diff --git a/elemental/README b/elemental/README
new file mode 100644
index 0000000..3537a00
--- /dev/null
+++ b/elemental/README
@@ -0,0 +1,19 @@
+Elemental is a "to the metal" raw programming API designed to keep up with fast changing 
+HTML5 browsers, reduce the need for JSNI code, and melt away to as little overhead as possible.
+It is particularly suited for situations where direct low level access and small code are important 
+such as mobile devices.
+
+Currently, Elemental is generated from the WebKit project's WebIDL binding definitions which are used also
+by the Dart project. Because of this, vendor prefixed APIs also show up (webkit specific). These APIs are
+often also available on Firefox, Opera, and IE. A future version of Elemental will generate these
+as well, either as Mozilla/Opera/IE vendor prefixed calls, or as standardized non-prefix calls backed by 
+multibrowser shim.
+
+To see Elemental and SuperDevMode in action, run 'ant dist-dev' to build gwt-dev and gwt-user jars. Then
+cd to examples/silvercomet and run 'ant demo'
+
+Visit http://localhost:9876/SilverComet/SilverComet.html and enjoy.
+
+
+
+
diff --git a/elemental/STOP.EXPERIMENTAL b/elemental/STOP.EXPERIMENTAL
new file mode 100644
index 0000000..c00e557
--- /dev/null
+++ b/elemental/STOP.EXPERIMENTAL
@@ -0,0 +1,6 @@
+DANGER! DANGER!
+
+Elemental is experimental. It will change rapidly, both because the HTML5 IDLs are evolving, and because
+some things like the Collection class APIs will most likely be changed. If you use elemental, be prepared to
+have your app broken, and to contribute by giving feedback and/or patches.
+
diff --git a/elemental/build.xml b/elemental/build.xml
new file mode 100644
index 0000000..51ad92d
--- /dev/null
+++ b/elemental/build.xml
@@ -0,0 +1,57 @@
+<project name="elemental" default="build" basedir=".">
+  <property name="gwt.root" location=".." />
+  <property name="project.tail" value="elemental" />
+  <property name="test.args" value="-ea" />
+  <property name="test.jvmargs" value="-ea" />
+
+  <import file="${gwt.root}/common.ant.xml" />
+
+  <!-- Platform shouldn't matter here, just picking one -->
+  <property.ensure name="gwt.dev.jar" location="${gwt.build.lib}/gwt-dev.jar" />
+  <property.ensure name="gwt.user.jar" location="${gwt.build.lib}/gwt-user.jar" />
+
+  <target name="compile" description="Compile all class files">
+    <mkdir dir="${javac.out}" />
+    <gwt.javac excludes="**/super/**">
+      <classpath>
+        <pathelement location="${gwt.dev.jar}" />
+        <pathelement location="${gwt.user.jar}" />
+      </classpath>
+    </gwt.javac>
+  </target>
+
+  <target name="build" depends="compile"
+      description="Creates gwt-elemental.jar">
+    <mkdir dir="${gwt.build.lib}" />
+    <gwt.jar>
+      <fileset dir="src" excludes="**/package.html" />
+      <fileset dir="${javac.out}" />
+    </gwt.jar>
+  </target>
+
+    <macrodef name="compileModule">
+      <element name="module" />
+      <sequential>
+        <gwt.timer name="Pre-compile module">
+          <java classname="com.google.gwt.dev.CompileModule" fork="yes" failonerror="true">
+            <classpath>
+              <pathelement location="${gwt.root}/elemental/src" />
+              <pathelement location="${gwt.dev.jar}" />
+              <pathelement location="${gwt.user.jar}" />
+            </classpath>
+            <jvmarg value="-Xmx512M" />
+            <module />
+            <arg value="-strict" />
+            <arg value="-out" />
+            <arg value="${project.build}/bin" />
+          </java>
+        </gwt.timer>
+      </sequential>
+    </macrodef>
+
+  <target name="clean"
+      description="Cleans this project's intermediate and output files">
+    <delete dir="${project.build}" />
+    <delete file="${project.lib}" />
+  </target>
+</project>
diff --git a/elemental/examples/silvercomet/build.xml b/elemental/examples/silvercomet/build.xml
new file mode 100755
index 0000000..cdd70c6
--- /dev/null
+++ b/elemental/examples/silvercomet/build.xml
@@ -0,0 +1,37 @@
+<!-- Demo of elemental implementing search and visualization of marathon runner times (json data) -->
+<project name="silvercomet" default="build" basedir=".">
+  <property name="gwt.root" location="../../.." />
+  <property name="project.tail" value="elemental/examples/silvercomet" />
+  <import file="${gwt.root}/common.ant.xml" />
+
+  <property.ensure name="gwt.dev.jar" location="${gwt.build.lib}/gwt-dev.jar" />
+  <property.ensure name="gwt.codeserver.jar" location="${gwt.build.lib}/gwt-codeserver.jar" />
+  <property.ensure name="gwt.elemental.jar" location="${gwt.build.lib}/gwt-elemental.jar" />
+
+  <target name="demo" depends="build" description="starts the code server with a sample app">
+
+    <!-- hack to make sourcemaps generation work in the compiler -->
+    <!-- See: http://code.google.com/p/google-web-toolkit/issues/detail?id=7397 -->
+    <property.ensure name="json.jar"
+                     location="${gwt.tools}/redist/json/r2_20080312/json-1.5.jar" />
+
+    <property.ensure name="gwt.user.jar" location="${gwt.build.lib}/gwt-user.jar" />
+    <property.ensure name="sample-src" location="${gwt.root}/elemental/examples/silvercomet/src" />
+
+
+    <java fork="true" failonerror="true" classname="com.google.gwt.dev.codeserver.CodeServer">
+      <classpath>
+        <pathelement location="${project.lib}"/>
+        <pathelement location="${gwt.dev.jar}"/>
+        <pathelement location="${json.jar}" />
+        <pathelement location="${gwt.user.jar}"/>
+        <pathelement location="${gwt.codeserver.jar}"/>
+        <pathelement location="${gwt.elemental.jar}"/>
+      </classpath>
+      <arg value="-src"/>
+      <arg value="${sample-src}"/>
+      <arg value="com.google.silvercomet.SilverComet"/>
+    </java>
+  </target>
+
+</project>
diff --git a/elemental/examples/silvercomet/src/com/google/silvercomet/SilverComet.gwt.xml b/elemental/examples/silvercomet/src/com/google/silvercomet/SilverComet.gwt.xml
new file mode 100644
index 0000000..40ba8d8
--- /dev/null
+++ b/elemental/examples/silvercomet/src/com/google/silvercomet/SilverComet.gwt.xml
@@ -0,0 +1,6 @@
+<module rename-to="SilverComet">
+  <inherits name="elemental.Elemental"/>
+  <add-linker name="xsiframe"/>
+  <set-configuration-property name="devModeRedirectEnabled" value="true"/>
+  <entry-point class="com.google.silvercomet.client.Main"/>
+</module>
diff --git a/elemental/examples/silvercomet/src/com/google/silvercomet/client/Main.java b/elemental/examples/silvercomet/src/com/google/silvercomet/client/Main.java
new file mode 100644
index 0000000..e6c67ce
--- /dev/null
+++ b/elemental/examples/silvercomet/src/com/google/silvercomet/client/Main.java
@@ -0,0 +1,522 @@
+package com.google.silvercomet.client;
+
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.resources.client.ClientBundle;
+import com.google.gwt.resources.client.CssResource;
+
+import elemental.client.Browser;
+import elemental.css.CSSStyleDeclaration;
+import elemental.css.CSSStyleDeclaration.Display;
+import elemental.css.CSSStyleDeclaration.Unit;
+import elemental.css.CSSStyleDeclaration.Visibility;
+import elemental.events.Event;
+import elemental.events.EventListener;
+import elemental.events.KeyboardEvent;
+import elemental.dom.Document;
+import elemental.dom.Element;
+import elemental.html.InputElement;
+import elemental.html.StyleElement;
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfInt;
+import elemental.util.Collections;
+import elemental.dom.*;
+
+/**
+ * All the view code that is fit to run.
+ *
+ * @author knorton@google.com (Kelly Norton)
+ */
+public class Main implements EntryPoint, Model.Listener, EventListener {
+
+  /**
+   * Access to all the relevant classnames and constants for the CSS selectors.
+   */
+  public static interface Css extends CssResource {
+    String bar();
+
+    String browserInfo();
+
+    String count();
+
+    String label();
+
+    String marker();
+
+    String moreResults();
+
+    String result();
+
+    String resultLeft();
+
+    String resultName();
+
+    String resultRight();
+
+    String root();
+
+    int rootHeight();
+
+    int rootWidth();
+
+    String tickMajor();
+
+    String tickMinor();
+  }
+
+  /**
+   * Bundles the CSS resources.
+   */
+  public interface Resources extends ClientBundle {
+    @Source("silver-comet.gwt.css")
+    Css css();
+  }
+
+  /**
+   * A simple view to show a runner's finishing info.
+   */
+  private static class RunnerView {
+    /**
+     * Returns a string describing a runner's place & finishing time. Example:
+     * 325th (1:49:11)
+     */
+    private static String infoString(Runner runner) {
+      return placeString(runner.place()) + " (" + secondsToTime(runner.time(), true) + ")";
+    }
+
+    /**
+     * Produces a english locale human readable places. Example: 1st, 2nd, 11th,
+     * etc.
+     */
+    private static String placeString(int place) {
+      final int tens = place / 10;
+      final int ones = place % 10;
+      if (ones == 1 && tens != 1) {
+        return place + "st";
+      } else if (ones == 2 && tens != 1) {
+        return place + "nd";
+      } else if (ones == 3 && tens != 1) {
+        return place + "rd";
+      } else {
+        return place + "th";
+      }
+    }
+
+    /**
+     * Sets the current runner being displayed.
+     */
+    private static native void setRunner(Element element, Runner runner) /*-{
+      element.currentRunner = runner;
+    }-*/;
+
+    /**
+     * This is a hack for sure, but I claim it demonstrates your ability to
+     * commit clever atrosities in JavaScript even while working in Java.
+     */
+    static native Runner getRunnerFromElement(Element element) /*-{
+      return element.currentRunner || element.parentNode.currentRunner;
+    }-*/;
+
+    private final Element root;
+
+    private final Element name;
+
+    private final Element info;
+
+    private final double secondsPerPixel;
+
+    /**
+     * Create a new view with a classname for the root element and a scaling
+     * factor for translating along the timeline.
+     */
+    RunnerView(String rootClass, double secondsPerPixel) {
+      this(rootClass, null, secondsPerPixel);
+    }
+
+    /**
+     * Create a new view classnames for the root element and text elements and a
+     * scaling factor for translating along the timeline.
+     */
+    RunnerView(String rootClass, String textClass, double secondsPerPixel) {
+      root = div(rootClass);
+      name = textClass == null ? div() : div(textClass);
+      info = textClass == null ? div() : div(textClass);
+
+      root.appendChild(name);
+      root.appendChild(info);
+
+      this.secondsPerPixel = secondsPerPixel;
+    }
+
+    /**
+     * Returns the root element for the view. Generally used to add the view to
+     * the DOM.
+     */
+    Element element() {
+      return root;
+    }
+
+    /**
+     * Make the view invisible.
+     */
+    void hide() {
+      root.getStyle().setVisibility(Visibility.HIDDEN);
+    }
+
+    /**
+     * Make the view visible.
+     */
+    void show() {
+      root.getStyle().removeProperty("visibility");
+    }
+
+    /**
+     * Update the view to show the info of a runner.
+     */
+    void update(Runner runner) {
+      setRunner(root, runner);
+      name.setTextContent(runner.name());
+      info.setTextContent(infoString(runner));
+      final int x = (int) ((double) runner.time() / (double) Model.SECONDS_PER_HISTOGRAM_BUCKET
+          * secondsPerPixel);
+
+      // TODO(knorton): This is actually wrong because it sets left on all
+      // markers.
+      root.getStyle().setLeft(x, Unit.PX);
+      show();
+    }
+  }
+
+  private static final int NUM_SEARCH_RESULTS = 6;
+
+  /*
+   * Get the correct classname based on the index of the result. This allows for
+   * different classnames on the first and last item.
+   */
+  private static String cssClassForResultItem(Css css, int index) {
+    if (index == 0) {
+      return css.result() + " " + css.resultLeft();
+    }
+
+    if (index == NUM_SEARCH_RESULTS - 1) {
+      return css.result() + " " + css.resultRight();
+    }
+
+    return css.result();
+  }
+
+  /**
+   * Convenience method for creating a new div.
+   */
+  private static Element div() {
+    return Browser.getDocument().createElement("div");
+  }
+
+  /**
+   * Convenience method for creating a new div with a classname.
+   */
+  private static Element div(String className) {
+    final Element e = div();
+    e.setClassName(className);
+    return e;
+  }
+
+  private static String getBrowserInfoString() {
+    final Browser.Info info = Browser.getInfo();
+    if (info.isWebKit()) {
+      return "WebKit Browser";
+    } else if (info.isGecko()) {
+      return "Gecko Browser";
+    }
+    return "Unsupported Browser";
+  }
+
+  private static void injectStyles(Document document, String css) {
+    final StyleElement style = (StyleElement)document.createElement("style");
+    style.setTextContent(css);
+    document.getHead().appendChild(style);
+  }
+
+  /**
+   * Converts a integer to a {@link String}, prepending a zero if the string
+   * representation is only 1 character in length.
+   */
+  private static String pad(int number) {
+    return number > 9 ? "" + number : "0" + number;
+  }
+
+  /**
+   * Converts the number of seconds to a more human readable finishing time.
+   */
+  private static String secondsToTime(int seconds, boolean includeSeconds) {
+    final int hrs = seconds / 3600;
+    final int mns = seconds / 60 - hrs * 60;
+    if (includeSeconds) {
+      final int scs = seconds - hrs * 3600 - mns * 60;
+      return hrs + ":" + pad(mns) + ":" + pad(scs);
+    }
+    return hrs + ":" + pad(mns);
+  }
+
+  private final Css css = GWT.<Resources>create(Resources.class).css();
+
+  private Element root;
+
+  private InputElement search;
+
+  private RunnerView marker;
+
+  private Model model;
+
+  private String lastQuery;
+
+  private Element results;
+
+  private ArrayOf<RunnerView> resultItems;
+
+  private double xAxisScale;
+
+  private Element moreResults;
+
+  /**
+   * Handles all DOM events for the app.
+   */
+  @Override
+  public void handleEvent(Event evt) {
+    final Element target = (Element) evt.getTarget();
+
+    // Handle searches.
+    if (target == search) {
+	//      if (((KeyboardEvent)evt).getKeyCode() == 42) {
+	//        clearSearch();
+	//      } else {
+        final String query = search.getValue();
+        updateSearch(query == null ? "" : query.trim());
+	//      }
+      return;
+    }
+
+    // Handle clicks on search results.
+    final Runner runner = RunnerView.getRunnerFromElement(target);
+    if (runner != null) {
+      marker.update(runner);
+      clearSearch();
+      return;
+    }
+  }
+
+  /**
+   * Indicates that the data failed to load.
+   */
+  @Override
+  public void modelDidFailLoading(Model model) {
+  }
+
+  /**
+   * Indicates that the model finished building the search indexes.
+   */
+  @Override
+  public void modelDidFinishBuildingIndex(Model model) {
+    // TODO(knorton): File crbug about readOnly not working properly.
+    // search.setReadOnly(false);
+    search.focus();
+  }
+
+  /**
+   * Indicates that all data has been loaded into the model.
+   */
+  @Override
+  public void modelDidFinishLoading(Model model) {
+    final ArrayOfInt histogram = model.histogram();
+    assert histogram.length() > 0 : "histogram is empty.";
+
+    xAxisScale = (double) css.rootWidth() / (double) histogram.length();
+
+    // Build the histogram graph.
+    render();
+
+    // Create the marker.
+    marker = new RunnerView(css.marker(), xAxisScale);
+    marker.hide();
+    root.appendChild(marker.element());
+    Browser.getDocument().getBody().getStyle().setOpacity(1.0);
+  }
+
+  /**
+   * The main entry point for the application.
+   */
+  public void onModuleLoad() {
+    injectStyles(Browser.getDocument(), css.getText());
+
+    // TODO(knorton): Bad Elemental pattern.
+    search = (InputElement) Browser.getDocument().getElementById("search");
+    // TODO(knorton): File crbug about readOnly not working properly.
+    // search.setReadOnly(true);
+    search.addEventListener("change", this, false);
+    search.addEventListener("keyup", this, false);
+    search.addEventListener("keydown", this, false);
+
+    root = (Element) Browser.getDocument().getElementById("c");
+    root.setClassName(css.root());
+
+    results = (Element)Browser.getDocument().getElementById("r");
+    results.getStyle().setVisibility(Visibility.HIDDEN);
+    results.addEventListener("click", this, false);
+
+    // Browser info indicator.
+    // TODO(knorton): Put this in a debug perm.
+    final Element info = Browser.getDocument().getElementById("f");
+    info.setClassName(css.browserInfo());
+    info.setTextContent(getBrowserInfoString());
+    
+    model = new Model(this);
+    model.load();
+  }
+
+  /**
+   * Clear the search box and hide the result item list.
+   */
+  private void clearSearch() {
+    search.setValue("");
+    hideSearchResults();
+  }
+
+  /**
+   * Ensure that the DOM for result items has been built and appended to the
+   * DOM.
+   */
+  private void ensureSearchResultItems() {
+    if (resultItems != null) {
+      return;
+    }
+
+    resultItems = Collections.arrayOf();
+    for (int i = 0; i < NUM_SEARCH_RESULTS; ++i) {
+      final RunnerView marker =
+          new RunnerView(cssClassForResultItem(css, i), css.resultName(), xAxisScale);
+      results.appendChild(marker.element());
+      resultItems.push(marker);
+    }
+
+    moreResults = div(css.moreResults());
+    results.appendChild(moreResults);
+    moreResults.getStyle().setDisplay(Display.NONE);
+  }
+  
+  /**
+   * Hide the search result items list.
+   */
+  private void hideSearchResults() {
+    results.getStyle().setVisibility(Visibility.HIDDEN);
+  }
+
+  /**
+   * Renders the bar graph.
+   */
+  private void render() {
+    final ArrayOfInt histogram = model.histogram();
+
+    final int padding = 2;
+    final int topPadding = 50;
+
+    final double dx = xAxisScale;
+    final double dy = (double) css.rootHeight() / histogram.get(histogram.length() - 1);
+    final double halfDx = dx / 2.0;
+
+    // Render all bars.
+    for (int i = 0, n = histogram.length(); i < n; ++i) {
+      final int value = histogram.get(i);
+      if (value == 0) continue;
+
+      final int x = (int) (dx * i) + padding;
+      final int h = (int) (dy * value) - topPadding;
+      final int w = (int) dx - padding * 2;
+
+      // Create the vertical bar.
+      final Element bar = div(css.bar());
+      final CSSStyleDeclaration barStyle = bar.getStyle();
+      barStyle.setLeft(x, Unit.PX);
+      barStyle.setBottom("0");
+      barStyle.setHeight(h, Unit.PX);
+      barStyle.setWidth(w, Unit.PX);
+
+      // Add a count at the top.
+      final Element count = div(css.count());
+      count.setTextContent("" + value);
+
+      bar.appendChild(count);
+      root.appendChild(bar);
+    }
+
+    // Render labels
+    for (int i = 0, n = histogram.length(); i <= n; ++i) {
+      final int x = (int) (dx * i);
+      final int w = (int) dx;
+
+      final String time = secondsToTime(i * Model.SECONDS_PER_HISTOGRAM_BUCKET, false);
+
+      final Element label = div(css.label());
+      label.setTextContent(time);
+      final CSSStyleDeclaration labelStyle = label.getStyle();
+      labelStyle.setLeft(x - dx, Unit.PX);
+      labelStyle.setWidth(w, Unit.PX);
+      root.appendChild(label);
+
+      // TODO(knorton): Heh, that's pretty trashy. I should fix that. :-)
+      final Element tick =
+          div(time.charAt(time.length() - 1) == '0' && time.charAt(time.length() - 2) == '0'
+              ? css.tickMajor() : css.tickMinor());
+      tick.getStyle().setLeft(x, Unit.PX);
+      root.appendChild(tick);
+    }
+  }
+
+  /**
+   * Show the search result items list and update it with the specified list of
+   * results.
+   */
+  private void showSearchResults(ArrayOf<Runner> runners) {
+    ensureSearchResultItems();
+    results.getStyle().removeProperty("visibility");
+    for (int i = 0; i < NUM_SEARCH_RESULTS; ++i) {
+      final RunnerView item = resultItems.get(i);
+      if (i < runners.length()) {
+        item.show();
+        item.update(runners.get(i));
+      } else {
+        item.hide();
+      }
+    }
+
+    if (runners.length() > NUM_SEARCH_RESULTS) {
+      moreResults.setTextContent("+" + (runners.length() - NUM_SEARCH_RESULTS) + " more");
+      moreResults.getStyle().removeProperty("display");
+    } else {
+      moreResults.getStyle().setDisplay(Display.NONE);
+    }
+  }
+
+  /**
+   * Update the search results visually for the specified query.
+   */
+  private void updateSearch(String query) {
+    if (query.equals(lastQuery)) {
+      return;
+    }
+
+    lastQuery = query;
+    if (query.length() == 0) {
+      hideSearchResults();
+    }
+
+    final ArrayOf<Runner> runners = model.search(query);
+    if (runners == null) {
+      hideSearchResults();
+    } else if (runners.length() == 1) {
+      hideSearchResults();
+      marker.update(runners.get(0));
+    } else {
+      showSearchResults(runners);
+    }
+  }
+}
diff --git a/elemental/examples/silvercomet/src/com/google/silvercomet/client/Model.java b/elemental/examples/silvercomet/src/com/google/silvercomet/client/Model.java
new file mode 100644
index 0000000..9db9022
--- /dev/null
+++ b/elemental/examples/silvercomet/src/com/google/silvercomet/client/Model.java
@@ -0,0 +1,193 @@
+// Copyright 2010 Google Inc. All Rights Reserved.
+
+package com.google.silvercomet.client;
+
+import com.google.gwt.xhr.client.XMLHttpRequest;
+
+import elemental.client.Browser;
+import elemental.html.Window;
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfInt;
+import elemental.util.ArrayOfString;
+import elemental.util.MapFromStringTo;
+import elemental.json.Json;
+import elemental.js.util.StringUtil;
+import elemental.js.util.Xhr;
+import elemental.util.CanCompare;
+import elemental.dom.TimeoutHandler;
+import elemental.util.Collections;
+
+/**
+ * A very simple data model for the application.
+ *
+ * @author knorton@google.com (Kelly Norton)
+ */
+public class Model implements Xhr.Callback {
+
+  /**
+   * A listener to receive callbacks on model events.
+   */
+  public interface Listener {
+    void modelDidFailLoading(Model model);
+
+    void modelDidFinishBuildingIndex(Model model);
+
+    void modelDidFinishLoading(Model model);
+  }
+
+  private static final String DATA_URL = "results.json";
+
+  public static final int SECONDS_PER_HISTOGRAM_BUCKET = 600;
+
+  /**
+   * Compute a histogram with number of finishers per bucket of time where the
+   * size of the bucket is indicated by <code>seconds</code>.
+   */
+  private static ArrayOfInt computeHistogram(ArrayOf<Runner> runners, int seconds) {
+    final ArrayOfInt hist = Collections.arrayOfInt();
+
+    for (int i = 0, n = runners.length(); i < n; ++i) {
+      int index = runners.get(i).time() / seconds;
+      hist.set(index, hist.isSet(index) ? hist.get(index) + 1 : 1);
+    }
+
+    int sum = 0;
+    for (int i = 0, n = hist.length(); i < n; ++i) {
+      if (hist.isSet(i)) {
+        sum += hist.get(i);
+      }
+      hist.set(i, sum);
+    }
+
+    return hist;
+  }
+
+  /**
+   * Sorts the list of runners by {@link Runner#time()} and updates their places
+   * accordingly.
+   */
+  private static ArrayOf<Runner> normalize(ArrayOf<Runner> runners) {
+    // Sort by time() which is based on bib time.
+    runners.sort(new CanCompare<Runner>() {
+      @Override
+      public int compare(Runner a, Runner b) {
+        return a.time() - b.time();
+      }
+    });
+
+    // Update the runner's new place.
+    for (int i = 0, n = runners.length(); i < n; ++i) {
+      runners.get(i).setPlace(i + 1);
+    }
+
+    return runners;
+  }
+
+  /**
+   * Update the model's index with all possible prefixes of the search key.
+   */
+  private static void updateIndexForAllPrefixes(
+      MapFromStringTo<ArrayOf<Runner>> index, String key, Runner runner) {
+    assert key.length() > 0 : "key.length must be > 0.";
+
+    for (int i = 1, n = key.length(); i <= n; ++i) {
+      final String prefix = key.substring(0, i);
+      if (!index.hasKey(prefix)) {
+        index.put(prefix, Collections.<Runner>arrayOf());
+      }
+
+      final ArrayOf<Runner> values = index.get(prefix);
+      // Do not add the same runner twice.
+      if (values.get(values.length() - 1) != runner) {
+        index.get(prefix).push(runner);
+      }
+    }
+  }
+
+  private final Listener listener;
+
+  private ArrayOfInt histogram = null;
+
+  private MapFromStringTo<ArrayOf<Runner>> index = Collections.mapFromStringTo();
+
+  /**
+   * Create a new model.
+   */
+  public Model(Listener listener) {
+    this.listener = listener;
+  }
+
+  /**
+   * Get a reference to the models histogram.
+   */
+  public ArrayOfInt histogram() {
+    return histogram;
+  }
+
+  /**
+   * Load the remote data into the model.
+   */
+  public void load() {
+    Xhr.get(DATA_URL, this);
+  }
+
+  /**
+   * Called if the XHR fails to load data from there server.
+   */
+  @Override
+  public void onFail(XMLHttpRequest xhr) {
+    listener.modelDidFailLoading(this);
+  }
+
+  /**
+   * Called when XHR successfully loads data from the server.
+   */
+  @Override
+  public void onSuccess(XMLHttpRequest xhr) {
+    update((ArrayOf<Runner>)Json.parse(xhr.getResponseText()));
+    listener.modelDidFinishLoading(this);
+  }
+
+  /**
+   * Performs a search and returns the list of runners that match.
+   */
+  public ArrayOf<Runner> search(String query) {
+    return index.get(query);
+  }
+
+  /**
+   * Update the model's internal data from an list of runners coming from the
+   * server.
+   */
+  private void update(ArrayOf<Runner> data) {
+    // Sort & mutate source data.
+    final ArrayOf<Runner> runners = normalize(data);
+
+    // Update indexes later.
+    Browser.getWindow().setTimeout(new TimeoutHandler() {
+      @Override
+      public void onTimeoutHandler() {
+        for (int i = 0, n = runners.length(); i < n; ++i) {
+          final Runner runner = runners.get(i);
+
+          final String name = runner.name().toLowerCase();
+          updateIndexForAllPrefixes(index, name, runner);
+          final ArrayOfString words = StringUtil.split(name, " ");
+          for (int j = 0, m = words.length(); j < m; ++j) {
+            updateIndexForAllPrefixes(index, words.get(j), runner);
+          }
+
+          updateIndexForAllPrefixes(index, "" + runner.place(), runner);
+          updateIndexForAllPrefixes(index, "" + runner.bibNumber(), runner);
+        }
+        listener.modelDidFinishBuildingIndex(Model.this);
+      }
+    }, 0);
+
+    // Compute histogram.
+    final ArrayOfInt histogram = computeHistogram(runners, SECONDS_PER_HISTOGRAM_BUCKET);
+
+    // Update fields.
+    this.histogram = histogram;
+  }
+}
diff --git a/elemental/examples/silvercomet/src/com/google/silvercomet/client/Runner.java b/elemental/examples/silvercomet/src/com/google/silvercomet/client/Runner.java
new file mode 100644
index 0000000..09667d8
--- /dev/null
+++ b/elemental/examples/silvercomet/src/com/google/silvercomet/client/Runner.java
@@ -0,0 +1,96 @@
+// Copyright 2010 Google Inc. All Rights Reserved.
+
+package com.google.silvercomet.client;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+/**
+ * An overlay type that structures a runner's data.
+ *
+ * @author knorton@google.com (Kelly Norton)
+ */
+public final class Runner extends JavaScriptObject {
+  protected Runner() {
+  }
+
+  /**
+   * The runner's age.
+   */
+  public native int age() /*-{
+    return this[2];
+  }-*/;
+
+  /**
+   * The number on the runner's bib (race number).
+   */
+  public native int bibNumber() /*-{
+    return this[5];
+  }-*/;
+
+  /**
+   * The runner's finishing time based on the RFID tag in their bib. -1 is
+   * returned if the runner did not record a valid time with their bib.
+   */
+  public native int bibTime() /*-{
+    return this[8];
+  }-*/;
+
+  /**
+   * The city the runner entered in their registration.
+   */
+  public native String city() /*-{
+    return this[4];
+  }-*/;
+
+  /**
+   * Male or Female.
+   */
+  public native int gender() /*-{
+    return this[3];
+  }-*/;
+
+  /**
+   * The runner's finishing time based on the time from the gun fire to the time
+   * they passed the finish line.
+   */
+  public native int gunTime() /*-{
+    return this[6];
+  }-*/;
+
+  /**
+   * The runner's full name.
+   */
+  public native String name() /*-{
+    return this[1];
+  }-*/;
+
+  /**
+   * The runner's pace in seconds / mile.
+   */
+  public native int pace() /*-{
+    return this[7];
+  }-*/;
+
+  /**
+   * The runner's finishing place (1 based).
+   */
+  public native int place() /*-{
+    return this[0];
+  }-*/;
+
+  /**
+   * Allows updating of the runner's place to accomodate recordering by
+   * {@link #bibTime()} instead of {@link #gunTime()}.
+   */
+  public native void setPlace(int place) /*-{
+    this[0] = place;
+  }-*/;
+
+  /**
+   * Normalized finishing time. This returns the {@link #bibTime()} if it's
+   * valid, {@link #gunTime()} otherwise.
+   */
+  public int time() {
+    return bibTime() != -1 ? bibTime() : gunTime();
+  }
+}
diff --git a/elemental/examples/silvercomet/src/com/google/silvercomet/client/silver-comet.gwt.css b/elemental/examples/silvercomet/src/com/google/silvercomet/client/silver-comet.gwt.css
new file mode 100644
index 0000000..e641ccc
--- /dev/null
+++ b/elemental/examples/silvercomet/src/com/google/silvercomet/client/silver-comet.gwt.css
@@ -0,0 +1,175 @@
+@def rootWidth 800px;
+@def rootHeight 600px;
+
+/* TODO(knorton): -moz and -webkit prefixes can be targeted with @if */
+body {
+  font-family: Helvetica,Arial,san-serif;
+  -webkit-transition: opacity 200ms ease-in-out;
+  /* opacity: 0 is defined in SilverComet.html */
+  
+  /* 
+   * Firefox doesn't allow margin: auto on flex-box displayed elements.
+   * It's like the new IE6.
+   */
+  text-align: center;
+}
+
+/* header */
+#h {
+  display: -webkit-box;
+  display: -moz-box;
+  -webkit-box-orient: horizontal;
+  -moz-box-orient: horizontal;
+  width: rootWidth;
+  margin: 10px auto;
+  background: #666;
+  padding: 10px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  color: #be7;
+  font-size: 12pt;
+}
+
+/* The chart */
+#c {
+  text-align: left;
+}
+
+/* find a runner */
+#ha {
+  font-size: 10px;
+  background-color: #777;
+  padding: 4px 10px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+}
+
+/* header title */
+#hb {
+  padding: 4px 10px;
+  -webkit-box-flex: 1;
+  -moz-box-flex: 1;
+  text-align: right;
+}
+
+/* search results */
+#r {
+  position: relative;
+  text-align: left;
+  font-size: 10px;
+  width: rootWidth;
+  margin: 0 auto;
+  height: 45px;
+  padding: 10px 4px;
+  background-color: #eee;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+}
+
+.result {
+  display: inline-block;
+  margin: 4px 0;
+  padding: 4px 10px;
+  border-right: 1px solid #999;
+  border-left: 1px solid #fff;
+  width: 111px;
+  cursor: pointer;
+  text-align: center;
+}
+
+.resultLeft {
+  border-left: none;
+}
+
+.resultRight {
+  border-right: none;
+}
+ 
+ .resultName {
+   white-space: nowrap;
+   overflow: hidden;
+   text-overflow: ellipsis;
+ }
+  
+#search {
+  font-size: 10px;
+  margin-left: 10px;
+}
+
+.root {
+  width: rootWidth;
+  height: rootHeight;
+  border-bottom: 1px solid #666;
+  margin: 50px auto;
+  position: relative;
+}
+
+.bar {
+  position: absolute;
+  background: #ccc;
+}
+
+.count {
+  font-size: 10px;
+  color: #666;
+  margin-top: -15px;
+}
+
+.label {
+  font-size: 10px;
+  position: absolute;
+  top: 601px;
+  height: 20px;
+  padding-top: 15px;
+  text-align: center;
+}
+
+.tickMinor {
+  position: absolute;
+  border-left: 1px solid #666;
+  bottom: -6px;
+  height: 6px;
+}
+
+.tickMajor {
+  position: absolute;
+  border-left: 1px solid #666;
+  bottom: -10px;
+  height: 10px;
+}
+
+.marker {
+  font-size: 10px;
+  border-left: 1px solid #600;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  color: #600;
+  padding-left: 4px;
+  -webkit-transition: left 200ms ease-in-out;
+  -moz-transition: left 200ms ease-in-out;
+  min-width: 200px;
+}
+
+.moreResults {
+  right: -5em;
+  top: 2.5em;
+  position: absolute;
+  background-color: #fff;
+  color: #000;
+  padding: 2px 10px;
+  -webkit-box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 2px;
+  -moz-box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 2px;
+  -webkit-border-radius: 20px;
+  -moz-border-radius: 20px;
+  border: 1px solid #666;
+}
+
+.browserInfo {
+  font-size: 8px;
+  position: fixed;
+  right: 0;
+  bottom: 0;
+  padding: 4px;
+  color: #666;
+}
\ No newline at end of file
diff --git a/elemental/examples/silvercomet/src/com/google/silvercomet/public/SilverComet.html b/elemental/examples/silvercomet/src/com/google/silvercomet/public/SilverComet.html
new file mode 100644
index 0000000..3b3cdb7
--- /dev/null
+++ b/elemental/examples/silvercomet/src/com/google/silvercomet/public/SilverComet.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <script src="SilverComet.nocache.js"></script>
+  </head>
+  <body style="opacity:0">
+    <div id="h">
+      <div id="ha">find a runner <input type="search" id="search"></div>
+      <div id="hb">Silver Comet Half Marathon &ndash; Oct 30, 2010</div>
+    </div>
+    <div id="r">
+    </div>
+    <div id="c"></div>
+    <div id="f"></div>
+  </body>
+</html>
+
diff --git a/elemental/examples/silvercomet/src/com/google/silvercomet/public/results.json b/elemental/examples/silvercomet/src/com/google/silvercomet/public/results.json
new file mode 100644
index 0000000..8723dcc
--- /dev/null
+++ b/elemental/examples/silvercomet/src/com/google/silvercomet/public/results.json
@@ -0,0 +1,18735 @@
+[
+  [
+    1, 
+    "KEVIN CLARY", 
+    29, 
+    "M", 
+    "ATLANTA GA", 
+    337, 
+    4090, 
+    313, 
+    4088
+  ], 
+  [
+    2, 
+    "TIM PRICHARD", 
+    39, 
+    "M", 
+    "DECATUR GA", 
+    1470, 
+    4665, 
+    357, 
+    4662
+  ], 
+  [
+    3, 
+    "CHRIS SMITH", 
+    32, 
+    "M", 
+    "ATLANTA GA", 
+    1704, 
+    4687, 
+    358, 
+    4685
+  ], 
+  [
+    4, 
+    "DAVID CATER", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    299, 
+    4694, 
+    359, 
+    4692
+  ], 
+  [
+    5, 
+    "JUSTIN TUCKER", 
+    25, 
+    "M", 
+    "DOUGLASVILLE GA", 
+    1863, 
+    4726, 
+    361, 
+    4723
+  ], 
+  [
+    6, 
+    "JACK WESTRICK", 
+    40, 
+    "M", 
+    "DUNWOODY GA", 
+    1954, 
+    4739, 
+    362, 
+    4736
+  ], 
+  [
+    7, 
+    "KEN YOUNGERS", 
+    54, 
+    "M", 
+    "DECATUR GA", 
+    2016, 
+    4795, 
+    366, 
+    4791
+  ], 
+  [
+    8, 
+    "BRITTNEY MENSEN", 
+    28, 
+    "F", 
+    "WINSTON GA", 
+    1255, 
+    4846, 
+    370, 
+    4843
+  ], 
+  [
+    9, 
+    "RAOUL NOWITZ", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    1356, 
+    4971, 
+    380, 
+    4966
+  ], 
+  [
+    10, 
+    "DANIEL SEO", 
+    28, 
+    "M", 
+    "DECATUR GA", 
+    1640, 
+    4986, 
+    381, 
+    4983
+  ], 
+  [
+    11, 
+    "IAN SMITH", 
+    22, 
+    "M", 
+    "MARIETTA GA", 
+    1707, 
+    5064, 
+    387, 
+    5057
+  ], 
+  [
+    12, 
+    "TODD KENNEDY", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    989, 
+    5071, 
+    388, 
+    5065
+  ], 
+  [
+    13, 
+    "EVAN GLUECK", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    700, 
+    5142, 
+    393, 
+    5139
+  ], 
+  [
+    14, 
+    "JOHN ALSOBROOK", 
+    40, 
+    "M", 
+    "SUGAR HILL GA", 
+    38, 
+    5158, 
+    394, 
+    5156
+  ], 
+  [
+    15, 
+    "JEFF CHAMBRELLO", 
+    51, 
+    "M", 
+    "MARIETTA GA", 
+    2034, 
+    5168, 
+    395, 
+    5164
+  ], 
+  [
+    16, 
+    "TOREY MCCORMICK", 
+    36, 
+    "M", 
+    "MCDONOUGH GA", 
+    1201, 
+    5177, 
+    396, 
+    5172
+  ], 
+  [
+    17, 
+    "MIKE WIEN", 
+    59, 
+    "M", 
+    "ATLANTA", 
+    2146, 
+    5184, 
+    396, 
+    5181
+  ], 
+  [
+    18, 
+    "BRAD SUMNER", 
+    40, 
+    "M", 
+    "CANTON GA", 
+    1787, 
+    5186, 
+    396, 
+    5182
+  ], 
+  [
+    19, 
+    "RAYMOND ROSS", 
+    49, 
+    "M", 
+    "ROSEWELL GA", 
+    1563, 
+    5222, 
+    399, 
+    5218
+  ], 
+  [
+    20, 
+    "ROBERT SCHNITTMAN", 
+    23, 
+    "M", 
+    "ATLANTA GA", 
+    1614, 
+    5236, 
+    400, 
+    5233
+  ], 
+  [
+    21, 
+    "CHAD DANIEL", 
+    32, 
+    "M", 
+    "PEACHTREE CITY GA", 
+    436, 
+    5245, 
+    401, 
+    5242
+  ], 
+  [
+    22, 
+    "KIMBERLY KREMER", 
+    31, 
+    "F", 
+    "MARIETTA GA", 
+    1025, 
+    5251, 
+    401, 
+    5248
+  ], 
+  [
+    23, 
+    "DAVID REHM", 
+    48, 
+    "M", 
+    "FAYETTEVILLE GA", 
+    1508, 
+    5263, 
+    402, 
+    5260
+  ], 
+  [
+    24, 
+    "DIRK REAUME", 
+    53, 
+    "M", 
+    "GAINESVILLE GA", 
+    1498, 
+    5269, 
+    403, 
+    5264
+  ], 
+  [
+    25, 
+    "MARK MCDUFFIE", 
+    40, 
+    "M", 
+    "BUFORD GA", 
+    1213, 
+    5272, 
+    403, 
+    5264
+  ], 
+  [
+    26, 
+    "JOHN KELSCH", 
+    39, 
+    "M", 
+    "MARIETTA GA", 
+    985, 
+    5281, 
+    404, 
+    5277
+  ], 
+  [
+    27, 
+    "NICK WESTBROOK", 
+    30, 
+    "M", 
+    "MCDONOUGH GA", 
+    1952, 
+    5284, 
+    404, 
+    5279
+  ], 
+  [
+    28, 
+    "DANNY WESTHEIMER", 
+    45, 
+    "M", 
+    "ATLANTA GA", 
+    1953, 
+    5288, 
+    404, 
+    5283
+  ], 
+  [
+    29, 
+    "JON CHALLY", 
+    31, 
+    "M", 
+    "SMYRNA GA", 
+    309, 
+    5300, 
+    405, 
+    5290
+  ], 
+  [
+    30, 
+    "JARED LEE", 
+    31, 
+    "M", 
+    "ATHENS GA", 
+    1079, 
+    5307, 
+    406, 
+    5303
+  ], 
+  [
+    31, 
+    "RYAN MCCREADY", 
+    30, 
+    "M", 
+    "OXFORD MS", 
+    1204, 
+    5314, 
+    406, 
+    5305
+  ], 
+  [
+    32, 
+    "GRANT KENDALL", 
+    24, 
+    "M", 
+    "ATLANTA GA", 
+    987, 
+    5320, 
+    407, 
+    5314
+  ], 
+  [
+    33, 
+    "SEAN DAVIS", 
+    39, 
+    "M", 
+    "MCDONOUGH GA", 
+    455, 
+    5323, 
+    407, 
+    5318
+  ], 
+  [
+    34, 
+    "KATE BRUN", 
+    24, 
+    "F", 
+    "KENNESAW GA", 
+    224, 
+    5325, 
+    407, 
+    5322
+  ], 
+  [
+    35, 
+    "NICK SMYTHE", 
+    30, 
+    "M", 
+    "SMYRNA GA", 
+    1719, 
+    5399, 
+    413, 
+    5395
+  ], 
+  [
+    36, 
+    "AMYN SOLDIER", 
+    23, 
+    "M", 
+    "DULUTH GA", 
+    1723, 
+    5403, 
+    413, 
+    5395
+  ], 
+  [
+    37, 
+    "MATT CAMPBELL", 
+    36, 
+    "M", 
+    "ATLANTA GA", 
+    277, 
+    5404, 
+    413, 
+    5400
+  ], 
+  [
+    38, 
+    "DAN SPOHRER", 
+    38, 
+    "M", 
+    "ALPHARETTA GA", 
+    1740, 
+    5405, 
+    413, 
+    5397
+  ], 
+  [
+    39, 
+    "BEN MCLAIN", 
+    35, 
+    "M", 
+    "CONYERS GA", 
+    1229, 
+    5405, 
+    413, 
+    5401
+  ], 
+  [
+    40, 
+    "RAY ALLEN", 
+    39, 
+    "M", 
+    "ROSWELL GA", 
+    35, 
+    5409, 
+    413, 
+    5395
+  ], 
+  [
+    41, 
+    "JACKSON ESODA", 
+    20, 
+    "M", 
+    "MARIETTA GA", 
+    577, 
+    5413, 
+    414, 
+    5410
+  ], 
+  [
+    42, 
+    "LAURA GOLD", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    702, 
+    5427, 
+    415, 
+    5423
+  ], 
+  [
+    43, 
+    "TODD KIEFFER", 
+    44, 
+    "M", 
+    "ATLANTA GA", 
+    994, 
+    5430, 
+    415, 
+    5425
+  ], 
+  [
+    44, 
+    "MATT HACKETT", 
+    37, 
+    "M", 
+    "WOODSTOCK GA", 
+    750, 
+    5433, 
+    415, 
+    5409
+  ], 
+  [
+    45, 
+    "DUANE NOVOTNI", 
+    31, 
+    "M", 
+    "FAIRFAX VA", 
+    1355, 
+    5455, 
+    417, 
+    5451
+  ], 
+  [
+    46, 
+    "CLAUDE GAUTHIER", 
+    45, 
+    "M", 
+    "DECATUR GA", 
+    677, 
+    5475, 
+    418, 
+    5454
+  ], 
+  [
+    47, 
+    "WENDELL BREWTON", 
+    34, 
+    "M", 
+    "DOUGLASVILLE GA", 
+    204, 
+    5483, 
+    419, 
+    5476
+  ], 
+  [
+    48, 
+    "ORLANDO DANIELS", 
+    46, 
+    "M", 
+    "COLLEGE PARK GA", 
+    2038, 
+    5484, 
+    419, 
+    5480
+  ], 
+  [
+    49, 
+    "PATRICIA COPPEL", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    862, 
+    5486, 
+    419, 
+    5482
+  ], 
+  [
+    50, 
+    "HARRY EVANS", 
+    48, 
+    "M", 
+    "ATLANTA GA", 
+    585, 
+    5498, 
+    420, 
+    5494
+  ], 
+  [
+    51, 
+    "PHILLIP FINLEY", 
+    46, 
+    "M", 
+    "ATLANTA GA", 
+    601, 
+    5505, 
+    421, 
+    5500
+  ], 
+  [
+    52, 
+    "HEIDI SPAETH", 
+    39, 
+    "F", 
+    "CANTON GA", 
+    1727, 
+    5528, 
+    422, 
+    5524
+  ], 
+  [
+    53, 
+    "REHAN HAQUE", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    781, 
+    5535, 
+    423, 
+    5530
+  ], 
+  [
+    54, 
+    "MICHEL ODERMATT", 
+    49, 
+    "M", 
+    "SMYRNA GA", 
+    1364, 
+    5567, 
+    425, 
+    5563
+  ], 
+  [
+    55, 
+    "THOMAS PLATT", 
+    26, 
+    "M", 
+    "ATLANTA GA", 
+    1446, 
+    5577, 
+    426, 
+    5566
+  ], 
+  [
+    56, 
+    "RAY DEMELFI", 
+    28, 
+    "M", 
+    "ATLANTA GA", 
+    474, 
+    5578, 
+    426, 
+    5570
+  ], 
+  [
+    57, 
+    "ROBERT TRUCKENMILLER", 
+    35, 
+    "M", 
+    "ACWORTH GA", 
+    1857, 
+    5579, 
+    426, 
+    5570
+  ], 
+  [
+    58, 
+    "MITCHELL BUTLER", 
+    46, 
+    "M", 
+    "FAYETTEVILLE GA", 
+    256, 
+    5583, 
+    427, 
+    5577
+  ], 
+  [
+    59, 
+    "LAURIE WHARTON", 
+    44, 
+    "F", 
+    "MARIETTA GA", 
+    1955, 
+    5585, 
+    427, 
+    5582
+  ], 
+  [
+    60, 
+    "ERIC LAMPHIER", 
+    36, 
+    "M", 
+    "MABLETON GA", 
+    1052, 
+    5590, 
+    427, 
+    5585
+  ], 
+  [
+    61, 
+    "JACOB BARTON", 
+    32, 
+    "M", 
+    "COLUMBUS GA", 
+    116, 
+    5595, 
+    428, 
+    5591
+  ], 
+  [
+    62, 
+    "HUMBERTO BENEDETTO", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    140, 
+    5595, 
+    428, 
+    5591
+  ], 
+  [
+    63, 
+    "MICHAEL WYSONG", 
+    48, 
+    "M", 
+    "ALPHARETTA GA", 
+    2013, 
+    5598, 
+    428, 
+    5593
+  ], 
+  [
+    64, 
+    "JEFF BREWER", 
+    42, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    203, 
+    5599, 
+    428, 
+    -1
+  ], 
+  [
+    65, 
+    "TAD SCEPANIAK", 
+    36, 
+    "M", 
+    "WOODSTOCK GA", 
+    1601, 
+    5603, 
+    428, 
+    5597
+  ], 
+  [
+    66, 
+    "CHRIS KOJALI", 
+    42, 
+    "M", 
+    "FAYETTEVILLE GA", 
+    1016, 
+    5603, 
+    428, 
+    5596
+  ], 
+  [
+    67, 
+    "DANIEL DELAMATER", 
+    38, 
+    "M", 
+    "ATHENS GA", 
+    469, 
+    5605, 
+    428, 
+    5602
+  ], 
+  [
+    68, 
+    "NAVEEN RAMACHANDRAPPA", 
+    28, 
+    "M", 
+    "ATLANTA GA", 
+    1489, 
+    5610, 
+    429, 
+    5603
+  ], 
+  [
+    69, 
+    "GREG MORRIS", 
+    36, 
+    "M", 
+    "BUFORD GA", 
+    1315, 
+    5620, 
+    429, 
+    5612
+  ], 
+  [
+    70, 
+    "BRIAN FRANK", 
+    42, 
+    "M", 
+    "ATLANTA GA", 
+    630, 
+    5621, 
+    430, 
+    5617
+  ], 
+  [
+    71, 
+    "JIM PARKER", 
+    51, 
+    "M", 
+    "CUMMING GA", 
+    1393, 
+    5623, 
+    430, 
+    5616
+  ], 
+  [
+    72, 
+    "DIRK MAISEL", 
+    41, 
+    "M", 
+    "CUMMING GA", 
+    1155, 
+    5623, 
+    430, 
+    5613
+  ], 
+  [
+    73, 
+    "RON TEED", 
+    41, 
+    "M", 
+    "ATLANTA GA", 
+    1814, 
+    5624, 
+    430, 
+    5617
+  ], 
+  [
+    74, 
+    "DEAN SHAW", 
+    45, 
+    "M", 
+    "KENNESAW GA", 
+    1658, 
+    5626, 
+    430, 
+    5623
+  ], 
+  [
+    75, 
+    "JOSHUA STEPHENS", 
+    21, 
+    "M", 
+    "MARIETTA GA", 
+    1762, 
+    5628, 
+    430, 
+    5625
+  ], 
+  [
+    76, 
+    "MICHAEL FIELDER", 
+    33, 
+    "M", 
+    "SMYRNA GA", 
+    598, 
+    5631, 
+    430, 
+    5620
+  ], 
+  [
+    77, 
+    "BRIAN KAUFMANN", 
+    50, 
+    "M", 
+    "MARIETTA GA", 
+    972, 
+    5635, 
+    431, 
+    5622
+  ], 
+  [
+    78, 
+    "TONY DICKS", 
+    36, 
+    "M", 
+    "WOODSTOCK GA", 
+    489, 
+    5673, 
+    434, 
+    5665
+  ], 
+  [
+    79, 
+    "JUSTIN BAKER", 
+    37, 
+    "M", 
+    "ATLANTA GA", 
+    82, 
+    5680, 
+    434, 
+    5675
+  ], 
+  [
+    80, 
+    "TAMMI KOLE", 
+    37, 
+    "F", 
+    "JOHNS CREEK GA", 
+    1019, 
+    5683, 
+    434, 
+    5678
+  ], 
+  [
+    81, 
+    "MIKE ERNSTES", 
+    52, 
+    "M", 
+    "MARIETTA GA", 
+    575, 
+    5704, 
+    436, 
+    5698
+  ], 
+  [
+    82, 
+    "DENNIS SITZMANN", 
+    44, 
+    "M", 
+    "MADISON GA", 
+    1691, 
+    5708, 
+    436, 
+    5701
+  ], 
+  [
+    83, 
+    "ANDREW SHANNON", 
+    23, 
+    "M", 
+    "ATLANTA GA", 
+    1651, 
+    5709, 
+    436, 
+    5704
+  ], 
+  [
+    84, 
+    "MATTHEW PORTER", 
+    30, 
+    "M", 
+    "ATLANTA GA", 
+    1458, 
+    5716, 
+    437, 
+    5681
+  ], 
+  [
+    85, 
+    "AARON DELAIGLE", 
+    24, 
+    "M", 
+    "OAKWOOD GA", 
+    467, 
+    5718, 
+    437, 
+    5712
+  ], 
+  [
+    86, 
+    "GRIFFEN ELLINGTON", 
+    39, 
+    "M", 
+    "CLARKSTON GA", 
+    563, 
+    5726, 
+    438, 
+    5722
+  ], 
+  [
+    87, 
+    "DEREK SCHILS", 
+    41, 
+    "M", 
+    "DALLAS GA", 
+    1604, 
+    5727, 
+    438, 
+    5713
+  ], 
+  [
+    88, 
+    "YVONNE BEDELL", 
+    33, 
+    "F", 
+    "DUNWOODY GA", 
+    136, 
+    5729, 
+    438, 
+    5721
+  ], 
+  [
+    89, 
+    "TIM WRIGHT", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    2009, 
+    5735, 
+    438, 
+    5729
+  ], 
+  [
+    90, 
+    "JASON HUYCK", 
+    35, 
+    "M", 
+    "CANTON GA", 
+    898, 
+    5738, 
+    438, 
+    5729
+  ], 
+  [
+    91, 
+    "BYRNE LAMB", 
+    42, 
+    "M", 
+    "ALPHARETTA GA", 
+    1050, 
+    5748, 
+    439, 
+    5692
+  ], 
+  [
+    92, 
+    "JOHN VOLTZ", 
+    38, 
+    "M", 
+    "LOGANVILLE GA", 
+    1894, 
+    5751, 
+    439, 
+    5745
+  ], 
+  [
+    93, 
+    "WES DUKE", 
+    43, 
+    "M", 
+    "ROSWELL GA", 
+    529, 
+    5755, 
+    440, 
+    5751
+  ], 
+  [
+    94, 
+    "MATTHEW THIBAULT", 
+    22, 
+    "M", 
+    "SAVAGE MN", 
+    1819, 
+    5759, 
+    440, 
+    5751
+  ], 
+  [
+    95, 
+    "SANDRA RIGGIN", 
+    49, 
+    "F", 
+    "SAUTEE GA", 
+    1529, 
+    5761, 
+    440, 
+    5759
+  ], 
+  [
+    96, 
+    "KEN ALMON", 
+    49, 
+    "M", 
+    "NORCROSS GA", 
+    36, 
+    5777, 
+    441, 
+    5773
+  ], 
+  [
+    97, 
+    "DAN MCCORMICK", 
+    51, 
+    "M", 
+    "MARIETTA GA", 
+    1200, 
+    5796, 
+    443, 
+    5788
+  ], 
+  [
+    98, 
+    "RYAN LEWIS", 
+    34, 
+    "M", 
+    "NEW FAIRFIELD CT", 
+    1094, 
+    5803, 
+    443, 
+    5796
+  ], 
+  [
+    99, 
+    "JASON TURNAGE", 
+    34, 
+    "M", 
+    "CANTON GA", 
+    1868, 
+    5805, 
+    444, 
+    5778
+  ], 
+  [
+    100, 
+    "KATIE HEINTZELMAN", 
+    37, 
+    "F", 
+    "MARIETTA GA", 
+    825, 
+    5806, 
+    444, 
+    5798
+  ], 
+  [
+    101, 
+    "TOM BRYSON", 
+    49, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    231, 
+    5809, 
+    444, 
+    5790
+  ], 
+  [
+    102, 
+    "TARA SARGENT", 
+    42, 
+    "F", 
+    "DALLAS GA", 
+    1595, 
+    5812, 
+    444, 
+    5805
+  ], 
+  [
+    103, 
+    "CHRIS RECKNOR", 
+    45, 
+    "M", 
+    "GAINESVILLE GA", 
+    1500, 
+    5816, 
+    444, 
+    5810
+  ], 
+  [
+    104, 
+    "MICHAEL TAYLOR HENDRIXSON", 
+    18, 
+    "M", 
+    "MARIETTA GA", 
+    828, 
+    5818, 
+    445, 
+    5780
+  ], 
+  [
+    105, 
+    "HEATH WOLFE", 
+    31, 
+    "M", 
+    "MARIETTA GA", 
+    1993, 
+    5820, 
+    445, 
+    5811
+  ], 
+  [
+    106, 
+    "MARC DAHLQUIST", 
+    28, 
+    "M", 
+    "CUMMING GA", 
+    429, 
+    5831, 
+    446, 
+    5818
+  ], 
+  [
+    107, 
+    "MIKE HENDRIXSON", 
+    47, 
+    "M", 
+    "MARIETTA GA", 
+    829, 
+    5845, 
+    447, 
+    5807
+  ], 
+  [
+    108, 
+    "PAUL SHINGLER", 
+    36, 
+    "M", 
+    "ATLANTA GA", 
+    1670, 
+    5847, 
+    447, 
+    5841
+  ], 
+  [
+    109, 
+    "MARIUS HECHTER", 
+    44, 
+    "M", 
+    "ATLANTA GA", 
+    823, 
+    5850, 
+    447, 
+    -1
+  ], 
+  [
+    110, 
+    "MELANIE COX", 
+    40, 
+    "F", 
+    "KNOXVILLE TN", 
+    398, 
+    5855, 
+    447, 
+    5849
+  ], 
+  [
+    111, 
+    "LINDSEY AMERSON", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    46, 
+    5874, 
+    449, 
+    5863
+  ], 
+  [
+    112, 
+    "JAMES MOON", 
+    44, 
+    "M", 
+    "ROSWELL GA", 
+    1300, 
+    5876, 
+    449, 
+    5865
+  ], 
+  [
+    113, 
+    "ASHLEY KEETON", 
+    33, 
+    "F", 
+    "SUWANEE GA", 
+    979, 
+    5880, 
+    449, 
+    5875
+  ], 
+  [
+    114, 
+    "JASON PALMER", 
+    25, 
+    "M", 
+    "ATLANTA GA", 
+    1389, 
+    5882, 
+    449, 
+    5877
+  ], 
+  [
+    115, 
+    "JEFF DROBNEY", 
+    44, 
+    "M", 
+    "ACWORTH GA", 
+    524, 
+    5898, 
+    451, 
+    5885
+  ], 
+  [
+    116, 
+    "MICHAEL BABCOCK", 
+    37, 
+    "M", 
+    "DECATUR GA", 
+    75, 
+    5899, 
+    451, 
+    5889
+  ], 
+  [
+    117, 
+    "DAWN HULTSTROM", 
+    43, 
+    "F", 
+    "WOODSTOCK GA", 
+    883, 
+    5904, 
+    451, 
+    5899
+  ], 
+  [
+    118, 
+    "AMY MAYER", 
+    37, 
+    "F", 
+    "DECATUR GA", 
+    1190, 
+    5904, 
+    451, 
+    5895
+  ], 
+  [
+    119, 
+    "JAMES BYRNES", 
+    54, 
+    "M", 
+    "HOSCHTON GA", 
+    265, 
+    5917, 
+    452, 
+    5911
+  ], 
+  [
+    120, 
+    "JAMES STANLEY", 
+    43, 
+    "M", 
+    "ACWORTH GA", 
+    1752, 
+    5919, 
+    452, 
+    5907
+  ], 
+  [
+    121, 
+    "FRED SOLLER", 
+    36, 
+    "M", 
+    "ALPHARETTA GA", 
+    2029, 
+    5920, 
+    452, 
+    5912
+  ], 
+  [
+    122, 
+    "KEVIN O'SULLIVAN", 
+    42, 
+    "M", 
+    "ATLANTA GA", 
+    1360, 
+    5921, 
+    452, 
+    5914
+  ], 
+  [
+    123, 
+    "ASHLEY JOHNSON", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    939, 
+    5921, 
+    452, 
+    5912
+  ], 
+  [
+    124, 
+    "STEVEN PHELPS", 
+    35, 
+    "M", 
+    "MARIETTA GA", 
+    1429, 
+    5936, 
+    454, 
+    5928
+  ], 
+  [
+    125, 
+    "SAMANTHA HACKETT", 
+    34, 
+    "F", 
+    "WOODSTOCK GA", 
+    751, 
+    5940, 
+    454, 
+    5926
+  ], 
+  [
+    126, 
+    "TIM GILLMAN", 
+    53, 
+    "M", 
+    "ROSWELL GA", 
+    695, 
+    5940, 
+    454, 
+    5932
+  ], 
+  [
+    127, 
+    "BRIAN WARREN", 
+    34, 
+    "M", 
+    "MARIETTA GA", 
+    1923, 
+    5945, 
+    454, 
+    5934
+  ], 
+  [
+    128, 
+    "STEVE GLEICHWEIT", 
+    41, 
+    "M", 
+    "MARIETTA GA", 
+    698, 
+    5957, 
+    455, 
+    5950
+  ], 
+  [
+    129, 
+    "SEAN FRICK", 
+    34, 
+    "M", 
+    "PEACHTREE CITY GA", 
+    643, 
+    5958, 
+    455, 
+    5927
+  ], 
+  [
+    130, 
+    "TOM LOACH", 
+    44, 
+    "M", 
+    "NORCROSS GA", 
+    1112, 
+    5972, 
+    456, 
+    5961
+  ], 
+  [
+    131, 
+    "KRISTA OSBORNE", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    1377, 
+    5982, 
+    457, 
+    5972
+  ], 
+  [
+    132, 
+    "CASEY KEETER", 
+    34, 
+    "F", 
+    "MARIETTA GA", 
+    978, 
+    5983, 
+    457, 
+    5980
+  ], 
+  [
+    133, 
+    "DAVID HOGAN", 
+    39, 
+    "M", 
+    "CUMMING GA", 
+    850, 
+    5987, 
+    457, 
+    5976
+  ], 
+  [
+    134, 
+    "PAUL TAYLOR", 
+    52, 
+    "M", 
+    "ATLANTA GA", 
+    1811, 
+    5989, 
+    458, 
+    5972
+  ], 
+  [
+    135, 
+    "BOBBY SMITH", 
+    57, 
+    "M", 
+    "SOUTH PITTSBURG TN", 
+    1702, 
+    5992, 
+    458, 
+    5988
+  ], 
+  [
+    136, 
+    "JORDAN EISON", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    562, 
+    5996, 
+    458, 
+    5993
+  ], 
+  [
+    137, 
+    "R BEAVER", 
+    30, 
+    "M", 
+    "ATLANTA GA", 
+    134, 
+    5998, 
+    458, 
+    5984
+  ], 
+  [
+    138, 
+    "BETH MCCURDY", 
+    41, 
+    "F", 
+    "DACULA GA", 
+    1206, 
+    6005, 
+    459, 
+    5996
+  ], 
+  [
+    139, 
+    "BARRY SNYDER", 
+    39, 
+    "M", 
+    "TUCKER GA", 
+    1721, 
+    6015, 
+    460, 
+    6008
+  ], 
+  [
+    140, 
+    "ENRIQUE (RICK) ALVAREZ", 
+    39, 
+    "M", 
+    "CHAMBLEE GA", 
+    42, 
+    6019, 
+    460, 
+    6005
+  ], 
+  [
+    141, 
+    "ANTHONY HARVEY", 
+    40, 
+    "M", 
+    "ALPHARETTA GA", 
+    805, 
+    6022, 
+    460, 
+    6010
+  ], 
+  [
+    142, 
+    "STEPHEN JANIS", 
+    41, 
+    "M", 
+    "DUNWOODY GA", 
+    920, 
+    6032, 
+    461, 
+    6026
+  ], 
+  [
+    143, 
+    "MARK SINGLETARY", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    1690, 
+    6037, 
+    461, 
+    6030
+  ], 
+  [
+    144, 
+    "RUSSELL DALBA", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    431, 
+    6040, 
+    462, 
+    6031
+  ], 
+  [
+    145, 
+    "KEELAN DIEHL", 
+    26, 
+    "M", 
+    "ATLANTA GA", 
+    490, 
+    6043, 
+    462, 
+    6008
+  ], 
+  [
+    146, 
+    "CHAD ADAMS", 
+    39, 
+    "M", 
+    "DECATUR GA", 
+    8, 
+    6046, 
+    462, 
+    6034
+  ], 
+  [
+    147, 
+    "SARAH HALBACH", 
+    33, 
+    "F", 
+    "MABLETON GA", 
+    756, 
+    6051, 
+    462, 
+    6038
+  ], 
+  [
+    148, 
+    "STEPHEN COCKERHAM", 
+    49, 
+    "M", 
+    "BLAIRSVILLE GA", 
+    351, 
+    6056, 
+    463, 
+    6048
+  ], 
+  [
+    149, 
+    "MARK WIMAN", 
+    53, 
+    "M", 
+    "ACWORTH GA", 
+    1986, 
+    6056, 
+    463, 
+    6038
+  ], 
+  [
+    150, 
+    "CURTISS SAMUEL", 
+    49, 
+    "M", 
+    "MARIETTA GA", 
+    1587, 
+    6056, 
+    463, 
+    6050
+  ], 
+  [
+    151, 
+    "PAUL LIPSEY", 
+    51, 
+    "M", 
+    "NEWNAN GA", 
+    1107, 
+    6057, 
+    463, 
+    6045
+  ], 
+  [
+    152, 
+    "JILL LOACH", 
+    45, 
+    "F", 
+    "NORCROSS GA", 
+    1111, 
+    6064, 
+    463, 
+    6054
+  ], 
+  [
+    153, 
+    "ROBERT OCHS", 
+    34, 
+    "M", 
+    "DACULA GA", 
+    1362, 
+    6068, 
+    464, 
+    6053
+  ], 
+  [
+    154, 
+    "JIM WALTERS", 
+    39, 
+    "M", 
+    "MABLETON GA", 
+    1910, 
+    6071, 
+    464, 
+    6064
+  ], 
+  [
+    155, 
+    "BOB DEBUSK", 
+    25, 
+    "M", 
+    "CARTERSVILLE GA", 
+    465, 
+    6072, 
+    464, 
+    6055
+  ], 
+  [
+    156, 
+    "BARRY MEREDITH JR", 
+    43, 
+    "M", 
+    "ATLANTA GA", 
+    1256, 
+    6073, 
+    464, 
+    6057
+  ], 
+  [
+    157, 
+    "BUDDY RABIN", 
+    58, 
+    "M", 
+    "MARIETTA GA", 
+    1479, 
+    6078, 
+    464, 
+    6066
+  ], 
+  [
+    158, 
+    "BRIAN GRAY", 
+    44, 
+    "M", 
+    "NORCROSS GA", 
+    722, 
+    6085, 
+    465, 
+    6070
+  ], 
+  [
+    159, 
+    "RACHELLE KURAMOTO", 
+    36, 
+    "F", 
+    "NORCROSS GA", 
+    1041, 
+    6086, 
+    465, 
+    6069
+  ], 
+  [
+    160, 
+    "VINCE BARTGES", 
+    29, 
+    "M", 
+    "ATLANTA GA", 
+    113, 
+    6095, 
+    466, 
+    6071
+  ], 
+  [
+    161, 
+    "CHUCK CARVER", 
+    50, 
+    "M", 
+    "ATLANTA GA", 
+    293, 
+    6095, 
+    466, 
+    6079
+  ], 
+  [
+    162, 
+    "BRANDON KUNZ", 
+    39, 
+    "M", 
+    "CUMMING GA", 
+    1040, 
+    6097, 
+    466, 
+    6086
+  ], 
+  [
+    163, 
+    "BILL JONES", 
+    52, 
+    "M", 
+    "ATLANTA GA", 
+    953, 
+    6097, 
+    466, 
+    6085
+  ], 
+  [
+    164, 
+    "RANDY LESTER", 
+    99, 
+    "M", 
+    "ACWORTH GA", 
+    1086, 
+    6098, 
+    466, 
+    6075
+  ], 
+  [
+    165, 
+    "ELIZABETH BROWN", 
+    45, 
+    "F", 
+    "DUNWOODY GA", 
+    217, 
+    6099, 
+    466, 
+    6096
+  ], 
+  [
+    166, 
+    "LARRY GORDON", 
+    58, 
+    "M", 
+    "DUNWOODY GA", 
+    711, 
+    6101, 
+    466, 
+    6095
+  ], 
+  [
+    167, 
+    "PAULA MUSONE", 
+    37, 
+    "F", 
+    "HOSCHTON GA", 
+    1327, 
+    6110, 
+    467, 
+    6102
+  ], 
+  [
+    168, 
+    "MARY HOWIE", 
+    40, 
+    "F", 
+    "DUNWOODY GA", 
+    876, 
+    6114, 
+    467, 
+    6110
+  ], 
+  [
+    169, 
+    "MOLLY HART", 
+    36, 
+    "F", 
+    "ALPHARETTA GA", 
+    800, 
+    6118, 
+    467, 
+    6107
+  ], 
+  [
+    170, 
+    "RONALD BYRNE", 
+    40, 
+    "M", 
+    "CUMMING GA", 
+    264, 
+    6126, 
+    468, 
+    6115
+  ], 
+  [
+    171, 
+    "BARRETT MERRILL", 
+    16, 
+    "M", 
+    "ATLANTA GA", 
+    1259, 
+    6127, 
+    468, 
+    6115
+  ], 
+  [
+    172, 
+    "JOE MCCOY", 
+    29, 
+    "M", 
+    "SMYRNA GA", 
+    1202, 
+    6132, 
+    469, 
+    6123
+  ], 
+  [
+    173, 
+    "SCOTT BOWMAN", 
+    43, 
+    "M", 
+    "ACWORTH GA", 
+    184, 
+    6137, 
+    469, 
+    6129
+  ], 
+  [
+    174, 
+    "CHARLIE PEEBLES", 
+    41, 
+    "M", 
+    "ALPHARETTA GA", 
+    1411, 
+    6138, 
+    469, 
+    6126
+  ], 
+  [
+    175, 
+    "WILLIAM FLETCHER", 
+    31, 
+    "M", 
+    "SMYRNA GA", 
+    613, 
+    6138, 
+    469, 
+    6103
+  ], 
+  [
+    176, 
+    "KIMARI WILSON", 
+    34, 
+    "F", 
+    "MABLETON GA", 
+    1979, 
+    6140, 
+    469, 
+    6128
+  ], 
+  [
+    177, 
+    "CHAD AKINS", 
+    40, 
+    "M", 
+    "CUMMING GA", 
+    21, 
+    6160, 
+    471, 
+    6144
+  ], 
+  [
+    178, 
+    "JENNY HOULROYD", 
+    29, 
+    "F", 
+    "MAREITTA GA", 
+    869, 
+    6163, 
+    471, 
+    6153
+  ], 
+  [
+    179, 
+    "MARK BLITZ", 
+    49, 
+    "M", 
+    "CLEARWATER FL", 
+    160, 
+    6166, 
+    471, 
+    6157
+  ], 
+  [
+    180, 
+    "KYLE PHILLIPPI", 
+    35, 
+    "M", 
+    "ROSWELL GA", 
+    1432, 
+    6167, 
+    471, 
+    6153
+  ], 
+  [
+    181, 
+    "ZACK NORDEN", 
+    19, 
+    "M", 
+    "ACWORTH GA", 
+    1351, 
+    6167, 
+    471, 
+    6163
+  ], 
+  [
+    182, 
+    "TRENT LLOYD", 
+    24, 
+    "M", 
+    "DECATUR GA", 
+    1110, 
+    6169, 
+    471, 
+    6159
+  ], 
+  [
+    183, 
+    "ANDREW DROTLEFF", 
+    48, 
+    "M", 
+    "ROSWELL GA", 
+    525, 
+    6169, 
+    471, 
+    6149
+  ], 
+  [
+    184, 
+    "JIMMY DALTON", 
+    52, 
+    "M", 
+    "ATLANTA GA", 
+    433, 
+    6175, 
+    472, 
+    6165
+  ], 
+  [
+    185, 
+    "ERIK DOWDEN", 
+    31, 
+    "M", 
+    "DECATUR GA", 
+    513, 
+    6184, 
+    472, 
+    6158
+  ], 
+  [
+    186, 
+    "JOHN STACK", 
+    31, 
+    "M", 
+    "MACON GA", 
+    1746, 
+    6195, 
+    473, 
+    6189
+  ], 
+  [
+    187, 
+    "JONATHAN MACDONALD", 
+    35, 
+    "M", 
+    "CUMMING GA", 
+    1142, 
+    6198, 
+    474, 
+    6178
+  ], 
+  [
+    188, 
+    "KENNETH KONDRITZER", 
+    59, 
+    "M", 
+    "ATLANTA GA", 
+    1020, 
+    6201, 
+    474, 
+    6198
+  ], 
+  [
+    189, 
+    "KAREN LUI", 
+    55, 
+    "F", 
+    "GAINESVILLE GA", 
+    1134, 
+    6204, 
+    474, 
+    6196
+  ], 
+  [
+    190, 
+    "DAVID FOURNIER", 
+    38, 
+    "M", 
+    "ATLANTA GA", 
+    628, 
+    6204, 
+    474, 
+    6197
+  ], 
+  [
+    191, 
+    "BJ MANN", 
+    37, 
+    "M", 
+    "ROSWELL GA", 
+    1165, 
+    6206, 
+    474, 
+    6186
+  ], 
+  [
+    192, 
+    "KEENAN SHARPE", 
+    42, 
+    "M", 
+    "ALPHARETTA GA", 
+    1653, 
+    6221, 
+    475, 
+    6216
+  ], 
+  [
+    193, 
+    "KENNETH TURNER", 
+    42, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    1871, 
+    6226, 
+    476, 
+    6216
+  ], 
+  [
+    194, 
+    "JASON WHITING", 
+    30, 
+    "M", 
+    "ATHENS GA", 
+    1962, 
+    6228, 
+    476, 
+    6221
+  ], 
+  [
+    195, 
+    "ROBERT ANTHONY", 
+    46, 
+    "M", 
+    "SMYRNA GA", 
+    59, 
+    6232, 
+    476, 
+    6216
+  ], 
+  [
+    196, 
+    "CHRISTIAN GRIFFITH", 
+    40, 
+    "M", 
+    "NORCROSS GA", 
+    740, 
+    6232, 
+    476, 
+    6205
+  ], 
+  [
+    197, 
+    "DOROTHY LINDSEY", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    1103, 
+    6233, 
+    476, 
+    6225
+  ], 
+  [
+    198, 
+    "DAVID JONES", 
+    55, 
+    "M", 
+    "ATLANTA GA", 
+    956, 
+    6237, 
+    477, 
+    6231
+  ], 
+  [
+    199, 
+    "RACHEL WHITING", 
+    30, 
+    "F", 
+    "ATHENS GA", 
+    1963, 
+    6239, 
+    477, 
+    6233
+  ], 
+  [
+    200, 
+    "MORRIS ESTES", 
+    44, 
+    "M", 
+    "ALPHARETTA GA", 
+    581, 
+    6243, 
+    477, 
+    6233
+  ], 
+  [
+    201, 
+    "STEVE ALTER", 
+    43, 
+    "M", 
+    "MARIETTA GA", 
+    41, 
+    6244, 
+    477, 
+    6238
+  ], 
+  [
+    202, 
+    "ERIK MOORE", 
+    43, 
+    "M", 
+    "ROSWELL GA", 
+    1302, 
+    6246, 
+    477, 
+    6233
+  ], 
+  [
+    203, 
+    "JONATHAN RUBIN", 
+    24, 
+    "M", 
+    "ATLANTA GA", 
+    1574, 
+    6247, 
+    477, 
+    6222
+  ], 
+  [
+    204, 
+    "RAE ANN MCCLAIN", 
+    39, 
+    "F", 
+    "KENNESAW GA", 
+    1198, 
+    6250, 
+    478, 
+    6235
+  ], 
+  [
+    205, 
+    "ERIC TUCKER", 
+    38, 
+    "M", 
+    "MENLO GA", 
+    1861, 
+    6251, 
+    478, 
+    6239
+  ], 
+  [
+    206, 
+    "MATTHEW WHEATLEY", 
+    33, 
+    "M", 
+    "DECATUR GA", 
+    1957, 
+    6251, 
+    478, 
+    6218
+  ], 
+  [
+    207, 
+    "CLAY MERSMANN", 
+    19, 
+    "M", 
+    "SNELLVILLE GA", 
+    1265, 
+    6253, 
+    478, 
+    6231
+  ], 
+  [
+    208, 
+    "KELLY LEFEVERE", 
+    23, 
+    "F", 
+    "ATLANTA OR", 
+    1081, 
+    6255, 
+    478, 
+    6239
+  ], 
+  [
+    209, 
+    "RITCHE CARNEY", 
+    55, 
+    "M", 
+    "ROSWELL GA", 
+    287, 
+    6259, 
+    478, 
+    6251
+  ], 
+  [
+    210, 
+    "CHRIS EHLERS", 
+    39, 
+    "M", 
+    "MABLETON GA", 
+    560, 
+    6263, 
+    479, 
+    6248
+  ], 
+  [
+    211, 
+    "BRIAN SIMMONS", 
+    38, 
+    "M", 
+    "DALLAS GA", 
+    1681, 
+    6265, 
+    479, 
+    6251
+  ], 
+  [
+    212, 
+    "TIMOTHY MERSMANN", 
+    49, 
+    "M", 
+    "SNELLVILLE GA", 
+    1266, 
+    6265, 
+    479, 
+    6243
+  ], 
+  [
+    213, 
+    "JIM UNDERWOOD", 
+    52, 
+    "M", 
+    "MARIETTA GA", 
+    1873, 
+    6266, 
+    479, 
+    6240
+  ], 
+  [
+    214, 
+    "MIKE MCHALE", 
+    43, 
+    "M", 
+    "SMYRNA GA", 
+    1222, 
+    6267, 
+    479, 
+    6262
+  ], 
+  [
+    215, 
+    "NICOLE BENCOMO", 
+    26, 
+    "F", 
+    "HIRAM GA", 
+    139, 
+    6268, 
+    479, 
+    6256
+  ], 
+  [
+    216, 
+    "KELLI MITTRUCKER", 
+    36, 
+    "F", 
+    "WOODSTOCK GA", 
+    1294, 
+    6270, 
+    479, 
+    6259
+  ], 
+  [
+    217, 
+    "SHAWN HARDISTER", 
+    46, 
+    "M", 
+    "ATLANTA GA", 
+    784, 
+    6277, 
+    480, 
+    6265
+  ], 
+  [
+    218, 
+    "KEVIN WEST", 
+    42, 
+    "M", 
+    "NORCROSS GA", 
+    1951, 
+    6279, 
+    480, 
+    6264
+  ], 
+  [
+    219, 
+    "STEPHANIE HAIGLER", 
+    34, 
+    "F", 
+    "KANNAPOLIS NC", 
+    755, 
+    6280, 
+    480, 
+    6266
+  ], 
+  [
+    220, 
+    "DONALD KNAPP", 
+    40, 
+    "M", 
+    "ALPHARETTA GA", 
+    1013, 
+    6280, 
+    480, 
+    6271
+  ], 
+  [
+    221, 
+    "VERNON SERMONS", 
+    54, 
+    "M", 
+    "MABLETON GA", 
+    1642, 
+    6281, 
+    480, 
+    6265
+  ], 
+  [
+    222, 
+    "JEFF BALLARD", 
+    37, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    87, 
+    6282, 
+    480, 
+    6270
+  ], 
+  [
+    223, 
+    "EZRA OWEN", 
+    34, 
+    "M", 
+    "KENNESAW GA", 
+    1380, 
+    6283, 
+    480, 
+    6268
+  ], 
+  [
+    224, 
+    "VERONICA ESTRADA", 
+    32, 
+    "F", 
+    "MARIETTA GA", 
+    582, 
+    6286, 
+    480, 
+    6278
+  ], 
+  [
+    225, 
+    "JULIE RECKNOR", 
+    47, 
+    "F", 
+    "GAINESVILLE GA", 
+    1501, 
+    6287, 
+    480, 
+    6281
+  ], 
+  [
+    226, 
+    "DAVID BROWN", 
+    52, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    216, 
+    6288, 
+    480, 
+    6284
+  ], 
+  [
+    227, 
+    "ARTHUR LYNN", 
+    46, 
+    "M", 
+    "ATLANTA GA", 
+    1139, 
+    6291, 
+    481, 
+    6277
+  ], 
+  [
+    228, 
+    "WINDY LOO", 
+    36, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    1123, 
+    6296, 
+    481, 
+    6268
+  ], 
+  [
+    229, 
+    "SERGIO TORRES", 
+    42, 
+    "M", 
+    "MARIETTA GA", 
+    1849, 
+    6298, 
+    481, 
+    6286
+  ], 
+  [
+    230, 
+    "TAMARA DANIEL", 
+    32, 
+    "F", 
+    "PEACHTREE CITY GA", 
+    438, 
+    6304, 
+    482, 
+    6296
+  ], 
+  [
+    231, 
+    "WALTER AUSTIN", 
+    39, 
+    "M", 
+    "MARIETTA GA", 
+    2033, 
+    6304, 
+    482, 
+    6286
+  ], 
+  [
+    232, 
+    "MIKE DYER", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    538, 
+    6308, 
+    482, 
+    6292
+  ], 
+  [
+    233, 
+    "DALE VANHOOSER", 
+    52, 
+    "M", 
+    "DULUTH GA", 
+    1884, 
+    6311, 
+    482, 
+    6284
+  ], 
+  [
+    234, 
+    "BRENT WYPER", 
+    41, 
+    "M", 
+    "ATLANTA GA", 
+    2012, 
+    6318, 
+    483, 
+    6301
+  ], 
+  [
+    235, 
+    "PETER ROBERTS", 
+    44, 
+    "M", 
+    "ATLANTA GA", 
+    1541, 
+    6319, 
+    483, 
+    6187
+  ], 
+  [
+    236, 
+    "MIKE CHALLMAN", 
+    48, 
+    "M", 
+    "FAYETTEVILLE GA", 
+    307, 
+    6321, 
+    483, 
+    6309
+  ], 
+  [
+    237, 
+    "WILLIAM KING", 
+    41, 
+    "M", 
+    "ATLANTA GA", 
+    1003, 
+    6325, 
+    483, 
+    6320
+  ], 
+  [
+    238, 
+    "JENNIFER ROWAN", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    240, 
+    6328, 
+    484, 
+    6318
+  ], 
+  [
+    239, 
+    "JILLIAN BURNS", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    250, 
+    6329, 
+    484, 
+    6319
+  ], 
+  [
+    240, 
+    "BRIAN LUCKETT", 
+    45, 
+    "M", 
+    "ATLANTA GA", 
+    1130, 
+    6330, 
+    484, 
+    6319
+  ], 
+  [
+    241, 
+    "TODD MITCHELL", 
+    47, 
+    "M", 
+    "VANCOUVER BC", 
+    1293, 
+    6333, 
+    484, 
+    6324
+  ], 
+  [
+    242, 
+    "DAVID NEUJAHR", 
+    37, 
+    "M", 
+    "ATLANTA GA", 
+    1341, 
+    6333, 
+    484, 
+    6324
+  ], 
+  [
+    243, 
+    "JAMES SALZER", 
+    50, 
+    "M", 
+    "DECATUR GA", 
+    1584, 
+    6338, 
+    484, 
+    6328
+  ], 
+  [
+    244, 
+    "AMY COBB", 
+    35, 
+    "F", 
+    "ATLANTA GA", 
+    346, 
+    6341, 
+    484, 
+    6335
+  ], 
+  [
+    245, 
+    "RANDY STANFORD", 
+    42, 
+    "M", 
+    "MCDONOUGH GA", 
+    1751, 
+    6343, 
+    485, 
+    6332
+  ], 
+  [
+    246, 
+    "DALE WESSON", 
+    35, 
+    "M", 
+    "NEWNAN GA", 
+    1950, 
+    6343, 
+    485, 
+    6326
+  ], 
+  [
+    247, 
+    "LAWRENCE LAMMERS", 
+    47, 
+    "M", 
+    "DACULA GA", 
+    1051, 
+    6352, 
+    485, 
+    6335
+  ], 
+  [
+    248, 
+    "FRANK DEMELFI, JR.", 
+    31, 
+    "M", 
+    "WOODSTOCK GA", 
+    2022, 
+    6362, 
+    486, 
+    6354
+  ], 
+  [
+    249, 
+    "VICTOR HALL", 
+    38, 
+    "M", 
+    "ATLANTA GA", 
+    766, 
+    6370, 
+    487, 
+    6316
+  ], 
+  [
+    250, 
+    "ANDY SMITH", 
+    32, 
+    "M", 
+    "ACWORTH GA", 
+    1700, 
+    6370, 
+    487, 
+    6366
+  ], 
+  [
+    251, 
+    "KATIE SCANLON", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    1600, 
+    6372, 
+    487, 
+    6365
+  ], 
+  [
+    252, 
+    "AMY BARKER", 
+    36, 
+    "F", 
+    "MABLETON GA", 
+    100, 
+    6373, 
+    487, 
+    -1
+  ], 
+  [
+    253, 
+    "JOHN MCRAE", 
+    32, 
+    "M", 
+    "ALPHARETTA GA", 
+    1244, 
+    6373, 
+    487, 
+    6291
+  ], 
+  [
+    254, 
+    "TOM KELLY", 
+    52, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    984, 
+    6375, 
+    487, 
+    6365
+  ], 
+  [
+    255, 
+    "BILL BOYNES", 
+    43, 
+    "M", 
+    "ATLANTA GA", 
+    187, 
+    6376, 
+    487, 
+    6263
+  ], 
+  [
+    256, 
+    "JONATHAN MERRILL", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    1261, 
+    6379, 
+    487, 
+    6367
+  ], 
+  [
+    257, 
+    "JOHN KAYAL", 
+    42, 
+    "M", 
+    "MARIETTA GA", 
+    973, 
+    6379, 
+    487, 
+    6319
+  ], 
+  [
+    258, 
+    "MATTHEW ANDERSON", 
+    25, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    53, 
+    6380, 
+    487, 
+    6366
+  ], 
+  [
+    259, 
+    "RICHARD HAMBRICK", 
+    33, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    770, 
+    6386, 
+    488, 
+    6372
+  ], 
+  [
+    260, 
+    "TIMOTHY EDWARDS", 
+    46, 
+    "M", 
+    "ALPHARETTA GA", 
+    557, 
+    6388, 
+    488, 
+    6373
+  ], 
+  [
+    261, 
+    "NICOLE HAWKINS", 
+    35, 
+    "F", 
+    "SMYRNA GA", 
+    817, 
+    6393, 
+    488, 
+    6382
+  ], 
+  [
+    262, 
+    "MAX DUMAS", 
+    44, 
+    "M", 
+    "MARIETTA GA", 
+    531, 
+    6397, 
+    489, 
+    6386
+  ], 
+  [
+    263, 
+    "TODD HENRY", 
+    39, 
+    "M", 
+    "CANTON GA", 
+    833, 
+    6405, 
+    489, 
+    6384
+  ], 
+  [
+    264, 
+    "JUAN GALARZA", 
+    45, 
+    "M", 
+    "MARIETTA GA", 
+    660, 
+    6408, 
+    490, 
+    6396
+  ], 
+  [
+    265, 
+    "JOSEPH HEINRICH", 
+    54, 
+    "M", 
+    "ATLANTA GA", 
+    824, 
+    6414, 
+    490, 
+    6397
+  ], 
+  [
+    266, 
+    "MICHAEL SMITH", 
+    42, 
+    "M", 
+    "ARNOLDSVILLE GA", 
+    1713, 
+    6418, 
+    490, 
+    6400
+  ], 
+  [
+    267, 
+    "PHILIP HARRELL", 
+    51, 
+    "M", 
+    "LILBURN GA", 
+    791, 
+    6419, 
+    490, 
+    6407
+  ], 
+  [
+    268, 
+    "CATHERINE BROWN", 
+    27, 
+    "F", 
+    "WARRENVILLE SC", 
+    214, 
+    6420, 
+    491, 
+    6397
+  ], 
+  [
+    269, 
+    "RYAN RICHARDS", 
+    24, 
+    "M", 
+    "DUNWOODY GA", 
+    1521, 
+    6423, 
+    491, 
+    6415
+  ], 
+  [
+    270, 
+    "STEVE WILSON", 
+    40, 
+    "M", 
+    "MARIETTA GA", 
+    1984, 
+    6432, 
+    491, 
+    6423
+  ], 
+  [
+    271, 
+    "NORMAN RICHARDSON", 
+    40, 
+    "M", 
+    "MABLETON GA", 
+    1522, 
+    6442, 
+    492, 
+    6431
+  ], 
+  [
+    272, 
+    "EMILIE HENRY", 
+    36, 
+    "F", 
+    "CANTON GA", 
+    832, 
+    6445, 
+    492, 
+    6425
+  ], 
+  [
+    273, 
+    "CLINT HAWKINS", 
+    31, 
+    "M", 
+    "SMYRNA GA", 
+    815, 
+    6449, 
+    493, 
+    6439
+  ], 
+  [
+    274, 
+    "DAVID CURRY", 
+    40, 
+    "M", 
+    "MCDONOUGH GA", 
+    425, 
+    6451, 
+    493, 
+    6443
+  ], 
+  [
+    275, 
+    "JOHN CHILDS", 
+    53, 
+    "M", 
+    "ATLANTA GA", 
+    326, 
+    6456, 
+    493, 
+    6439
+  ], 
+  [
+    276, 
+    "DONOVAN HAAG", 
+    37, 
+    "M", 
+    "DACULA GA", 
+    749, 
+    6458, 
+    493, 
+    6438
+  ], 
+  [
+    277, 
+    "KAREN CUNLIFFE", 
+    52, 
+    "F", 
+    "ATLANTA GA", 
+    415, 
+    6458, 
+    493, 
+    6444
+  ], 
+  [
+    278, 
+    "JANET FITZ", 
+    53, 
+    "F", 
+    "DACULA GA", 
+    604, 
+    6459, 
+    494, 
+    6441
+  ], 
+  [
+    279, 
+    "ANDY JOHNSON", 
+    28, 
+    "M", 
+    "CARROLLTON GA", 
+    936, 
+    6462, 
+    494, 
+    6426
+  ], 
+  [
+    280, 
+    "THOMAS STREET", 
+    47, 
+    "M", 
+    "ATLANTA GA", 
+    1769, 
+    6466, 
+    494, 
+    6451
+  ], 
+  [
+    281, 
+    "PHIL HURWITZ", 
+    43, 
+    "M", 
+    "DUNWOODY GA", 
+    894, 
+    6467, 
+    494, 
+    6446
+  ], 
+  [
+    282, 
+    "ELIZABETH BARTGES", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    112, 
+    6468, 
+    494, 
+    6445
+  ], 
+  [
+    283, 
+    "BRIAN MURRAY", 
+    27, 
+    "M", 
+    "DAHLONEGA GA", 
+    1325, 
+    6469, 
+    494, 
+    6430
+  ], 
+  [
+    284, 
+    "MARK WEINTRAUB", 
+    41, 
+    "M", 
+    "ROSWELL GA", 
+    1943, 
+    6471, 
+    494, 
+    6452
+  ], 
+  [
+    285, 
+    "KEN BUWALDA", 
+    49, 
+    "M", 
+    "ACWORTH GA", 
+    260, 
+    6476, 
+    495, 
+    6441
+  ], 
+  [
+    286, 
+    "LAURA MOSSING", 
+    22, 
+    "F", 
+    "DUNWOODY GA", 
+    1319, 
+    6481, 
+    495, 
+    6474
+  ], 
+  [
+    287, 
+    "CHRISSIE BURNS", 
+    35, 
+    "F", 
+    "ATLANTA GA", 
+    249, 
+    6485, 
+    495, 
+    6472
+  ], 
+  [
+    288, 
+    "CHRIS KALLIO", 
+    33, 
+    "M", 
+    "ATLANTA GA", 
+    964, 
+    6485, 
+    496, 
+    6472
+  ], 
+  [
+    289, 
+    "MICHAEL BAMBA", 
+    16, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    91, 
+    6486, 
+    496, 
+    6450
+  ], 
+  [
+    290, 
+    "JESSICA BURKHART", 
+    28, 
+    "F", 
+    "ATLANTA GA", 
+    248, 
+    6488, 
+    496, 
+    6467
+  ], 
+  [
+    291, 
+    "EMILY EDWARDS", 
+    37, 
+    "F", 
+    "ATLANTA GA", 
+    549, 
+    6489, 
+    496, 
+    6466
+  ], 
+  [
+    292, 
+    "STEVEN SCOLERI", 
+    39, 
+    "M", 
+    "PEACHTREE CITY GA", 
+    1624, 
+    6490, 
+    496, 
+    6452
+  ], 
+  [
+    293, 
+    "KELLY STEPHENS", 
+    35, 
+    "F", 
+    "SHARPSBURG GA", 
+    1763, 
+    6492, 
+    496, 
+    6455
+  ], 
+  [
+    294, 
+    "ERICA COCHRAN", 
+    41, 
+    "F", 
+    "CUMMING GA", 
+    349, 
+    6494, 
+    496, 
+    6479
+  ], 
+  [
+    295, 
+    "CHRIS FOX", 
+    30, 
+    "M", 
+    "ATLANTA GA", 
+    629, 
+    6495, 
+    496, 
+    6473
+  ], 
+  [
+    296, 
+    "ROB ST. JEAN", 
+    32, 
+    "M", 
+    "SMYRNA GA", 
+    1745, 
+    6500, 
+    497, 
+    6483
+  ], 
+  [
+    297, 
+    "SANDRA ABBOTT", 
+    54, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    6, 
+    6501, 
+    497, 
+    6494
+  ], 
+  [
+    298, 
+    "ROBERT REDHEAD", 
+    40, 
+    "M", 
+    "MARIETTA GA", 
+    1502, 
+    6502, 
+    497, 
+    6485
+  ], 
+  [
+    299, 
+    "DANIEL LECLERC", 
+    23, 
+    "M", 
+    "ATLANTA GA", 
+    1077, 
+    6503, 
+    497, 
+    6463
+  ], 
+  [
+    300, 
+    "JAMES SUMMERLIN", 
+    52, 
+    "M", 
+    "DACULA GA", 
+    1782, 
+    6504, 
+    497, 
+    6493
+  ], 
+  [
+    301, 
+    "KELSEY HAGAN", 
+    23, 
+    "F", 
+    "CARROLLTON GA", 
+    754, 
+    6512, 
+    498, 
+    6496
+  ], 
+  [
+    302, 
+    "ALICE ROUGEUX", 
+    26, 
+    "F", 
+    "ATLANTA GA", 
+    1568, 
+    6520, 
+    498, 
+    6484
+  ], 
+  [
+    303, 
+    "ROBERT TOMEY", 
+    46, 
+    "M", 
+    "MABLETON GA", 
+    1846, 
+    6521, 
+    498, 
+    6501
+  ], 
+  [
+    304, 
+    "CHAD DAVIS", 
+    31, 
+    "M", 
+    "ALPHARETTA GA", 
+    448, 
+    6527, 
+    499, 
+    6508
+  ], 
+  [
+    305, 
+    "WAYNE DOWNEY", 
+    44, 
+    "M", 
+    "BETHLEHEM GA", 
+    519, 
+    6529, 
+    499, 
+    6502
+  ], 
+  [
+    306, 
+    "BETH KRUMPER", 
+    34, 
+    "F", 
+    "ATLANTA GA", 
+    1032, 
+    6531, 
+    499, 
+    6516
+  ], 
+  [
+    307, 
+    "ROBERT LEWALLEN", 
+    39, 
+    "M", 
+    "ATLANTA GA", 
+    1088, 
+    6532, 
+    499, 
+    6517
+  ], 
+  [
+    308, 
+    "KEN BEATTY", 
+    37, 
+    "M", 
+    "ATLANTA GA", 
+    131, 
+    6538, 
+    500, 
+    6493
+  ], 
+  [
+    309, 
+    "KYLE COCHRAN", 
+    36, 
+    "M", 
+    "MABLETON GA", 
+    350, 
+    6538, 
+    500, 
+    6498
+  ], 
+  [
+    310, 
+    "JENS RAHBEK", 
+    41, 
+    "M", 
+    "SMYRNA GA", 
+    1485, 
+    6544, 
+    500, 
+    -1
+  ], 
+  [
+    311, 
+    "VINAYAK KULKARNI", 
+    47, 
+    "M", 
+    "ALPHARETTA GA", 
+    1039, 
+    6545, 
+    500, 
+    6522
+  ], 
+  [
+    312, 
+    "CHARLENE PREG", 
+    45, 
+    "F", 
+    "ATLANTA GA", 
+    1463, 
+    6546, 
+    500, 
+    6533
+  ], 
+  [
+    313, 
+    "TREI WENTZ", 
+    37, 
+    "M", 
+    "WOODSTOCK GA", 
+    1947, 
+    6555, 
+    501, 
+    6542
+  ], 
+  [
+    314, 
+    "ROB BYRAM", 
+    39, 
+    "M", 
+    "SUWANEE GA", 
+    261, 
+    6556, 
+    501, 
+    6537
+  ], 
+  [
+    315, 
+    "MELISSA LIBBY", 
+    47, 
+    "F", 
+    "ATLANTA GA", 
+    1097, 
+    6562, 
+    501, 
+    6552
+  ], 
+  [
+    316, 
+    "RYAN STRONG", 
+    35, 
+    "M", 
+    "ALPHARETTA GA", 
+    1772, 
+    6563, 
+    501, 
+    6545
+  ], 
+  [
+    317, 
+    "MICHAEL MCLAUGHLIN", 
+    43, 
+    "M", 
+    "NORCROSS GA", 
+    1232, 
+    6564, 
+    501, 
+    6545
+  ], 
+  [
+    318, 
+    "BENJAMIN COLLIER", 
+    34, 
+    "M", 
+    "MCDONOUGH GA", 
+    363, 
+    6567, 
+    502, 
+    6549
+  ], 
+  [
+    319, 
+    "SUNG FLEMMING", 
+    49, 
+    "F", 
+    "SUGARHILL GA", 
+    611, 
+    6569, 
+    502, 
+    6525
+  ], 
+  [
+    320, 
+    "NEIL HUTCHINSON", 
+    37, 
+    "M", 
+    "ROSWELL GA", 
+    896, 
+    6572, 
+    502, 
+    6546
+  ], 
+  [
+    321, 
+    "BRADLEY FULKERSON", 
+    48, 
+    "M", 
+    "MARIETTA GA", 
+    651, 
+    6573, 
+    502, 
+    6566
+  ], 
+  [
+    322, 
+    "JENNIFER TUCKER", 
+    34, 
+    "F", 
+    "MARIETTA GA", 
+    1862, 
+    6573, 
+    502, 
+    6558
+  ], 
+  [
+    323, 
+    "JEREMY GREENWELL", 
+    35, 
+    "M", 
+    "SMYRNA GA", 
+    730, 
+    6575, 
+    502, 
+    6544
+  ], 
+  [
+    324, 
+    "CARRIE DIX", 
+    47, 
+    "F", 
+    "ROSWELL GA", 
+    494, 
+    6580, 
+    503, 
+    6565
+  ], 
+  [
+    325, 
+    "PATRICK GRAFFIUS", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    715, 
+    6582, 
+    503, 
+    6566
+  ], 
+  [
+    326, 
+    "GLENN GRAVES", 
+    47, 
+    "M", 
+    "DOUGLASVILLE GA", 
+    718, 
+    6583, 
+    503, 
+    6549
+  ], 
+  [
+    327, 
+    "JON PICKENS", 
+    36, 
+    "M", 
+    "ROSWELL GA", 
+    1440, 
+    6585, 
+    503, 
+    6571
+  ], 
+  [
+    328, 
+    "JOHN EDWARDS, JR.", 
+    45, 
+    "M", 
+    "RADCLIFF KY", 
+    558, 
+    6588, 
+    503, 
+    6560
+  ], 
+  [
+    329, 
+    "ERIC COONEY", 
+    49, 
+    "M", 
+    "MARIETTA GA", 
+    381, 
+    6588, 
+    503, 
+    6557
+  ], 
+  [
+    330, 
+    "BRITT JONES", 
+    36, 
+    "M", 
+    "MARIETTA GA", 
+    954, 
+    6590, 
+    504, 
+    6558
+  ], 
+  [
+    331, 
+    "ELENA JOHNSON", 
+    31, 
+    "F", 
+    "ALPHARETTA GA", 
+    944, 
+    6593, 
+    504, 
+    6485
+  ], 
+  [
+    332, 
+    "TOM MAKRIDES", 
+    51, 
+    "M", 
+    "MILTON GA", 
+    1157, 
+    6594, 
+    504, 
+    6526
+  ], 
+  [
+    333, 
+    "KARA QUINCY", 
+    39, 
+    "F", 
+    "CUMMING GA", 
+    1477, 
+    6594, 
+    504, 
+    6582
+  ], 
+  [
+    334, 
+    "JENNIFER HASSON", 
+    39, 
+    "F", 
+    "ROSWELL GA", 
+    811, 
+    6594, 
+    504, 
+    6579
+  ], 
+  [
+    335, 
+    "DAVID HURST", 
+    38, 
+    "M", 
+    "WOODSTOCK GA", 
+    893, 
+    6594, 
+    504, 
+    6569
+  ], 
+  [
+    336, 
+    "MAUREEN UNDERWOOD", 
+    43, 
+    "F", 
+    "ROSWELL GA", 
+    1874, 
+    6596, 
+    504, 
+    6581
+  ], 
+  [
+    337, 
+    "NATALIE WITT", 
+    40, 
+    "F", 
+    "ATLANTA GA", 
+    1991, 
+    6596, 
+    504, 
+    6554
+  ], 
+  [
+    338, 
+    "LISA MARCINEK", 
+    34, 
+    "F", 
+    "CUMMING GA", 
+    1168, 
+    6597, 
+    504, 
+    6585
+  ], 
+  [
+    339, 
+    "JOHN HYLAND", 
+    38, 
+    "M", 
+    "ALPHARETTA GA", 
+    901, 
+    6598, 
+    504, 
+    6579
+  ], 
+  [
+    340, 
+    "TOM HYLAND", 
+    46, 
+    "M", 
+    "AVON LAKE OH", 
+    902, 
+    6599, 
+    504, 
+    6579
+  ], 
+  [
+    341, 
+    "JEREMY HENSON", 
+    35, 
+    "M", 
+    "NEWNAN GA", 
+    835, 
+    6599, 
+    504, 
+    6585
+  ], 
+  [
+    342, 
+    "MATTHEW RIGDON", 
+    31, 
+    "M", 
+    "CALHOUN GA", 
+    2028, 
+    6599, 
+    504, 
+    6582
+  ], 
+  [
+    343, 
+    "SARAH LANGVILLE", 
+    29, 
+    "F", 
+    "ATLANTA GA", 
+    1054, 
+    6605, 
+    505, 
+    6559
+  ], 
+  [
+    344, 
+    "CHRISTOPHER FRATTO", 
+    36, 
+    "M", 
+    "SMYRNA GA", 
+    635, 
+    6607, 
+    505, 
+    6482
+  ], 
+  [
+    345, 
+    "JAMES HARRIS", 
+    46, 
+    "M", 
+    "ATLANTA GA", 
+    796, 
+    6609, 
+    505, 
+    6600
+  ], 
+  [
+    346, 
+    "BRANDON FAYE", 
+    39, 
+    "M", 
+    "MARIETTA GA", 
+    591, 
+    6611, 
+    505, 
+    6570
+  ], 
+  [
+    347, 
+    "SCOTT STAFFORD", 
+    38, 
+    "M", 
+    "SMYRNA GA", 
+    1748, 
+    6612, 
+    505, 
+    6563
+  ], 
+  [
+    348, 
+    "STEVE BERREY", 
+    41, 
+    "M", 
+    "ROSWELL GA", 
+    149, 
+    6613, 
+    505, 
+    6588
+  ], 
+  [
+    349, 
+    "KYLE ZAUNBRECHER", 
+    27, 
+    "M", 
+    "BIRMINGHAM AL", 
+    2020, 
+    6614, 
+    505, 
+    6596
+  ], 
+  [
+    350, 
+    "JASON TOOLE", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    1848, 
+    6617, 
+    506, 
+    6575
+  ], 
+  [
+    351, 
+    "MATTHEW WOLFE", 
+    39, 
+    "M", 
+    "DECATUR GA", 
+    1995, 
+    6618, 
+    506, 
+    6578
+  ], 
+  [
+    352, 
+    "BRYAN JACKSON", 
+    41, 
+    "M", 
+    "SANDY SPRINGS GA", 
+    908, 
+    6621, 
+    506, 
+    6603
+  ], 
+  [
+    353, 
+    "TOM VANN", 
+    38, 
+    "M", 
+    "ROSWELL GA", 
+    1885, 
+    6622, 
+    506, 
+    6609
+  ], 
+  [
+    354, 
+    "LEONARDO GARCIA", 
+    36, 
+    "M", 
+    "NEWNAN GA", 
+    668, 
+    6624, 
+    506, 
+    6588
+  ], 
+  [
+    355, 
+    "CHRIS KYRIAKAKIS", 
+    38, 
+    "M", 
+    "DULUTH GA", 
+    1043, 
+    6628, 
+    506, 
+    6609
+  ], 
+  [
+    356, 
+    "CAROLYN SULLIVAN", 
+    27, 
+    "F", 
+    "ACWORTH GA", 
+    1779, 
+    6629, 
+    506, 
+    6595
+  ], 
+  [
+    357, 
+    "KELLY NORTON", 
+    36, 
+    "M", 
+    "DECATUR GA", 
+    1352, 
+    6631, 
+    507, 
+    6551
+  ], 
+  [
+    358, 
+    "JENNIFER COLEMAN", 
+    35, 
+    "F", 
+    "MOBILE AL", 
+    362, 
+    6632, 
+    507, 
+    6603
+  ], 
+  [
+    359, 
+    "JANE GROVER", 
+    37, 
+    "F", 
+    "GRAYSON GA", 
+    744, 
+    6633, 
+    507, 
+    6611
+  ], 
+  [
+    360, 
+    "ASHLEY CHURCH", 
+    35, 
+    "F", 
+    "ALTANTA GA", 
+    331, 
+    6637, 
+    507, 
+    6616
+  ], 
+  [
+    361, 
+    "SCOTT MARTIN", 
+    39, 
+    "M", 
+    "ATLANTA GA", 
+    1178, 
+    6663, 
+    509, 
+    6649
+  ], 
+  [
+    362, 
+    "MATTHEW LOGAN", 
+    43, 
+    "M", 
+    "ACWORTH GA", 
+    1117, 
+    6664, 
+    509, 
+    6645
+  ], 
+  [
+    363, 
+    "MITCHELL SALAIN", 
+    41, 
+    "M", 
+    "DAHLONEGA GA", 
+    1581, 
+    6664, 
+    509, 
+    6615
+  ], 
+  [
+    364, 
+    "ALAN MORELLI", 
+    55, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    1310, 
+    6667, 
+    509, 
+    6629
+  ], 
+  [
+    365, 
+    "KEVIN HEATH", 
+    39, 
+    "M", 
+    "SMRYNA GA", 
+    822, 
+    6668, 
+    509, 
+    6637
+  ], 
+  [
+    366, 
+    "JEFF GANTT", 
+    23, 
+    "M", 
+    "MARIETTA GA", 
+    667, 
+    6668, 
+    509, 
+    6650
+  ], 
+  [
+    367, 
+    "DAVID BOFF", 
+    39, 
+    "M", 
+    "KENNESAW GA", 
+    166, 
+    6674, 
+    510, 
+    6658
+  ], 
+  [
+    368, 
+    "CAREY HYDE", 
+    49, 
+    "F", 
+    "MABLETON GA", 
+    900, 
+    6676, 
+    510, 
+    6651
+  ], 
+  [
+    369, 
+    "KRISTIN WHITE", 
+    40, 
+    "F", 
+    "ALPHARETTA GA", 
+    1960, 
+    6682, 
+    511, 
+    6641
+  ], 
+  [
+    370, 
+    "NICHOLE LEWIS", 
+    40, 
+    "F", 
+    "NEW FAIRFIELD CT", 
+    1093, 
+    6687, 
+    511, 
+    6671
+  ], 
+  [
+    371, 
+    "ANDREAS BOMMARIUS", 
+    51, 
+    "M", 
+    "ATLANTA GA", 
+    170, 
+    6689, 
+    511, 
+    6680
+  ], 
+  [
+    372, 
+    "JEREMY SELLARS", 
+    31, 
+    "M", 
+    "MARIETTA GA", 
+    1637, 
+    6690, 
+    511, 
+    6640
+  ], 
+  [
+    373, 
+    "KENDRA SELLARS", 
+    30, 
+    "F", 
+    "MARIETTA GA", 
+    1638, 
+    6690, 
+    511, 
+    6640
+  ], 
+  [
+    374, 
+    "SCOTT NADER", 
+    40, 
+    "M", 
+    "ROSWELL GA", 
+    1331, 
+    6691, 
+    511, 
+    6680
+  ], 
+  [
+    375, 
+    "JAMES N WOODRUFF", 
+    53, 
+    "M", 
+    "ATLANTA GA", 
+    2000, 
+    6692, 
+    511, 
+    6673
+  ], 
+  [
+    376, 
+    "A SWEET", 
+    45, 
+    "F", 
+    "ALPHARETTA GA", 
+    1793, 
+    6694, 
+    511, 
+    6673
+  ], 
+  [
+    377, 
+    "SCOTT GOLDEN", 
+    40, 
+    "M", 
+    "SMYRNA GA", 
+    703, 
+    6696, 
+    512, 
+    6676
+  ], 
+  [
+    378, 
+    "MARYANNA HALL", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    763, 
+    6700, 
+    512, 
+    6684
+  ], 
+  [
+    379, 
+    "SHANE CRIDER", 
+    28, 
+    "M", 
+    "DOUGLASVILLE GA", 
+    405, 
+    6701, 
+    512, 
+    6694
+  ], 
+  [
+    380, 
+    "JANET HALL", 
+    43, 
+    "F", 
+    "MARIETTA GA", 
+    762, 
+    6701, 
+    512, 
+    6683
+  ], 
+  [
+    381, 
+    "REID DAVIS", 
+    39, 
+    "M", 
+    "ATLANTA GA", 
+    453, 
+    6702, 
+    512, 
+    6679
+  ], 
+  [
+    382, 
+    "BRETT HASLAM", 
+    38, 
+    "M", 
+    "BISHOP GA", 
+    810, 
+    6705, 
+    512, 
+    6690
+  ], 
+  [
+    383, 
+    "ALYSON HASLAM", 
+    35, 
+    "F", 
+    "BISHOP GA", 
+    809, 
+    6705, 
+    512, 
+    6691
+  ], 
+  [
+    384, 
+    "CALVIN COOK", 
+    32, 
+    "M", 
+    "WOODSTOCK GA", 
+    374, 
+    6705, 
+    512, 
+    6673
+  ], 
+  [
+    385, 
+    "DOUG CUNNINGTON", 
+    31, 
+    "M", 
+    "DUNWOODY GA", 
+    419, 
+    6706, 
+    512, 
+    6680
+  ], 
+  [
+    386, 
+    "HILDE THOMAS", 
+    49, 
+    "F", 
+    "CARROLLTON GA", 
+    1820, 
+    6706, 
+    512, 
+    6689
+  ], 
+  [
+    387, 
+    "CHRISTOPHER BROWN", 
+    25, 
+    "M", 
+    "ATLANTA GA", 
+    215, 
+    6707, 
+    512, 
+    6686
+  ], 
+  [
+    388, 
+    "ASHLEY BROWN", 
+    26, 
+    "F", 
+    "ATLANTA SC", 
+    212, 
+    6708, 
+    512, 
+    6687
+  ], 
+  [
+    389, 
+    "RICK GALLOWAY", 
+    38, 
+    "M", 
+    "KENNESAW GA", 
+    665, 
+    6709, 
+    513, 
+    6659
+  ], 
+  [
+    390, 
+    "GREG SHILLING", 
+    43, 
+    "M", 
+    "CARROLLTON GA", 
+    1668, 
+    6711, 
+    513, 
+    6681
+  ], 
+  [
+    391, 
+    "DIANE MCHORNEY", 
+    38, 
+    "F", 
+    "ACWORTH GA", 
+    1224, 
+    6716, 
+    513, 
+    6701
+  ], 
+  [
+    392, 
+    "BRITTANY ATKINSON", 
+    31, 
+    "F", 
+    "MILTON GA", 
+    69, 
+    6717, 
+    513, 
+    6660
+  ], 
+  [
+    393, 
+    "BRIAN FRONK", 
+    27, 
+    "M", 
+    "ATLANTA GA", 
+    649, 
+    6719, 
+    513, 
+    6691
+  ], 
+  [
+    394, 
+    "RYAN ASCHAUER", 
+    33, 
+    "M", 
+    "ATLANTA GA", 
+    66, 
+    6724, 
+    514, 
+    6687
+  ], 
+  [
+    395, 
+    "TRACI GOWENS", 
+    40, 
+    "F", 
+    "DULUTH GA", 
+    713, 
+    6726, 
+    514, 
+    6559
+  ], 
+  [
+    396, 
+    "JENNIFER STEPHENS", 
+    27, 
+    "F", 
+    "SMYRNA GA", 
+    1761, 
+    6727, 
+    514, 
+    6706
+  ], 
+  [
+    397, 
+    "KIRA DUNKERLEY", 
+    39, 
+    "F", 
+    "DUNWOODY GA", 
+    532, 
+    6729, 
+    514, 
+    6712
+  ], 
+  [
+    398, 
+    "MARIO BACCE", 
+    52, 
+    "M", 
+    "MARIETTA GA", 
+    76, 
+    6731, 
+    514, 
+    6718
+  ], 
+  [
+    399, 
+    "KELLY MCNEARNEY", 
+    42, 
+    "F", 
+    "ACWORTH GA", 
+    1239, 
+    6732, 
+    514, 
+    6702
+  ], 
+  [
+    400, 
+    "GLENN HOWELL", 
+    42, 
+    "M", 
+    "LILBURN GA", 
+    875, 
+    6732, 
+    514, 
+    6713
+  ], 
+  [
+    401, 
+    "HAZEL CALDWELL", 
+    32, 
+    "F", 
+    "FORSYTH GA", 
+    270, 
+    6733, 
+    514, 
+    6651
+  ], 
+  [
+    402, 
+    "NICOLE JAYNE", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    924, 
+    6736, 
+    515, 
+    6653
+  ], 
+  [
+    403, 
+    "CHARLES CAYCE", 
+    44, 
+    "M", 
+    "CUMMING GA", 
+    303, 
+    6736, 
+    515, 
+    6714
+  ], 
+  [
+    404, 
+    "BISHOP LEATHERBURY", 
+    58, 
+    "M", 
+    "ATLANTA GA", 
+    1075, 
+    6742, 
+    515, 
+    6707
+  ], 
+  [
+    405, 
+    "DAVID SPEACH", 
+    34, 
+    "M", 
+    "CARTERSVILLE GA", 
+    1729, 
+    6743, 
+    515, 
+    6726
+  ], 
+  [
+    406, 
+    "EMELINE ABEITA", 
+    33, 
+    "F", 
+    "ATLANTA GA", 
+    7, 
+    6744, 
+    515, 
+    6721
+  ], 
+  [
+    407, 
+    "KERRI MCMAHON", 
+    34, 
+    "F", 
+    "DACULA GA", 
+    1234, 
+    6745, 
+    515, 
+    6714
+  ], 
+  [
+    408, 
+    "KEITH JERNIGAN", 
+    45, 
+    "M", 
+    "SUWANEE GA", 
+    932, 
+    6747, 
+    515, 
+    6716
+  ], 
+  [
+    409, 
+    "MELANIE PHILLIPS", 
+    38, 
+    "F", 
+    "CANTON GA", 
+    1436, 
+    6749, 
+    516, 
+    6691
+  ], 
+  [
+    410, 
+    "EARL SHARPE", 
+    44, 
+    "M", 
+    "DULUTH GA", 
+    1652, 
+    6751, 
+    516, 
+    6717
+  ], 
+  [
+    411, 
+    "AMANDA WRUBEL", 
+    35, 
+    "F", 
+    "ATLANTA GA", 
+    2010, 
+    6752, 
+    516, 
+    6708
+  ], 
+  [
+    412, 
+    "KIMBERLEY HALE", 
+    38, 
+    "F", 
+    "NORCROSS GA", 
+    758, 
+    6752, 
+    516, 
+    6736
+  ], 
+  [
+    413, 
+    "GARY MARTIN", 
+    45, 
+    "M", 
+    "ALPHARETTA GA", 
+    1174, 
+    6753, 
+    516, 
+    6729
+  ], 
+  [
+    414, 
+    "ANGELA FREEMAN", 
+    45, 
+    "F", 
+    "ROSWELL GA", 
+    640, 
+    6755, 
+    516, 
+    6740
+  ], 
+  [
+    415, 
+    "CARLOS TALLEY", 
+    99, 
+    "M", 
+    "MARIETTA GA", 
+    1799, 
+    6757, 
+    516, 
+    6665
+  ], 
+  [
+    416, 
+    "CATHERINE HASH", 
+    38, 
+    "F", 
+    "CUMMING GA", 
+    808, 
+    6759, 
+    516, 
+    6735
+  ], 
+  [
+    417, 
+    "JOHN SWANSON", 
+    45, 
+    "M", 
+    "ATLANTA GA", 
+    1790, 
+    6760, 
+    516, 
+    6743
+  ], 
+  [
+    418, 
+    "ALLISON SPEARS", 
+    40, 
+    "F", 
+    "ATLANTA GA", 
+    1732, 
+    6761, 
+    517, 
+    6741
+  ], 
+  [
+    419, 
+    "BETH STUDLEY", 
+    38, 
+    "F", 
+    "SMYRNA GA", 
+    1774, 
+    6766, 
+    517, 
+    6729
+  ], 
+  [
+    420, 
+    "JODI JACKSON", 
+    39, 
+    "F", 
+    "SANDY SPRINGS GA", 
+    909, 
+    6767, 
+    517, 
+    -1
+  ], 
+  [
+    421, 
+    "THOMAS RUSSE", 
+    56, 
+    "M", 
+    "CHATTANOOGA TN", 
+    1576, 
+    6773, 
+    517, 
+    6764
+  ], 
+  [
+    422, 
+    "DERRICK FRIEDMAN", 
+    38, 
+    "M", 
+    "ALPHARETTA GA", 
+    646, 
+    6773, 
+    517, 
+    6759
+  ], 
+  [
+    423, 
+    "SCOTT BALLARD", 
+    46, 
+    "M", 
+    "WOODSTOCK GA", 
+    88, 
+    6775, 
+    518, 
+    6732
+  ], 
+  [
+    424, 
+    "LYNN HOWE", 
+    49, 
+    "F", 
+    "JONESBORO GA", 
+    874, 
+    6775, 
+    518, 
+    6753
+  ], 
+  [
+    425, 
+    "KAREN MATHEWS", 
+    45, 
+    "F", 
+    "ROSWELL GA", 
+    1185, 
+    6778, 
+    518, 
+    6758
+  ], 
+  [
+    426, 
+    "CRAIG CURRENT", 
+    45, 
+    "M", 
+    "MARIETTA GA", 
+    423, 
+    6779, 
+    518, 
+    6667
+  ], 
+  [
+    427, 
+    "JOSE RIVERA", 
+    29, 
+    "M", 
+    "MARIETTA GA", 
+    1534, 
+    6780, 
+    518, 
+    6745
+  ], 
+  [
+    428, 
+    "CHRISTOPHER TUFF", 
+    30, 
+    "F", 
+    "ATLANTA GA", 
+    1865, 
+    6781, 
+    518, 
+    6758
+  ], 
+  [
+    429, 
+    "FRANK DEMELFI", 
+    58, 
+    "M", 
+    "MARIETTA GA", 
+    472, 
+    6782, 
+    518, 
+    6750
+  ], 
+  [
+    430, 
+    "RAMON DEMPERS", 
+    52, 
+    "M", 
+    "ALPHARETTA GA", 
+    477, 
+    6783, 
+    518, 
+    6762
+  ], 
+  [
+    431, 
+    "SARAH RANK", 
+    33, 
+    "F", 
+    "LAGRANGE GA", 
+    1492, 
+    6784, 
+    518, 
+    6752
+  ], 
+  [
+    432, 
+    "JULIE TUFF", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    1866, 
+    6787, 
+    519, 
+    6764
+  ], 
+  [
+    433, 
+    "MATT COSSON", 
+    37, 
+    "M", 
+    "HOSCHTON GA", 
+    388, 
+    6789, 
+    519, 
+    6752
+  ], 
+  [
+    434, 
+    "NIKKI BLYSTONE", 
+    32, 
+    "F", 
+    "ELLENWOOD GA", 
+    163, 
+    6789, 
+    519, 
+    6728
+  ], 
+  [
+    435, 
+    "TIMOTHY GRANT", 
+    40, 
+    "M", 
+    "MACON GA", 
+    717, 
+    6789, 
+    519, 
+    6774
+  ], 
+  [
+    436, 
+    "MARISA WHEATLEY", 
+    31, 
+    "F", 
+    "DECATUR GA", 
+    1956, 
+    6790, 
+    519, 
+    6756
+  ], 
+  [
+    437, 
+    "CHAD LORD", 
+    37, 
+    "M", 
+    "SUGAR HILL GA", 
+    1126, 
+    6791, 
+    519, 
+    6690
+  ], 
+  [
+    438, 
+    "MICHELLE DAVIDSON", 
+    42, 
+    "F", 
+    "MABLETON GA", 
+    447, 
+    6791, 
+    519, 
+    6659
+  ], 
+  [
+    439, 
+    "NICK ERNESTON", 
+    29, 
+    "M", 
+    "SMYRNA GA", 
+    573, 
+    6792, 
+    519, 
+    6779
+  ], 
+  [
+    440, 
+    "MICHAEL BALLOU", 
+    25, 
+    "M", 
+    "SMYRNA GA", 
+    89, 
+    6793, 
+    519, 
+    6732
+  ], 
+  [
+    441, 
+    "KAREN ANDERSON", 
+    45, 
+    "F", 
+    "COVINGTON GA", 
+    51, 
+    6794, 
+    519, 
+    6766
+  ], 
+  [
+    442, 
+    "TOMMY DANCE", 
+    39, 
+    "M", 
+    "WOODSTOCK GA", 
+    435, 
+    6794, 
+    519, 
+    6756
+  ], 
+  [
+    443, 
+    "DUSTY SHARPES", 
+    24, 
+    "M", 
+    "ATLANTA GA", 
+    1654, 
+    6799, 
+    519, 
+    6756
+  ], 
+  [
+    444, 
+    "JENNIFER PHILLIPPI", 
+    37, 
+    "F", 
+    "ROSWELL GA", 
+    1431, 
+    6800, 
+    519, 
+    6767
+  ], 
+  [
+    445, 
+    "KRISTI COX", 
+    33, 
+    "F", 
+    "MARIETTA GA", 
+    397, 
+    6801, 
+    520, 
+    6766
+  ], 
+  [
+    446, 
+    "BO JACKSON", 
+    33, 
+    "M", 
+    "CANTON GA", 
+    907, 
+    6801, 
+    520, 
+    6774
+  ], 
+  [
+    447, 
+    "KIRSTEN SHARPES", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    1655, 
+    6803, 
+    520, 
+    6780
+  ], 
+  [
+    448, 
+    "MATTHEW RACK", 
+    34, 
+    "M", 
+    "HIXSON TN", 
+    1481, 
+    6804, 
+    520, 
+    6740
+  ], 
+  [
+    449, 
+    "BEN WAITES", 
+    48, 
+    "M", 
+    "SUWANEE GA", 
+    1897, 
+    6809, 
+    520, 
+    6782
+  ], 
+  [
+    450, 
+    "VINNIE CUPOLI", 
+    40, 
+    "M", 
+    "JOHNS CREEK GA", 
+    420, 
+    6823, 
+    521, 
+    6808
+  ], 
+  [
+    451, 
+    "STEVE SEGARS", 
+    40, 
+    "M", 
+    "BRASELTON GA", 
+    1633, 
+    6826, 
+    522, 
+    6822
+  ], 
+  [
+    452, 
+    "ANDY PARSONS", 
+    40, 
+    "M", 
+    "CUMMING GA", 
+    1400, 
+    6829, 
+    522, 
+    6812
+  ], 
+  [
+    453, 
+    "JAKE EAVENSON", 
+    21, 
+    "M", 
+    "ATLANTA GA", 
+    544, 
+    6830, 
+    522, 
+    6796
+  ], 
+  [
+    454, 
+    "MARTIN BOYLE", 
+    46, 
+    "M", 
+    "MARIETTA GA", 
+    186, 
+    6831, 
+    522, 
+    6804
+  ], 
+  [
+    455, 
+    "ALISHA JEPPSON", 
+    34, 
+    "F", 
+    "CUMMING GA", 
+    928, 
+    6832, 
+    522, 
+    6785
+  ], 
+  [
+    456, 
+    "JUSTINE PHIFER", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    1430, 
+    6833, 
+    522, 
+    6775
+  ], 
+  [
+    457, 
+    "AMI ROACH", 
+    35, 
+    "F", 
+    "DACULA GA", 
+    1535, 
+    6835, 
+    522, 
+    6816
+  ], 
+  [
+    458, 
+    "CHRIS REZEK", 
+    44, 
+    "M", 
+    "ATLANTA GA", 
+    1517, 
+    6837, 
+    522, 
+    6820
+  ], 
+  [
+    459, 
+    "LISA WOODWARD", 
+    47, 
+    "F", 
+    "CANTON GA", 
+    2003, 
+    6837, 
+    522, 
+    6804
+  ], 
+  [
+    460, 
+    "ANDREA RESTIFO", 
+    45, 
+    "F", 
+    "ATLANTA GA", 
+    1515, 
+    6841, 
+    523, 
+    6815
+  ], 
+  [
+    461, 
+    "JENNIFER SCHMIDT", 
+    38, 
+    "F", 
+    "ATHENS GA", 
+    1608, 
+    6844, 
+    523, 
+    6828
+  ], 
+  [
+    462, 
+    "FRANCES CREEKMUIR", 
+    51, 
+    "F", 
+    "ATLANTA GA", 
+    402, 
+    6846, 
+    523, 
+    6815
+  ], 
+  [
+    463, 
+    "CHRIS KULINSKI", 
+    32, 
+    "M", 
+    "ATLANTA GA", 
+    1036, 
+    6847, 
+    523, 
+    6819
+  ], 
+  [
+    464, 
+    "MATT WATERS", 
+    32, 
+    "M", 
+    "ACWORTH GA", 
+    1930, 
+    6848, 
+    523, 
+    6798
+  ], 
+  [
+    465, 
+    "MARGARET BARBEE", 
+    36, 
+    "F", 
+    "PEACHTREE CITY GA", 
+    97, 
+    6852, 
+    523, 
+    6819
+  ], 
+  [
+    466, 
+    "COREY RIECK", 
+    46, 
+    "M", 
+    "ATLANTA GA", 
+    385, 
+    6854, 
+    524, 
+    6837
+  ], 
+  [
+    467, 
+    "KAREN GAILEY", 
+    30, 
+    "F", 
+    "ATLANTA GA", 
+    658, 
+    6855, 
+    524, 
+    6818
+  ], 
+  [
+    468, 
+    "CHRIS HOLTON", 
+    30, 
+    "M", 
+    "MABLETON GA", 
+    857, 
+    6855, 
+    524, 
+    6798
+  ], 
+  [
+    469, 
+    "MICHAEL OZBURN", 
+    36, 
+    "M", 
+    "SANDY SPRINGS GA", 
+    1384, 
+    6855, 
+    524, 
+    6826
+  ], 
+  [
+    470, 
+    "ALEXANDER AMBINDER", 
+    24, 
+    "M", 
+    "ATLANTA GA", 
+    44, 
+    6857, 
+    524, 
+    6799
+  ], 
+  [
+    471, 
+    "EMILY MCINTOSH", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    1225, 
+    6858, 
+    524, 
+    6799
+  ], 
+  [
+    472, 
+    "DAN CURRIDEN", 
+    42, 
+    "M", 
+    "MARIETTA GA", 
+    424, 
+    6864, 
+    524, 
+    6790
+  ], 
+  [
+    473, 
+    "JOHN OCONNOR", 
+    43, 
+    "M", 
+    "SUWANEE GA", 
+    1363, 
+    6865, 
+    524, 
+    6838
+  ], 
+  [
+    474, 
+    "STEPHEN BUMPAS", 
+    46, 
+    "M", 
+    "ATLANTA GA", 
+    239, 
+    6865, 
+    525, 
+    6803
+  ], 
+  [
+    475, 
+    "BEN KIRKLAND", 
+    56, 
+    "M", 
+    "PEACHTREE CITY, GA", 
+    1005, 
+    6866, 
+    525, 
+    6825
+  ], 
+  [
+    476, 
+    "JEFF ROBERTS", 
+    40, 
+    "M", 
+    "WOODSTOCK GA", 
+    1539, 
+    6868, 
+    525, 
+    6831
+  ], 
+  [
+    477, 
+    "SHELBY KATZ", 
+    44, 
+    "F", 
+    "NORCROSS GA", 
+    970, 
+    6869, 
+    525, 
+    6829
+  ], 
+  [
+    478, 
+    "SHAWN RYALS", 
+    33, 
+    "M", 
+    "MABLETON GA", 
+    1578, 
+    6870, 
+    525, 
+    6846
+  ], 
+  [
+    479, 
+    "KEVIN GARMON", 
+    37, 
+    "M", 
+    "CUMMING GA", 
+    670, 
+    6873, 
+    525, 
+    6859
+  ], 
+  [
+    480, 
+    "JACQUELINE DANIELS", 
+    38, 
+    "F", 
+    "KENNESAW GA", 
+    440, 
+    6880, 
+    526, 
+    6853
+  ], 
+  [
+    481, 
+    "LES SEIBERT", 
+    50, 
+    "M", 
+    "ALPHARETTA GA", 
+    1635, 
+    6887, 
+    526, 
+    6871
+  ], 
+  [
+    482, 
+    "ERIC WEIDNER", 
+    31, 
+    "M", 
+    "MARIETTA GA", 
+    1940, 
+    6887, 
+    526, 
+    6851
+  ], 
+  [
+    483, 
+    "TERRY HARRIS", 
+    47, 
+    "M", 
+    "BREMEN GA", 
+    797, 
+    6888, 
+    526, 
+    6834
+  ], 
+  [
+    484, 
+    "MARK ADENT", 
+    43, 
+    "M", 
+    "JOHNS CREEK GA", 
+    14, 
+    6892, 
+    527, 
+    6886
+  ], 
+  [
+    485, 
+    "PATTY WILDER", 
+    29, 
+    "F", 
+    "TUCKER GA", 
+    1967, 
+    6893, 
+    527, 
+    6853
+  ], 
+  [
+    486, 
+    "DEBORAH GAUL", 
+    15, 
+    "F", 
+    "CUMMING GA", 
+    675, 
+    6895, 
+    527, 
+    6883
+  ], 
+  [
+    487, 
+    "NANCY GAUL", 
+    42, 
+    "F", 
+    "CUMMING GA", 
+    676, 
+    6895, 
+    527, 
+    -1
+  ], 
+  [
+    488, 
+    "DAVE KEMP", 
+    51, 
+    "M", 
+    "KENNESAW GA", 
+    986, 
+    6895, 
+    527, 
+    6853
+  ], 
+  [
+    489, 
+    "TRACY ROSE", 
+    48, 
+    "M", 
+    "ACWORTH GA", 
+    1561, 
+    6900, 
+    527, 
+    6865
+  ], 
+  [
+    490, 
+    "CYNTHIA ESKEW", 
+    43, 
+    "F", 
+    "BRASELTON GA", 
+    576, 
+    6901, 
+    527, 
+    6881
+  ], 
+  [
+    491, 
+    "STEPHANIE WILSON", 
+    36, 
+    "F", 
+    "TUCKER GA", 
+    1983, 
+    6903, 
+    527, 
+    6882
+  ], 
+  [
+    492, 
+    "CAMBREE ROSE", 
+    17, 
+    "F", 
+    "ACWORTH GA", 
+    1558, 
+    6910, 
+    528, 
+    6875
+  ], 
+  [
+    493, 
+    "PETER VAN DER REYDEN", 
+    44, 
+    "M", 
+    "ATLANTA GA", 
+    1878, 
+    6915, 
+    528, 
+    6905
+  ], 
+  [
+    494, 
+    "JOHN COBB", 
+    58, 
+    "M", 
+    "ATLANTA GA", 
+    347, 
+    6916, 
+    528, 
+    6899
+  ], 
+  [
+    495, 
+    "MILO COGAN", 
+    38, 
+    "M", 
+    "ATLANTA GA", 
+    354, 
+    6916, 
+    528, 
+    6894
+  ], 
+  [
+    496, 
+    "ANDREW JEPPSON", 
+    37, 
+    "M", 
+    "CUMMING GA", 
+    929, 
+    6919, 
+    529, 
+    6870
+  ], 
+  [
+    497, 
+    "TONIA HARBIN", 
+    45, 
+    "F", 
+    "WOODSTOCK GA", 
+    782, 
+    6919, 
+    529, 
+    6901
+  ], 
+  [
+    498, 
+    "REBECCA WATTERS", 
+    24, 
+    "F", 
+    "MABLETON GA", 
+    1935, 
+    6920, 
+    529, 
+    6887
+  ], 
+  [
+    499, 
+    "WILL OWENS", 
+    40, 
+    "M", 
+    "MABLETON GA", 
+    1383, 
+    6920, 
+    529, 
+    6886
+  ], 
+  [
+    500, 
+    "ERIK ATKINSON", 
+    37, 
+    "M", 
+    "MILTON GA", 
+    70, 
+    6921, 
+    529, 
+    6865
+  ], 
+  [
+    501, 
+    "LARRY KOLAND", 
+    44, 
+    "M", 
+    "MABLETON GA", 
+    1017, 
+    6923, 
+    529, 
+    6909
+  ], 
+  [
+    502, 
+    "PAUL COX", 
+    41, 
+    "M", 
+    "ATLANTA GA", 
+    399, 
+    6923, 
+    529, 
+    6880
+  ], 
+  [
+    503, 
+    "STEVE BRADY", 
+    54, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    195, 
+    6924, 
+    529, 
+    6891
+  ], 
+  [
+    504, 
+    "RODNEY SMITH", 
+    45, 
+    "M", 
+    "CARROLLTON GA", 
+    1715, 
+    6924, 
+    529, 
+    6902
+  ], 
+  [
+    505, 
+    "COURTNEY FOSTER", 
+    31, 
+    "F", 
+    "CANTON GA", 
+    622, 
+    6927, 
+    529, 
+    6900
+  ], 
+  [
+    506, 
+    "NOELL WANNAMAKER", 
+    49, 
+    "M", 
+    "SMYRNA GA", 
+    1917, 
+    6930, 
+    529, 
+    6904
+  ], 
+  [
+    507, 
+    "WILLIAM LEAHY", 
+    50, 
+    "M", 
+    "JASPER GA", 
+    1072, 
+    6933, 
+    530, 
+    6922
+  ], 
+  [
+    508, 
+    "BENJAMIN KIRKLAND", 
+    22, 
+    "M", 
+    "DESTIN FL", 
+    1006, 
+    6933, 
+    530, 
+    6893
+  ], 
+  [
+    509, 
+    "ALTON CHAPMAN", 
+    41, 
+    "M", 
+    "MABLETON GA", 
+    318, 
+    6936, 
+    530, 
+    6931
+  ], 
+  [
+    510, 
+    "BOB DANVILLE", 
+    51, 
+    "M", 
+    "ALPHARETTA GA", 
+    441, 
+    6937, 
+    530, 
+    6923
+  ], 
+  [
+    511, 
+    "KURT BRUDER", 
+    48, 
+    "M", 
+    "ALPHARETTA GA", 
+    223, 
+    6937, 
+    530, 
+    6925
+  ], 
+  [
+    512, 
+    "MICHAEL FONSECA", 
+    33, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    617, 
+    6939, 
+    530, 
+    6921
+  ], 
+  [
+    513, 
+    "KRISTINA MCLAUGHLIN", 
+    35, 
+    "F", 
+    "CUMMING GA", 
+    1230, 
+    6941, 
+    530, 
+    6916
+  ], 
+  [
+    514, 
+    "TIMOTHY TACKETT", 
+    49, 
+    "M", 
+    "SNELLVILLE GA", 
+    1798, 
+    6942, 
+    530, 
+    6914
+  ], 
+  [
+    515, 
+    "MALLORY KIRKLAND", 
+    24, 
+    "F", 
+    "PEACHTREE CITY GA", 
+    1007, 
+    6943, 
+    530, 
+    6903
+  ], 
+  [
+    516, 
+    "ROBIN SMITH", 
+    32, 
+    "F", 
+    "ACWORTH GA", 
+    1714, 
+    6945, 
+    531, 
+    6916
+  ], 
+  [
+    517, 
+    "KEN KLAER", 
+    52, 
+    "M", 
+    "JOHNS CREEK DR GA", 
+    1011, 
+    6947, 
+    531, 
+    6907
+  ], 
+  [
+    518, 
+    "ERIC NORDEN", 
+    46, 
+    "M", 
+    "ACWORTH GA", 
+    1350, 
+    6947, 
+    531, 
+    6925
+  ], 
+  [
+    519, 
+    "MARK LASITER", 
+    39, 
+    "M", 
+    "MABLETON GA", 
+    1056, 
+    6954, 
+    531, 
+    6906
+  ], 
+  [
+    520, 
+    "KATHERYN PETTUS", 
+    39, 
+    "F", 
+    "ATLANTA GA", 
+    1424, 
+    6956, 
+    531, 
+    6867
+  ], 
+  [
+    521, 
+    "JACK DILLARD", 
+    29, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    491, 
+    6964, 
+    532, 
+    6919
+  ], 
+  [
+    522, 
+    "MICHAEL THRASHER", 
+    29, 
+    "M", 
+    "ATLANTA GA", 
+    1833, 
+    6966, 
+    532, 
+    6927
+  ], 
+  [
+    523, 
+    "KEN THRASHER", 
+    59, 
+    "M", 
+    "ATLANTA GA", 
+    1832, 
+    6967, 
+    532, 
+    6928
+  ], 
+  [
+    524, 
+    "GUS JOHNSON", 
+    45, 
+    "M", 
+    "MARIETTA GA", 
+    945, 
+    6972, 
+    533, 
+    6939
+  ], 
+  [
+    525, 
+    "TARA BLACK", 
+    41, 
+    "F", 
+    "ROSWELL GA", 
+    156, 
+    6973, 
+    533, 
+    6937
+  ], 
+  [
+    526, 
+    "RAY BROWN", 
+    53, 
+    "M", 
+    "ROSWELL GA", 
+    219, 
+    6973, 
+    533, 
+    6959
+  ], 
+  [
+    527, 
+    "SHARON BONDHUS", 
+    38, 
+    "F", 
+    "MABLETON GA", 
+    172, 
+    6974, 
+    533, 
+    6944
+  ], 
+  [
+    528, 
+    "HEATHER SHOEMAKER", 
+    25, 
+    "F", 
+    "ALPHARETTA GA", 
+    1673, 
+    6974, 
+    533, 
+    6964
+  ], 
+  [
+    529, 
+    "TONYA CENIZA", 
+    41, 
+    "F", 
+    "ALPHARETTA GA", 
+    304, 
+    6975, 
+    533, 
+    6964
+  ], 
+  [
+    530, 
+    "CHRISTOPHER BARR", 
+    28, 
+    "M", 
+    "CANTON GA", 
+    105, 
+    6977, 
+    533, 
+    6961
+  ], 
+  [
+    531, 
+    "KAREN KRESAK", 
+    47, 
+    "F", 
+    "MARIETTA GA", 
+    1026, 
+    6983, 
+    534, 
+    6959
+  ], 
+  [
+    532, 
+    "STEVE CALBERT", 
+    40, 
+    "M", 
+    "WOODSTOCK GA", 
+    267, 
+    6985, 
+    534, 
+    6900
+  ], 
+  [
+    533, 
+    "ALEXANDRA ALDRICH", 
+    42, 
+    "F", 
+    "SANDY SPRINGS GA", 
+    28, 
+    6990, 
+    534, 
+    6953
+  ], 
+  [
+    534, 
+    "KEN GREBE", 
+    48, 
+    "M", 
+    "ACWORTH GA", 
+    726, 
+    6992, 
+    534, 
+    6967
+  ], 
+  [
+    535, 
+    "LAURA HERAKOVICH", 
+    39, 
+    "F", 
+    "ATLANTA GA", 
+    836, 
+    6996, 
+    534, 
+    6971
+  ], 
+  [
+    536, 
+    "MATTHEW TAYLOR", 
+    35, 
+    "M", 
+    "SMYRNA GA", 
+    1810, 
+    7000, 
+    535, 
+    6938
+  ], 
+  [
+    537, 
+    "KAREN BATTLES", 
+    38, 
+    "F", 
+    "DAHLONEGA GA", 
+    124, 
+    7015, 
+    536, 
+    6987
+  ], 
+  [
+    538, 
+    "DAVID RHODEN", 
+    41, 
+    "M", 
+    "CANTON GA", 
+    1518, 
+    7017, 
+    536, 
+    6965
+  ], 
+  [
+    539, 
+    "BRETT CAMPBELL", 
+    37, 
+    "M", 
+    "ROSWELL GA", 
+    274, 
+    7018, 
+    536, 
+    6978
+  ], 
+  [
+    540, 
+    "ROBERT MORRIS", 
+    34, 
+    "M", 
+    "DECATUR GA", 
+    1316, 
+    7022, 
+    537, 
+    6989
+  ], 
+  [
+    541, 
+    "MOLLY FULLER", 
+    32, 
+    "F", 
+    "ATLANTA GA", 
+    653, 
+    7024, 
+    537, 
+    7002
+  ], 
+  [
+    542, 
+    "ALESHKA CALDERON", 
+    25, 
+    "F", 
+    "SMYRNA GA", 
+    269, 
+    7025, 
+    537, 
+    6988
+  ], 
+  [
+    543, 
+    "BONNIE SCOTT", 
+    22, 
+    "F", 
+    "ATLANTA GA", 
+    1626, 
+    7026, 
+    537, 
+    7002
+  ], 
+  [
+    544, 
+    "ELIZABETH SMITH", 
+    27, 
+    "F", 
+    "MARIETTA GA", 
+    1705, 
+    7026, 
+    537, 
+    7017
+  ], 
+  [
+    545, 
+    "BRETT HADDON-COOK", 
+    39, 
+    "M", 
+    "ROSWELL GA", 
+    753, 
+    7028, 
+    537, 
+    6989
+  ], 
+  [
+    546, 
+    "LAURA JOPLING", 
+    40, 
+    "F", 
+    "GRAYSON GA", 
+    960, 
+    7028, 
+    537, 
+    7006
+  ], 
+  [
+    547, 
+    "JEFF KLEIN", 
+    37, 
+    "M", 
+    "ROSWELL GA", 
+    1012, 
+    7030, 
+    537, 
+    6990
+  ], 
+  [
+    548, 
+    "HUTCH DELOACH", 
+    56, 
+    "M", 
+    "DOUGLASVILLE GA", 
+    470, 
+    7031, 
+    537, 
+    7018
+  ], 
+  [
+    549, 
+    "REBECCA BRYAN", 
+    39, 
+    "F", 
+    "CUMMING GA", 
+    226, 
+    7034, 
+    537, 
+    6985
+  ], 
+  [
+    550, 
+    "DANIEL SZYMANSKI", 
+    44, 
+    "M", 
+    "ATLANTA GA", 
+    1797, 
+    7035, 
+    537, 
+    6970
+  ], 
+  [
+    551, 
+    "MICHAEL TUCHALSKI", 
+    51, 
+    "M", 
+    "MARIETTA GA", 
+    1859, 
+    7038, 
+    538, 
+    6996
+  ], 
+  [
+    552, 
+    "THERESE TUCHALSKI", 
+    51, 
+    "F", 
+    "MARIETTA GA", 
+    1860, 
+    7039, 
+    538, 
+    6998
+  ], 
+  [
+    553, 
+    "NATALIE LOPRESTI", 
+    27, 
+    "F", 
+    "KENNESAW GA", 
+    1125, 
+    7040, 
+    538, 
+    7001
+  ], 
+  [
+    554, 
+    "BART WALTERS", 
+    40, 
+    "M", 
+    "WATKINSVILLE GA", 
+    1908, 
+    7044, 
+    538, 
+    6994
+  ], 
+  [
+    555, 
+    "ROBERT HOWREN", 
+    46, 
+    "M", 
+    "AUSTELL GA", 
+    877, 
+    7045, 
+    538, 
+    7034
+  ], 
+  [
+    556, 
+    "NATHAN FANT", 
+    25, 
+    "M", 
+    "CARTERSVILLE GA", 
+    590, 
+    7046, 
+    538, 
+    7011
+  ], 
+  [
+    557, 
+    "JAY BASSETT", 
+    27, 
+    "M", 
+    "MABLETON GA", 
+    122, 
+    7049, 
+    539, 
+    7028
+  ], 
+  [
+    558, 
+    "DAVID TINSLEY", 
+    61, 
+    "M", 
+    "CUMMING GA", 
+    1842, 
+    7050, 
+    539, 
+    7029
+  ], 
+  [
+    559, 
+    "CHAD DANIELS", 
+    36, 
+    "M", 
+    "SMYRNA GA", 
+    439, 
+    7051, 
+    539, 
+    6999
+  ], 
+  [
+    560, 
+    "MICHAEL STANTON", 
+    28, 
+    "M", 
+    "DACULA GA", 
+    1755, 
+    7054, 
+    539, 
+    6954
+  ], 
+  [
+    561, 
+    "BARRON SMITH", 
+    50, 
+    "M", 
+    "WHITE GA", 
+    1701, 
+    7057, 
+    539, 
+    7034
+  ], 
+  [
+    562, 
+    "BRIAN SIMPSON", 
+    61, 
+    "M", 
+    "LAWNDALE NC", 
+    1684, 
+    7058, 
+    539, 
+    7034
+  ], 
+  [
+    563, 
+    "CHRISTOPHER WEISER", 
+    42, 
+    "M", 
+    "ACWORTH GA", 
+    1944, 
+    7060, 
+    539, 
+    7013
+  ], 
+  [
+    564, 
+    "AUBREY KNICK-KOPPENHOFER", 
+    23, 
+    "F", 
+    "ATLANTA GA", 
+    1014, 
+    7060, 
+    539, 
+    7006
+  ], 
+  [
+    565, 
+    "GEORGE CONNOLLY", 
+    33, 
+    "M", 
+    "WOODSTOCK GA", 
+    372, 
+    7063, 
+    540, 
+    6950
+  ], 
+  [
+    566, 
+    "KIM ROWAN", 
+    41, 
+    "F", 
+    "SMYRNA GA", 
+    1571, 
+    7064, 
+    540, 
+    7040
+  ], 
+  [
+    567, 
+    "WARD PETTENGER", 
+    36, 
+    "M", 
+    "DOUGLASVILLE GA", 
+    1423, 
+    7064, 
+    540, 
+    7038
+  ], 
+  [
+    568, 
+    "ERICA WATFORD", 
+    30, 
+    "F", 
+    "MARIETTA GA", 
+    1931, 
+    7066, 
+    540, 
+    7017
+  ], 
+  [
+    569, 
+    "NICOLE EDWARDS", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    551, 
+    7068, 
+    540, 
+    7044
+  ], 
+  [
+    570, 
+    "JANA MCCLENDON", 
+    47, 
+    "F", 
+    "MARIETTA GA", 
+    4, 
+    7068, 
+    540, 
+    7037
+  ], 
+  [
+    571, 
+    "GORDON PATRICK", 
+    36, 
+    "M", 
+    "WOODSTOCK GA", 
+    1402, 
+    7069, 
+    540, 
+    7050
+  ], 
+  [
+    572, 
+    "TERI MCKENNAN", 
+    35, 
+    "F", 
+    "TYRONE GA", 
+    1226, 
+    7069, 
+    540, 
+    7013
+  ], 
+  [
+    573, 
+    "WILLIAM MARTIN II", 
+    41, 
+    "M", 
+    "MACON GA", 
+    1179, 
+    7070, 
+    540, 
+    7045
+  ], 
+  [
+    574, 
+    "DAVID LAMAR", 
+    31, 
+    "M", 
+    "ATLANTA GA", 
+    1049, 
+    7077, 
+    541, 
+    7038
+  ], 
+  [
+    575, 
+    "BEN PHILLIPS", 
+    34, 
+    "M", 
+    "ATLANTA GA", 
+    1433, 
+    7078, 
+    541, 
+    7039
+  ], 
+  [
+    576, 
+    "CARLOS CASON", 
+    37, 
+    "M", 
+    "ATLANTA GA", 
+    296, 
+    7078, 
+    541, 
+    7065
+  ], 
+  [
+    577, 
+    "RANDY STRICKLIN", 
+    39, 
+    "M", 
+    "STONE MOUNTAIN GA", 
+    2143, 
+    7080, 
+    541, 
+    7058
+  ], 
+  [
+    578, 
+    "JOIE FROST", 
+    31, 
+    "F", 
+    "MARIETTA GA", 
+    650, 
+    7081, 
+    541, 
+    7035
+  ], 
+  [
+    579, 
+    "WILLIAM CREEKMUIR", 
+    55, 
+    "M", 
+    "ATLANTA GA", 
+    403, 
+    7081, 
+    541, 
+    7050
+  ], 
+  [
+    580, 
+    "CHRISTINE CASON", 
+    37, 
+    "F", 
+    "ATLANTA GA", 
+    297, 
+    7083, 
+    541, 
+    7070
+  ], 
+  [
+    581, 
+    "ANTHONY WATSON", 
+    33, 
+    "M", 
+    "TUCKER GA", 
+    1933, 
+    7083, 
+    541, 
+    7043
+  ], 
+  [
+    582, 
+    "CHARLIE WILLIAMSON", 
+    33, 
+    "M", 
+    "LITHIA SPRINGS GA", 
+    1977, 
+    7084, 
+    541, 
+    7055
+  ], 
+  [
+    583, 
+    "KURT SCHNEIDER", 
+    43, 
+    "M", 
+    "CUMMING GA", 
+    1613, 
+    7085, 
+    541, 
+    7051
+  ], 
+  [
+    584, 
+    "EVAN RITTENBERG", 
+    46, 
+    "M", 
+    "NASHVILLE TN", 
+    1532, 
+    7085, 
+    541, 
+    6993
+  ], 
+  [
+    585, 
+    "TERESA KIRKMAN", 
+    38, 
+    "F", 
+    "CANTON GA", 
+    1008, 
+    7087, 
+    541, 
+    7061
+  ], 
+  [
+    586, 
+    "VALERIE KELLEHER", 
+    61, 
+    "F", 
+    "ATLANTA GA", 
+    980, 
+    7087, 
+    541, 
+    7066
+  ], 
+  [
+    587, 
+    "DIANNA MORTON", 
+    41, 
+    "F", 
+    "ATLANTA GA", 
+    1318, 
+    7088, 
+    542, 
+    7017
+  ], 
+  [
+    588, 
+    "DANIEL EARLES", 
+    40, 
+    "M", 
+    "SMYRNA GA", 
+    541, 
+    7093, 
+    542, 
+    6987
+  ], 
+  [
+    589, 
+    "BRENDA FLAIG", 
+    37, 
+    "F", 
+    "ROSWELL GA", 
+    606, 
+    7098, 
+    542, 
+    7087
+  ], 
+  [
+    590, 
+    "SUZANNE MCGUIRE", 
+    31, 
+    "F", 
+    "MCDONOUGH GA", 
+    1221, 
+    7106, 
+    543, 
+    6954
+  ], 
+  [
+    591, 
+    "PATRICK MACKEN", 
+    36, 
+    "M", 
+    "DULUTH GA", 
+    1147, 
+    7108, 
+    543, 
+    7065
+  ], 
+  [
+    592, 
+    "JOSIE SNAPP", 
+    29, 
+    "F", 
+    "MCDONOUGH GA", 
+    1720, 
+    7110, 
+    543, 
+    7043
+  ], 
+  [
+    593, 
+    "DAVID ST. HILAIRE", 
+    54, 
+    "M", 
+    "ALPHARETTA GA", 
+    1743, 
+    7110, 
+    543, 
+    7082
+  ], 
+  [
+    594, 
+    "JAMES RICKETT", 
+    41, 
+    "M", 
+    "ATLANTA GA", 
+    1524, 
+    7111, 
+    543, 
+    6952
+  ], 
+  [
+    595, 
+    "ELLEN LAHATTE", 
+    14, 
+    "F", 
+    "ROSWELL GA", 
+    1045, 
+    7113, 
+    543, 
+    7078
+  ], 
+  [
+    596, 
+    "SUSAN PERKINS", 
+    47, 
+    "F", 
+    "ATLANTA GA", 
+    1418, 
+    7115, 
+    544, 
+    7077
+  ], 
+  [
+    597, 
+    "MIKE KOTANIAN", 
+    39, 
+    "M", 
+    "SUWANEE GA", 
+    1021, 
+    7119, 
+    544, 
+    7109
+  ], 
+  [
+    598, 
+    "KIM KRONSHAGE", 
+    40, 
+    "M", 
+    "ALPHARETTA GA", 
+    1030, 
+    7119, 
+    544, 
+    7109
+  ], 
+  [
+    599, 
+    "JOSH TOLLEY", 
+    31, 
+    "M", 
+    "MARIETTA GA", 
+    1845, 
+    7120, 
+    544, 
+    7055
+  ], 
+  [
+    600, 
+    "DANIELLE SPEARMAN", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    1730, 
+    7121, 
+    544, 
+    7061
+  ], 
+  [
+    601, 
+    "MICHAEL SIMPSON", 
+    38, 
+    "M", 
+    "MARIETTA GA", 
+    1686, 
+    7122, 
+    544, 
+    7083
+  ], 
+  [
+    602, 
+    "LEE JOHNSON", 
+    42, 
+    "F", 
+    "ATHENS GA", 
+    948, 
+    7122, 
+    544, 
+    7104
+  ], 
+  [
+    603, 
+    "KORY MUEHLHAUSER", 
+    30, 
+    "F", 
+    "SMYRNA GA", 
+    1320, 
+    7123, 
+    544, 
+    7103
+  ], 
+  [
+    604, 
+    "DAVID JACKLITCH", 
+    58, 
+    "M", 
+    "NEW SMYRNA BEAC FL", 
+    906, 
+    7123, 
+    544, 
+    7096
+  ], 
+  [
+    605, 
+    "THOMAS ANDREWS", 
+    47, 
+    "M", 
+    "SANDY SPRINGS GA", 
+    57, 
+    7124, 
+    544, 
+    7107
+  ], 
+  [
+    606, 
+    "CAROLYN LAHATTE", 
+    50, 
+    "F", 
+    "ROSWELL GA", 
+    1044, 
+    7125, 
+    544, 
+    7090
+  ], 
+  [
+    607, 
+    "JERRY LAHATTE", 
+    49, 
+    "M", 
+    "ROSWELL GA", 
+    1046, 
+    7126, 
+    544, 
+    7091
+  ], 
+  [
+    608, 
+    "DAVID DANIEL", 
+    40, 
+    "M", 
+    "SUWANEE GA", 
+    437, 
+    7126, 
+    544, 
+    7101
+  ], 
+  [
+    609, 
+    "LINDSAY ROBISON", 
+    33, 
+    "F", 
+    "SHARPSBURG GA", 
+    1548, 
+    7127, 
+    545, 
+    7090
+  ], 
+  [
+    610, 
+    "LISA ROGERS", 
+    36, 
+    "F", 
+    "FAYETTEVILLE GA", 
+    1552, 
+    7128, 
+    545, 
+    7091
+  ], 
+  [
+    611, 
+    "CHELSEA BUTTRAM", 
+    22, 
+    "F", 
+    "CATAULA GA", 
+    259, 
+    7129, 
+    545, 
+    7009
+  ], 
+  [
+    612, 
+    "KATHERINA GONZALEZ", 
+    43, 
+    "F", 
+    "MARIETTA GA", 
+    707, 
+    7132, 
+    545, 
+    7081
+  ], 
+  [
+    613, 
+    "MICHAEL RIEMAN", 
+    33, 
+    "M", 
+    "KENNESAW GA", 
+    1528, 
+    7134, 
+    545, 
+    7126
+  ], 
+  [
+    614, 
+    "GLORIA ARGUMEDO", 
+    40, 
+    "F", 
+    "LONG BEACH CA", 
+    62, 
+    7136, 
+    545, 
+    7108
+  ], 
+  [
+    615, 
+    "KEITH GALLIGAN", 
+    35, 
+    "M", 
+    "JASPER GA", 
+    661, 
+    7136, 
+    545, 
+    7086
+  ], 
+  [
+    616, 
+    "SANTIAGO (TED) RAVELO, JR.", 
+    39, 
+    "M", 
+    "NEWNAN GA", 
+    1495, 
+    7138, 
+    545, 
+    7108
+  ], 
+  [
+    617, 
+    "DELL MAJURE", 
+    40, 
+    "M", 
+    "CUMMING GA", 
+    1156, 
+    7140, 
+    545, 
+    7016
+  ], 
+  [
+    618, 
+    "PAUL FERGUSON", 
+    29, 
+    "M", 
+    "ACWORTH GA", 
+    597, 
+    7142, 
+    546, 
+    7090
+  ], 
+  [
+    619, 
+    "AMY VINSON", 
+    37, 
+    "F", 
+    "ROSWELL GA", 
+    1891, 
+    7144, 
+    546, 
+    7107
+  ], 
+  [
+    620, 
+    "SAMRA ALIKHAN", 
+    39, 
+    "F", 
+    "SMYRNA GA", 
+    32, 
+    7146, 
+    546, 
+    7122
+  ], 
+  [
+    621, 
+    "GEORGE MONSALVATGE", 
+    44, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    1297, 
+    7147, 
+    546, 
+    7130
+  ], 
+  [
+    622, 
+    "MADELEINE HACKNEY", 
+    36, 
+    "F", 
+    "ATLANTA GA", 
+    752, 
+    7148, 
+    546, 
+    7040
+  ], 
+  [
+    623, 
+    "NATE SANDERS", 
+    31, 
+    "M", 
+    "CANTON GA", 
+    1590, 
+    7148, 
+    546, 
+    7120
+  ], 
+  [
+    624, 
+    "ROBERT POMA", 
+    49, 
+    "M", 
+    "MARIETTA GA", 
+    2026, 
+    7150, 
+    546, 
+    7135
+  ], 
+  [
+    625, 
+    "ELLEN COMEAUX", 
+    32, 
+    "F", 
+    "ALPHARETTA GA", 
+    368, 
+    7156, 
+    547, 
+    7138
+  ], 
+  [
+    626, 
+    "AUDREY SUMMERS", 
+    36, 
+    "F", 
+    "SMYRNA GA", 
+    1783, 
+    7156, 
+    547, 
+    7035
+  ], 
+  [
+    627, 
+    "CHRIS TART", 
+    37, 
+    "M", 
+    "ATLANTA GA", 
+    1801, 
+    7157, 
+    547, 
+    7081
+  ], 
+  [
+    628, 
+    "JESSICA FORREST", 
+    24, 
+    "F", 
+    "SPRINGFIELD IL", 
+    621, 
+    7157, 
+    547, 
+    7106
+  ], 
+  [
+    629, 
+    "TIMOTHY LLOYD", 
+    28, 
+    "M", 
+    "DECATUR GA", 
+    1109, 
+    7161, 
+    547, 
+    7140
+  ], 
+  [
+    630, 
+    "CLAUDE COLE", 
+    52, 
+    "M", 
+    "MABLETON GA", 
+    358, 
+    7162, 
+    547, 
+    7134
+  ], 
+  [
+    631, 
+    "JACQUELINE SANDORA", 
+    34, 
+    "F", 
+    "WOODSTOCK GA", 
+    1592, 
+    7168, 
+    548, 
+    7136
+  ], 
+  [
+    632, 
+    "HEATHER CARTER", 
+    28, 
+    "F", 
+    "KATHLEEN GA", 
+    289, 
+    7169, 
+    548, 
+    7142
+  ], 
+  [
+    633, 
+    "DENISE BERGEY", 
+    40, 
+    "F", 
+    "CUMMING GA", 
+    145, 
+    7169, 
+    548, 
+    7107
+  ], 
+  [
+    634, 
+    "STACEY KELLER", 
+    43, 
+    "F", 
+    "MARIETTA GA", 
+    981, 
+    7170, 
+    548, 
+    7096
+  ], 
+  [
+    635, 
+    "JANICE ST. HILAIRE", 
+    47, 
+    "F", 
+    "ALPHARETTA GA", 
+    1744, 
+    7177, 
+    548, 
+    7148
+  ], 
+  [
+    636, 
+    "GLENN SIMPSON", 
+    44, 
+    "M", 
+    "ATLANTA GA", 
+    1685, 
+    7178, 
+    548, 
+    7133
+  ], 
+  [
+    637, 
+    "CHAD NILES", 
+    38, 
+    "M", 
+    "ATLANTA GA", 
+    1349, 
+    7181, 
+    549, 
+    7144
+  ], 
+  [
+    638, 
+    "NATALIE WATSON", 
+    25, 
+    "F", 
+    "TUCKER GA", 
+    1934, 
+    7181, 
+    549, 
+    7140
+  ], 
+  [
+    639, 
+    "RON EAKER", 
+    52, 
+    "M", 
+    "AUGUSTA GA", 
+    539, 
+    7187, 
+    549, 
+    7161
+  ], 
+  [
+    640, 
+    "ALEXANDRA HARTNETT", 
+    25, 
+    "F", 
+    "KENNESAW GA", 
+    802, 
+    7188, 
+    549, 
+    7173
+  ], 
+  [
+    641, 
+    "ROLF SODERBERG", 
+    57, 
+    "M", 
+    "JASPER GA", 
+    1722, 
+    7190, 
+    549, 
+    7175
+  ], 
+  [
+    642, 
+    "FRANK TURNER", 
+    41, 
+    "M", 
+    "CUMMING GA", 
+    1869, 
+    7191, 
+    549, 
+    7170
+  ], 
+  [
+    643, 
+    "HAMPTON HALE", 
+    41, 
+    "M", 
+    "MARIETTA GA", 
+    757, 
+    7193, 
+    550, 
+    7120
+  ], 
+  [
+    644, 
+    "CARL LINE", 
+    50, 
+    "M", 
+    "LITHONIA GA", 
+    1104, 
+    7193, 
+    550, 
+    7156
+  ], 
+  [
+    645, 
+    "ALISON ESTELLA", 
+    38, 
+    "F", 
+    "MARIETTA GA", 
+    579, 
+    7193, 
+    550, 
+    7121
+  ], 
+  [
+    646, 
+    "NELSON MILLER", 
+    36, 
+    "M", 
+    "ADAIRSVILLE GA", 
+    1282, 
+    7195, 
+    550, 
+    7148
+  ], 
+  [
+    647, 
+    "AMY ROBBINS", 
+    38, 
+    "F", 
+    "CUMMING GA", 
+    1537, 
+    7195, 
+    550, 
+    7169
+  ], 
+  [
+    648, 
+    "SHAWN SIMPSON", 
+    34, 
+    "M", 
+    "SANDY SPRINGS GA", 
+    1689, 
+    7198, 
+    550, 
+    7172
+  ], 
+  [
+    649, 
+    "JESSICA ROPER", 
+    22, 
+    "F", 
+    "JASPER GA", 
+    1556, 
+    7198, 
+    550, 
+    7158
+  ], 
+  [
+    650, 
+    "LIANI SWINGLE", 
+    29, 
+    "F", 
+    "CHAMBLEE GA", 
+    1795, 
+    7199, 
+    550, 
+    7167
+  ], 
+  [
+    651, 
+    "ELEANOR THOMPSON", 
+    51, 
+    "F", 
+    "SUGAR HILL GA", 
+    1825, 
+    7200, 
+    550, 
+    7163
+  ], 
+  [
+    652, 
+    "JILL KANTOR", 
+    34, 
+    "F", 
+    "MARIETTA GA", 
+    967, 
+    7207, 
+    551, 
+    7140
+  ], 
+  [
+    653, 
+    "SUSAN SCHMIDT", 
+    37, 
+    "F", 
+    "WOODSTOCK GA", 
+    1609, 
+    7207, 
+    551, 
+    7175
+  ], 
+  [
+    654, 
+    "JENNIFER ROWAN DUPLICATE", 
+    24, 
+    "F", 
+    "", 
+    2587, 
+    7208, 
+    551, 
+    -1
+  ], 
+  [
+    655, 
+    "KATHERINE CUTTER", 
+    35, 
+    "F", 
+    "ATHENS GA", 
+    427, 
+    7212, 
+    551, 
+    7181
+  ], 
+  [
+    656, 
+    "SCOTT SCHATZBERG", 
+    39, 
+    "M", 
+    "ATHENS GA", 
+    1603, 
+    7212, 
+    551, 
+    7182
+  ], 
+  [
+    657, 
+    "JENNIFER SORRELLS", 
+    35, 
+    "F", 
+    "GAINESVILLE GA", 
+    1726, 
+    7214, 
+    551, 
+    7100
+  ], 
+  [
+    658, 
+    "DAVID STEINES", 
+    62, 
+    "M", 
+    "WOODSTOCK GA", 
+    1758, 
+    7215, 
+    551, 
+    7193
+  ], 
+  [
+    659, 
+    "EMILY DRURY", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    527, 
+    7215, 
+    551, 
+    7129
+  ], 
+  [
+    660, 
+    "CAROLYN DOWNEY", 
+    48, 
+    "F", 
+    "KENNESAW GA", 
+    518, 
+    7216, 
+    551, 
+    7184
+  ], 
+  [
+    661, 
+    "ANDREA HUYCK", 
+    35, 
+    "F", 
+    "CANTON GA", 
+    897, 
+    7216, 
+    551, 
+    7195
+  ], 
+  [
+    662, 
+    "JILLIAN MARTIN", 
+    28, 
+    "F", 
+    "ATLANTA GA", 
+    1176, 
+    7218, 
+    551, 
+    7181
+  ], 
+  [
+    663, 
+    "SHANE SHEFFIELD", 
+    38, 
+    "M", 
+    "PEACHTREE CITY GA", 
+    1662, 
+    7222, 
+    552, 
+    7191
+  ], 
+  [
+    664, 
+    "DANA VAN WINKLE", 
+    26, 
+    "F", 
+    "SENOIA GA", 
+    1882, 
+    7225, 
+    552, 
+    7129
+  ], 
+  [
+    665, 
+    "ALISON NEISLER", 
+    32, 
+    "F", 
+    "MABLETON GA", 
+    1337, 
+    7226, 
+    552, 
+    7203
+  ], 
+  [
+    666, 
+    "KATHRYN MILLER", 
+    35, 
+    "F", 
+    "ATLANTA GA", 
+    1279, 
+    7226, 
+    552, 
+    7178
+  ], 
+  [
+    667, 
+    "JOANNA DAVIDSON", 
+    41, 
+    "F", 
+    "ATLANTA GA", 
+    446, 
+    7227, 
+    552, 
+    7203
+  ], 
+  [
+    668, 
+    "BRYAN PRICE", 
+    39, 
+    "M", 
+    "NEWNAN GA", 
+    1467, 
+    7228, 
+    552, 
+    7178
+  ], 
+  [
+    669, 
+    "LAINE KILBURN", 
+    37, 
+    "F", 
+    "ATLANTA GA", 
+    995, 
+    7232, 
+    553, 
+    7210
+  ], 
+  [
+    670, 
+    "STEPHANIE TONRA", 
+    42, 
+    "F", 
+    "ROSWELL GA", 
+    1847, 
+    7234, 
+    553, 
+    7201
+  ], 
+  [
+    671, 
+    "ANDREW WARD", 
+    23, 
+    "M", 
+    "HOUSTON TX", 
+    1918, 
+    7235, 
+    553, 
+    7175
+  ], 
+  [
+    672, 
+    "ADAM MILLER", 
+    29, 
+    "M", 
+    "ATLANTA GA", 
+    1271, 
+    7236, 
+    553, 
+    7184
+  ], 
+  [
+    673, 
+    "MANDI SUMMERS", 
+    28, 
+    "F", 
+    "DALLAS GA", 
+    1786, 
+    7236, 
+    553, 
+    7195
+  ], 
+  [
+    674, 
+    "SCOTT MCDUFFEE", 
+    38, 
+    "M", 
+    "ROSWELL GA", 
+    1212, 
+    7240, 
+    553, 
+    7205
+  ], 
+  [
+    675, 
+    "TERESA MOORE", 
+    41, 
+    "F", 
+    "FAYETTEVILLE GA", 
+    1309, 
+    7241, 
+    553, 
+    7199
+  ], 
+  [
+    676, 
+    "LAURA SCHOLZ", 
+    34, 
+    "F", 
+    "ATLANTA GA", 
+    1616, 
+    7242, 
+    553, 
+    7124
+  ], 
+  [
+    677, 
+    "TIMOTHY LONG", 
+    47, 
+    "M", 
+    "ATLANTA GA", 
+    1122, 
+    7242, 
+    553, 
+    7124
+  ], 
+  [
+    678, 
+    "MICHAEL LATHAM", 
+    61, 
+    "M", 
+    "MABLETON GA", 
+    1061, 
+    7249, 
+    554, 
+    7242
+  ], 
+  [
+    679, 
+    "MIQUEL SCHLOERKE", 
+    34, 
+    "F", 
+    "ALPHARETTA GA", 
+    1607, 
+    7250, 
+    554, 
+    7214
+  ], 
+  [
+    680, 
+    "MICHAEL RAYMOND", 
+    34, 
+    "M", 
+    "MILTON GA", 
+    2027, 
+    7252, 
+    554, 
+    7118
+  ], 
+  [
+    681, 
+    "SUSIE CRISLER", 
+    43, 
+    "F", 
+    "ATLANTA GA", 
+    406, 
+    7252, 
+    554, 
+    7220
+  ], 
+  [
+    682, 
+    "RODNEY BARRY", 
+    52, 
+    "M", 
+    "SMYRNA GA", 
+    110, 
+    7259, 
+    555, 
+    7237
+  ], 
+  [
+    683, 
+    "PAGETT BOSSI", 
+    40, 
+    "F", 
+    "DECATUR GA", 
+    177, 
+    7259, 
+    555, 
+    7212
+  ], 
+  [
+    684, 
+    "MELISSA BRODY", 
+    23, 
+    "F", 
+    "ATLANTA GA", 
+    209, 
+    7259, 
+    555, 
+    7188
+  ], 
+  [
+    685, 
+    "JOANNE IANITELLO", 
+    43, 
+    "F", 
+    "WOODSTOCK GA", 
+    903, 
+    7261, 
+    555, 
+    7247
+  ], 
+  [
+    686, 
+    "TIM DOWDY", 
+    49, 
+    "M", 
+    "MCDONOUGH GA", 
+    516, 
+    7266, 
+    555, 
+    7244
+  ], 
+  [
+    687, 
+    "ANTHONY STOLARSKI", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    1767, 
+    7270, 
+    555, 
+    7148
+  ], 
+  [
+    688, 
+    "MICHAEL BOZEMAN", 
+    31, 
+    "M", 
+    "JOHNS CREEK GA", 
+    190, 
+    7275, 
+    556, 
+    7206
+  ], 
+  [
+    689, 
+    "NANCY ALBINGER", 
+    47, 
+    "F", 
+    "MARIETTA GA", 
+    24, 
+    7276, 
+    556, 
+    7231
+  ], 
+  [
+    690, 
+    "RHONDA HARRISON", 
+    37, 
+    "F", 
+    "CHATSWORTH GA", 
+    799, 
+    7277, 
+    556, 
+    7192
+  ], 
+  [
+    691, 
+    "ANITA BURKES", 
+    33, 
+    "F", 
+    "CUMMING GA", 
+    246, 
+    7279, 
+    556, 
+    7231
+  ], 
+  [
+    692, 
+    "JILL WANDSTRAT", 
+    33, 
+    "F", 
+    "ATLANTA GA", 
+    1915, 
+    7282, 
+    556, 
+    7230
+  ], 
+  [
+    693, 
+    "ELIZABETH HESMER", 
+    55, 
+    "F", 
+    "MARIETTA GA", 
+    839, 
+    7284, 
+    557, 
+    7255
+  ], 
+  [
+    694, 
+    "RILINDO FOSTER", 
+    36, 
+    "M", 
+    "ATLANTA GA", 
+    625, 
+    7286, 
+    557, 
+    7237
+  ], 
+  [
+    695, 
+    "JENKA FYFE", 
+    35, 
+    "F", 
+    "ATLANTA GA", 
+    656, 
+    7295, 
+    557, 
+    7181
+  ], 
+  [
+    696, 
+    "KELLY JERDEN", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    930, 
+    7296, 
+    557, 
+    7229
+  ], 
+  [
+    697, 
+    "ROBERT HULME-LIPPERT", 
+    28, 
+    "M", 
+    "DECATUR GA", 
+    882, 
+    7297, 
+    557, 
+    7264
+  ], 
+  [
+    698, 
+    "JAMES HANSEN", 
+    44, 
+    "M", 
+    "LYNDHURST OH", 
+    778, 
+    7299, 
+    558, 
+    7243
+  ], 
+  [
+    699, 
+    "JILL BAGBY", 
+    46, 
+    "F", 
+    "BIRMINGHAM AL", 
+    77, 
+    7302, 
+    558, 
+    7260
+  ], 
+  [
+    700, 
+    "BRIAN FRANKLIN", 
+    32, 
+    "M", 
+    "TYRONE GA", 
+    631, 
+    7305, 
+    558, 
+    7246
+  ], 
+  [
+    701, 
+    "AMBER MELVILLE", 
+    29, 
+    "F", 
+    "CARROLLTON GA", 
+    1252, 
+    7308, 
+    558, 
+    7224
+  ], 
+  [
+    702, 
+    "L WALLER", 
+    38, 
+    "F", 
+    "ATLANTA GA", 
+    1905, 
+    7309, 
+    558, 
+    7274
+  ], 
+  [
+    703, 
+    "SARAH PORRI", 
+    23, 
+    "F", 
+    "MARIETTA GA", 
+    1457, 
+    7311, 
+    559, 
+    7291
+  ], 
+  [
+    704, 
+    "TOM BANG", 
+    48, 
+    "M", 
+    "DECATUR GA", 
+    93, 
+    7314, 
+    559, 
+    7253
+  ], 
+  [
+    705, 
+    "TARA GREGORY", 
+    38, 
+    "F", 
+    "ALPHARETTA GA", 
+    733, 
+    7315, 
+    559, 
+    7168
+  ], 
+  [
+    706, 
+    "BONGSUB SHIM", 
+    51, 
+    "M", 
+    "LAGRANGE GA", 
+    1669, 
+    7316, 
+    559, 
+    7232
+  ], 
+  [
+    707, 
+    "JOEL FERGUSON", 
+    59, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    596, 
+    7318, 
+    559, 
+    7264
+  ], 
+  [
+    708, 
+    "SEAN BRAUD", 
+    34, 
+    "M", 
+    "ATLANTA GA", 
+    197, 
+    7318, 
+    559, 
+    7252
+  ], 
+  [
+    709, 
+    "HERBERT WASHINGTON", 
+    42, 
+    "M", 
+    "PEACHTREE CITY GA", 
+    1926, 
+    7320, 
+    559, 
+    7300
+  ], 
+  [
+    710, 
+    "CHRISTIE CASEY", 
+    36, 
+    "F", 
+    "LAKELAND TN", 
+    295, 
+    7320, 
+    559, 
+    7213
+  ], 
+  [
+    711, 
+    "KEVIN BALDWIN", 
+    36, 
+    "M", 
+    "DULUTH GA", 
+    85, 
+    7325, 
+    560, 
+    7296
+  ], 
+  [
+    712, 
+    "SAMUEL SIMPSON", 
+    28, 
+    "M", 
+    "KENNESAW GA", 
+    1688, 
+    7328, 
+    560, 
+    7310
+  ], 
+  [
+    713, 
+    "MATT POHLMANN", 
+    26, 
+    "M", 
+    "ATLANTA GA", 
+    1451, 
+    7328, 
+    560, 
+    7292
+  ], 
+  [
+    714, 
+    "STUART DAILEY", 
+    37, 
+    "M", 
+    "MURRAYVILLE GA", 
+    430, 
+    7329, 
+    560, 
+    7311
+  ], 
+  [
+    715, 
+    "MARY MCDONALD", 
+    37, 
+    "F", 
+    "CARTERSVILLE GA", 
+    1209, 
+    7330, 
+    560, 
+    7276
+  ], 
+  [
+    716, 
+    "KELLY BARBERA", 
+    24, 
+    "F", 
+    "NEW YORK NY", 
+    98, 
+    7332, 
+    560, 
+    7293
+  ], 
+  [
+    717, 
+    "ELLEN MCNAMARA", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    1237, 
+    7332, 
+    560, 
+    7294
+  ], 
+  [
+    718, 
+    "RENEE WILLIAMS", 
+    36, 
+    "F", 
+    "SAVANNAH GA", 
+    1976, 
+    7333, 
+    560, 
+    7297
+  ], 
+  [
+    719, 
+    "CINDY MCGEE", 
+    42, 
+    "F", 
+    "DUNWOODY GA", 
+    1217, 
+    7333, 
+    560, 
+    7317
+  ], 
+  [
+    720, 
+    "MOLLY ELMORE", 
+    36, 
+    "F", 
+    "NORCROSS GA", 
+    568, 
+    7334, 
+    560, 
+    7294
+  ], 
+  [
+    721, 
+    "JOHNNY WEBB", 
+    61, 
+    "M", 
+    "ACWORTH GA", 
+    1937, 
+    7336, 
+    560, 
+    7278
+  ], 
+  [
+    722, 
+    "BILL YATES", 
+    45, 
+    "M", 
+    "KENNESAW GA", 
+    2015, 
+    7336, 
+    560, 
+    7277
+  ], 
+  [
+    723, 
+    "TAMMY BROWN", 
+    46, 
+    "F", 
+    "ROSWELL GA", 
+    220, 
+    7340, 
+    561, 
+    7325
+  ], 
+  [
+    724, 
+    "MELANIE FRICKS", 
+    48, 
+    "F", 
+    "ALPHARETTA GA", 
+    645, 
+    7344, 
+    561, 
+    7312
+  ], 
+  [
+    725, 
+    "FRANK FRICKS", 
+    50, 
+    "M", 
+    "ALPHARETTA GA", 
+    644, 
+    7344, 
+    561, 
+    7312
+  ], 
+  [
+    726, 
+    "TRACY OVERTON", 
+    36, 
+    "F", 
+    "KENNESAW GA", 
+    1379, 
+    7345, 
+    561, 
+    7252
+  ], 
+  [
+    727, 
+    "CARALYN LEONARD", 
+    52, 
+    "F", 
+    "MANSFIELD GA", 
+    1084, 
+    7348, 
+    561, 
+    7294
+  ], 
+  [
+    728, 
+    "WILLIAM PARRISH", 
+    42, 
+    "M", 
+    "CARROLLTON GA", 
+    1397, 
+    7348, 
+    561, 
+    7291
+  ], 
+  [
+    729, 
+    "ROBERT WILSON", 
+    39, 
+    "M", 
+    "ROSWELL GA", 
+    1982, 
+    7349, 
+    561, 
+    7316
+  ], 
+  [
+    730, 
+    "CATHY HAMRICK", 
+    35, 
+    "F", 
+    "WOODSTOCK GA", 
+    772, 
+    7350, 
+    562, 
+    7313
+  ], 
+  [
+    731, 
+    "TIMOTHY HENDRICKS", 
+    39, 
+    "M", 
+    "GRIFFIN GA", 
+    827, 
+    7351, 
+    562, 
+    7307
+  ], 
+  [
+    732, 
+    "JUDY CANGEALOSE", 
+    46, 
+    "F", 
+    "SMYRNA GA", 
+    279, 
+    7354, 
+    562, 
+    7323
+  ], 
+  [
+    733, 
+    "JENNIFER GROSS", 
+    23, 
+    "F", 
+    "MCDONOUGH GA", 
+    743, 
+    7356, 
+    562, 
+    7331
+  ], 
+  [
+    734, 
+    "ARI MATHE", 
+    31, 
+    "F", 
+    "FLOWERY BRANCH GA", 
+    1184, 
+    7359, 
+    562, 
+    7329
+  ], 
+  [
+    735, 
+    "MICHAL DOERGE", 
+    51, 
+    "M", 
+    "HARRISBURG IL", 
+    502, 
+    7359, 
+    562, 
+    7315
+  ], 
+  [
+    736, 
+    "BONNIE BASSETT", 
+    35, 
+    "F", 
+    "DECATUR GA", 
+    121, 
+    7359, 
+    562, 
+    7329
+  ], 
+  [
+    737, 
+    "MARSHALL THURMOND", 
+    56, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    1835, 
+    7363, 
+    563, 
+    7305
+  ], 
+  [
+    738, 
+    "QUINCY BARNETT", 
+    32, 
+    "M", 
+    "LITHONIA GA", 
+    104, 
+    7365, 
+    563, 
+    7343
+  ], 
+  [
+    739, 
+    "HOLLY BONVISSUTO", 
+    40, 
+    "F", 
+    "SMYRNA GA", 
+    174, 
+    7366, 
+    563, 
+    7320
+  ], 
+  [
+    740, 
+    "KELLY HUNT", 
+    23, 
+    "F", 
+    "ATLANTA GA", 
+    887, 
+    7366, 
+    563, 
+    7307
+  ], 
+  [
+    741, 
+    "DIANA HATCHER", 
+    35, 
+    "F", 
+    "ROSWELL GA", 
+    814, 
+    7367, 
+    563, 
+    7336
+  ], 
+  [
+    742, 
+    "CAREY CHIPPS", 
+    45, 
+    "F", 
+    "MARIETTA GA", 
+    327, 
+    7367, 
+    563, 
+    7284
+  ], 
+  [
+    743, 
+    "JEFF BREWER", 
+    50, 
+    "M", 
+    "KENNESAW GA", 
+    202, 
+    7375, 
+    563, 
+    7318
+  ], 
+  [
+    744, 
+    "JULIE CERNICH", 
+    42, 
+    "F", 
+    "GRAYSON GA", 
+    306, 
+    7378, 
+    564, 
+    7356
+  ], 
+  [
+    745, 
+    "MARIA BRAUNE", 
+    40, 
+    "F", 
+    "ROSWELL GA", 
+    198, 
+    7387, 
+    564, 
+    7314
+  ], 
+  [
+    746, 
+    "GINGER PHELAN", 
+    48, 
+    "F", 
+    "PEACHTREE CITY GA", 
+    1428, 
+    7388, 
+    564, 
+    7345
+  ], 
+  [
+    747, 
+    "SUSIE DEAN", 
+    30, 
+    "F", 
+    "WOODSTOCK GA", 
+    461, 
+    7390, 
+    565, 
+    7337
+  ], 
+  [
+    748, 
+    "RAJEEV DAYAL", 
+    31, 
+    "M", 
+    "SMYRNA GA", 
+    459, 
+    7391, 
+    565, 
+    7311
+  ], 
+  [
+    749, 
+    "KATHARINA PROBST", 
+    34, 
+    "F", 
+    "ATLANTA GA", 
+    1473, 
+    7391, 
+    565, 
+    7311
+  ], 
+  [
+    750, 
+    "TAWANDA LEWIS", 
+    33, 
+    "F", 
+    "BUFORD GA", 
+    1095, 
+    7392, 
+    565, 
+    7317
+  ], 
+  [
+    751, 
+    "KOREY CARTER", 
+    33, 
+    "F", 
+    "SMYRNA GA", 
+    291, 
+    7392, 
+    565, 
+    7378
+  ], 
+  [
+    752, 
+    "GARY SANDERS", 
+    53, 
+    "M", 
+    "ACWORTH GA", 
+    1588, 
+    7393, 
+    565, 
+    7331
+  ], 
+  [
+    753, 
+    "EMILY WILLIAMS", 
+    30, 
+    "F", 
+    "AUBURN AL", 
+    1973, 
+    7394, 
+    565, 
+    7285
+  ], 
+  [
+    754, 
+    "ELIZABETH HUMPHRIES", 
+    43, 
+    "F", 
+    "CUMMING GA", 
+    884, 
+    7403, 
+    566, 
+    7374
+  ], 
+  [
+    755, 
+    "JEFFREY HOLLINGTON", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    855, 
+    7403, 
+    566, 
+    7366
+  ], 
+  [
+    756, 
+    "ADDIE COCHRAN", 
+    36, 
+    "F", 
+    "MABLETON GA", 
+    348, 
+    7405, 
+    566, 
+    -1
+  ], 
+  [
+    757, 
+    "C.L. DUNN", 
+    60, 
+    "M", 
+    "DALTON GA", 
+    534, 
+    7407, 
+    566, 
+    7322
+  ], 
+  [
+    758, 
+    "JENNIFER ALSOBROOK", 
+    39, 
+    "F", 
+    "SUGAR HILL GA", 
+    37, 
+    7407, 
+    566, 
+    7383
+  ], 
+  [
+    759, 
+    "LAURA BETH JACKSON", 
+    18, 
+    "F", 
+    "ALPHARETTA GA", 
+    910, 
+    7408, 
+    566, 
+    7350
+  ], 
+  [
+    760, 
+    "EDDIE PULLEY", 
+    47, 
+    "M", 
+    "MARIETTA GA", 
+    1475, 
+    7409, 
+    566, 
+    7349
+  ], 
+  [
+    761, 
+    "GREG FANSLER", 
+    30, 
+    "M", 
+    "BLACKSBURG VA", 
+    589, 
+    7412, 
+    566, 
+    7362
+  ], 
+  [
+    762, 
+    "SUSIE PANNES", 
+    37, 
+    "F", 
+    "ORLANDO FL", 
+    1391, 
+    7412, 
+    566, 
+    7361
+  ], 
+  [
+    763, 
+    "RANDOLPH COOK", 
+    49, 
+    "M", 
+    "VILLA RICA GA", 
+    376, 
+    7414, 
+    566, 
+    7337
+  ], 
+  [
+    764, 
+    "KELLY ROTHWELL", 
+    31, 
+    "F", 
+    "MARIETTA GA", 
+    1567, 
+    7414, 
+    566, 
+    7350
+  ], 
+  [
+    765, 
+    "ADELAIDA GALARZA", 
+    43, 
+    "F", 
+    "MARIETTA GA", 
+    659, 
+    7416, 
+    567, 
+    7399
+  ], 
+  [
+    766, 
+    "ELOISA DUMAS", 
+    42, 
+    "F", 
+    "MARIETTA GA", 
+    530, 
+    7417, 
+    567, 
+    7401
+  ], 
+  [
+    767, 
+    "KERI CARTER", 
+    39, 
+    "F", 
+    "CUMMING GA", 
+    290, 
+    7420, 
+    567, 
+    7401
+  ], 
+  [
+    768, 
+    "MARY RUTH HAMBRICK", 
+    38, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    769, 
+    7423, 
+    567, 
+    7371
+  ], 
+  [
+    769, 
+    "BARRY PRENDERGAST", 
+    35, 
+    "M", 
+    "MABLETON GA", 
+    1464, 
+    7428, 
+    568, 
+    -1
+  ], 
+  [
+    770, 
+    "SHEAU-SHAN LIEW", 
+    31, 
+    "F", 
+    "SMYRNA GA", 
+    1099, 
+    7434, 
+    568, 
+    7355
+  ], 
+  [
+    771, 
+    "ALLY HUNG", 
+    35, 
+    "F", 
+    "SMYRNA GA", 
+    885, 
+    7435, 
+    568, 
+    7356
+  ], 
+  [
+    772, 
+    "DAWN SPECKHART", 
+    39, 
+    "F", 
+    "ROSWELL GA", 
+    1735, 
+    7437, 
+    568, 
+    7412
+  ], 
+  [
+    773, 
+    "JARED REEDER", 
+    31, 
+    "M", 
+    "SMYRNA GA", 
+    1506, 
+    7437, 
+    568, 
+    7420
+  ], 
+  [
+    774, 
+    "BARBIE BREGEN", 
+    36, 
+    "F", 
+    "ATLANTA GA", 
+    2021, 
+    7438, 
+    568, 
+    7354
+  ], 
+  [
+    775, 
+    "LARRY SMITH", 
+    34, 
+    "M", 
+    "LOGANVILLE GA", 
+    1711, 
+    7439, 
+    568, 
+    7345
+  ], 
+  [
+    776, 
+    "LORI ANN ROBERTSON", 
+    38, 
+    "F", 
+    "DAHLONEGA GA", 
+    1542, 
+    7439, 
+    568, 
+    7372
+  ], 
+  [
+    777, 
+    "DEBRA POCH", 
+    40, 
+    "F", 
+    "SMYRNA GA", 
+    1448, 
+    7440, 
+    568, 
+    7416
+  ], 
+  [
+    778, 
+    "GARY POCH", 
+    44, 
+    "M", 
+    "SMYRNA GA", 
+    1449, 
+    7440, 
+    568, 
+    7416
+  ], 
+  [
+    779, 
+    "GREGG ERNST", 
+    45, 
+    "M", 
+    "ATLANTA GA", 
+    574, 
+    7442, 
+    569, 
+    7386
+  ], 
+  [
+    780, 
+    "ALEXIS ST JEAN", 
+    27, 
+    "F", 
+    "DENVER CO", 
+    1742, 
+    7444, 
+    569, 
+    7426
+  ], 
+  [
+    781, 
+    "ZACHERY SCHWARTZ", 
+    31, 
+    "M", 
+    "DULUTH GA", 
+    1622, 
+    7445, 
+    569, 
+    7370
+  ], 
+  [
+    782, 
+    "SHARON DEMIDIO", 
+    45, 
+    "F", 
+    "SENOIA GA", 
+    475, 
+    7447, 
+    569, 
+    7399
+  ], 
+  [
+    783, 
+    "ELIZABETH PHILLIPS", 
+    37, 
+    "F", 
+    "MARIETTA GA", 
+    1435, 
+    7449, 
+    569, 
+    7414
+  ], 
+  [
+    784, 
+    "JAMES ONEAL", 
+    42, 
+    "M", 
+    "CUMMING GA", 
+    1368, 
+    7450, 
+    569, 
+    7386
+  ], 
+  [
+    785, 
+    "BECCA SUNDAL", 
+    38, 
+    "F", 
+    "SMYRNA GA", 
+    1788, 
+    7456, 
+    570, 
+    7433
+  ], 
+  [
+    786, 
+    "JENNY HUNTER", 
+    36, 
+    "F", 
+    "CANTON GA", 
+    890, 
+    7457, 
+    570, 
+    7413
+  ], 
+  [
+    787, 
+    "ANDREW DAVEY", 
+    50, 
+    "M", 
+    "ATLANTA GA", 
+    445, 
+    7457, 
+    570, 
+    7413
+  ], 
+  [
+    788, 
+    "KELLIE LOVELL", 
+    40, 
+    "F", 
+    "GAINESVILLE GA", 
+    2025, 
+    7460, 
+    570, 
+    7433
+  ], 
+  [
+    789, 
+    "LEANNE BONSACK", 
+    44, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    173, 
+    7460, 
+    570, 
+    7417
+  ], 
+  [
+    790, 
+    "JELENA CRAWFORD", 
+    29, 
+    "F", 
+    "ATLANTA GA", 
+    401, 
+    7460, 
+    570, 
+    7421
+  ], 
+  [
+    791, 
+    "KEVIN REDMON", 
+    30, 
+    "M", 
+    "MARIETTA GA", 
+    1503, 
+    7462, 
+    570, 
+    7422
+  ], 
+  [
+    792, 
+    "DESHA SECREST", 
+    34, 
+    "F", 
+    "HOLLY SPRINGS GA", 
+    1632, 
+    7462, 
+    570, 
+    7436
+  ], 
+  [
+    793, 
+    "JILL GRAY", 
+    36, 
+    "F", 
+    "CANTON GA", 
+    723, 
+    7462, 
+    570, 
+    7436
+  ], 
+  [
+    794, 
+    "SCOTT RITTENBERG", 
+    47, 
+    "M", 
+    "ROSWELL GA", 
+    1533, 
+    7466, 
+    570, 
+    7418
+  ], 
+  [
+    795, 
+    "CARL LAI LEUNG", 
+    67, 
+    "M", 
+    "STONE MOUNTAIN GA", 
+    1047, 
+    7466, 
+    570, 
+    7461
+  ], 
+  [
+    796, 
+    "GEORGE MILLS", 
+    35, 
+    "M", 
+    "WOODSTOCK GA", 
+    1287, 
+    7468, 
+    570, 
+    7359
+  ], 
+  [
+    797, 
+    "RIGOBERTO HERNANDEZ", 
+    42, 
+    "M", 
+    "ATLANTA GA", 
+    838, 
+    7471, 
+    571, 
+    7450
+  ], 
+  [
+    798, 
+    "DANA ROBBINS", 
+    51, 
+    "M", 
+    "ATLANTA GA", 
+    1538, 
+    7481, 
+    571, 
+    7459
+  ], 
+  [
+    799, 
+    "AMY HERNANDEZ", 
+    36, 
+    "F", 
+    "ATLANTA GA", 
+    837, 
+    7485, 
+    572, 
+    7463
+  ], 
+  [
+    800, 
+    "SAM MCCLENDON", 
+    46, 
+    "M", 
+    "MARIETTA GA", 
+    1199, 
+    7486, 
+    572, 
+    7454
+  ], 
+  [
+    801, 
+    "LINDSAY MCFEELEY", 
+    35, 
+    "F", 
+    "WOODSTOCK GA", 
+    1216, 
+    7486, 
+    572, 
+    7432
+  ], 
+  [
+    802, 
+    "SHANNON HORSEY", 
+    34, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    867, 
+    7490, 
+    572, 
+    7423
+  ], 
+  [
+    803, 
+    "AMY RYAN", 
+    33, 
+    "F", 
+    "ALPHARETTA GA", 
+    1579, 
+    7494, 
+    573, 
+    7452
+  ], 
+  [
+    804, 
+    "TODD SHERMAN", 
+    41, 
+    "M", 
+    "MARIETTA GA", 
+    1667, 
+    7495, 
+    573, 
+    7423
+  ], 
+  [
+    805, 
+    "STACY KOLAND", 
+    40, 
+    "F", 
+    "MABLETON GA", 
+    1018, 
+    7495, 
+    573, 
+    7482
+  ], 
+  [
+    806, 
+    "STUART GRAY", 
+    37, 
+    "M", 
+    "TUCKER GA", 
+    725, 
+    7495, 
+    573, 
+    7432
+  ], 
+  [
+    807, 
+    "RYAN NICELER", 
+    37, 
+    "M", 
+    "TUCKER GA", 
+    1342, 
+    7496, 
+    573, 
+    7433
+  ], 
+  [
+    808, 
+    "EVETTE MCKENZIE", 
+    44, 
+    "F", 
+    "LITHONIA GA", 
+    1227, 
+    7496, 
+    573, 
+    7435
+  ], 
+  [
+    809, 
+    "REBECCA TIMMIS", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    1841, 
+    7504, 
+    573, 
+    7465
+  ], 
+  [
+    810, 
+    "WILLIAM STULTZ", 
+    49, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    1776, 
+    7508, 
+    574, 
+    7438
+  ], 
+  [
+    811, 
+    "TRACY MCDONALD", 
+    50, 
+    "F", 
+    "MARIETTA GA", 
+    1210, 
+    7512, 
+    574, 
+    7443
+  ], 
+  [
+    812, 
+    "JEANNINE BERNSTEIN", 
+    37, 
+    "F", 
+    "SMYRNA GA", 
+    148, 
+    7517, 
+    574, 
+    7463
+  ], 
+  [
+    813, 
+    "JUSTIN CANTRELL", 
+    31, 
+    "M", 
+    "LILBURN GA", 
+    281, 
+    7519, 
+    574, 
+    7428
+  ], 
+  [
+    814, 
+    "MATTHEW SCHMOLESKY", 
+    39, 
+    "M", 
+    "OGDEN UT", 
+    1611, 
+    7525, 
+    575, 
+    7476
+  ], 
+  [
+    815, 
+    "MARIAN KING", 
+    41, 
+    "F", 
+    "DULUTH GA", 
+    1000, 
+    7527, 
+    575, 
+    7362
+  ], 
+  [
+    816, 
+    "SARA MCNABB", 
+    38, 
+    "F", 
+    "ROSWELL GA", 
+    1236, 
+    7528, 
+    575, 
+    7428
+  ], 
+  [
+    817, 
+    "TIA HARDY", 
+    36, 
+    "F", 
+    "CANTON GA", 
+    785, 
+    7529, 
+    575, 
+    7490
+  ], 
+  [
+    818, 
+    "TREPHINA GALLOWAY", 
+    38, 
+    "F", 
+    "ATLANTA GA", 
+    666, 
+    7532, 
+    575, 
+    7483
+  ], 
+  [
+    819, 
+    "JEFF NICHOLS", 
+    49, 
+    "M", 
+    "MARIETTA GA", 
+    1345, 
+    7534, 
+    576, 
+    7503
+  ], 
+  [
+    820, 
+    "SIMONE HOFFMAN", 
+    49, 
+    "F", 
+    "MARIETTA GA", 
+    849, 
+    7534, 
+    576, 
+    7503
+  ], 
+  [
+    821, 
+    "BRANDON CHECKETTS", 
+    31, 
+    "M", 
+    "ATHENS GA", 
+    322, 
+    7539, 
+    576, 
+    7484
+  ], 
+  [
+    822, 
+    "ANGIE BUDAY", 
+    40, 
+    "F", 
+    "ROSWELL GA", 
+    235, 
+    7539, 
+    576, 
+    7479
+  ], 
+  [
+    823, 
+    "VICTOR MARIANO", 
+    52, 
+    "M", 
+    "SUWANEE GA", 
+    1169, 
+    7543, 
+    576, 
+    7476
+  ], 
+  [
+    824, 
+    "DOUGLAS GIBEAUT", 
+    47, 
+    "M", 
+    "ROSWELL GA", 
+    691, 
+    7543, 
+    576, 
+    7473
+  ], 
+  [
+    825, 
+    "MATTHEW O'HERN", 
+    25, 
+    "M", 
+    "SMYRNA GA", 
+    1359, 
+    7550, 
+    577, 
+    7494
+  ], 
+  [
+    826, 
+    "JENNIFER MCKINNON", 
+    34, 
+    "F", 
+    "NEWNAN GA", 
+    1228, 
+    7550, 
+    577, 
+    7495
+  ], 
+  [
+    827, 
+    "BETH MAGURE", 
+    40, 
+    "F", 
+    "CUMMING GA", 
+    1152, 
+    7551, 
+    577, 
+    7427
+  ], 
+  [
+    828, 
+    "MARK MASON", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    1183, 
+    7554, 
+    577, 
+    7509
+  ], 
+  [
+    829, 
+    "ANITA STRUSS", 
+    56, 
+    "F", 
+    "ARAGON GA", 
+    1773, 
+    7560, 
+    578, 
+    7475
+  ], 
+  [
+    830, 
+    "SEREN AYDEMIR", 
+    21, 
+    "F", 
+    "WARNER ROBINS GA", 
+    74, 
+    7560, 
+    578, 
+    7503
+  ], 
+  [
+    831, 
+    "TIFFANY BJERKEN", 
+    37, 
+    "F", 
+    "MARIETTA GA", 
+    155, 
+    7561, 
+    578, 
+    7532
+  ], 
+  [
+    832, 
+    "AMANDA CUNNINGHAM", 
+    25, 
+    "F", 
+    "ROSWELL GA", 
+    416, 
+    7563, 
+    578, 
+    7497
+  ], 
+  [
+    833, 
+    "ROBERT ELLIOTT", 
+    30, 
+    "M", 
+    "ATLANTA GA", 
+    564, 
+    7563, 
+    578, 
+    7492
+  ], 
+  [
+    834, 
+    "CURTIS WALLACE", 
+    29, 
+    "M", 
+    "LAGRANGE GA", 
+    1903, 
+    7564, 
+    578, 
+    7490
+  ], 
+  [
+    835, 
+    "CHRISTINE BAYE", 
+    40, 
+    "F", 
+    "KENNESAW GA", 
+    127, 
+    7570, 
+    578, 
+    7534
+  ], 
+  [
+    836, 
+    "BAI-HENG WANG", 
+    49, 
+    "M", 
+    "ALPHARETTA GA", 
+    1916, 
+    7572, 
+    578, 
+    7520
+  ], 
+  [
+    837, 
+    "CATHERINE LIEMOHN", 
+    43, 
+    "F", 
+    "ALPHARETTA GA", 
+    1098, 
+    7572, 
+    578, 
+    7530
+  ], 
+  [
+    838, 
+    "ZACK NELSON", 
+    33, 
+    "M", 
+    "SMYRNA GA", 
+    1340, 
+    7574, 
+    579, 
+    7477
+  ], 
+  [
+    839, 
+    "TONYA HARDEMAN", 
+    57, 
+    "M", 
+    "BREMEN GA", 
+    783, 
+    7574, 
+    579, 
+    7511
+  ], 
+  [
+    840, 
+    "TARA COWAN", 
+    33, 
+    "F", 
+    "SMYRNA GA", 
+    395, 
+    7575, 
+    579, 
+    7478
+  ], 
+  [
+    841, 
+    "STACI SANDERS", 
+    27, 
+    "F", 
+    "JEFFERSON GA", 
+    1591, 
+    7578, 
+    579, 
+    7507
+  ], 
+  [
+    842, 
+    "KIRKLYN WILSON", 
+    29, 
+    "F", 
+    "LULA GA", 
+    1980, 
+    7579, 
+    579, 
+    7508
+  ], 
+  [
+    843, 
+    "KEVIN DUNLAP", 
+    46, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    533, 
+    7580, 
+    579, 
+    7522
+  ], 
+  [
+    844, 
+    "SUSAN JOHNSON", 
+    37, 
+    "F", 
+    "MARIETTA GA", 
+    950, 
+    7581, 
+    579, 
+    7490
+  ], 
+  [
+    845, 
+    "APARNA JUE", 
+    30, 
+    "F", 
+    "MARIETTA GA", 
+    963, 
+    7583, 
+    579, 
+    7518
+  ], 
+  [
+    846, 
+    "DANA MINCEY", 
+    32, 
+    "F", 
+    "DAHLONEGA GA", 
+    1289, 
+    7585, 
+    579, 
+    7512
+  ], 
+  [
+    847, 
+    "KIA TAYLOR", 
+    33, 
+    "F", 
+    "ACWORTH GA", 
+    1809, 
+    7585, 
+    579, 
+    7539
+  ], 
+  [
+    848, 
+    "RICKY CORNETT", 
+    40, 
+    "M", 
+    "DAHLONEGA GA", 
+    387, 
+    7585, 
+    579, 
+    7513
+  ], 
+  [
+    849, 
+    "ROSE HALE", 
+    40, 
+    "F", 
+    "MARIETTA GA", 
+    759, 
+    7586, 
+    580, 
+    7514
+  ], 
+  [
+    850, 
+    "ERIC GERALDS", 
+    40, 
+    "M", 
+    "MABLETON GA", 
+    686, 
+    7590, 
+    580, 
+    7562
+  ], 
+  [
+    851, 
+    "KRISTI GRECO", 
+    33, 
+    "F", 
+    "SOCIAL CIRCLE GA", 
+    727, 
+    7594, 
+    580, 
+    7515
+  ], 
+  [
+    852, 
+    "JESSICA HINTON", 
+    29, 
+    "F", 
+    "COVINGTON GA", 
+    844, 
+    7594, 
+    580, 
+    7515
+  ], 
+  [
+    853, 
+    "BRADLEY JAMES", 
+    47, 
+    "M", 
+    "ALPHARETTA GA", 
+    914, 
+    7595, 
+    580, 
+    7531
+  ], 
+  [
+    854, 
+    "SAIDA CABALLERO", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    266, 
+    7599, 
+    581, 
+    7508
+  ], 
+  [
+    855, 
+    "JENNIFER TARDELLI", 
+    38, 
+    "F", 
+    "ATLANTA GA", 
+    1800, 
+    7599, 
+    581, 
+    7528
+  ], 
+  [
+    856, 
+    "RYAN DOUGHERTY", 
+    17, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    512, 
+    7603, 
+    581, 
+    7559
+  ], 
+  [
+    857, 
+    "REBECCA HALES", 
+    52, 
+    "F", 
+    "ALPHARETTA GA", 
+    760, 
+    7604, 
+    581, 
+    7568
+  ], 
+  [
+    858, 
+    "JEFFREY TAYLOR", 
+    50, 
+    "M", 
+    "ALPHARETTA GA", 
+    1808, 
+    7604, 
+    581, 
+    7584
+  ], 
+  [
+    859, 
+    "THOMAS ESTELLA", 
+    35, 
+    "M", 
+    "MARIETTA GA", 
+    580, 
+    7606, 
+    581, 
+    7534
+  ], 
+  [
+    860, 
+    "MARGARET TRIPPE", 
+    26, 
+    "F", 
+    "SILVER SPRING MD", 
+    1854, 
+    7609, 
+    581, 
+    7518
+  ], 
+  [
+    861, 
+    "COLLINS ROUX", 
+    48, 
+    "F", 
+    "MARIETTA GA", 
+    1570, 
+    7609, 
+    581, 
+    7582
+  ], 
+  [
+    862, 
+    "RICHARD ABBOTT", 
+    41, 
+    "M", 
+    "CANTON GA", 
+    5, 
+    7613, 
+    582, 
+    7554
+  ], 
+  [
+    863, 
+    "SUSAN WALL", 
+    39, 
+    "F", 
+    "ROSWELL GA", 
+    1902, 
+    7614, 
+    582, 
+    7554
+  ], 
+  [
+    864, 
+    "LISA MAIER", 
+    40, 
+    "F", 
+    "ATLANTA GA", 
+    1154, 
+    7618, 
+    582, 
+    7557
+  ], 
+  [
+    865, 
+    "KATE PIENTKA", 
+    30, 
+    "F", 
+    "ROSWELL GA", 
+    1442, 
+    7620, 
+    582, 
+    7596
+  ], 
+  [
+    866, 
+    "SARAH HOHWALD", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    851, 
+    7621, 
+    582, 
+    7581
+  ], 
+  [
+    867, 
+    "MICHELLE LORENZ", 
+    40, 
+    "F", 
+    "CANTON GA", 
+    1127, 
+    7625, 
+    582, 
+    7586
+  ], 
+  [
+    868, 
+    "JEFFREY PERRY", 
+    50, 
+    "M", 
+    "WACO GA", 
+    1420, 
+    7629, 
+    583, 
+    7521
+  ], 
+  [
+    869, 
+    "ROCKY WHITE", 
+    41, 
+    "M", 
+    "GRIFFIN GA", 
+    1961, 
+    7629, 
+    583, 
+    7584
+  ], 
+  [
+    870, 
+    "DAVID BUCHALTER", 
+    46, 
+    "M", 
+    "DECATUR GA", 
+    232, 
+    7632, 
+    583, 
+    7602
+  ], 
+  [
+    871, 
+    "KAREN JOHNSON", 
+    49, 
+    "F", 
+    "ELLIJAY GA", 
+    947, 
+    7634, 
+    583, 
+    7602
+  ], 
+  [
+    872, 
+    "GARY TURNER", 
+    48, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    1870, 
+    7638, 
+    584, 
+    7610
+  ], 
+  [
+    873, 
+    "DANA GURELA", 
+    41, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    748, 
+    7639, 
+    584, 
+    7573
+  ], 
+  [
+    874, 
+    "CATHERINE CAMERON", 
+    36, 
+    "F", 
+    "DACULA GA", 
+    273, 
+    7639, 
+    584, 
+    7573
+  ], 
+  [
+    875, 
+    "ANGIE MOONEY", 
+    51, 
+    "F", 
+    "MARIETTA GA", 
+    1301, 
+    7647, 
+    584, 
+    7614
+  ], 
+  [
+    876, 
+    "GARY FACKETT", 
+    62, 
+    "M", 
+    "HENDERSON NV", 
+    586, 
+    7648, 
+    584, 
+    7620
+  ], 
+  [
+    877, 
+    "DEREK MULLINS", 
+    26, 
+    "M", 
+    "MARIETTA GA", 
+    1322, 
+    7656, 
+    585, 
+    7554
+  ], 
+  [
+    878, 
+    "RALPH LLOYD", 
+    66, 
+    "M", 
+    "DUNWOODY GA", 
+    1108, 
+    7661, 
+    585, 
+    7583
+  ], 
+  [
+    879, 
+    "JIMMY AHERN", 
+    38, 
+    "M", 
+    "ATLANTA GA", 
+    17, 
+    7666, 
+    586, 
+    7604
+  ], 
+  [
+    880, 
+    "MICAH HOLDEN", 
+    29, 
+    "F", 
+    "KENNSAW GA", 
+    853, 
+    7666, 
+    586, 
+    7602
+  ], 
+  [
+    881, 
+    "TARA ARNOLD", 
+    35, 
+    "F", 
+    "SMYRNA GA", 
+    64, 
+    7667, 
+    586, 
+    7604
+  ], 
+  [
+    882, 
+    "JUSTIN WHITE", 
+    29, 
+    "M", 
+    "CLEVELAND TN", 
+    1959, 
+    7667, 
+    586, 
+    7603
+  ], 
+  [
+    883, 
+    "MICHELLE THOMAS", 
+    26, 
+    "F", 
+    "ATLANTA GA", 
+    1822, 
+    7668, 
+    586, 
+    7576
+  ], 
+  [
+    884, 
+    "ABBI TAYLOR", 
+    44, 
+    "F", 
+    "DECATUR GA", 
+    1805, 
+    7679, 
+    587, 
+    7620
+  ], 
+  [
+    885, 
+    "BEN BRYANT", 
+    39, 
+    "M", 
+    "STOCKBRIDGE GA", 
+    228, 
+    7684, 
+    587, 
+    7509
+  ], 
+  [
+    886, 
+    "SPENCER BRIEN", 
+    31, 
+    "M", 
+    "DECATUR GA", 
+    205, 
+    7690, 
+    587, 
+    7627
+  ], 
+  [
+    887, 
+    "KELLY VAN NORT", 
+    39, 
+    "F", 
+    "SMYRNA GA", 
+    1879, 
+    7691, 
+    588, 
+    7628
+  ], 
+  [
+    888, 
+    "KAREN DEMPERS", 
+    47, 
+    "F", 
+    "ALPHARETTA GA", 
+    476, 
+    7692, 
+    588, 
+    7671
+  ], 
+  [
+    889, 
+    "CHRISTIE CHAPEL", 
+    39, 
+    "F", 
+    "BETHLEHEM GA", 
+    317, 
+    7702, 
+    588, 
+    7627
+  ], 
+  [
+    890, 
+    "NICHOLE ANDERSON", 
+    27, 
+    "F", 
+    "KENNESAW GA", 
+    54, 
+    7704, 
+    589, 
+    7609
+  ], 
+  [
+    891, 
+    "STEPHANIE SPILOTTO", 
+    34, 
+    "F", 
+    "CANTON GA", 
+    1739, 
+    7705, 
+    589, 
+    7678
+  ], 
+  [
+    892, 
+    "LAURA BARTON", 
+    34, 
+    "F", 
+    "CARROLLTON GA", 
+    117, 
+    7705, 
+    589, 
+    7646
+  ], 
+  [
+    893, 
+    "PETER HOAG", 
+    34, 
+    "M", 
+    "DUNWOODY GA", 
+    847, 
+    7707, 
+    589, 
+    7645
+  ], 
+  [
+    894, 
+    "HOLLY ADAMS", 
+    34, 
+    "F", 
+    "ALPHARETTA GA", 
+    9, 
+    7708, 
+    589, 
+    7647
+  ], 
+  [
+    895, 
+    "BRENTON STENSON", 
+    46, 
+    "M", 
+    "MCDONOUGH GA", 
+    1759, 
+    7709, 
+    589, 
+    7692
+  ], 
+  [
+    896, 
+    "BRAD LIPHAM", 
+    40, 
+    "M", 
+    "CARROLLTON GA", 
+    1105, 
+    7712, 
+    589, 
+    7636
+  ], 
+  [
+    897, 
+    "EMILY SHOEMAKER", 
+    28, 
+    "F", 
+    "ATLANTA GA", 
+    1671, 
+    7714, 
+    589, 
+    7642
+  ], 
+  [
+    898, 
+    "CINDY RALSTON", 
+    53, 
+    "F", 
+    "HIRAM GA", 
+    1488, 
+    7717, 
+    590, 
+    7630
+  ], 
+  [
+    899, 
+    "TAMMY DENNEY", 
+    46, 
+    "F", 
+    "CARROLLTON GA", 
+    480, 
+    7718, 
+    590, 
+    7661
+  ], 
+  [
+    900, 
+    "JOHN DENNEY", 
+    63, 
+    "M", 
+    "CARROLLTON GA", 
+    479, 
+    7718, 
+    590, 
+    7660
+  ], 
+  [
+    901, 
+    "JENNIFER ROBERTS", 
+    36, 
+    "F", 
+    "MACON GA", 
+    1540, 
+    7722, 
+    590, 
+    7661
+  ], 
+  [
+    902, 
+    "JASON WRIGHT", 
+    32, 
+    "M", 
+    "MABLETON GA", 
+    2006, 
+    7723, 
+    590, 
+    7643
+  ], 
+  [
+    903, 
+    "MICAH DOWDY", 
+    22, 
+    "M", 
+    "MCDONOUGH GA", 
+    515, 
+    7723, 
+    590, 
+    7643
+  ], 
+  [
+    904, 
+    "TRINA SCHLECHT", 
+    38, 
+    "F", 
+    "ALPHARETTA GA", 
+    1606, 
+    7727, 
+    590, 
+    7685
+  ], 
+  [
+    905, 
+    "LEE ANN NASH", 
+    56, 
+    "F", 
+    "BARNESVILLE GA", 
+    1333, 
+    7729, 
+    590, 
+    7683
+  ], 
+  [
+    906, 
+    "JULIE POOLE", 
+    49, 
+    "F", 
+    "MARIETTA GA", 
+    1455, 
+    7729, 
+    590, 
+    7683
+  ], 
+  [
+    907, 
+    "SPEARS MALLIS", 
+    32, 
+    "M", 
+    "GAINESVILLE GA", 
+    1161, 
+    7736, 
+    591, 
+    7716
+  ], 
+  [
+    908, 
+    "ANGELIA CAMERON", 
+    41, 
+    "F", 
+    "MONTICELLO GA", 
+    272, 
+    7741, 
+    591, 
+    7687
+  ], 
+  [
+    909, 
+    "A ORTKIESE", 
+    42, 
+    "F", 
+    "ATLANTA GA", 
+    1375, 
+    7743, 
+    592, 
+    7723
+  ], 
+  [
+    910, 
+    "ERIN MULL", 
+    31, 
+    "F", 
+    "MARIETTA GA", 
+    1321, 
+    7745, 
+    592, 
+    7688
+  ], 
+  [
+    911, 
+    "LORI BLANCHARD", 
+    42, 
+    "F", 
+    "SUWANEE GA", 
+    159, 
+    7747, 
+    592, 
+    7726
+  ], 
+  [
+    912, 
+    "MERIDITH OKEEFE", 
+    38, 
+    "F", 
+    "ATLANTA GA", 
+    1365, 
+    7749, 
+    592, 
+    7729
+  ], 
+  [
+    913, 
+    "NANCY LOCHMAN", 
+    40, 
+    "F", 
+    "ROSWELL GA", 
+    1113, 
+    7751, 
+    592, 
+    7715
+  ], 
+  [
+    914, 
+    "VICKI GRIZZARD", 
+    39, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    742, 
+    7759, 
+    593, 
+    7673
+  ], 
+  [
+    915, 
+    "VICKI WASHINGTON", 
+    48, 
+    "F", 
+    "NICEVILLE FL", 
+    1927, 
+    7761, 
+    593, 
+    7701
+  ], 
+  [
+    916, 
+    "YEVONE DEAN", 
+    45, 
+    "F", 
+    "ACWORTH GA", 
+    462, 
+    7761, 
+    593, 
+    7702
+  ], 
+  [
+    917, 
+    "NAVEEN BOOMA", 
+    27, 
+    "M", 
+    "ATLANTA GA", 
+    175, 
+    7764, 
+    593, 
+    7740
+  ], 
+  [
+    918, 
+    "JOSEPH PATRICK", 
+    27, 
+    "M", 
+    "MILLEDGEVILLE GA", 
+    1403, 
+    7774, 
+    594, 
+    7670
+  ], 
+  [
+    919, 
+    "ANGIE BOGGS", 
+    36, 
+    "F", 
+    "ATLANTA GA", 
+    167, 
+    7774, 
+    594, 
+    7736
+  ], 
+  [
+    920, 
+    "STACY WOLFF", 
+    45, 
+    "F", 
+    "MARIETTA GA", 
+    1997, 
+    7779, 
+    594, 
+    7732
+  ], 
+  [
+    921, 
+    "LAURA KURTZ", 
+    49, 
+    "F", 
+    "ROSWELL GA", 
+    1042, 
+    7783, 
+    595, 
+    7723
+  ], 
+  [
+    922, 
+    "TERRY SMITH", 
+    42, 
+    "M", 
+    "MCHENRY IL", 
+    1717, 
+    7783, 
+    595, 
+    7720
+  ], 
+  [
+    923, 
+    "CHRISTOPHER HICKMAN", 
+    34, 
+    "M", 
+    "MABLETON GA", 
+    842, 
+    7784, 
+    595, 
+    7739
+  ], 
+  [
+    924, 
+    "TRACY SELLARS", 
+    35, 
+    "F", 
+    "DALLAS GA", 
+    1639, 
+    7784, 
+    595, 
+    7720
+  ], 
+  [
+    925, 
+    "SUSAN MEHRE", 
+    43, 
+    "F", 
+    "ATLANTA GA", 
+    1249, 
+    7784, 
+    595, 
+    7713
+  ], 
+  [
+    926, 
+    "JAMES GAVIN", 
+    35, 
+    "M", 
+    "WOODSTOCK GA", 
+    679, 
+    7785, 
+    595, 
+    7690
+  ], 
+  [
+    927, 
+    "SUSAN BRADBURY", 
+    47, 
+    "F", 
+    "DECATUR GA", 
+    193, 
+    7785, 
+    595, 
+    7768
+  ], 
+  [
+    928, 
+    "MEGAN BAGBY", 
+    23, 
+    "F", 
+    "BIRMINGHAM AL", 
+    78, 
+    7788, 
+    595, 
+    7745
+  ], 
+  [
+    929, 
+    "PAUL LAZAR", 
+    45, 
+    "M", 
+    "WOODSTOCK GA", 
+    1069, 
+    7790, 
+    595, 
+    7722
+  ], 
+  [
+    930, 
+    "LYNN RIECK", 
+    42, 
+    "F", 
+    "ATLANTA GA", 
+    1526, 
+    7799, 
+    596, 
+    7744
+  ], 
+  [
+    931, 
+    "KELLY KITTLE", 
+    40, 
+    "F", 
+    "ALPHARETTA GA", 
+    1010, 
+    7802, 
+    596, 
+    7746
+  ], 
+  [
+    932, 
+    "JOHN KITTLE", 
+    41, 
+    "M", 
+    "ALPHARETTA GA", 
+    1009, 
+    7802, 
+    596, 
+    7746
+  ], 
+  [
+    933, 
+    "JOE DAVIS", 
+    57, 
+    "M", 
+    "CHATSWORTH GA", 
+    450, 
+    7803, 
+    596, 
+    7718
+  ], 
+  [
+    934, 
+    "KEN FORDE", 
+    41, 
+    "M", 
+    "SANDY SPRINGS GA", 
+    620, 
+    7807, 
+    596, 
+    7779
+  ], 
+  [
+    935, 
+    "CATHY ADDISON", 
+    50, 
+    "F", 
+    "ATLANTA GA", 
+    12, 
+    7814, 
+    597, 
+    7772
+  ], 
+  [
+    936, 
+    "ERIC SCHWARTZ", 
+    26, 
+    "M", 
+    "ATLANTA GA", 
+    1620, 
+    7818, 
+    597, 
+    7749
+  ], 
+  [
+    937, 
+    "AVERY WIENS", 
+    17, 
+    "F", 
+    "ATLANTA GA", 
+    1966, 
+    7820, 
+    597, 
+    7720
+  ], 
+  [
+    938, 
+    "REBECCA ORTON", 
+    29, 
+    "F", 
+    "ATLANTA GA", 
+    1376, 
+    7823, 
+    598, 
+    7755
+  ], 
+  [
+    939, 
+    "CASSIE LASSITER", 
+    38, 
+    "F", 
+    "ATLANTA GA", 
+    1060, 
+    7826, 
+    598, 
+    7784
+  ], 
+  [
+    940, 
+    "GURURAJ RAO", 
+    41, 
+    "M", 
+    "MARIETTA GA", 
+    1493, 
+    7828, 
+    598, 
+    7788
+  ], 
+  [
+    941, 
+    "YANTO YANTO", 
+    26, 
+    "M", 
+    "ATLANTA GA", 
+    2014, 
+    7828, 
+    598, 
+    7811
+  ], 
+  [
+    942, 
+    "SHANE HEWGLEY", 
+    40, 
+    "M", 
+    "WOODSTOCK GA", 
+    841, 
+    7832, 
+    598, 
+    7799
+  ], 
+  [
+    943, 
+    "KATIE WRIGHT", 
+    32, 
+    "F", 
+    "MABLETON GA", 
+    2007, 
+    7835, 
+    599, 
+    7755
+  ], 
+  [
+    944, 
+    "MICHAEL RUSSELL", 
+    38, 
+    "M", 
+    "ATLANTA GA", 
+    1577, 
+    7837, 
+    599, 
+    7780
+  ], 
+  [
+    945, 
+    "AARON BARTELS", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    111, 
+    7839, 
+    599, 
+    7824
+  ], 
+  [
+    946, 
+    "CALLEY MERSMANN", 
+    21, 
+    "F", 
+    "SNELLVILLE GA", 
+    1264, 
+    7840, 
+    599, 
+    7727
+  ], 
+  [
+    947, 
+    "DESMOND SULLIVAN", 
+    34, 
+    "M", 
+    "ATLANTA GA", 
+    1780, 
+    7843, 
+    599, 
+    7749
+  ], 
+  [
+    948, 
+    "REETIKA NIJHAWAN", 
+    37, 
+    "F", 
+    "ATLANTA GA", 
+    1348, 
+    7845, 
+    599, 
+    7790
+  ], 
+  [
+    949, 
+    "BARRY BARTON", 
+    37, 
+    "M", 
+    "CARROLLTON GA", 
+    114, 
+    7847, 
+    599, 
+    7789
+  ], 
+  [
+    950, 
+    "STEVE DRUCKENMILLER", 
+    47, 
+    "M", 
+    "CUMMING GA", 
+    526, 
+    7850, 
+    600, 
+    7804
+  ], 
+  [
+    951, 
+    "LANNY BRANUM", 
+    37, 
+    "M", 
+    "DUNWOODY GA", 
+    196, 
+    7851, 
+    600, 
+    7783
+  ], 
+  [
+    952, 
+    "LUTHER OPJORDEN", 
+    65, 
+    "M", 
+    "MILAN MN", 
+    1373, 
+    7854, 
+    600, 
+    7787
+  ], 
+  [
+    953, 
+    "RODNEY EDWARDS", 
+    34, 
+    "M", 
+    "CANTON GA", 
+    552, 
+    7855, 
+    600, 
+    7801
+  ], 
+  [
+    954, 
+    "TINA HARMON", 
+    42, 
+    "F", 
+    "ATLANTA GA", 
+    788, 
+    7856, 
+    600, 
+    7796
+  ], 
+  [
+    955, 
+    "GREG WERCHANOWSKYJ", 
+    36, 
+    "M", 
+    "HELENA AL", 
+    1948, 
+    7856, 
+    600, 
+    7770
+  ], 
+  [
+    956, 
+    "BRANDON TYLER", 
+    26, 
+    "M", 
+    "ATLANTA GA", 
+    1872, 
+    7863, 
+    601, 
+    7809
+  ], 
+  [
+    957, 
+    "RALPH GIACOMARRO", 
+    49, 
+    "M", 
+    "CUMMING GA", 
+    690, 
+    7865, 
+    601, 
+    7804
+  ], 
+  [
+    958, 
+    "ELIZABETH WARD", 
+    23, 
+    "F", 
+    "ATLANTA GA", 
+    1919, 
+    7870, 
+    601, 
+    7844
+  ], 
+  [
+    959, 
+    "KIMBERLY ELLIS", 
+    29, 
+    "F", 
+    "PRATTVILLE AL", 
+    566, 
+    7873, 
+    601, 
+    7802
+  ], 
+  [
+    960, 
+    "GUY CHAMBLESS", 
+    38, 
+    "M", 
+    "ADAIRSVILLE GA", 
+    313, 
+    7876, 
+    602, 
+    7865
+  ], 
+  [
+    961, 
+    "CHRIS YUEH", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    2017, 
+    7883, 
+    602, 
+    7731
+  ], 
+  [
+    962, 
+    "KATE HANNON", 
+    33, 
+    "F", 
+    "ATLANTA GA", 
+    775, 
+    7883, 
+    602, 
+    7803
+  ], 
+  [
+    963, 
+    "JAMES TAYLOR", 
+    25, 
+    "M", 
+    "DOUGLASVILLE GA", 
+    1807, 
+    7886, 
+    602, 
+    7822
+  ], 
+  [
+    964, 
+    "NICOLE MEADOR", 
+    31, 
+    "F", 
+    "MARIETTA GA", 
+    1245, 
+    7887, 
+    602, 
+    7840
+  ], 
+  [
+    965, 
+    "CHANDRA BOZEMAN", 
+    41, 
+    "F", 
+    "JOHNS CREEK GA", 
+    188, 
+    7887, 
+    603, 
+    7818
+  ], 
+  [
+    966, 
+    "KIM SHUFORD", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    1677, 
+    7888, 
+    603, 
+    7807
+  ], 
+  [
+    967, 
+    "SHAREE CLARKE", 
+    36, 
+    "F", 
+    "ATLANTA GA", 
+    336, 
+    7889, 
+    603, 
+    7819
+  ], 
+  [
+    968, 
+    "MIKE LUEBECK", 
+    55, 
+    "M", 
+    "MCDONOUGH GA", 
+    1132, 
+    7892, 
+    603, 
+    7847
+  ], 
+  [
+    969, 
+    "ASHLEY WILLIAMS", 
+    38, 
+    "F", 
+    "MABLETON GA", 
+    1971, 
+    7896, 
+    603, 
+    7815
+  ], 
+  [
+    970, 
+    "CHRISTI MCCAREY", 
+    44, 
+    "F", 
+    "MARIETTA GA", 
+    1194, 
+    7906, 
+    604, 
+    7875
+  ], 
+  [
+    971, 
+    "WHITNEY BROWN", 
+    26, 
+    "F", 
+    "ATLANTA GA", 
+    221, 
+    7906, 
+    604, 
+    7836
+  ], 
+  [
+    972, 
+    "WALT LIPHAM", 
+    15, 
+    "M", 
+    "CARROLLTON GA", 
+    1106, 
+    7915, 
+    605, 
+    7838
+  ], 
+  [
+    973, 
+    "JARIAN RICH", 
+    31, 
+    "M", 
+    "WOODSTOCK GA", 
+    1520, 
+    7915, 
+    605, 
+    7860
+  ], 
+  [
+    974, 
+    "COLLEEN SPRAYBERRY", 
+    48, 
+    "F", 
+    "NEWNAN GA", 
+    1741, 
+    7924, 
+    605, 
+    7880
+  ], 
+  [
+    975, 
+    "ANDREW SAMPSON", 
+    29, 
+    "M", 
+    "LAKELAND FL", 
+    1585, 
+    7926, 
+    605, 
+    7862
+  ], 
+  [
+    976, 
+    "SAMUEL SAMPSON", 
+    30, 
+    "M", 
+    "MARIETTA GA", 
+    1586, 
+    7926, 
+    605, 
+    7863
+  ], 
+  [
+    977, 
+    "LOU DEMARINO", 
+    37, 
+    "M", 
+    "MABLETON GA", 
+    471, 
+    7930, 
+    606, 
+    7899
+  ], 
+  [
+    978, 
+    "MARICELA SMITH", 
+    39, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    1712, 
+    7931, 
+    606, 
+    7837
+  ], 
+  [
+    979, 
+    "AMBER COOK", 
+    39, 
+    "F", 
+    "WOODSTOCK GA", 
+    373, 
+    7937, 
+    606, 
+    7905
+  ], 
+  [
+    980, 
+    "ELIZABETH BROWN", 
+    14, 
+    "F", 
+    "ANNISTON AL", 
+    218, 
+    7937, 
+    606, 
+    7865
+  ], 
+  [
+    981, 
+    "JAMIE LIMBAUGH", 
+    33, 
+    "F", 
+    "ANNISTON AL", 
+    1101, 
+    7938, 
+    606, 
+    7866
+  ], 
+  [
+    982, 
+    "MARK LEWIS", 
+    39, 
+    "M", 
+    "ACWORTH GA", 
+    1092, 
+    7940, 
+    607, 
+    7907
+  ], 
+  [
+    983, 
+    "ANDREA GEPFER", 
+    27, 
+    "F", 
+    "ACWORTH GA", 
+    685, 
+    7945, 
+    607, 
+    7858
+  ], 
+  [
+    984, 
+    "JAMES KING", 
+    50, 
+    "M", 
+    "ATLANTA GA", 
+    2140, 
+    7946, 
+    607, 
+    7867
+  ], 
+  [
+    985, 
+    "MICHAEL ETHRIDGE", 
+    44, 
+    "M", 
+    "MARIETTA GA", 
+    584, 
+    7946, 
+    607, 
+    7873
+  ], 
+  [
+    986, 
+    "MARK KAUFMAN", 
+    61, 
+    "M", 
+    "ATLANTA GA", 
+    971, 
+    7950, 
+    607, 
+    7866
+  ], 
+  [
+    987, 
+    "SUSAN ALDRICH", 
+    64, 
+    "F", 
+    "JOHNS CREEK GA", 
+    29, 
+    7951, 
+    607, 
+    7914
+  ], 
+  [
+    988, 
+    "JODY ALDERMAN", 
+    53, 
+    "M", 
+    "DECATUR GA", 
+    27, 
+    7954, 
+    608, 
+    7903
+  ], 
+  [
+    989, 
+    "DEBYE ALDERMAN", 
+    55, 
+    "F", 
+    "DECATUR GA", 
+    26, 
+    7954, 
+    608, 
+    7903
+  ], 
+  [
+    990, 
+    "BOB REEVES", 
+    43, 
+    "M", 
+    "MARIETTA GA", 
+    1507, 
+    7956, 
+    608, 
+    7929
+  ], 
+  [
+    991, 
+    "KERRY DOUGHERTY", 
+    44, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    511, 
+    7957, 
+    608, 
+    7899
+  ], 
+  [
+    992, 
+    "GLORIA LAWTON", 
+    27, 
+    "F", 
+    "CUMMING GA", 
+    1067, 
+    7957, 
+    608, 
+    7884
+  ], 
+  [
+    993, 
+    "LEAH WOLFE", 
+    31, 
+    "F", 
+    "MARIETTA GA", 
+    1994, 
+    7957, 
+    608, 
+    7927
+  ], 
+  [
+    994, 
+    "AIMEE WATKISS", 
+    35, 
+    "F", 
+    "PEACHTREE CITY GA", 
+    1932, 
+    7958, 
+    608, 
+    7868
+  ], 
+  [
+    995, 
+    "DANIEL DONOHUE", 
+    42, 
+    "M", 
+    "MARIETTA GA", 
+    507, 
+    7959, 
+    608, 
+    7927
+  ], 
+  [
+    996, 
+    "CAROLINE PHILSON", 
+    39, 
+    "F", 
+    "ATLANTA GA", 
+    1438, 
+    7963, 
+    608, 
+    7810
+  ], 
+  [
+    997, 
+    "ASTRID FONTAINE", 
+    41, 
+    "F", 
+    "MABLETON GA", 
+    618, 
+    7964, 
+    608, 
+    7940
+  ], 
+  [
+    998, 
+    "KIM SCHOEN", 
+    50, 
+    "F", 
+    "COHUTTA GA", 
+    1615, 
+    7964, 
+    608, 
+    7883
+  ], 
+  [
+    999, 
+    "KACIE DARDEN", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    442, 
+    7965, 
+    608, 
+    7883
+  ], 
+  [
+    1000, 
+    "SANDRA HUEY", 
+    48, 
+    "F", 
+    "CARROLLTON GA", 
+    881, 
+    7966, 
+    609, 
+    7878
+  ], 
+  [
+    1001, 
+    "MICHAEL JAMIESON", 
+    45, 
+    "M", 
+    "SUWANEE GA", 
+    918, 
+    7968, 
+    609, 
+    7859
+  ], 
+  [
+    1002, 
+    "DANIEL JAMES", 
+    40, 
+    "M", 
+    "DACULA GA", 
+    915, 
+    7975, 
+    609, 
+    7915
+  ], 
+  [
+    1003, 
+    "KARLA BROOKRESON-OWENS", 
+    35, 
+    "F", 
+    "STOCKBRIDGE GA", 
+    211, 
+    7976, 
+    609, 
+    7862
+  ], 
+  [
+    1004, 
+    "CHRISTOPHER TENNANT", 
+    39, 
+    "M", 
+    "ATLANTA GA", 
+    1816, 
+    7978, 
+    609, 
+    7879
+  ], 
+  [
+    1005, 
+    "ELLIS THORP", 
+    45, 
+    "M", 
+    "ATLANTA GA", 
+    1831, 
+    7982, 
+    610, 
+    7927
+  ], 
+  [
+    1006, 
+    "SUZANNE LEBLANC", 
+    40, 
+    "F", 
+    "ATLANTA GA", 
+    1076, 
+    7982, 
+    610, 
+    7927
+  ], 
+  [
+    1007, 
+    "MEGHAN STACK", 
+    25, 
+    "F", 
+    "ACWORTH GA", 
+    1747, 
+    7983, 
+    610, 
+    7895
+  ], 
+  [
+    1008, 
+    "DONNA THOMPSON", 
+    41, 
+    "F", 
+    "CARROLLTON GA", 
+    1824, 
+    7989, 
+    610, 
+    7944
+  ], 
+  [
+    1009, 
+    "JOSHUA CURRAN", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    422, 
+    7990, 
+    610, 
+    7921
+  ], 
+  [
+    1010, 
+    "BRAD TROHA", 
+    36, 
+    "M", 
+    "DUNWOODY GA", 
+    1855, 
+    7991, 
+    610, 
+    7879
+  ], 
+  [
+    1011, 
+    "SARAH GOODBREAD", 
+    28, 
+    "F", 
+    "KENNESAW GA", 
+    708, 
+    7993, 
+    611, 
+    7891
+  ], 
+  [
+    1012, 
+    "MELODY SANFREY", 
+    38, 
+    "F", 
+    "MACON GA", 
+    1594, 
+    7995, 
+    611, 
+    7934
+  ], 
+  [
+    1013, 
+    "STACEY HIPPS", 
+    27, 
+    "F", 
+    "CUMMING GA", 
+    845, 
+    7999, 
+    611, 
+    7958
+  ], 
+  [
+    1014, 
+    "KATIE URBAN", 
+    30, 
+    "F", 
+    "ATLANTA GA", 
+    1875, 
+    7999, 
+    611, 
+    7968
+  ], 
+  [
+    1015, 
+    "CHRISTIE WILLIAMS", 
+    35, 
+    "F", 
+    "MARIETTA GA", 
+    1972, 
+    8002, 
+    611, 
+    7903
+  ], 
+  [
+    1016, 
+    "CINDY LOHEIDE", 
+    39, 
+    "F", 
+    "MABLETON GA", 
+    1119, 
+    8002, 
+    611, 
+    7903
+  ], 
+  [
+    1017, 
+    "CHARLES EARL", 
+    32, 
+    "M", 
+    "ATLANTA GA", 
+    540, 
+    8002, 
+    611, 
+    7954
+  ], 
+  [
+    1018, 
+    "PAOLA BEACH", 
+    41, 
+    "F", 
+    "LILBURN GA", 
+    128, 
+    8005, 
+    612, 
+    7908
+  ], 
+  [
+    1019, 
+    "JUDITH ROBINSON", 
+    48, 
+    "F", 
+    "MARIETTA GA", 
+    1544, 
+    8008, 
+    612, 
+    7961
+  ], 
+  [
+    1020, 
+    "ROSINA AUGSBURGER", 
+    43, 
+    "F", 
+    "MARIETTA GA", 
+    71, 
+    8018, 
+    612, 
+    7965
+  ], 
+  [
+    1021, 
+    "SCARLET HAYES", 
+    35, 
+    "F", 
+    "WOODSTOCK GA", 
+    2023, 
+    8019, 
+    613, 
+    7946
+  ], 
+  [
+    1022, 
+    "KATIE GOLDSMITH", 
+    28, 
+    "F", 
+    "ATLANTA GA", 
+    704, 
+    8025, 
+    613, 
+    7999
+  ], 
+  [
+    1023, 
+    "BRETT LAZANSKY", 
+    38, 
+    "M", 
+    "JOHNS CREEK GA", 
+    1068, 
+    8025, 
+    613, 
+    7997
+  ], 
+  [
+    1024, 
+    "DOUG STROMMEN", 
+    50, 
+    "M", 
+    "MARIETTA GA", 
+    1771, 
+    8027, 
+    613, 
+    7954
+  ], 
+  [
+    1025, 
+    "TOM KESLING", 
+    40, 
+    "M", 
+    "ACWORTH GA", 
+    991, 
+    8037, 
+    614, 
+    7967
+  ], 
+  [
+    1026, 
+    "ROBERT FRIESS", 
+    37, 
+    "M", 
+    "KENNESAW GA", 
+    648, 
+    8037, 
+    614, 
+    7967
+  ], 
+  [
+    1027, 
+    "KIMBERLY NICKELS", 
+    34, 
+    "F", 
+    "WOODSTOCK GA", 
+    1346, 
+    8040, 
+    614, 
+    7972
+  ], 
+  [
+    1028, 
+    "PETER BRACCI", 
+    33, 
+    "M", 
+    "SMYRNA GA", 
+    191, 
+    8042, 
+    614, 
+    7973
+  ], 
+  [
+    1029, 
+    "LILLIAN BARNES", 
+    43, 
+    "F", 
+    "DALLAS GA", 
+    103, 
+    8047, 
+    615, 
+    8033
+  ], 
+  [
+    1030, 
+    "KIM FRANLIN", 
+    29, 
+    "F", 
+    "MARIETTA GA", 
+    633, 
+    8048, 
+    615, 
+    7993
+  ], 
+  [
+    1031, 
+    "MELODY SHELTON", 
+    42, 
+    "F", 
+    "MARIETTA GA", 
+    1665, 
+    8054, 
+    615, 
+    7976
+  ], 
+  [
+    1032, 
+    "EVELYN RACHED", 
+    33, 
+    "F", 
+    "ALPHARETTA GA", 
+    1480, 
+    8058, 
+    616, 
+    7985
+  ], 
+  [
+    1033, 
+    "CRAIG CHAMBERS", 
+    45, 
+    "M", 
+    "MCDONOUGH GA", 
+    311, 
+    8059, 
+    616, 
+    7967
+  ], 
+  [
+    1034, 
+    "CINDI CHAMBERS", 
+    42, 
+    "F", 
+    "MCDONOUGH GA", 
+    310, 
+    8059, 
+    616, 
+    7966
+  ], 
+  [
+    1035, 
+    "DONNA CLEARY", 
+    43, 
+    "F", 
+    "MCDONOUGH GA", 
+    338, 
+    8060, 
+    616, 
+    7967
+  ], 
+  [
+    1036, 
+    "RYAN HANSELL", 
+    29, 
+    "M", 
+    "ATLANTA GA", 
+    777, 
+    8060, 
+    616, 
+    8009
+  ], 
+  [
+    1037, 
+    "AMANDA HANSELL", 
+    28, 
+    "F", 
+    "ATLANTA GA", 
+    776, 
+    8060, 
+    616, 
+    8010
+  ], 
+  [
+    1038, 
+    "EUGENE VAN SICKLE", 
+    38, 
+    "M", 
+    "DAHLONEGA GA", 
+    1881, 
+    8062, 
+    616, 
+    7995
+  ], 
+  [
+    1039, 
+    "MARY HARPER", 
+    45, 
+    "F", 
+    "ATLANTA GA", 
+    790, 
+    8063, 
+    616, 
+    7893
+  ], 
+  [
+    1040, 
+    "SRIDHAR VENNA", 
+    36, 
+    "M", 
+    "SMYRNA GA", 
+    1889, 
+    8074, 
+    617, 
+    7990
+  ], 
+  [
+    1041, 
+    "GARY ANDREWS", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    55, 
+    8075, 
+    617, 
+    8016
+  ], 
+  [
+    1042, 
+    "BOBBI HARWOOD", 
+    40, 
+    "F", 
+    "ATLANTA GA", 
+    807, 
+    8078, 
+    617, 
+    8020
+  ], 
+  [
+    1043, 
+    "YVETTE MORGAN", 
+    37, 
+    "F", 
+    "SUWANEE GA", 
+    1313, 
+    8081, 
+    617, 
+    8011
+  ], 
+  [
+    1044, 
+    "CATHY BANKSTON", 
+    36, 
+    "F", 
+    "FORSYTH GA", 
+    95, 
+    8086, 
+    618, 
+    8004
+  ], 
+  [
+    1045, 
+    "LORI WARD", 
+    37, 
+    "F", 
+    "MARIETTA GA", 
+    1921, 
+    8090, 
+    618, 
+    8063
+  ], 
+  [
+    1046, 
+    "MELANIE GERNATT", 
+    52, 
+    "F", 
+    "MARIETTA GA", 
+    689, 
+    8091, 
+    618, 
+    8063
+  ], 
+  [
+    1047, 
+    "VALERIE DAVIS", 
+    39, 
+    "F", 
+    "KENNESAW GA", 
+    456, 
+    8091, 
+    618, 
+    8009
+  ], 
+  [
+    1048, 
+    "RONALD PRINCE", 
+    52, 
+    "M", 
+    "MARIETTA GA", 
+    1471, 
+    8091, 
+    618, 
+    8010
+  ], 
+  [
+    1049, 
+    "JENNIFER COOKE", 
+    29, 
+    "F", 
+    "CUMMING GA", 
+    379, 
+    8092, 
+    618, 
+    8024
+  ], 
+  [
+    1050, 
+    "DANIEL SHUFORD", 
+    33, 
+    "M", 
+    "ATLANTA GA", 
+    1676, 
+    8094, 
+    618, 
+    8011
+  ], 
+  [
+    1051, 
+    "KATHI KIMBELL", 
+    45, 
+    "F", 
+    "GRIFFIN GA", 
+    997, 
+    8096, 
+    618, 
+    8051
+  ], 
+  [
+    1052, 
+    "AMANDA KREFT", 
+    36, 
+    "F", 
+    "CANTON GA", 
+    1023, 
+    8099, 
+    619, 
+    8057
+  ], 
+  [
+    1053, 
+    "KEVIN KREFT", 
+    35, 
+    "M", 
+    "CANTON GA", 
+    1024, 
+    8100, 
+    619, 
+    8057
+  ], 
+  [
+    1054, 
+    "AMANDA JACOBS", 
+    37, 
+    "F", 
+    "SUWANEE GA", 
+    2024, 
+    8100, 
+    619, 
+    8016
+  ], 
+  [
+    1055, 
+    "RYAN FREEL", 
+    32, 
+    "M", 
+    "MARIETTA GA", 
+    638, 
+    8102, 
+    619, 
+    8038
+  ], 
+  [
+    1056, 
+    "SCOTT DRINKARD", 
+    44, 
+    "M", 
+    "ATLANTA GA", 
+    523, 
+    8103, 
+    619, 
+    8036
+  ], 
+  [
+    1057, 
+    "AMY MERRILL", 
+    38, 
+    "F", 
+    "ATLANTA GA", 
+    1258, 
+    8105, 
+    619, 
+    8049
+  ], 
+  [
+    1058, 
+    "CHAD MERRILL", 
+    43, 
+    "M", 
+    "ATLANTA GA", 
+    1260, 
+    8105, 
+    619, 
+    8049
+  ], 
+  [
+    1059, 
+    "JENNY SCHNEIDER", 
+    43, 
+    "F", 
+    "CUMMING GA", 
+    1612, 
+    8113, 
+    620, 
+    8079
+  ], 
+  [
+    1060, 
+    "TERRIE TILLMAN", 
+    42, 
+    "F", 
+    "SMYRNA GA", 
+    1839, 
+    8114, 
+    620, 
+    8059
+  ], 
+  [
+    1061, 
+    "NICK J BIERIE", 
+    21, 
+    "M", 
+    "ACWORTH GA", 
+    154, 
+    8114, 
+    620, 
+    8046
+  ], 
+  [
+    1062, 
+    "SHARON LAWSON", 
+    30, 
+    "F", 
+    "SUWANEE GA", 
+    1066, 
+    8117, 
+    620, 
+    8074
+  ], 
+  [
+    1063, 
+    "MARTHA PACINI", 
+    50, 
+    "F", 
+    "ATLANTA GA", 
+    1386, 
+    8118, 
+    620, 
+    8009
+  ], 
+  [
+    1064, 
+    "JENNIFER WEINGARTH", 
+    38, 
+    "F", 
+    "SUWANEE GA", 
+    1941, 
+    8119, 
+    620, 
+    8077
+  ], 
+  [
+    1065, 
+    "COLLEEN DESANTIS", 
+    45, 
+    "F", 
+    "MARIETTA FL", 
+    482, 
+    8120, 
+    620, 
+    8023
+  ], 
+  [
+    1066, 
+    "SALLIE HONEYCHURCH", 
+    55, 
+    "F", 
+    "ATLANTA GA", 
+    859, 
+    8123, 
+    621, 
+    8044
+  ], 
+  [
+    1067, 
+    "LARRY PEPPER", 
+    60, 
+    "M", 
+    "ALPHARETTA GA", 
+    1417, 
+    8123, 
+    621, 
+    8094
+  ], 
+  [
+    1068, 
+    "MELISSA HAPGOOD", 
+    42, 
+    "F", 
+    "SMYRNA GA", 
+    780, 
+    8124, 
+    621, 
+    8061
+  ], 
+  [
+    1069, 
+    "DEBBIE BRYANT", 
+    54, 
+    "F", 
+    "JASPER GA", 
+    229, 
+    8126, 
+    621, 
+    8069
+  ], 
+  [
+    1070, 
+    "KATHIE WOOD", 
+    43, 
+    "F", 
+    "MARIETTAQ GA", 
+    1999, 
+    8127, 
+    621, 
+    8019
+  ], 
+  [
+    1071, 
+    "DENISE MIRABELLA", 
+    40, 
+    "F", 
+    "CANTON GA", 
+    1290, 
+    8130, 
+    621, 
+    8051
+  ], 
+  [
+    1072, 
+    "NICKI MARMOLL", 
+    46, 
+    "F", 
+    "MARIETTA GA", 
+    1171, 
+    8134, 
+    621, 
+    8036
+  ], 
+  [
+    1073, 
+    "KELLY EMERICK", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    570, 
+    8136, 
+    622, 
+    8082
+  ], 
+  [
+    1074, 
+    "LEE BECKNELL", 
+    32, 
+    "F", 
+    "TUCKER GA", 
+    135, 
+    8141, 
+    622, 
+    8064
+  ], 
+  [
+    1075, 
+    "JEANNA CHALLY", 
+    37, 
+    "F", 
+    "SMYRNA GA", 
+    308, 
+    8143, 
+    622, 
+    8039
+  ], 
+  [
+    1076, 
+    "DARREN MARTIN", 
+    36, 
+    "M", 
+    "DAHLONEGA GA", 
+    1173, 
+    8147, 
+    622, 
+    8096
+  ], 
+  [
+    1077, 
+    "WESLEY PARKER", 
+    39, 
+    "M", 
+    "CALHOUN GA", 
+    1396, 
+    8152, 
+    623, 
+    8023
+  ], 
+  [
+    1078, 
+    "JOY SANDOZ", 
+    39, 
+    "F", 
+    "SANDY SPRINGS GA", 
+    1593, 
+    8152, 
+    623, 
+    8071
+  ], 
+  [
+    1079, 
+    "MICHAEL QUIGLEY", 
+    38, 
+    "M", 
+    "ATLANTA GA", 
+    1476, 
+    8153, 
+    623, 
+    8082
+  ], 
+  [
+    1080, 
+    "LINDA NATTRASS", 
+    38, 
+    "F", 
+    "WOODSTOCK GA", 
+    1334, 
+    8156, 
+    623, 
+    8072
+  ], 
+  [
+    1081, 
+    "APRIL STAMBAUGH", 
+    40, 
+    "F", 
+    "ALPHARETTA GA", 
+    1750, 
+    8164, 
+    624, 
+    8093
+  ], 
+  [
+    1082, 
+    "MEERA MODI", 
+    26, 
+    "F", 
+    "ATLANTA GA", 
+    1295, 
+    8167, 
+    624, 
+    8071
+  ], 
+  [
+    1083, 
+    "REBECCA ROFFMAN", 
+    28, 
+    "F", 
+    "DECATUR GA", 
+    1550, 
+    8167, 
+    624, 
+    8071
+  ], 
+  [
+    1084, 
+    "SUSAN MILLS", 
+    62, 
+    "F", 
+    "PEACHTREE CITY GA", 
+    1288, 
+    8168, 
+    624, 
+    8091
+  ], 
+  [
+    1085, 
+    "KRISTIN DEMELFI", 
+    26, 
+    "F", 
+    "ATLANTA GA", 
+    473, 
+    8171, 
+    624, 
+    8091
+  ], 
+  [
+    1086, 
+    "KIM CEPULL", 
+    41, 
+    "F", 
+    "ROSWELL GA", 
+    305, 
+    8177, 
+    625, 
+    8099
+  ], 
+  [
+    1087, 
+    "CARY SCALES", 
+    36, 
+    "F", 
+    "SMYRNA GA", 
+    1599, 
+    8186, 
+    625, 
+    8161
+  ], 
+  [
+    1088, 
+    "DENISE BIERIE", 
+    54, 
+    "F", 
+    "ACWORTH GA", 
+    153, 
+    8187, 
+    625, 
+    8119
+  ], 
+  [
+    1089, 
+    "BRIAN BRODSKY", 
+    29, 
+    "M", 
+    "CARROLLTON GA", 
+    208, 
+    8188, 
+    625, 
+    8165
+  ], 
+  [
+    1090, 
+    "ANASTASIA WALKER", 
+    38, 
+    "F", 
+    "PEACHTREE CITY GA", 
+    1901, 
+    8189, 
+    626, 
+    8141
+  ], 
+  [
+    1091, 
+    "CRAIG SHULER", 
+    43, 
+    "M", 
+    "SMYRNA GA", 
+    1678, 
+    8196, 
+    626, 
+    8125
+  ], 
+  [
+    1092, 
+    "MELISSA ADAMS", 
+    33, 
+    "F", 
+    "DAHLONEGA GA", 
+    11, 
+    8200, 
+    626, 
+    8085
+  ], 
+  [
+    1093, 
+    "MEG ROBINSON", 
+    31, 
+    "F", 
+    "DECATUR GA", 
+    1546, 
+    8204, 
+    627, 
+    8151
+  ], 
+  [
+    1094, 
+    "THERESA SMITH", 
+    41, 
+    "F", 
+    "MABLETON GA", 
+    1718, 
+    8205, 
+    627, 
+    8140
+  ], 
+  [
+    1095, 
+    "DEON WILLIS", 
+    40, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    1978, 
+    8207, 
+    627, 
+    8176
+  ], 
+  [
+    1096, 
+    "JASON BEAVER", 
+    37, 
+    "M", 
+    "DULUTH GA", 
+    132, 
+    8210, 
+    627, 
+    8194
+  ], 
+  [
+    1097, 
+    "LISA WEARING", 
+    43, 
+    "F", 
+    "ATLANTA GA", 
+    1936, 
+    8210, 
+    627, 
+    8145
+  ], 
+  [
+    1098, 
+    "JODI BOSSAK", 
+    33, 
+    "F", 
+    "AUSTELL GA", 
+    176, 
+    8217, 
+    628, 
+    8139
+  ], 
+  [
+    1099, 
+    "ROBERT OWEN", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    1381, 
+    8223, 
+    628, 
+    8166
+  ], 
+  [
+    1100, 
+    "LORI BRENNAN", 
+    36, 
+    "F", 
+    "MABLETON GA", 
+    201, 
+    8224, 
+    628, 
+    8144
+  ], 
+  [
+    1101, 
+    "DONALD STAPLES", 
+    50, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    1756, 
+    8230, 
+    629, 
+    8142
+  ], 
+  [
+    1102, 
+    "MELINDA PRUITT", 
+    41, 
+    "F", 
+    "GRIFFIN GA", 
+    1474, 
+    8234, 
+    629, 
+    8176
+  ], 
+  [
+    1103, 
+    "JESSICA CUMMO", 
+    30, 
+    "F", 
+    "ATLANTA GA", 
+    414, 
+    8235, 
+    629, 
+    8072
+  ], 
+  [
+    1104, 
+    "MILLARD DAVIS", 
+    57, 
+    "M", 
+    "ATLANTA GA", 
+    452, 
+    8236, 
+    629, 
+    8167
+  ], 
+  [
+    1105, 
+    "AMY JEWETT", 
+    39, 
+    "F", 
+    "ROSWELL GA", 
+    934, 
+    8237, 
+    629, 
+    8180
+  ], 
+  [
+    1106, 
+    "LISA TERRY", 
+    45, 
+    "F", 
+    "JOHNS CREEK GA", 
+    1817, 
+    8237, 
+    629, 
+    -1
+  ], 
+  [
+    1107, 
+    "ROBERT MOORE", 
+    53, 
+    "M", 
+    "ACWORTH GA", 
+    1308, 
+    8242, 
+    630, 
+    8193
+  ], 
+  [
+    1108, 
+    "JIM PAGE", 
+    56, 
+    "M", 
+    "ACWORTH GA", 
+    1387, 
+    8243, 
+    630, 
+    8195
+  ], 
+  [
+    1109, 
+    "SUZANNE SIMKIN", 
+    48, 
+    "F", 
+    "ATLANTA GA", 
+    1680, 
+    8243, 
+    630, 
+    -1
+  ], 
+  [
+    1110, 
+    "JODY KUBIET", 
+    35, 
+    "F", 
+    "NEWNAN GA", 
+    1034, 
+    8244, 
+    630, 
+    8179
+  ], 
+  [
+    1111, 
+    "JENNIFER MCDUFFEE", 
+    40, 
+    "F", 
+    "ROSWELL GA", 
+    1211, 
+    8244, 
+    630, 
+    8178
+  ], 
+  [
+    1112, 
+    "MEG FREDERICK", 
+    57, 
+    "F", 
+    "ATLANTA GA", 
+    637, 
+    8261, 
+    631, 
+    8195
+  ], 
+  [
+    1113, 
+    "KAREN KALLIS", 
+    43, 
+    "F", 
+    "SANDY SPINGS GA", 
+    965, 
+    8261, 
+    631, 
+    8197
+  ], 
+  [
+    1114, 
+    "CASEY BROGDON", 
+    51, 
+    "M", 
+    "SNELLVILLE GA", 
+    210, 
+    8266, 
+    631, 
+    8189
+  ], 
+  [
+    1115, 
+    "MIRANDA DILLARD", 
+    44, 
+    "F", 
+    "ATLANTA GA", 
+    492, 
+    8269, 
+    632, 
+    -1
+  ], 
+  [
+    1116, 
+    "NELSON BURKE", 
+    51, 
+    "M", 
+    "ATLANTA GA", 
+    245, 
+    8269, 
+    632, 
+    8199
+  ], 
+  [
+    1117, 
+    "TODD METCALF", 
+    39, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    1267, 
+    8272, 
+    632, 
+    8212
+  ], 
+  [
+    1118, 
+    "MIKE TETI", 
+    55, 
+    "M", 
+    "ACWORTH GA", 
+    1818, 
+    8274, 
+    632, 
+    8231
+  ], 
+  [
+    1119, 
+    "AMY GLOSSON", 
+    37, 
+    "F", 
+    "TUCKER GA", 
+    699, 
+    8281, 
+    633, 
+    8222
+  ], 
+  [
+    1120, 
+    "VICTORIA FLETCHER", 
+    31, 
+    "F", 
+    "SMYRNA GA", 
+    612, 
+    8281, 
+    633, 
+    8244
+  ], 
+  [
+    1121, 
+    "LISA MILLER", 
+    46, 
+    "F", 
+    "MILLEDGEVILLE GA", 
+    1281, 
+    8282, 
+    633, 
+    8178
+  ], 
+  [
+    1122, 
+    "MARY PICK", 
+    57, 
+    "F", 
+    "ATLANTA GA", 
+    1439, 
+    8282, 
+    633, 
+    8263
+  ], 
+  [
+    1123, 
+    "LINDSEY NELMS", 
+    21, 
+    "F", 
+    "ATLANTA GA", 
+    1338, 
+    8286, 
+    633, 
+    8253
+  ], 
+  [
+    1124, 
+    "HUGH ARMITAGE", 
+    56, 
+    "M", 
+    "DULUTH GA", 
+    63, 
+    8292, 
+    633, 
+    8218
+  ], 
+  [
+    1125, 
+    "JUANITA RAINEY", 
+    41, 
+    "F", 
+    "DULUTH GA", 
+    1486, 
+    8295, 
+    634, 
+    8178
+  ], 
+  [
+    1126, 
+    "PAUL BOUDREAU", 
+    44, 
+    "M", 
+    "MARIETTA GA", 
+    179, 
+    8298, 
+    634, 
+    8227
+  ], 
+  [
+    1127, 
+    "LOREN LYLES", 
+    24, 
+    "F", 
+    "MARIETTA GA", 
+    1138, 
+    8301, 
+    634, 
+    8203
+  ], 
+  [
+    1128, 
+    "KELLEY MAUTZ", 
+    40, 
+    "F", 
+    "DACULA GA", 
+    1188, 
+    8301, 
+    634, 
+    8193
+  ], 
+  [
+    1129, 
+    "HOLLEY FEINBERG", 
+    35, 
+    "F", 
+    "GRAYSON GA", 
+    593, 
+    8309, 
+    635, 
+    8233
+  ], 
+  [
+    1130, 
+    "CAREY HUDDLESTUN", 
+    51, 
+    "M", 
+    "ATLANTA GA", 
+    880, 
+    8320, 
+    636, 
+    8231
+  ], 
+  [
+    1131, 
+    "JAMES LATIMORE", 
+    55, 
+    "M", 
+    "MABLETON GA", 
+    1062, 
+    8320, 
+    636, 
+    8252
+  ], 
+  [
+    1132, 
+    "S WALLER", 
+    39, 
+    "M", 
+    "ATLANTA GA", 
+    1906, 
+    8326, 
+    636, 
+    8292
+  ], 
+  [
+    1133, 
+    "TONIKA LOMAX", 
+    35, 
+    "F", 
+    "CUMMING GA", 
+    1120, 
+    8329, 
+    636, 
+    8237
+  ], 
+  [
+    1134, 
+    "TAMMI PARKER", 
+    39, 
+    "F", 
+    "ATLANTA GA", 
+    1395, 
+    8331, 
+    636, 
+    8235
+  ], 
+  [
+    1135, 
+    "CHERIE AVIV", 
+    57, 
+    "F", 
+    "DUNWOODY GA", 
+    73, 
+    8331, 
+    636, 
+    8235
+  ], 
+  [
+    1136, 
+    "MARGARET TATE", 
+    58, 
+    "F", 
+    "MONROE NC", 
+    1803, 
+    8333, 
+    637, 
+    8257
+  ], 
+  [
+    1137, 
+    "AMANDA DEYOUNG", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    486, 
+    8334, 
+    637, 
+    8280
+  ], 
+  [
+    1138, 
+    "KRISTEN ROMANO", 
+    24, 
+    "F", 
+    "ATLANTA GA", 
+    1555, 
+    8334, 
+    637, 
+    8181
+  ], 
+  [
+    1139, 
+    "ROBERTA DALLA VERDE", 
+    38, 
+    "F", 
+    "SUWANEE GA", 
+    432, 
+    8341, 
+    637, 
+    8273
+  ], 
+  [
+    1140, 
+    "WENDY CATES", 
+    44, 
+    "F", 
+    "CUMMING GA", 
+    301, 
+    8343, 
+    637, 
+    8281
+  ], 
+  [
+    1141, 
+    "ASHLEY GIBLIN", 
+    30, 
+    "F", 
+    "ATLANTA GA", 
+    692, 
+    8347, 
+    638, 
+    8268
+  ], 
+  [
+    1142, 
+    "GAYLE MARTIN", 
+    44, 
+    "F", 
+    "CUMMING GA", 
+    1175, 
+    8348, 
+    638, 
+    8255
+  ], 
+  [
+    1143, 
+    "JEFF HARRINGTON", 
+    36, 
+    "M", 
+    "MONROE GA", 
+    792, 
+    8348, 
+    638, 
+    8273
+  ], 
+  [
+    1144, 
+    "JAMES HUNTER", 
+    38, 
+    "M", 
+    "CANTON GA", 
+    889, 
+    8349, 
+    638, 
+    -1
+  ], 
+  [
+    1145, 
+    "DAVID ASTOR", 
+    36, 
+    "M", 
+    "MARIETTA GA", 
+    68, 
+    8350, 
+    638, 
+    8296
+  ], 
+  [
+    1146, 
+    "KELLY MARLOW", 
+    43, 
+    "F", 
+    "CANTON GA", 
+    1170, 
+    8358, 
+    638, 
+    8323
+  ], 
+  [
+    1147, 
+    "H MICHAEL BURGETT", 
+    42, 
+    "M", 
+    "MARIETTA GA", 
+    244, 
+    8358, 
+    638, 
+    8288
+  ], 
+  [
+    1148, 
+    "RUSTY GUNTER", 
+    33, 
+    "M", 
+    "CARTERVILLE GA", 
+    747, 
+    8360, 
+    639, 
+    8305
+  ], 
+  [
+    1149, 
+    "JAMES HAYES", 
+    57, 
+    "M", 
+    "MABLETON GA", 
+    819, 
+    8363, 
+    639, 
+    8312
+  ], 
+  [
+    1150, 
+    "ROBERT DOYAL", 
+    37, 
+    "M", 
+    "PEACHTREE CITY GA", 
+    521, 
+    8375, 
+    640, 
+    8293
+  ], 
+  [
+    1151, 
+    "PETER BURKES", 
+    33, 
+    "M", 
+    "CUMMING GA", 
+    247, 
+    8375, 
+    640, 
+    8328
+  ], 
+  [
+    1152, 
+    "PATRICIA DUBOISE", 
+    43, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    528, 
+    8379, 
+    640, 
+    8311
+  ], 
+  [
+    1153, 
+    "MAGAN HARPER", 
+    37, 
+    "F", 
+    "DOUGLASVILLE GA", 
+    789, 
+    8381, 
+    640, 
+    8334
+  ], 
+  [
+    1154, 
+    "AMY GIROUD", 
+    37, 
+    "F", 
+    "ATLANTA GA", 
+    697, 
+    8381, 
+    640, 
+    8356
+  ], 
+  [
+    1155, 
+    "RACHEL MILES", 
+    29, 
+    "F", 
+    "ATLANTA GA", 
+    1270, 
+    8385, 
+    641, 
+    8312
+  ], 
+  [
+    1156, 
+    "KIM BOZEMAN", 
+    46, 
+    "F", 
+    "TEMPLE GA", 
+    189, 
+    8387, 
+    641, 
+    8300
+  ], 
+  [
+    1157, 
+    "SUSAN EDWARDS", 
+    34, 
+    "F", 
+    "DALLAS GA", 
+    554, 
+    8387, 
+    641, 
+    8310
+  ], 
+  [
+    1158, 
+    "DANIEL NICHOLS", 
+    26, 
+    "M", 
+    "DECATUR GA", 
+    1343, 
+    8392, 
+    641, 
+    8311
+  ], 
+  [
+    1159, 
+    "HIROHIKO ASAKAWA", 
+    52, 
+    "M", 
+    "ACWORTH GA", 
+    65, 
+    8393, 
+    641, 
+    8338
+  ], 
+  [
+    1160, 
+    "EMILY CARLTON", 
+    31, 
+    "F", 
+    "DECATUR GA", 
+    286, 
+    8395, 
+    641, 
+    8352
+  ], 
+  [
+    1161, 
+    "STEVEN POTTS", 
+    30, 
+    "M", 
+    "ATLANTA GA", 
+    1460, 
+    8396, 
+    641, 
+    8319
+  ], 
+  [
+    1162, 
+    "THERESA EBRON", 
+    37, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    545, 
+    8397, 
+    641, 
+    8303
+  ], 
+  [
+    1163, 
+    "ADRIENNE SMITH", 
+    31, 
+    "F", 
+    "DECATUR GA", 
+    1698, 
+    8397, 
+    641, 
+    8325
+  ], 
+  [
+    1164, 
+    "GINNY ROGERS", 
+    28, 
+    "F", 
+    "ADAIRSVILLE GA", 
+    1551, 
+    8398, 
+    641, 
+    8327
+  ], 
+  [
+    1165, 
+    "LIN STRADLEY", 
+    61, 
+    "M", 
+    "ATLANTA GA", 
+    1768, 
+    8403, 
+    642, 
+    8371
+  ], 
+  [
+    1166, 
+    "KELLI PIRKLE", 
+    40, 
+    "F", 
+    "GAINESVILLE GA", 
+    1443, 
+    8403, 
+    642, 
+    8291
+  ], 
+  [
+    1167, 
+    "KELLY GALLIMORE", 
+    45, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    662, 
+    8407, 
+    642, 
+    8352
+  ], 
+  [
+    1168, 
+    "ERIN ROBINSON", 
+    28, 
+    "F", 
+    "MARIETTA GA", 
+    1543, 
+    8408, 
+    642, 
+    8316
+  ], 
+  [
+    1169, 
+    "BRIE KUDLA", 
+    29, 
+    "F", 
+    "SMYRNA GA", 
+    1035, 
+    8408, 
+    642, 
+    8317
+  ], 
+  [
+    1170, 
+    "CINDY RATLIFF", 
+    39, 
+    "F", 
+    "GAINESVILLE GA", 
+    1494, 
+    8410, 
+    642, 
+    8336
+  ], 
+  [
+    1171, 
+    "LAUREN SOMERS", 
+    23, 
+    "F", 
+    "ATLANTA GA", 
+    1724, 
+    8416, 
+    643, 
+    8319
+  ], 
+  [
+    1172, 
+    "JILL SKOCIR", 
+    35, 
+    "F", 
+    "DECATUR GA", 
+    1694, 
+    8418, 
+    643, 
+    8320
+  ], 
+  [
+    1173, 
+    "TAYLOR EDWARDS", 
+    56, 
+    "M", 
+    "DOUGLASVILLE GA", 
+    555, 
+    8418, 
+    643, 
+    8379
+  ], 
+  [
+    1174, 
+    "MELISSA WHITINGER", 
+    38, 
+    "F", 
+    "FLOWERY BRANCH GA", 
+    1964, 
+    8419, 
+    643, 
+    8353
+  ], 
+  [
+    1175, 
+    "DAWN HANDLEY", 
+    31, 
+    "F", 
+    "FORT WORTH TX", 
+    773, 
+    8425, 
+    644, 
+    8341
+  ], 
+  [
+    1176, 
+    "KIM BRUNDAGE", 
+    44, 
+    "F", 
+    "SUWANEE GA", 
+    225, 
+    8430, 
+    644, 
+    8345
+  ], 
+  [
+    1177, 
+    "SARAH LASITER", 
+    37, 
+    "F", 
+    "MABLETON GA", 
+    1057, 
+    8431, 
+    644, 
+    8384
+  ], 
+  [
+    1178, 
+    "PAULA JAMIESON", 
+    45, 
+    "F", 
+    "SUWANEE GA", 
+    919, 
+    8432, 
+    644, 
+    8346
+  ], 
+  [
+    1179, 
+    "SANDY SCHWARTZ", 
+    57, 
+    "M", 
+    "ATLANTA GA", 
+    1621, 
+    8432, 
+    644, 
+    8404
+  ], 
+  [
+    1180, 
+    "DAVID BARRON", 
+    49, 
+    "M", 
+    "MARIETTA GA", 
+    107, 
+    8438, 
+    645, 
+    8357
+  ], 
+  [
+    1181, 
+    "ANNE SEPKO", 
+    40, 
+    "F", 
+    "SUGAR HILL GA", 
+    1641, 
+    8442, 
+    645, 
+    8321
+  ], 
+  [
+    1182, 
+    "CATHERINE CANFIELD", 
+    50, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    278, 
+    8444, 
+    645, 
+    8355
+  ], 
+  [
+    1183, 
+    "TERESITA PACHANO", 
+    46, 
+    "F", 
+    "MARIETTA GA", 
+    1385, 
+    8444, 
+    645, 
+    8391
+  ], 
+  [
+    1184, 
+    "HEATHER WRIGHT", 
+    41, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    2005, 
+    8444, 
+    645, 
+    8356
+  ], 
+  [
+    1185, 
+    "LIZBETH TULLOCH", 
+    53, 
+    "F", 
+    "HOUSTON TX", 
+    1867, 
+    8446, 
+    645, 
+    8367
+  ], 
+  [
+    1186, 
+    "KRISTEN BREEDLOVE", 
+    28, 
+    "F", 
+    "SMYRNA GA", 
+    199, 
+    8447, 
+    645, 
+    8406
+  ], 
+  [
+    1187, 
+    "DIANA RIMBY", 
+    29, 
+    "F", 
+    "MARIETTA GA", 
+    1531, 
+    8447, 
+    645, 
+    8391
+  ], 
+  [
+    1188, 
+    "SANDY SHEAROUSE", 
+    38, 
+    "F", 
+    "BARNESVILLE GA", 
+    1660, 
+    8447, 
+    645, 
+    8344
+  ], 
+  [
+    1189, 
+    "RACHEL WITKIEWICZ", 
+    28, 
+    "F", 
+    "CANTON GA", 
+    1990, 
+    8451, 
+    646, 
+    8364
+  ], 
+  [
+    1190, 
+    "ROBERT MCMENOMY", 
+    26, 
+    "M", 
+    "MONTGOMERY AL", 
+    1235, 
+    8454, 
+    646, 
+    8349
+  ], 
+  [
+    1191, 
+    "KATIE COOPER", 
+    22, 
+    "F", 
+    "CHARLOTTE NC", 
+    382, 
+    8455, 
+    646, 
+    8404
+  ], 
+  [
+    1192, 
+    "JAMIE CROSBY", 
+    37, 
+    "M", 
+    "NORCROSS GA", 
+    410, 
+    8457, 
+    646, 
+    8438
+  ], 
+  [
+    1193, 
+    "SARA TOERING", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    1844, 
+    8457, 
+    646, 
+    8404
+  ], 
+  [
+    1194, 
+    "HOWARD ALTER", 
+    50, 
+    "M", 
+    "SMYRNA GA", 
+    39, 
+    8458, 
+    646, 
+    8376
+  ], 
+  [
+    1195, 
+    "CHRISTINA ALLEN", 
+    37, 
+    "F", 
+    "DAWSONVILLE GA", 
+    33, 
+    8463, 
+    647, 
+    8410
+  ], 
+  [
+    1196, 
+    "TIFFANY JONES", 
+    35, 
+    "F", 
+    "WOODSTOCK GA", 
+    2032, 
+    8465, 
+    647, 
+    8347
+  ], 
+  [
+    1197, 
+    "SUZANNE MACKIEWICZ", 
+    40, 
+    "F", 
+    "MARIETTA GA", 
+    1148, 
+    8469, 
+    647, 
+    8403
+  ], 
+  [
+    1198, 
+    "SANDY LASSERE", 
+    44, 
+    "F", 
+    "ATLANTA GA", 
+    1059, 
+    8470, 
+    647, 
+    8409
+  ], 
+  [
+    1199, 
+    "AMBER WATERS", 
+    27, 
+    "F", 
+    "CARROLLTON GA", 
+    1928, 
+    8472, 
+    647, 
+    8412
+  ], 
+  [
+    1200, 
+    "KATHERINE MELVIN", 
+    32, 
+    "F", 
+    "SMYRNA GA", 
+    1253, 
+    8477, 
+    648, 
+    8423
+  ], 
+  [
+    1201, 
+    "MEGAN MCGUIGAN", 
+    33, 
+    "F", 
+    "ATLANTA GA", 
+    1220, 
+    8499, 
+    649, 
+    8404
+  ], 
+  [
+    1202, 
+    "ROBERT MAURY", 
+    53, 
+    "M", 
+    "FAYETTEVILLE GA", 
+    1187, 
+    8504, 
+    650, 
+    8416
+  ], 
+  [
+    1203, 
+    "SUSAN CHRISTIAN", 
+    35, 
+    "F", 
+    "CANTON GA", 
+    329, 
+    8505, 
+    650, 
+    8420
+  ], 
+  [
+    1204, 
+    "KATIE BYRD", 
+    30, 
+    "F", 
+    "ATLANTA GA", 
+    263, 
+    8513, 
+    650, 
+    8406
+  ], 
+  [
+    1205, 
+    "PAMELA ROPER", 
+    37, 
+    "F", 
+    "KENNESAW GA", 
+    1557, 
+    8520, 
+    651, 
+    8427
+  ], 
+  [
+    1206, 
+    "TAMMY MELLOTT", 
+    44, 
+    "F", 
+    "HOSCHTON GA", 
+    1250, 
+    8520, 
+    651, 
+    8436
+  ], 
+  [
+    1207, 
+    "SARA SMITH", 
+    38, 
+    "F", 
+    "KENNESAW GA", 
+    1716, 
+    8521, 
+    651, 
+    8385
+  ], 
+  [
+    1208, 
+    "RON OLIVER", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    1367, 
+    8523, 
+    651, 
+    8479
+  ], 
+  [
+    1209, 
+    "ANNA GRAY", 
+    19, 
+    "F", 
+    "SNELLVILLE GA", 
+    721, 
+    8526, 
+    651, 
+    8458
+  ], 
+  [
+    1210, 
+    "ELSPETH FRENCH", 
+    43, 
+    "F", 
+    "CHAMBLEE GA", 
+    642, 
+    8536, 
+    652, 
+    8440
+  ], 
+  [
+    1211, 
+    "ANNIE KING", 
+    51, 
+    "F", 
+    "DECATUR GA", 
+    998, 
+    8537, 
+    652, 
+    8444
+  ], 
+  [
+    1212, 
+    "MICHAEL CHASE", 
+    60, 
+    "M", 
+    "DECATUR GA", 
+    320, 
+    8538, 
+    652, 
+    8445
+  ], 
+  [
+    1213, 
+    "JENNIFER DEYOUNG", 
+    39, 
+    "F", 
+    "CANTON GA", 
+    487, 
+    8540, 
+    652, 
+    8443
+  ], 
+  [
+    1214, 
+    "LYNDEL BEAVER", 
+    25, 
+    "F", 
+    "ATLANTA GA", 
+    133, 
+    8548, 
+    653, 
+    8502
+  ], 
+  [
+    1215, 
+    "MEGAN RILEY", 
+    35, 
+    "F", 
+    "MARIETTA GA", 
+    1530, 
+    8553, 
+    653, 
+    8434
+  ], 
+  [
+    1216, 
+    "BROOKE WALDEN", 
+    29, 
+    "F", 
+    "CUMMING GA", 
+    1899, 
+    8553, 
+    653, 
+    8505
+  ], 
+  [
+    1217, 
+    "TRICIA ONEILL", 
+    36, 
+    "F", 
+    "CANTON GA", 
+    1371, 
+    8554, 
+    653, 
+    8435
+  ], 
+  [
+    1218, 
+    "MEERA SHAH", 
+    29, 
+    "F", 
+    "ATLANTA GA", 
+    1648, 
+    8555, 
+    654, 
+    8510
+  ], 
+  [
+    1219, 
+    "STEPHANIE LOOMIS", 
+    45, 
+    "F", 
+    "MARIETTA GA", 
+    1124, 
+    8556, 
+    654, 
+    8455
+  ], 
+  [
+    1220, 
+    "JOHN BARRON", 
+    15, 
+    "M", 
+    "MARIETTA GA", 
+    108, 
+    8556, 
+    654, 
+    8477
+  ], 
+  [
+    1221, 
+    "MEGAN BOYD", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    2144, 
+    8557, 
+    654, 
+    8472
+  ], 
+  [
+    1222, 
+    "JEREMY SALE", 
+    30, 
+    "M", 
+    "ATLANTA GA", 
+    2145, 
+    8557, 
+    654, 
+    8472
+  ], 
+  [
+    1223, 
+    "KIMBERLY RALICH", 
+    39, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    1487, 
+    8561, 
+    654, 
+    8512
+  ], 
+  [
+    1224, 
+    "MELLISSA FRIEDRICH", 
+    42, 
+    "F", 
+    "CARTERSVILLE GA", 
+    647, 
+    8574, 
+    655, 
+    8519
+  ], 
+  [
+    1225, 
+    "VANESSA LE", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    1071, 
+    8576, 
+    655, 
+    8499
+  ], 
+  [
+    1226, 
+    "KERSTIN BENTON", 
+    38, 
+    "F", 
+    "PEACHTREE CITY GA", 
+    144, 
+    8576, 
+    655, 
+    8500
+  ], 
+  [
+    1227, 
+    "NIKKI MOORE", 
+    99, 
+    "F", 
+    "SMYRNA GA", 
+    1306, 
+    8579, 
+    655, 
+    8474
+  ], 
+  [
+    1228, 
+    "LAURA FOSTER", 
+    41, 
+    "F", 
+    "ATLANTA GA", 
+    623, 
+    8584, 
+    656, 
+    8507
+  ], 
+  [
+    1229, 
+    "SARAH KING", 
+    38, 
+    "F", 
+    "ROME GA", 
+    1002, 
+    8584, 
+    656, 
+    8507
+  ], 
+  [
+    1230, 
+    "ALI THOMPSON", 
+    35, 
+    "F", 
+    "WOODSTOCK GA", 
+    2031, 
+    8586, 
+    656, 
+    8468
+  ], 
+  [
+    1231, 
+    "JUDY JOHNSTON", 
+    48, 
+    "F", 
+    "CANTON GA", 
+    951, 
+    8587, 
+    656, 
+    8525
+  ], 
+  [
+    1232, 
+    "ROBERTA WALTERS", 
+    36, 
+    "F", 
+    "WATKINSVILLE GA", 
+    1912, 
+    8588, 
+    656, 
+    8529
+  ], 
+  [
+    1233, 
+    "MELINDA SETCHELL", 
+    36, 
+    "F", 
+    "MARIETTA GA", 
+    1643, 
+    8590, 
+    656, 
+    8517
+  ], 
+  [
+    1234, 
+    "BONITA CASON-ATLOW", 
+    41, 
+    "F", 
+    "ATLANTA GA", 
+    298, 
+    8594, 
+    656, 
+    8548
+  ], 
+  [
+    1235, 
+    "TROY RAMBO", 
+    40, 
+    "M", 
+    "COLUMBUS OH", 
+    1490, 
+    8594, 
+    656, 
+    8561
+  ], 
+  [
+    1236, 
+    "MELISSA LUNDELL", 
+    33, 
+    "F", 
+    "MARIETTA GA", 
+    1135, 
+    8597, 
+    657, 
+    8544
+  ], 
+  [
+    1237, 
+    "JENNIFER BUSEICK", 
+    33, 
+    "F", 
+    "ATLANTA GA", 
+    254, 
+    8598, 
+    657, 
+    8516
+  ], 
+  [
+    1238, 
+    "ELIZABETH SCHWARZE", 
+    46, 
+    "F", 
+    "DUNWOODY GA", 
+    1623, 
+    8598, 
+    657, 
+    8552
+  ], 
+  [
+    1239, 
+    "REBECCA KIEFFER", 
+    30, 
+    "F", 
+    "SMYRNA GA", 
+    993, 
+    8599, 
+    657, 
+    8546
+  ], 
+  [
+    1240, 
+    "CURTIS JONES", 
+    29, 
+    "M", 
+    "ATLANTA GA", 
+    955, 
+    8610, 
+    658, 
+    8564
+  ], 
+  [
+    1241, 
+    "TANYA PALMER", 
+    32, 
+    "F", 
+    "SMYRNA GA", 
+    1390, 
+    8610, 
+    658, 
+    8565
+  ], 
+  [
+    1242, 
+    "CHRISTINE PATRICK", 
+    35, 
+    "F", 
+    "ALPHARETTA GA", 
+    1401, 
+    8611, 
+    658, 
+    8538
+  ], 
+  [
+    1243, 
+    "DIANA PENGE", 
+    43, 
+    "F", 
+    "ACWORTH GA", 
+    1416, 
+    8611, 
+    658, 
+    8534
+  ], 
+  [
+    1244, 
+    "JENNIFER HAWKINS", 
+    39, 
+    "F", 
+    "CUMMING GA", 
+    816, 
+    8620, 
+    658, 
+    8560
+  ], 
+  [
+    1245, 
+    "JOSH BUGOSH", 
+    26, 
+    "M", 
+    "BUFORD GA", 
+    236, 
+    8622, 
+    659, 
+    8517
+  ], 
+  [
+    1246, 
+    "TIM SCHIPPMANN", 
+    41, 
+    "M", 
+    "CUMMING GA", 
+    1605, 
+    8625, 
+    659, 
+    8601
+  ], 
+  [
+    1247, 
+    "AMY BERRY", 
+    35, 
+    "F", 
+    "TULSA OK", 
+    150, 
+    8631, 
+    659, 
+    8536
+  ], 
+  [
+    1248, 
+    "WENDY SCHMITZ", 
+    35, 
+    "F", 
+    "ROSWELL GA", 
+    1610, 
+    8631, 
+    659, 
+    8537
+  ], 
+  [
+    1249, 
+    "ROSS JOHNSTON", 
+    48, 
+    "M", 
+    "CANTON GA", 
+    952, 
+    8640, 
+    660, 
+    8578
+  ], 
+  [
+    1250, 
+    "CHERYL HUNTER", 
+    47, 
+    "F", 
+    "DECATUR GA", 
+    888, 
+    8643, 
+    660, 
+    8527
+  ], 
+  [
+    1251, 
+    "TAMERA MILLER", 
+    49, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    1283, 
+    8644, 
+    660, 
+    8571
+  ], 
+  [
+    1252, 
+    "JENNIFER CLEMENS", 
+    39, 
+    "F", 
+    "MARIETTA GA", 
+    340, 
+    8653, 
+    661, 
+    8565
+  ], 
+  [
+    1253, 
+    "JEANNINE BROCK", 
+    39, 
+    "F", 
+    "MARIETTA GA", 
+    206, 
+    8653, 
+    661, 
+    8565
+  ], 
+  [
+    1254, 
+    "DAMON BENNAFIELD", 
+    43, 
+    "M", 
+    "ATLANTA GA", 
+    141, 
+    8654, 
+    661, 
+    8593
+  ], 
+  [
+    1255, 
+    "JANELLE BOWERSOX", 
+    50, 
+    "F", 
+    "ATLANTA GA", 
+    181, 
+    8658, 
+    661, 
+    8562
+  ], 
+  [
+    1256, 
+    "CLAUDIA DONATO", 
+    33, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    505, 
+    8662, 
+    662, 
+    8587
+  ], 
+  [
+    1257, 
+    "KATE HOWARD", 
+    24, 
+    "F", 
+    "ACWORTH GA", 
+    872, 
+    8664, 
+    662, 
+    8585
+  ], 
+  [
+    1258, 
+    "JUDY STANLEY", 
+    59, 
+    "F", 
+    "DECATUR GA", 
+    1753, 
+    8677, 
+    663, 
+    8647
+  ], 
+  [
+    1259, 
+    "LEWIS DOWDEN", 
+    62, 
+    "M", 
+    "DECATUR GA GA", 
+    514, 
+    8678, 
+    663, 
+    8647
+  ], 
+  [
+    1260, 
+    "MELISSA O'CONNELL", 
+    38, 
+    "F", 
+    "ATLANTA GA", 
+    1358, 
+    8681, 
+    663, 
+    8619
+  ], 
+  [
+    1261, 
+    "ERIN MACE", 
+    35, 
+    "F", 
+    "NEWNAN GA", 
+    1143, 
+    8681, 
+    663, 
+    8636
+  ], 
+  [
+    1262, 
+    "ELIZABETH ALLEN", 
+    38, 
+    "F", 
+    "COVINGTON GA", 
+    34, 
+    8683, 
+    663, 
+    8625
+  ], 
+  [
+    1263, 
+    "ODIONYENFE ADELAKUN", 
+    34, 
+    "F", 
+    "MARIETTA GA", 
+    13, 
+    8688, 
+    664, 
+    8617
+  ], 
+  [
+    1264, 
+    "GLORIA CLARK", 
+    48, 
+    "F", 
+    "MARIETTA GA", 
+    333, 
+    8689, 
+    664, 
+    8620
+  ], 
+  [
+    1265, 
+    "VICTORIA PRICE", 
+    21, 
+    "F", 
+    "MILLEDGEVILLE GA", 
+    1469, 
+    8690, 
+    664, 
+    8624
+  ], 
+  [
+    1266, 
+    "MARK LASSERE", 
+    46, 
+    "M", 
+    "ATLANTA GA", 
+    1058, 
+    8692, 
+    664, 
+    -1
+  ], 
+  [
+    1267, 
+    "MITCHELL MCGHEE", 
+    23, 
+    "M", 
+    "MILLEDGEVILLE GA", 
+    1218, 
+    8692, 
+    664, 
+    8625
+  ], 
+  [
+    1268, 
+    "DANIELA MARTINEZ", 
+    25, 
+    "F", 
+    "DAHLONEGA GA", 
+    1180, 
+    8696, 
+    664, 
+    8582
+  ], 
+  [
+    1269, 
+    "WILLIAM HENRY, JR.", 
+    55, 
+    "M", 
+    "NEWPORT NEWS VA", 
+    834, 
+    8699, 
+    665, 
+    8539
+  ], 
+  [
+    1270, 
+    "RUTH COLEGROVE", 
+    37, 
+    "F", 
+    "DULUTH GA", 
+    361, 
+    8703, 
+    665, 
+    8610
+  ], 
+  [
+    1271, 
+    "IRENE DA SILVA", 
+    39, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    428, 
+    8711, 
+    665, 
+    8612
+  ], 
+  [
+    1272, 
+    "MORGAN ETHERINGTON", 
+    26, 
+    "F", 
+    "ATLANTA GA", 
+    583, 
+    8711, 
+    665, 
+    8612
+  ], 
+  [
+    1273, 
+    "WENDY COSTELLO", 
+    47, 
+    "F", 
+    "FLOWERY BRANCH GA", 
+    389, 
+    8711, 
+    665, 
+    8640
+  ], 
+  [
+    1274, 
+    "KRISTY BASINGER", 
+    38, 
+    "F", 
+    "GAINESVILLE GA", 
+    120, 
+    8722, 
+    666, 
+    8650
+  ], 
+  [
+    1275, 
+    "JULIEANA JOHNSON", 
+    37, 
+    "F", 
+    "ALPHARETTA GA", 
+    946, 
+    8727, 
+    667, 
+    8606
+  ], 
+  [
+    1276, 
+    "KRISTEN GOTT", 
+    30, 
+    "F", 
+    "LOCUST GROVE GA", 
+    712, 
+    8728, 
+    667, 
+    8633
+  ], 
+  [
+    1277, 
+    "CARRIE RAGAN", 
+    18, 
+    "F", 
+    "ROSWELL GA", 
+    1483, 
+    8729, 
+    667, 
+    8651
+  ], 
+  [
+    1278, 
+    "DIANE PITTMAN", 
+    60, 
+    "F", 
+    "JOHNS CREEK GA", 
+    1444, 
+    8732, 
+    667, 
+    8656
+  ], 
+  [
+    1279, 
+    "WHITNEY HALLER", 
+    23, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    768, 
+    8732, 
+    667, 
+    8662
+  ], 
+  [
+    1280, 
+    "JAMES KIM", 
+    26, 
+    "M", 
+    "LAGRANGE GA", 
+    996, 
+    8734, 
+    667, 
+    8711
+  ], 
+  [
+    1281, 
+    "KIMBERLY LARAVEA", 
+    52, 
+    "F", 
+    "ALPHARETTA GA", 
+    1055, 
+    8737, 
+    667, 
+    8661
+  ], 
+  [
+    1282, 
+    "SARAH BABCOCK", 
+    28, 
+    "F", 
+    "MARIETTA GA", 
+    2035, 
+    8738, 
+    667, 
+    8663
+  ], 
+  [
+    1283, 
+    "THOMAS DARNELL", 
+    37, 
+    "M", 
+    "CANTON GA", 
+    443, 
+    8739, 
+    668, 
+    8703
+  ], 
+  [
+    1284, 
+    "RAQUEL BOWMAN", 
+    48, 
+    "F", 
+    "ACWORTH GA", 
+    183, 
+    8742, 
+    668, 
+    8632
+  ], 
+  [
+    1285, 
+    "ALEXIS SEYMOUR", 
+    28, 
+    "F", 
+    "GAINESVILLE GA", 
+    1645, 
+    8744, 
+    668, 
+    8673
+  ], 
+  [
+    1286, 
+    "AMY POTTS", 
+    28, 
+    "F", 
+    "ATLANTA GA", 
+    1459, 
+    8759, 
+    669, 
+    8660
+  ], 
+  [
+    1287, 
+    "JAMES SHELTON", 
+    35, 
+    "M", 
+    "ROSWELL GA", 
+    1664, 
+    8762, 
+    669, 
+    8735
+  ], 
+  [
+    1288, 
+    "JOHN RAFFERTY", 
+    40, 
+    "M", 
+    "STONE MOUNTAIN GA", 
+    1482, 
+    8762, 
+    669, 
+    8660
+  ], 
+  [
+    1289, 
+    "SANDI SASSENBERGER", 
+    41, 
+    "F", 
+    "MARIETTA GA", 
+    1596, 
+    8770, 
+    670, 
+    8690
+  ], 
+  [
+    1290, 
+    "ELIZABETH EDWARDS", 
+    32, 
+    "F", 
+    "CANTON GA", 
+    548, 
+    8773, 
+    670, 
+    8678
+  ], 
+  [
+    1291, 
+    "JENNIFER CHANG", 
+    36, 
+    "F", 
+    "TUCKER GA", 
+    316, 
+    8775, 
+    670, 
+    8675
+  ], 
+  [
+    1292, 
+    "DOMINIC AMBROSIO", 
+    30, 
+    "M", 
+    "SAN DIEGO CA", 
+    45, 
+    8778, 
+    670, 
+    8711
+  ], 
+  [
+    1293, 
+    "BETH BELK", 
+    31, 
+    "F", 
+    "SAN DIEGO CA", 
+    137, 
+    8778, 
+    671, 
+    8712
+  ], 
+  [
+    1294, 
+    "SCOTT BRYANT", 
+    43, 
+    "M", 
+    "MARIETTA GA", 
+    230, 
+    8780, 
+    671, 
+    8688
+  ], 
+  [
+    1295, 
+    "AMY HARVISON", 
+    34, 
+    "F", 
+    "VILLA RICA GA", 
+    806, 
+    8781, 
+    671, 
+    8724
+  ], 
+  [
+    1296, 
+    "KIM SHATTUCK", 
+    44, 
+    "F", 
+    "SANDY SPRINGS GA", 
+    1657, 
+    8781, 
+    671, 
+    8683
+  ], 
+  [
+    1297, 
+    "PAMELA ROSEN", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    1562, 
+    8783, 
+    671, 
+    8704
+  ], 
+  [
+    1298, 
+    "DEBBIE PAULDING", 
+    48, 
+    "F", 
+    "CUMMING GA", 
+    1408, 
+    8787, 
+    671, 
+    8740
+  ], 
+  [
+    1299, 
+    "AMY DEARMENT", 
+    23, 
+    "F", 
+    "ATLANTA GA", 
+    463, 
+    8787, 
+    671, 
+    8722
+  ], 
+  [
+    1300, 
+    "DAN MCCULLY", 
+    50, 
+    "M", 
+    "SHARPSBURG GA", 
+    1205, 
+    8790, 
+    671, 
+    8680
+  ], 
+  [
+    1301, 
+    "HEATHER SAILORS", 
+    30, 
+    "F", 
+    "MARIETTA GA", 
+    1580, 
+    8790, 
+    671, 
+    8693
+  ], 
+  [
+    1302, 
+    "MICHAEL VETTER", 
+    37, 
+    "M", 
+    "GAINESVILLE GA", 
+    1890, 
+    8795, 
+    672, 
+    8721
+  ], 
+  [
+    1303, 
+    "LAURA OWENS", 
+    36, 
+    "F", 
+    "MABLETON GA", 
+    1382, 
+    8795, 
+    672, 
+    8689
+  ], 
+  [
+    1304, 
+    "KIM FULKERSON", 
+    40, 
+    "F", 
+    "KENNESAW GA", 
+    652, 
+    8799, 
+    672, 
+    8714
+  ], 
+  [
+    1305, 
+    "STACY ALEXANDER", 
+    33, 
+    "F", 
+    "MARIETTA GA", 
+    31, 
+    8800, 
+    672, 
+    8754
+  ], 
+  [
+    1306, 
+    "KEVIN WILLIAMS", 
+    39, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    1974, 
+    8801, 
+    672, 
+    -1
+  ], 
+  [
+    1307, 
+    "KATE JARVIS", 
+    18, 
+    "F", 
+    "CUMMING GA", 
+    923, 
+    8805, 
+    673, 
+    8724
+  ], 
+  [
+    1308, 
+    "CHRIS JARVIS", 
+    44, 
+    "M", 
+    "CUMMING GA", 
+    922, 
+    8805, 
+    673, 
+    8726
+  ], 
+  [
+    1309, 
+    "HINTON DAVIS", 
+    41, 
+    "M", 
+    "DULUTH GA", 
+    449, 
+    8808, 
+    673, 
+    8734
+  ], 
+  [
+    1310, 
+    "RUSSELL SPEARS", 
+    46, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    1734, 
+    8811, 
+    673, 
+    8737
+  ], 
+  [
+    1311, 
+    "MARLENE BURCKHALTER", 
+    46, 
+    "F", 
+    "THOMASVILLE NC", 
+    241, 
+    8811, 
+    673, 
+    8669
+  ], 
+  [
+    1312, 
+    "KAREN SLATE", 
+    53, 
+    "F", 
+    "THOMASVILLE NC", 
+    1695, 
+    8811, 
+    673, 
+    8670
+  ], 
+  [
+    1313, 
+    "JILL SPEARS", 
+    42, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    1733, 
+    8812, 
+    673, 
+    8737
+  ], 
+  [
+    1314, 
+    "MICHAEL LINDSAY", 
+    57, 
+    "M", 
+    "LITHONIA GA", 
+    1102, 
+    8823, 
+    674, 
+    8728
+  ], 
+  [
+    1315, 
+    "MARY ESPIRITU", 
+    39, 
+    "F", 
+    "COLUMBUS GA", 
+    578, 
+    8826, 
+    674, 
+    8712
+  ], 
+  [
+    1316, 
+    "SARAH BIERENFELD", 
+    17, 
+    "F", 
+    "COLUMBUS GA", 
+    152, 
+    8827, 
+    674, 
+    8713
+  ], 
+  [
+    1317, 
+    "KESHAWN RIDGEL", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    1525, 
+    8828, 
+    674, 
+    8737
+  ], 
+  [
+    1318, 
+    "MATTHEW BASFORD", 
+    30, 
+    "M", 
+    "MABLETON GA", 
+    119, 
+    8830, 
+    675, 
+    8730
+  ], 
+  [
+    1319, 
+    "KELLIE ADAMS", 
+    28, 
+    "F", 
+    "CONYERS GA", 
+    10, 
+    8831, 
+    675, 
+    8741
+  ], 
+  [
+    1320, 
+    "JEANNE GREEN", 
+    42, 
+    "F", 
+    "MARIETTA GA", 
+    729, 
+    8831, 
+    675, 
+    8762
+  ], 
+  [
+    1321, 
+    "LULIT GEBRU", 
+    41, 
+    "F", 
+    "MARIETTE GA", 
+    683, 
+    8833, 
+    675, 
+    8731
+  ], 
+  [
+    1322, 
+    "ROBERT LOSAW", 
+    66, 
+    "M", 
+    "CANTON GA", 
+    1128, 
+    8835, 
+    675, 
+    8756
+  ], 
+  [
+    1323, 
+    "ALECIA SMITH", 
+    26, 
+    "F", 
+    "BETHLEHEM GA", 
+    1699, 
+    8835, 
+    675, 
+    8791
+  ], 
+  [
+    1324, 
+    "JANNA MALLIS", 
+    31, 
+    "F", 
+    "GAINESVILLE GA", 
+    1160, 
+    8836, 
+    675, 
+    8763
+  ], 
+  [
+    1325, 
+    "ALVARO TEJADA", 
+    33, 
+    "M", 
+    "CANTON GA", 
+    1815, 
+    8840, 
+    675, 
+    8740
+  ], 
+  [
+    1326, 
+    "KENDRA CALDARELLA", 
+    40, 
+    "F", 
+    "MARIETTA GA", 
+    268, 
+    8843, 
+    675, 
+    8748
+  ], 
+  [
+    1327, 
+    "MICHELLE MOORE", 
+    36, 
+    "F", 
+    "MARIETTA GA", 
+    1305, 
+    8844, 
+    676, 
+    8750
+  ], 
+  [
+    1328, 
+    "SARAH KENNEDY", 
+    40, 
+    "F", 
+    "ATLANTA GA", 
+    988, 
+    8844, 
+    676, 
+    8742
+  ], 
+  [
+    1329, 
+    "STEVEN JENKINS", 
+    36, 
+    "M", 
+    "NOLENSVILLE TN", 
+    926, 
+    8863, 
+    677, 
+    8775
+  ], 
+  [
+    1330, 
+    "KEVIN LYON", 
+    36, 
+    "M", 
+    "SMYRNA GA", 
+    1140, 
+    8864, 
+    677, 
+    8776
+  ], 
+  [
+    1331, 
+    "MERISSA HAYMORE", 
+    33, 
+    "F", 
+    "MARIETTA GA", 
+    821, 
+    8866, 
+    677, 
+    8767
+  ], 
+  [
+    1332, 
+    "ROSA KING", 
+    38, 
+    "F", 
+    "WOODSTOCK GA", 
+    1001, 
+    8869, 
+    677, 
+    8767
+  ], 
+  [
+    1333, 
+    "KELLY FREEMAN", 
+    42, 
+    "F", 
+    "SUGAR HILL GA", 
+    641, 
+    8873, 
+    678, 
+    8751
+  ], 
+  [
+    1334, 
+    "YULONDA GODBOLD", 
+    44, 
+    "F", 
+    "DECATUR GA", 
+    701, 
+    8881, 
+    678, 
+    8782
+  ], 
+  [
+    1335, 
+    "ANDY GRIFFIN", 
+    41, 
+    "M", 
+    "GAINESVILLEG GA", 
+    738, 
+    8888, 
+    679, 
+    8816
+  ], 
+  [
+    1336, 
+    "TIMOTHY REESE", 
+    32, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    2036, 
+    8894, 
+    679, 
+    8808
+  ], 
+  [
+    1337, 
+    "JORJA DAVENPORT", 
+    64, 
+    "F", 
+    "ATLANTA GA", 
+    444, 
+    8894, 
+    679, 
+    8871
+  ], 
+  [
+    1338, 
+    "SUSI BRACKNELL", 
+    37, 
+    "F", 
+    "ACWORTH GA", 
+    192, 
+    8901, 
+    680, 
+    8859
+  ], 
+  [
+    1339, 
+    "ANGIE SCOTT", 
+    35, 
+    "F", 
+    "GRAYSON GA", 
+    1625, 
+    8903, 
+    680, 
+    8833
+  ], 
+  [
+    1340, 
+    "TRICIA GRAHAM", 
+    45, 
+    "F", 
+    "JULIETTE GA", 
+    716, 
+    8911, 
+    681, 
+    8829
+  ], 
+  [
+    1341, 
+    "AMANDA HAYMORE", 
+    25, 
+    "F", 
+    "NASHVILLE TN", 
+    820, 
+    8918, 
+    681, 
+    8819
+  ], 
+  [
+    1342, 
+    "ILENE MILLER", 
+    35, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    1276, 
+    8918, 
+    681, 
+    8812
+  ], 
+  [
+    1343, 
+    "ELIZABETH LEWIS", 
+    39, 
+    "F", 
+    "DACULA GA", 
+    1090, 
+    8922, 
+    682, 
+    8817
+  ], 
+  [
+    1344, 
+    "LISA DOWNER", 
+    34, 
+    "F", 
+    "DALLAS GA", 
+    517, 
+    8924, 
+    682, 
+    8896
+  ], 
+  [
+    1345, 
+    "RACHEL REED", 
+    34, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    1505, 
+    8924, 
+    682, 
+    8819
+  ], 
+  [
+    1346, 
+    "JEFFREY FLEMING", 
+    46, 
+    "M", 
+    "HOSCHTON GA", 
+    608, 
+    8925, 
+    682, 
+    8842
+  ], 
+  [
+    1347, 
+    "TUCKER FLEMING", 
+    17, 
+    "M", 
+    "HOSCHTON GA", 
+    610, 
+    8926, 
+    682, 
+    8843
+  ], 
+  [
+    1348, 
+    "MELISSA WILSON", 
+    26, 
+    "F", 
+    "SMYRNA GA", 
+    1981, 
+    8927, 
+    682, 
+    8833
+  ], 
+  [
+    1349, 
+    "JAMES GRAVES", 
+    40, 
+    "M", 
+    "ATLANTA GA", 
+    719, 
+    8928, 
+    682, 
+    8834
+  ], 
+  [
+    1350, 
+    "STACEY GRAVES", 
+    37, 
+    "F", 
+    "ATLANTA GA", 
+    720, 
+    8929, 
+    682, 
+    8836
+  ], 
+  [
+    1351, 
+    "JO ANN SHANLEY", 
+    51, 
+    "F", 
+    "DULUTH GA", 
+    1650, 
+    8929, 
+    682, 
+    8864
+  ], 
+  [
+    1352, 
+    "ERIKA SHADOFF", 
+    40, 
+    "F", 
+    "SUWANEE GA", 
+    1647, 
+    8930, 
+    682, 
+    8830
+  ], 
+  [
+    1353, 
+    "RORY GAGAN", 
+    30, 
+    "F", 
+    "ATLANTA GA", 
+    657, 
+    8933, 
+    682, 
+    8851
+  ], 
+  [
+    1354, 
+    "MARIE ONEIL", 
+    28, 
+    "F", 
+    "ATLANTA GA", 
+    1369, 
+    8946, 
+    683, 
+    8898
+  ], 
+  [
+    1355, 
+    "BARBARA BLAKE", 
+    48, 
+    "F", 
+    "ROSWELL GA", 
+    158, 
+    8947, 
+    683, 
+    8923
+  ], 
+  [
+    1356, 
+    "LINDA GEBERT", 
+    51, 
+    "F", 
+    "DALLAS GA", 
+    682, 
+    8949, 
+    684, 
+    8910
+  ], 
+  [
+    1357, 
+    "GARRON BOTHE", 
+    39, 
+    "F", 
+    "MABLETON GA", 
+    178, 
+    8963, 
+    685, 
+    8932
+  ], 
+  [
+    1358, 
+    "JAMIE FISHER", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    603, 
+    8966, 
+    685, 
+    8889
+  ], 
+  [
+    1359, 
+    "KATHERINE HOYLE", 
+    53, 
+    "F", 
+    "LAWNDALE NC", 
+    878, 
+    8967, 
+    685, 
+    8858
+  ], 
+  [
+    1360, 
+    "COREEN DELAMATER", 
+    38, 
+    "F", 
+    "ATHENS GA", 
+    468, 
+    8971, 
+    685, 
+    8890
+  ], 
+  [
+    1361, 
+    "FRANK FLYNN", 
+    74, 
+    "M", 
+    "ROSWELL GA", 
+    616, 
+    8979, 
+    686, 
+    8928
+  ], 
+  [
+    1362, 
+    "BRAD WOLFF", 
+    50, 
+    "M", 
+    "ALPHARETTA GA", 
+    1996, 
+    8983, 
+    686, 
+    8892
+  ], 
+  [
+    1363, 
+    "DANIELLE MACIK", 
+    38, 
+    "F", 
+    "ATLANTA GA", 
+    1144, 
+    8992, 
+    687, 
+    8893
+  ], 
+  [
+    1364, 
+    "MARGARET HOPKINS", 
+    28, 
+    "F", 
+    "ATLANTA GA", 
+    861, 
+    8999, 
+    687, 
+    8957
+  ], 
+  [
+    1365, 
+    "SONDI LOSAW", 
+    63, 
+    "F", 
+    "CANTON GA", 
+    1129, 
+    9004, 
+    688, 
+    8924
+  ], 
+  [
+    1366, 
+    "CHRISTY EPSTEIN", 
+    37, 
+    "F", 
+    "ALPHARETTA GA", 
+    571, 
+    9005, 
+    688, 
+    8907
+  ], 
+  [
+    1367, 
+    "MARGO GREGORY", 
+    45, 
+    "F", 
+    "KENNESAW GA", 
+    732, 
+    9015, 
+    689, 
+    8963
+  ], 
+  [
+    1368, 
+    "MARIANN DEWITT", 
+    42, 
+    "F", 
+    "KENNESAW GA", 
+    485, 
+    9018, 
+    689, 
+    8942
+  ], 
+  [
+    1369, 
+    "DEIRDRE WALSH", 
+    40, 
+    "F", 
+    "ROSWELL GA", 
+    1907, 
+    9021, 
+    689, 
+    8910
+  ], 
+  [
+    1370, 
+    "LOLITA MANNIK", 
+    40, 
+    "F", 
+    "ROSWELL GA", 
+    1166, 
+    9021, 
+    689, 
+    8910
+  ], 
+  [
+    1371, 
+    "ALISON GREY", 
+    40, 
+    "F", 
+    "DACULA GA", 
+    736, 
+    9029, 
+    690, 
+    8919
+  ], 
+  [
+    1372, 
+    "BRIDGET GONGOL", 
+    26, 
+    "F", 
+    "EAST POINT GA", 
+    706, 
+    9031, 
+    690, 
+    8934
+  ], 
+  [
+    1373, 
+    "JENNIFER LAZO", 
+    29, 
+    "F", 
+    "ATLANTA GA", 
+    1070, 
+    9034, 
+    690, 
+    8931
+  ], 
+  [
+    1374, 
+    "TAMARA CALDWELL", 
+    45, 
+    "F", 
+    "MARIETTA GA", 
+    271, 
+    9035, 
+    690, 
+    8939
+  ], 
+  [
+    1375, 
+    "MICHAEL GEREN", 
+    51, 
+    "M", 
+    "SUWANEE GA", 
+    688, 
+    9041, 
+    691, 
+    8963
+  ], 
+  [
+    1376, 
+    "VIRGINIA JAMES", 
+    38, 
+    "F", 
+    "DACULA GA", 
+    917, 
+    9042, 
+    691, 
+    8932
+  ], 
+  [
+    1377, 
+    "ADRIENNE MILLER", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    1272, 
+    9044, 
+    691, 
+    8963
+  ], 
+  [
+    1378, 
+    "MARYBETH MONTINI", 
+    37, 
+    "F", 
+    "DACULA GA", 
+    1298, 
+    9045, 
+    691, 
+    8936
+  ], 
+  [
+    1379, 
+    "SONJA MCLEOD", 
+    37, 
+    "F", 
+    "MCDONOUGH GA", 
+    1233, 
+    9060, 
+    692, 
+    9003
+  ], 
+  [
+    1380, 
+    "JULIE MILLER", 
+    43, 
+    "F", 
+    "WOODSTOCK GA", 
+    1278, 
+    9060, 
+    692, 
+    8985
+  ], 
+  [
+    1381, 
+    "RYAN REMILLARD", 
+    29, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    1511, 
+    9061, 
+    692, 
+    8962
+  ], 
+  [
+    1382, 
+    "NICOLE MCCARTHY", 
+    32, 
+    "F", 
+    "BIRMINGHAM AL", 
+    1196, 
+    9075, 
+    693, 
+    8987
+  ], 
+  [
+    1383, 
+    "AMY NUGENT", 
+    42, 
+    "F", 
+    "ALPHARETTA GA", 
+    1357, 
+    9076, 
+    693, 
+    9002
+  ], 
+  [
+    1384, 
+    "SEBASTIAN LURIE", 
+    39, 
+    "M", 
+    "SAN FRANCISCO CA", 
+    1136, 
+    9087, 
+    694, 
+    9037
+  ], 
+  [
+    1385, 
+    "SANDRA HANSEN", 
+    54, 
+    "F", 
+    "JONESBORO GA", 
+    779, 
+    9087, 
+    694, 
+    9000
+  ], 
+  [
+    1386, 
+    "DREW DEMPSEY", 
+    33, 
+    "M", 
+    "ROME GA", 
+    478, 
+    9089, 
+    694, 
+    9020
+  ], 
+  [
+    1387, 
+    "LORI FURR", 
+    47, 
+    "F", 
+    "DOUGLASVILLE GA", 
+    655, 
+    9099, 
+    695, 
+    9012
+  ], 
+  [
+    1388, 
+    "AMY ANASTAS", 
+    27, 
+    "F", 
+    "FAYETTEVILLE GA", 
+    47, 
+    9100, 
+    695, 
+    9024
+  ], 
+  [
+    1389, 
+    "ALLISON REPASS", 
+    16, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    1512, 
+    9107, 
+    696, 
+    9063
+  ], 
+  [
+    1390, 
+    "JENNIFER WOHL", 
+    40, 
+    "F", 
+    "MARIETTA GA", 
+    1992, 
+    9113, 
+    696, 
+    9078
+  ], 
+  [
+    1391, 
+    "LISA NADREAU", 
+    35, 
+    "F", 
+    "NEWNAN GA", 
+    1332, 
+    9114, 
+    696, 
+    9038
+  ], 
+  [
+    1392, 
+    "CJ ALVERSON", 
+    44, 
+    "M", 
+    "CANTON GA", 
+    43, 
+    9120, 
+    697, 
+    9075
+  ], 
+  [
+    1393, 
+    "MARY BLITZ", 
+    49, 
+    "F", 
+    "CLEARWATER FL", 
+    161, 
+    9136, 
+    698, 
+    9049
+  ], 
+  [
+    1394, 
+    "LINDSAY WOODS", 
+    36, 
+    "F", 
+    "ATLANTA GA", 
+    2001, 
+    9156, 
+    699, 
+    9117
+  ], 
+  [
+    1395, 
+    "CLIFF JORDAN", 
+    32, 
+    "M", 
+    "AUSTELL GA", 
+    962, 
+    9162, 
+    700, 
+    9117
+  ], 
+  [
+    1396, 
+    "DANIEL NELSON", 
+    51, 
+    "M", 
+    "CARROLLTON GA", 
+    2142, 
+    9164, 
+    700, 
+    9142
+  ], 
+  [
+    1397, 
+    "JAMES L. SORRELLS", 
+    69, 
+    "M", 
+    "CARROLLTON GA", 
+    1725, 
+    9165, 
+    700, 
+    9113
+  ], 
+  [
+    1398, 
+    "ANGELA JOHNSON", 
+    43, 
+    "F", 
+    "ATHENS GA", 
+    937, 
+    9168, 
+    700, 
+    9043
+  ], 
+  [
+    1399, 
+    "JOHN THOMAS", 
+    40, 
+    "M", 
+    "ACWORTH GA", 
+    1821, 
+    9179, 
+    701, 
+    9113
+  ], 
+  [
+    1400, 
+    "SUZANNA MORRIS", 
+    50, 
+    "F", 
+    "MARIETTA GA", 
+    1317, 
+    9182, 
+    701, 
+    9038
+  ], 
+  [
+    1401, 
+    "JENNIFER HEWGLEY", 
+    36, 
+    "F", 
+    "WOODSTOCK GA", 
+    840, 
+    9183, 
+    701, 
+    9151
+  ], 
+  [
+    1402, 
+    "JAMIE HATCH", 
+    33, 
+    "F", 
+    "DORAVILLE GA", 
+    812, 
+    9183, 
+    701, 
+    9095
+  ], 
+  [
+    1403, 
+    "SAM HARTIN", 
+    69, 
+    "M", 
+    "DUNWOODY GA", 
+    801, 
+    9202, 
+    703, 
+    9151
+  ], 
+  [
+    1404, 
+    "RON ALTER", 
+    44, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    40, 
+    9205, 
+    703, 
+    9122
+  ], 
+  [
+    1405, 
+    "SHERON CURTIS", 
+    44, 
+    "F", 
+    "CONYERS GA", 
+    426, 
+    9208, 
+    703, 
+    9108
+  ], 
+  [
+    1406, 
+    "JOE COLE", 
+    39, 
+    "M", 
+    "CUMMING GA", 
+    359, 
+    9219, 
+    704, 
+    9131
+  ], 
+  [
+    1407, 
+    "RICHARD DAVIS", 
+    54, 
+    "M", 
+    "COCHRAN GA", 
+    454, 
+    9224, 
+    705, 
+    9207
+  ], 
+  [
+    1408, 
+    "DAVID SLEPPY", 
+    54, 
+    "M", 
+    "ATLANTA GA", 
+    1696, 
+    9229, 
+    705, 
+    9084
+  ], 
+  [
+    1409, 
+    "ARAS KANNU", 
+    40, 
+    "M", 
+    "CUMMING GA", 
+    966, 
+    9238, 
+    706, 
+    9155
+  ], 
+  [
+    1410, 
+    "GAYE ORSINI", 
+    49, 
+    "F", 
+    "MARIETTA GA", 
+    1374, 
+    9241, 
+    706, 
+    9140
+  ], 
+  [
+    1411, 
+    "MICHAEL ALBINGER", 
+    18, 
+    "M", 
+    "MARIETTA GA", 
+    23, 
+    9267, 
+    708, 
+    9221
+  ], 
+  [
+    1412, 
+    "VALERIE FAMBROUGH", 
+    30, 
+    "F", 
+    "DAHLONEGA GA", 
+    588, 
+    9270, 
+    708, 
+    9157
+  ], 
+  [
+    1413, 
+    "WENDY STULL", 
+    30, 
+    "F", 
+    "PUYALLUP WA", 
+    1775, 
+    9270, 
+    708, 
+    9157
+  ], 
+  [
+    1414, 
+    "JOE MILLER", 
+    46, 
+    "M", 
+    "MARIETTA GA", 
+    1277, 
+    9271, 
+    708, 
+    9202
+  ], 
+  [
+    1415, 
+    "RONALD HOLMES", 
+    29, 
+    "M", 
+    "ATLANTA GA", 
+    856, 
+    9272, 
+    708, 
+    9207
+  ], 
+  [
+    1416, 
+    "MIKE KRESAK", 
+    42, 
+    "M", 
+    "MARIETTA GA", 
+    1027, 
+    9278, 
+    709, 
+    9182
+  ], 
+  [
+    1417, 
+    "CANDICE POOR", 
+    39, 
+    "F", 
+    "MILTON GA", 
+    1456, 
+    9279, 
+    709, 
+    9172
+  ], 
+  [
+    1418, 
+    "MICHAEL LYONS", 
+    32, 
+    "M", 
+    "ATLANTA GA", 
+    1141, 
+    9298, 
+    710, 
+    9229
+  ], 
+  [
+    1419, 
+    "REBECCA HELLGETH", 
+    39, 
+    "F", 
+    "FAYETTEVILLE GA", 
+    826, 
+    9304, 
+    711, 
+    9227
+  ], 
+  [
+    1420, 
+    "JESSICA MCCARTY", 
+    29, 
+    "F", 
+    "MARIETTA GA", 
+    1197, 
+    9306, 
+    711, 
+    9232
+  ], 
+  [
+    1421, 
+    "LINDA PAUL", 
+    48, 
+    "F", 
+    "SNELLVILLE GA", 
+    1407, 
+    9314, 
+    711, 
+    9201
+  ], 
+  [
+    1422, 
+    "EMILY PAUL", 
+    19, 
+    "F", 
+    "SNELLVILLE GA", 
+    1405, 
+    9314, 
+    711, 
+    9203
+  ], 
+  [
+    1423, 
+    "CAROLINE KEATING", 
+    39, 
+    "F", 
+    "KENNESAW GA", 
+    975, 
+    9323, 
+    712, 
+    9218
+  ], 
+  [
+    1424, 
+    "LINDSEY MCNEIL", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    1241, 
+    9326, 
+    712, 
+    9254
+  ], 
+  [
+    1425, 
+    "ALANA STANTON", 
+    28, 
+    "F", 
+    "DACULA GA", 
+    1754, 
+    9329, 
+    713, 
+    9227
+  ], 
+  [
+    1426, 
+    "JOE SCHUSTER", 
+    52, 
+    "M", 
+    "CUMMING GA", 
+    1619, 
+    9339, 
+    713, 
+    9278
+  ], 
+  [
+    1427, 
+    "ROSS ALEXANDER", 
+    37, 
+    "M", 
+    "DAHLONEGA GA", 
+    30, 
+    9341, 
+    714, 
+    9274
+  ], 
+  [
+    1428, 
+    "KERRY PLATT", 
+    54, 
+    "F", 
+    "MARIETTA GA", 
+    1445, 
+    9347, 
+    714, 
+    9261
+  ], 
+  [
+    1429, 
+    "REBEKAH WALTERS", 
+    28, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    1911, 
+    9352, 
+    714, 
+    9262
+  ], 
+  [
+    1430, 
+    "STEPHEN WALTERS", 
+    30, 
+    "M", 
+    "LAWRENCEVILLE GA", 
+    1914, 
+    9352, 
+    714, 
+    9262
+  ], 
+  [
+    1431, 
+    "MICHAEL WILLIAMS", 
+    64, 
+    "M", 
+    "NEWNAN GA", 
+    1975, 
+    9356, 
+    715, 
+    9257
+  ], 
+  [
+    1432, 
+    "CHELSEA CLINE", 
+    26, 
+    "F", 
+    "WINSTON GA", 
+    343, 
+    9364, 
+    715, 
+    9262
+  ], 
+  [
+    1433, 
+    "GUS HUBER", 
+    38, 
+    "M", 
+    "CUMMING GA", 
+    879, 
+    9367, 
+    715, 
+    9258
+  ], 
+  [
+    1434, 
+    "PAUL MACIK", 
+    50, 
+    "M", 
+    "ATLANTA GA", 
+    1145, 
+    9369, 
+    716, 
+    9270
+  ], 
+  [
+    1435, 
+    "ERIN ANDERSON", 
+    32, 
+    "F", 
+    "DALLAS GA", 
+    48, 
+    9377, 
+    716, 
+    9288
+  ], 
+  [
+    1436, 
+    "JEFFREY ANDERSON", 
+    32, 
+    "M", 
+    "DALLAS GA", 
+    50, 
+    9378, 
+    716, 
+    9288
+  ], 
+  [
+    1437, 
+    "ERICA LEYDIC", 
+    39, 
+    "F", 
+    "ATLANTA GA", 
+    1096, 
+    9379, 
+    716, 
+    9281
+  ], 
+  [
+    1438, 
+    "LESLIE BENNETT", 
+    51, 
+    "F", 
+    "JOHNS CREEK GA", 
+    143, 
+    9379, 
+    716, 
+    9303
+  ], 
+  [
+    1439, 
+    "KRISTEN WARNER", 
+    40, 
+    "F", 
+    "WOODSTOCK GA", 
+    1922, 
+    9379, 
+    716, 
+    9305
+  ], 
+  [
+    1440, 
+    "LISA CROSBY", 
+    49, 
+    "F", 
+    "SUWANEE GA", 
+    411, 
+    9381, 
+    717, 
+    9284
+  ], 
+  [
+    1441, 
+    "GLORIA CARTER", 
+    53, 
+    "F", 
+    "MARIETTA GA", 
+    288, 
+    9387, 
+    717, 
+    9286
+  ], 
+  [
+    1442, 
+    "CELESTE BASFORD", 
+    33, 
+    "F", 
+    "MABLETON GA", 
+    118, 
+    9388, 
+    717, 
+    9288
+  ], 
+  [
+    1443, 
+    "STEPHANIE OLIN", 
+    36, 
+    "F", 
+    "MARIETTA GA", 
+    1366, 
+    9406, 
+    718, 
+    9347
+  ], 
+  [
+    1444, 
+    "ANGELA VAUGHN", 
+    33, 
+    "F", 
+    "ATLANTA GA", 
+    1886, 
+    9411, 
+    719, 
+    9320
+  ], 
+  [
+    1445, 
+    "LARRY CAMPBELL", 
+    39, 
+    "M", 
+    "SOCIAL CIRCLE GA", 
+    276, 
+    9419, 
+    719, 
+    9325
+  ], 
+  [
+    1446, 
+    "DANA BARTON", 
+    47, 
+    "F", 
+    "FOREST PARK GA", 
+    115, 
+    9421, 
+    720, 
+    9336
+  ], 
+  [
+    1447, 
+    "ALAN EARLS", 
+    52, 
+    "M", 
+    "HAMPTON GA", 
+    542, 
+    9422, 
+    720, 
+    9336
+  ], 
+  [
+    1448, 
+    "JENNIFER MCDONALD", 
+    34, 
+    "F", 
+    "BREMEN GA", 
+    1208, 
+    9430, 
+    720, 
+    9326
+  ], 
+  [
+    1449, 
+    "KARI WARD", 
+    25, 
+    "F", 
+    "DOUGLASVILLE GA", 
+    1920, 
+    9431, 
+    720, 
+    9328
+  ], 
+  [
+    1450, 
+    "MICHELLE FINCH", 
+    41, 
+    "F", 
+    "LEXINGTON GA", 
+    600, 
+    9432, 
+    720, 
+    9343
+  ], 
+  [
+    1451, 
+    "LORI FLEMING", 
+    46, 
+    "F", 
+    "HOSCHTON GA", 
+    609, 
+    9450, 
+    722, 
+    9366
+  ], 
+  [
+    1452, 
+    "MARIA ALBO CARABELLI", 
+    31, 
+    "F", 
+    "CUMMING GA", 
+    25, 
+    9461, 
+    723, 
+    9348
+  ], 
+  [
+    1453, 
+    "BRIGITTE LANDRUM", 
+    43, 
+    "F", 
+    "ACWORTH GA", 
+    1053, 
+    9462, 
+    723, 
+    9351
+  ], 
+  [
+    1454, 
+    "KEVIN SULLIVAN", 
+    30, 
+    "M", 
+    "WOODSTOCK GA", 
+    1781, 
+    9463, 
+    723, 
+    9409
+  ], 
+  [
+    1455, 
+    "HILARIE WALLER", 
+    38, 
+    "F", 
+    "DULUTH GA", 
+    1904, 
+    9469, 
+    723, 
+    9387
+  ], 
+  [
+    1456, 
+    "MARITZA ROSE", 
+    56, 
+    "F", 
+    "SMYRNA GA", 
+    1560, 
+    9489, 
+    725, 
+    9470
+  ], 
+  [
+    1457, 
+    "JULIE HENLY", 
+    49, 
+    "F", 
+    "CUMMING GA", 
+    831, 
+    9500, 
+    726, 
+    9383
+  ], 
+  [
+    1458, 
+    "RACHEL PARISAY", 
+    23, 
+    "F", 
+    "ATLANTA GA", 
+    1392, 
+    9506, 
+    726, 
+    9408
+  ], 
+  [
+    1459, 
+    "JASON LOGAN", 
+    38, 
+    "M", 
+    "WOODSTOCK GA", 
+    1116, 
+    9508, 
+    726, 
+    -1
+  ], 
+  [
+    1460, 
+    "JENNIFER PATTERSON", 
+    42, 
+    "F", 
+    "CANTON GA", 
+    1404, 
+    9517, 
+    727, 
+    9439
+  ], 
+  [
+    1461, 
+    "COLLEEN WRAY WRAY", 
+    45, 
+    "F", 
+    "MANHATTAN IL", 
+    2004, 
+    9517, 
+    727, 
+    9427
+  ], 
+  [
+    1462, 
+    "HEATHER FURLONG", 
+    29, 
+    "F", 
+    "AUSTELL GA", 
+    654, 
+    9525, 
+    728, 
+    9442
+  ], 
+  [
+    1463, 
+    "DANIELLE WEBER", 
+    26, 
+    "F", 
+    "ATLANTA GA", 
+    1938, 
+    9527, 
+    728, 
+    9427
+  ], 
+  [
+    1464, 
+    "KATHARINE SIGLER", 
+    28, 
+    "F", 
+    "KENNESAW GA", 
+    1679, 
+    9528, 
+    728, 
+    9444
+  ], 
+  [
+    1465, 
+    "SONIA LEE", 
+    38, 
+    "F", 
+    "NORCROSS GA", 
+    1080, 
+    9531, 
+    728, 
+    9432
+  ], 
+  [
+    1466, 
+    "KENDRA WRIGHT", 
+    37, 
+    "F", 
+    "AUSTELL GA", 
+    2008, 
+    9547, 
+    729, 
+    9503
+  ], 
+  [
+    1467, 
+    "ALISHA JORDAN", 
+    34, 
+    "F", 
+    "AUSTELL GA", 
+    961, 
+    9547, 
+    729, 
+    9503
+  ], 
+  [
+    1468, 
+    "ELLEN SMITH", 
+    63, 
+    "F", 
+    "LITHIA SPRINGS GA", 
+    1706, 
+    9557, 
+    730, 
+    9450
+  ], 
+  [
+    1469, 
+    "ANDREA BAPST", 
+    43, 
+    "F", 
+    "MABLETON GA", 
+    96, 
+    9566, 
+    731, 
+    9480
+  ], 
+  [
+    1470, 
+    "SANDRA STEWART KRUGER", 
+    47, 
+    "F", 
+    "ATLANTA GA", 
+    1766, 
+    9578, 
+    732, 
+    9469
+  ], 
+  [
+    1471, 
+    "NIKI MCCUTCHEN", 
+    40, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    1207, 
+    9590, 
+    732, 
+    9541
+  ], 
+  [
+    1472, 
+    "LAURA CORN", 
+    36, 
+    "F", 
+    "MARIETTA GA", 
+    386, 
+    9602, 
+    733, 
+    9497
+  ], 
+  [
+    1473, 
+    "JEFFREY PAUL", 
+    48, 
+    "M", 
+    "SNELLVILLE GA", 
+    1406, 
+    9626, 
+    735, 
+    9515
+  ], 
+  [
+    1474, 
+    "KATHY PARKER", 
+    43, 
+    "F", 
+    "LILBURN GA", 
+    1394, 
+    9627, 
+    735, 
+    9515
+  ], 
+  [
+    1475, 
+    "GAIL BANG", 
+    51, 
+    "F", 
+    "DECATUR GA", 
+    92, 
+    9633, 
+    736, 
+    9533
+  ], 
+  [
+    1476, 
+    "AMANDA FISHER", 
+    28, 
+    "F", 
+    "ACWORTH GA", 
+    602, 
+    9637, 
+    736, 
+    9604
+  ], 
+  [
+    1477, 
+    "PATTY MCGILL", 
+    53, 
+    "F", 
+    "ATLANTA GA", 
+    1219, 
+    9644, 
+    737, 
+    9498
+  ], 
+  [
+    1478, 
+    "DAVE INFANTE", 
+    41, 
+    "M", 
+    "WOODSTOCK GA", 
+    904, 
+    9649, 
+    737, 
+    9553
+  ], 
+  [
+    1479, 
+    "TRACY COOPER", 
+    31, 
+    "F", 
+    "ATLANTA GA", 
+    383, 
+    9657, 
+    738, 
+    9567
+  ], 
+  [
+    1480, 
+    "DAVID GAVIN", 
+    39, 
+    "M", 
+    "KENNESAW GA", 
+    678, 
+    9657, 
+    738, 
+    9573
+  ], 
+  [
+    1481, 
+    "ALYSSA PARSONS", 
+    28, 
+    "F", 
+    "DECATUR GA", 
+    1399, 
+    9667, 
+    738, 
+    9587
+  ], 
+  [
+    1482, 
+    "PRESTON CLOVER", 
+    25, 
+    "M", 
+    "MOUNTAIN VIEW CA", 
+    344, 
+    9668, 
+    738, 
+    9588
+  ], 
+  [
+    1483, 
+    "BECKY MALCOM", 
+    37, 
+    "F", 
+    "MARIETTA GA", 
+    1159, 
+    9668, 
+    738, 
+    9563
+  ], 
+  [
+    1484, 
+    "DONNA MILLER", 
+    49, 
+    "F", 
+    "LOGUST GROVE GA", 
+    1274, 
+    9668, 
+    738, 
+    9603
+  ], 
+  [
+    1485, 
+    "KIM BRADLEY", 
+    53, 
+    "F", 
+    "ATHENS GA", 
+    194, 
+    9670, 
+    739, 
+    9546
+  ], 
+  [
+    1486, 
+    "SHANNON CASAJUANA", 
+    35, 
+    "F", 
+    "DALLAS GA", 
+    294, 
+    9671, 
+    739, 
+    9564
+  ], 
+  [
+    1487, 
+    "MARY JANE BATES", 
+    43, 
+    "F", 
+    "FAYETTEVILLE GA", 
+    123, 
+    9671, 
+    739, 
+    9606
+  ], 
+  [
+    1488, 
+    "ERIN SHOEMAKER", 
+    34, 
+    "F", 
+    "ALPHARETTA GA", 
+    1672, 
+    9695, 
+    741, 
+    9660
+  ], 
+  [
+    1489, 
+    "PAULA MACKAY", 
+    34, 
+    "F", 
+    "CUMMING GA", 
+    1146, 
+    9700, 
+    741, 
+    9599
+  ], 
+  [
+    1490, 
+    "ANTHONY FOURNIER", 
+    21, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    627, 
+    9705, 
+    741, 
+    9651
+  ], 
+  [
+    1491, 
+    "ALYS PLEDGER", 
+    19, 
+    "F", 
+    "SMYRNA GA", 
+    1447, 
+    9705, 
+    741, 
+    9651
+  ], 
+  [
+    1492, 
+    "JASON HARMON", 
+    39, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    787, 
+    9706, 
+    741, 
+    9608
+  ], 
+  [
+    1493, 
+    "DANIELLE HARMON", 
+    43, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    786, 
+    9706, 
+    741, 
+    9608
+  ], 
+  [
+    1494, 
+    "KENNETH KEATING", 
+    39, 
+    "M", 
+    "KENNESAW GA", 
+    976, 
+    9709, 
+    742, 
+    9604
+  ], 
+  [
+    1495, 
+    "TOM GOODWIN", 
+    45, 
+    "M", 
+    "ROSWELL GA", 
+    709, 
+    9711, 
+    742, 
+    9610
+  ], 
+  [
+    1496, 
+    "STACEY CHAMBLISS", 
+    36, 
+    "F", 
+    "ROSWELL GA", 
+    314, 
+    9713, 
+    742, 
+    9620
+  ], 
+  [
+    1497, 
+    "BECKY JOHNSON", 
+    29, 
+    "F", 
+    "ALPHARETTA GA", 
+    940, 
+    9713, 
+    742, 
+    9620
+  ], 
+  [
+    1498, 
+    "RACHAEL BURNS", 
+    28, 
+    "F", 
+    "MABLETON GA", 
+    251, 
+    9717, 
+    742, 
+    9684
+  ], 
+  [
+    1499, 
+    "BAILEY KNIGHT", 
+    21, 
+    "F", 
+    "MILLEDGEVILLE GA", 
+    1015, 
+    9731, 
+    743, 
+    9665
+  ], 
+  [
+    1500, 
+    "JARED SMITH", 
+    24, 
+    "M", 
+    "MILLEDGEVILLE GA", 
+    1709, 
+    9731, 
+    743, 
+    9666
+  ], 
+  [
+    1501, 
+    "JENNY THOMPSON", 
+    39, 
+    "F", 
+    "ATLANTA GA", 
+    1828, 
+    9750, 
+    745, 
+    9648
+  ], 
+  [
+    1502, 
+    "BONNIE SEABROOKE", 
+    41, 
+    "F", 
+    "ATLANTA GA", 
+    1630, 
+    9750, 
+    745, 
+    9648
+  ], 
+  [
+    1503, 
+    "THOMAS CHERNETSKY", 
+    42, 
+    "M", 
+    "SUWANEE GA", 
+    324, 
+    9775, 
+    747, 
+    9733
+  ], 
+  [
+    1504, 
+    "TOM CHERNETSKY", 
+    72, 
+    "M", 
+    "ROSWELL GA", 
+    325, 
+    9775, 
+    747, 
+    9733
+  ], 
+  [
+    1505, 
+    "LISA ROSS-FAUST", 
+    48, 
+    "F", 
+    "SMYRNA GA", 
+    1565, 
+    9778, 
+    747, 
+    9680
+  ], 
+  [
+    1506, 
+    "DARLENE COWAN", 
+    56, 
+    "F", 
+    "DALLAS GA", 
+    394, 
+    9781, 
+    747, 
+    9674
+  ], 
+  [
+    1507, 
+    "KEVIN BARGER", 
+    56, 
+    "M", 
+    "WOODSTOCK GA", 
+    99, 
+    9783, 
+    747, 
+    9699
+  ], 
+  [
+    1508, 
+    "RANDY REAGAN", 
+    32, 
+    "M", 
+    "DAWSONVILLE GA", 
+    1496, 
+    9783, 
+    747, 
+    9698
+  ], 
+  [
+    1509, 
+    "CINDY MILLER", 
+    48, 
+    "F", 
+    "WOODSTOCK GA", 
+    1273, 
+    9793, 
+    748, 
+    9695
+  ], 
+  [
+    1510, 
+    "JAMIE LONG", 
+    39, 
+    "M", 
+    "JACKSON GA", 
+    1121, 
+    9801, 
+    749, 
+    9721
+  ], 
+  [
+    1511, 
+    "FAYE DIMASSIMO", 
+    50, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    493, 
+    9818, 
+    750, 
+    9708
+  ], 
+  [
+    1512, 
+    "SARAH DURLING", 
+    28, 
+    "F", 
+    "ATLANTA GA", 
+    537, 
+    9850, 
+    752, 
+    9695
+  ], 
+  [
+    1513, 
+    "AMMONS BENFORD", 
+    42, 
+    "M", 
+    "ATLANTA GA", 
+    2141, 
+    9852, 
+    753, 
+    9794
+  ], 
+  [
+    1514, 
+    "LAUREN ROTCHFORD", 
+    34, 
+    "F", 
+    "ATLANTA GA", 
+    1566, 
+    9854, 
+    753, 
+    9828
+  ], 
+  [
+    1515, 
+    "ALISON GREEN", 
+    40, 
+    "F", 
+    "ATLANTA GA", 
+    728, 
+    9860, 
+    753, 
+    9749
+  ], 
+  [
+    1516, 
+    "KIRSTEN JONES", 
+    42, 
+    "F", 
+    "DOUGLASVILLE GA", 
+    959, 
+    9861, 
+    753, 
+    9754
+  ], 
+  [
+    1517, 
+    "JEAN MENSE", 
+    51, 
+    "F", 
+    "ROSWELL GA", 
+    1254, 
+    9862, 
+    753, 
+    9765
+  ], 
+  [
+    1518, 
+    "NEIL MCCARTHY", 
+    71, 
+    "M", 
+    "ROSWELL GA", 
+    1195, 
+    9870, 
+    754, 
+    -1
+  ], 
+  [
+    1519, 
+    "MICHELLE DAVIS", 
+    36, 
+    "F", 
+    "ACWORTH GA", 
+    451, 
+    9875, 
+    754, 
+    9762
+  ], 
+  [
+    1520, 
+    "KIM SKIBER", 
+    39, 
+    "F", 
+    "ROSWELL GA", 
+    1693, 
+    9886, 
+    755, 
+    9797
+  ], 
+  [
+    1521, 
+    "LIA KAPLAN", 
+    38, 
+    "F", 
+    "TUCKER GA", 
+    969, 
+    9891, 
+    755, 
+    9803
+  ], 
+  [
+    1522, 
+    "DANA BAHLINGER", 
+    40, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    79, 
+    9894, 
+    756, 
+    9775
+  ], 
+  [
+    1523, 
+    "EDWARD BOYD", 
+    34, 
+    "M", 
+    "DAHLONEGA GA", 
+    185, 
+    9895, 
+    756, 
+    9827
+  ], 
+  [
+    1524, 
+    "REBECCA GRAY", 
+    22, 
+    "F", 
+    "ATLANTA GA", 
+    724, 
+    9899, 
+    756, 
+    9831
+  ], 
+  [
+    1525, 
+    "IRENE SMITH", 
+    41, 
+    "F", 
+    "WHITE GA", 
+    1708, 
+    9899, 
+    756, 
+    9837
+  ], 
+  [
+    1526, 
+    "KEVIN KELLY", 
+    50, 
+    "M", 
+    "KENNESAW GA", 
+    983, 
+    9927, 
+    758, 
+    9863
+  ], 
+  [
+    1527, 
+    "HEATHER KELLY", 
+    26, 
+    "F", 
+    "MARIETTA GA", 
+    982, 
+    9928, 
+    758, 
+    9863
+  ], 
+  [
+    1528, 
+    "KAREN PICKENS", 
+    50, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    1441, 
+    9931, 
+    759, 
+    9840
+  ], 
+  [
+    1529, 
+    "NATALIE DAWKINS", 
+    48, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    457, 
+    9932, 
+    759, 
+    9840
+  ], 
+  [
+    1530, 
+    "MEGEN MACOMBER", 
+    36, 
+    "F", 
+    "CANTON GA", 
+    1150, 
+    9942, 
+    759, 
+    9839
+  ], 
+  [
+    1531, 
+    "MICHELLE ANSLEY", 
+    43, 
+    "F", 
+    "MARIETTA GA", 
+    58, 
+    9953, 
+    760, 
+    9838
+  ], 
+  [
+    1532, 
+    "DANIEL BUCHANAN", 
+    30, 
+    "M", 
+    "ALPHARETTA GA", 
+    233, 
+    9961, 
+    761, 
+    9884
+  ], 
+  [
+    1533, 
+    "AMANDA DEES", 
+    32, 
+    "F", 
+    "MONROE NC", 
+    466, 
+    9968, 
+    761, 
+    9891
+  ], 
+  [
+    1534, 
+    "JOAN LAKE", 
+    42, 
+    "F", 
+    "ACWORTH GA", 
+    1048, 
+    9969, 
+    761, 
+    9857
+  ], 
+  [
+    1535, 
+    "KELLY LUCKETT", 
+    43, 
+    "F", 
+    "ATLANTA GA", 
+    1131, 
+    9981, 
+    762, 
+    9954
+  ], 
+  [
+    1536, 
+    "MATTHEW GRUND", 
+    33, 
+    "M", 
+    "MARIETTA GA", 
+    746, 
+    9989, 
+    763, 
+    9881
+  ], 
+  [
+    1537, 
+    "EMILY GRUND", 
+    33, 
+    "F", 
+    "MARIETTA GA", 
+    745, 
+    9989, 
+    763, 
+    9880
+  ], 
+  [
+    1538, 
+    "VALORIE KETCHUM", 
+    47, 
+    "F", 
+    "PINEHURST NC", 
+    992, 
+    9992, 
+    763, 
+    9905
+  ], 
+  [
+    1539, 
+    "KAREN POWELL", 
+    41, 
+    "F", 
+    "MABLETON GA", 
+    1461, 
+    10008, 
+    764, 
+    9906
+  ], 
+  [
+    1540, 
+    "SHANNON BRYAN", 
+    35, 
+    "F", 
+    "KANNAPOLIS NC", 
+    227, 
+    10017, 
+    765, 
+    9909
+  ], 
+  [
+    1541, 
+    "MEL DODD", 
+    58, 
+    "M", 
+    "JOHNS CREEK GA", 
+    500, 
+    10022, 
+    766, 
+    9941
+  ], 
+  [
+    1542, 
+    "LAURA DODD", 
+    53, 
+    "M", 
+    "JOHNS CREEK GA", 
+    499, 
+    10023, 
+    766, 
+    9941
+  ], 
+  [
+    1543, 
+    "ELLEN JANNETTA", 
+    42, 
+    "F", 
+    "ATLANTA GA", 
+    921, 
+    10032, 
+    766, 
+    9918
+  ], 
+  [
+    1544, 
+    "SHELLY PETERS", 
+    43, 
+    "F", 
+    "MARIETTA GA", 
+    2030, 
+    10041, 
+    767, 
+    10004
+  ], 
+  [
+    1545, 
+    "LISA SANDERS", 
+    30, 
+    "F", 
+    "HOLLY SPRINGS GA", 
+    1589, 
+    10070, 
+    769, 
+    10024
+  ], 
+  [
+    1546, 
+    "MARY CHAMLEE", 
+    40, 
+    "F", 
+    "ROSWELL GA", 
+    315, 
+    10073, 
+    769, 
+    9953
+  ], 
+  [
+    1547, 
+    "KIMBERLY WALDROP", 
+    39, 
+    "F", 
+    "PEACHTREE CITY GA", 
+    1900, 
+    10074, 
+    769, 
+    10025
+  ], 
+  [
+    1548, 
+    "STACEY CHAPMAN", 
+    39, 
+    "F", 
+    "MABLETON GA", 
+    319, 
+    10075, 
+    770, 
+    10027
+  ], 
+  [
+    1549, 
+    "MARIA HANDWORK", 
+    46, 
+    "F", 
+    "MARIETTA GA", 
+    774, 
+    10079, 
+    770, 
+    10001
+  ], 
+  [
+    1550, 
+    "STACY GAVIN", 
+    35, 
+    "F", 
+    "WOODSTOCK GA", 
+    680, 
+    10083, 
+    770, 
+    9989
+  ], 
+  [
+    1551, 
+    "SARAH MULLINS", 
+    30, 
+    "F", 
+    "WOODSTOCK GA", 
+    1323, 
+    10083, 
+    770, 
+    9989
+  ], 
+  [
+    1552, 
+    "KIM SPERLING", 
+    38, 
+    "F", 
+    "ROSWELL GA", 
+    1738, 
+    10086, 
+    770, 
+    9981
+  ], 
+  [
+    1553, 
+    "MICHELLE DIXON", 
+    28, 
+    "F", 
+    "SNELLVILLE GA", 
+    495, 
+    10097, 
+    771, 
+    9991
+  ], 
+  [
+    1554, 
+    "THEJA WICKERSHAM", 
+    32, 
+    "F", 
+    "CUMMING GA", 
+    1965, 
+    10144, 
+    775, 
+    10051
+  ], 
+  [
+    1555, 
+    "ASHLEY ROCQUE", 
+    28, 
+    "F", 
+    "KENNESAW GA", 
+    1549, 
+    10146, 
+    775, 
+    10071
+  ], 
+  [
+    1556, 
+    "TINA BUTTERFIELD", 
+    31, 
+    "F", 
+    "COLUMBIA SC", 
+    258, 
+    10146, 
+    775, 
+    10071
+  ], 
+  [
+    1557, 
+    "TERI DOEPKE", 
+    36, 
+    "F", 
+    "OXFORD GA", 
+    501, 
+    10152, 
+    775, 
+    10032
+  ], 
+  [
+    1558, 
+    "ROBERT JACKSON", 
+    48, 
+    "M", 
+    "ATLANTA GA", 
+    912, 
+    10173, 
+    777, 
+    10071
+  ], 
+  [
+    1559, 
+    "JASON GALLMAN", 
+    39, 
+    "M", 
+    "WINDER GA", 
+    663, 
+    10177, 
+    777, 
+    9980
+  ], 
+  [
+    1560, 
+    "CANDACE BROWN", 
+    44, 
+    "F", 
+    "JOHNS CREEK GA", 
+    213, 
+    10190, 
+    778, 
+    10074
+  ], 
+  [
+    1561, 
+    "TONYA LETT", 
+    41, 
+    "F", 
+    "DULUTH GA", 
+    1087, 
+    10191, 
+    778, 
+    10075
+  ], 
+  [
+    1562, 
+    "ERIKA MILLER", 
+    41, 
+    "F", 
+    "ATLANTA GA", 
+    1275, 
+    10234, 
+    782, 
+    -1
+  ], 
+  [
+    1563, 
+    "STACIE HUSACK", 
+    31, 
+    "F", 
+    "FAYETTEVILLE GA", 
+    895, 
+    10243, 
+    782, 
+    10146
+  ], 
+  [
+    1564, 
+    "JODI DOBY", 
+    41, 
+    "F", 
+    "DOUGLASVILLE GA", 
+    496, 
+    10249, 
+    783, 
+    10191
+  ], 
+  [
+    1565, 
+    "LISA LEGATE", 
+    45, 
+    "F", 
+    "MARIETTA GA", 
+    1083, 
+    10264, 
+    784, 
+    10226
+  ], 
+  [
+    1566, 
+    "JOSEPH ERNEST", 
+    65, 
+    "M", 
+    "NORCROSS GA", 
+    572, 
+    10314, 
+    788, 
+    10231
+  ], 
+  [
+    1567, 
+    "GWEN COTTRELL", 
+    41, 
+    "F", 
+    "ACWORTH GA", 
+    391, 
+    10379, 
+    793, 
+    10261
+  ], 
+  [
+    1568, 
+    "KEVIN TIERNEY", 
+    33, 
+    "M", 
+    "CUMMING GA", 
+    1837, 
+    10385, 
+    793, 
+    10337
+  ], 
+  [
+    1569, 
+    "DEENNA DURHAM", 
+    40, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    536, 
+    10386, 
+    793, 
+    10271
+  ], 
+  [
+    1570, 
+    "JAMIE ANDREWS", 
+    37, 
+    "F", 
+    "WOODSTOCK GA", 
+    56, 
+    10387, 
+    793, 
+    10279
+  ], 
+  [
+    1571, 
+    "HEIDI SHOOK", 
+    39, 
+    "F", 
+    "ALPHARETTA GA", 
+    1674, 
+    10420, 
+    796, 
+    10308
+  ], 
+  [
+    1572, 
+    "ASHLEY GELLIS", 
+    41, 
+    "F", 
+    "MARIETTA GA", 
+    684, 
+    10430, 
+    797, 
+    10319
+  ], 
+  [
+    1573, 
+    "TERRY MILLER", 
+    51, 
+    "M", 
+    "ATLANTA GA", 
+    1284, 
+    10439, 
+    797, 
+    10413
+  ], 
+  [
+    1574, 
+    "MARILEE DORSEY", 
+    53, 
+    "F", 
+    "DULUTH GA", 
+    508, 
+    10448, 
+    798, 
+    10342
+  ], 
+  [
+    1575, 
+    "WYLENE EASON", 
+    69, 
+    "F", 
+    "MCDONOUGH GA", 
+    543, 
+    10451, 
+    798, 
+    10345
+  ], 
+  [
+    1576, 
+    "NATE DEAN", 
+    30, 
+    "M", 
+    "WOODSTOCK GA", 
+    460, 
+    10452, 
+    798, 
+    10349
+  ], 
+  [
+    1577, 
+    "DORI JO LAWRANCE", 
+    40, 
+    "F", 
+    "CHATTANOOGA TN", 
+    1064, 
+    10466, 
+    799, 
+    10358
+  ], 
+  [
+    1578, 
+    "SABRINA MAGEE", 
+    48, 
+    "F", 
+    "CARROLLTON GA", 
+    1151, 
+    10477, 
+    800, 
+    10365
+  ], 
+  [
+    1579, 
+    "LEIGH REED", 
+    44, 
+    "F", 
+    "ATLANTA GA", 
+    1504, 
+    10477, 
+    800, 
+    10361
+  ], 
+  [
+    1580, 
+    "JANET ANDERSON", 
+    54, 
+    "F", 
+    "ATLANTA GA", 
+    49, 
+    10486, 
+    801, 
+    10423
+  ], 
+  [
+    1581, 
+    "DAVID GRIFFIN", 
+    52, 
+    "M", 
+    "MARIETTA GA", 
+    739, 
+    10512, 
+    803, 
+    10484
+  ], 
+  [
+    1582, 
+    "BRANDY AIRALL", 
+    33, 
+    "F", 
+    "ATLANTA GA", 
+    20, 
+    10530, 
+    804, 
+    10414
+  ], 
+  [
+    1583, 
+    "PAUL GRICE", 
+    61, 
+    "M", 
+    "ATLANTA GA", 
+    737, 
+    10533, 
+    805, 
+    10432
+  ], 
+  [
+    1584, 
+    "ANGELA EDGAR", 
+    55, 
+    "F", 
+    "MCDONOUGH GA", 
+    546, 
+    10534, 
+    805, 
+    10430
+  ], 
+  [
+    1585, 
+    "CLARISSA ELS", 
+    22, 
+    "F", 
+    "SUWANEE GA", 
+    569, 
+    10536, 
+    805, 
+    10330
+  ], 
+  [
+    1586, 
+    "KITTI MURRAY", 
+    53, 
+    "F", 
+    "ATLANTA GA", 
+    1326, 
+    10541, 
+    805, 
+    10334
+  ], 
+  [
+    1587, 
+    "KIM FRANKLIN", 
+    29, 
+    "F", 
+    "MARIETTA GA", 
+    632, 
+    10566, 
+    807, 
+    10476
+  ], 
+  [
+    1588, 
+    "SARAH GILBERT", 
+    25, 
+    "F", 
+    "DOUGLASVILLE GA", 
+    694, 
+    10607, 
+    810, 
+    -1
+  ], 
+  [
+    1589, 
+    "ALLISON PERRY", 
+    27, 
+    "F", 
+    "WOODSTOCK GA", 
+    1419, 
+    10607, 
+    810, 
+    10502
+  ], 
+  [
+    1590, 
+    "JULIE LUGAR", 
+    48, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    1133, 
+    10628, 
+    812, 
+    10537
+  ], 
+  [
+    1591, 
+    "LUCIANA TUCCI", 
+    32, 
+    "F", 
+    "ATLANTA GA", 
+    1858, 
+    10656, 
+    814, 
+    10566
+  ], 
+  [
+    1592, 
+    "ROBERT PEARSON", 
+    41, 
+    "M", 
+    "TALLAHASSEE FL", 
+    1410, 
+    10657, 
+    814, 
+    10596
+  ], 
+  [
+    1593, 
+    "AMBER PEARSON", 
+    31, 
+    "F", 
+    "TALLAHASSEE FL", 
+    1409, 
+    10658, 
+    814, 
+    10596
+  ], 
+  [
+    1594, 
+    "BECKY COLDWELL", 
+    53, 
+    "F", 
+    "CARROLLTON GA", 
+    357, 
+    10659, 
+    814, 
+    10566
+  ], 
+  [
+    1595, 
+    "ETHEL LILLO", 
+    54, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    1100, 
+    10665, 
+    815, 
+    10569
+  ], 
+  [
+    1596, 
+    "LORA BOCK", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    165, 
+    10668, 
+    815, 
+    10554
+  ], 
+  [
+    1597, 
+    "YVELISE HODO-LOPEZ", 
+    38, 
+    "F", 
+    "ATLANTA GA", 
+    848, 
+    10669, 
+    815, 
+    10554
+  ], 
+  [
+    1598, 
+    "VIC MILLER", 
+    40, 
+    "M", 
+    "SMYRNA GA", 
+    1285, 
+    10680, 
+    816, 
+    10576
+  ], 
+  [
+    1599, 
+    "MATT SHADE", 
+    69, 
+    "M", 
+    "MARIETTA GA", 
+    1646, 
+    10689, 
+    816, 
+    10586
+  ], 
+  [
+    1600, 
+    "LAUREN SAUNDERS", 
+    27, 
+    "F", 
+    "MARIETTA GA", 
+    1597, 
+    10718, 
+    819, 
+    10652
+  ], 
+  [
+    1601, 
+    "AMY MALCOM", 
+    44, 
+    "F", 
+    "ALPHARETTA GA", 
+    1158, 
+    10730, 
+    820, 
+    10692
+  ], 
+  [
+    1602, 
+    "ANDY SHEPPARD", 
+    38, 
+    "M", 
+    "HOSCHTON GA", 
+    1666, 
+    10733, 
+    820, 
+    10674
+  ], 
+  [
+    1603, 
+    "REBECCA GALLMAN", 
+    33, 
+    "F", 
+    "WINDER GA", 
+    664, 
+    10751, 
+    821, 
+    10553
+  ], 
+  [
+    1604, 
+    "SAMANTHA STEPHENS", 
+    38, 
+    "F", 
+    "MARIETTA GA", 
+    1764, 
+    10754, 
+    821, 
+    10643
+  ], 
+  [
+    1605, 
+    "WILLIAM BROCK", 
+    38, 
+    "M", 
+    "KENNESAW GA", 
+    207, 
+    10765, 
+    822, 
+    10676
+  ], 
+  [
+    1606, 
+    "ADAM TOENES", 
+    29, 
+    "M", 
+    "DACULA GA", 
+    1843, 
+    10765, 
+    822, 
+    10660
+  ], 
+  [
+    1607, 
+    "AMANDA REMILLARD", 
+    25, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    1510, 
+    10773, 
+    823, 
+    10674
+  ], 
+  [
+    1608, 
+    "AUDREA REASE", 
+    37, 
+    "F", 
+    "DECATUR GA", 
+    1497, 
+    10781, 
+    823, 
+    10740
+  ], 
+  [
+    1609, 
+    "RHEA ASHCRAFT", 
+    45, 
+    "F", 
+    "SAN DIEGO CA", 
+    67, 
+    10801, 
+    825, 
+    10696
+  ], 
+  [
+    1610, 
+    "SANDRA HORAN", 
+    67, 
+    "F", 
+    "SUWANEE GA", 
+    863, 
+    10803, 
+    825, 
+    10687
+  ], 
+  [
+    1611, 
+    "KASHI SEHGAL", 
+    30, 
+    "F", 
+    "ATLANTA GA", 
+    1634, 
+    10820, 
+    826, 
+    10727
+  ], 
+  [
+    1612, 
+    "MELISSA KOVACH", 
+    30, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    1022, 
+    10824, 
+    827, 
+    10716
+  ], 
+  [
+    1613, 
+    "KISHA DONAHUE", 
+    35, 
+    "F", 
+    "KENNESAW GA", 
+    504, 
+    10840, 
+    828, 
+    10751
+  ], 
+  [
+    1614, 
+    "LINDA JACKSON", 
+    55, 
+    "F", 
+    "CUMMING GA", 
+    911, 
+    10856, 
+    829, 
+    10747
+  ], 
+  [
+    1615, 
+    "CHRISTOPHER PETERSON", 
+    38, 
+    "M", 
+    "MARIETTA GA", 
+    1421, 
+    10894, 
+    832, 
+    10778
+  ], 
+  [
+    1616, 
+    "JEFF MCNEIL", 
+    31, 
+    "M", 
+    "MARIETTA GA", 
+    1240, 
+    10911, 
+    833, 
+    10793
+  ], 
+  [
+    1617, 
+    "ANJANETTE KEANE-DAWES", 
+    39, 
+    "F", 
+    "MABLETON FM", 
+    974, 
+    10919, 
+    834, 
+    10891
+  ], 
+  [
+    1618, 
+    "MANISHA KULKARNI", 
+    44, 
+    "F", 
+    "ALPHARETTA GA", 
+    1038, 
+    10936, 
+    835, 
+    10893
+  ], 
+  [
+    1619, 
+    "LINDA MONGELL", 
+    63, 
+    "F", 
+    "ATLANTA GA", 
+    1296, 
+    10945, 
+    836, 
+    10835
+  ], 
+  [
+    1620, 
+    "EDNA SALAMO", 
+    41, 
+    "F", 
+    "MABLETON GA", 
+    1582, 
+    10949, 
+    836, 
+    10833
+  ], 
+  [
+    1621, 
+    "LAURA POLO", 
+    37, 
+    "F", 
+    "LAWRENCEVILLE GA", 
+    1452, 
+    10984, 
+    839, 
+    10865
+  ], 
+  [
+    1622, 
+    "CAROL LEWIS", 
+    64, 
+    "F", 
+    "CONYERS GA", 
+    1089, 
+    10985, 
+    839, 
+    10866
+  ], 
+  [
+    1623, 
+    "AMRUT KULKARNI", 
+    14, 
+    "M", 
+    "ALPHARETTA GA", 
+    1037, 
+    11030, 
+    842, 
+    10986
+  ], 
+  [
+    1624, 
+    "DORALEE GORDON", 
+    43, 
+    "F", 
+    "OOLTEWAH TN", 
+    710, 
+    11074, 
+    846, 
+    10965
+  ], 
+  [
+    1625, 
+    "PEGGY ROGERS", 
+    67, 
+    "F", 
+    "ATLANTA GA", 
+    1553, 
+    11103, 
+    848, 
+    10994
+  ], 
+  [
+    1626, 
+    "SHEREE BERK", 
+    51, 
+    "F", 
+    "MARIETTA GA", 
+    146, 
+    11129, 
+    850, 
+    11092
+  ], 
+  [
+    1627, 
+    "STACIE METCALFE", 
+    39, 
+    "F", 
+    "ATLANTA GA", 
+    1268, 
+    11170, 
+    853, 
+    11073
+  ], 
+  [
+    1628, 
+    "KAREN CONNELLY", 
+    46, 
+    "F", 
+    "DALLAS GA", 
+    370, 
+    11174, 
+    853, 
+    11066
+  ], 
+  [
+    1629, 
+    "MARCI BENNAFIELD", 
+    43, 
+    "F", 
+    "ATLANTA GA", 
+    142, 
+    11194, 
+    855, 
+    11074
+  ], 
+  [
+    1630, 
+    "DAVID GARNER", 
+    40, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    671, 
+    11203, 
+    856, 
+    11095
+  ], 
+  [
+    1631, 
+    "GRACE THOMSEN", 
+    12, 
+    "F", 
+    "MABLETON GA", 
+    1830, 
+    11217, 
+    857, 
+    11193
+  ], 
+  [
+    1632, 
+    "ANGELA THOMSEN", 
+    45, 
+    "F", 
+    "MABLETON GA", 
+    1829, 
+    11217, 
+    857, 
+    11193
+  ], 
+  [
+    1633, 
+    "MITCHELL KAO", 
+    40, 
+    "M", 
+    "NORCROSS GA", 
+    968, 
+    11223, 
+    857, 
+    11124
+  ], 
+  [
+    1634, 
+    "MARY KAY BALTZELL", 
+    47, 
+    "F", 
+    "TUCKER GA", 
+    90, 
+    11229, 
+    858, 
+    11130
+  ], 
+  [
+    1635, 
+    "SUSAN BANKE", 
+    55, 
+    "F", 
+    "SMYRNA GA", 
+    94, 
+    11270, 
+    861, 
+    11152
+  ], 
+  [
+    1636, 
+    "JENNIFER SUGGS", 
+    26, 
+    "F", 
+    "SMYRNA GA", 
+    1778, 
+    11270, 
+    861, 
+    11151
+  ], 
+  [
+    1637, 
+    "CHARLENE DETLER", 
+    42, 
+    "F", 
+    "ELLENWOOD GA", 
+    483, 
+    11274, 
+    861, 
+    11167
+  ], 
+  [
+    1638, 
+    "ASHLEY COX", 
+    25, 
+    "F", 
+    "KENNESAW GA", 
+    396, 
+    11303, 
+    863, 
+    11204
+  ], 
+  [
+    1639, 
+    "SHAYNA PEIKEN", 
+    42, 
+    "F", 
+    "MARIETTA GA", 
+    1413, 
+    11369, 
+    868, 
+    11280
+  ], 
+  [
+    1640, 
+    "CHARLOTTE HOOVER", 
+    61, 
+    "F", 
+    "MCDONOUGH GA", 
+    860, 
+    11437, 
+    874, 
+    11332
+  ], 
+  [
+    1641, 
+    "LINDA SUMMERS", 
+    49, 
+    "F", 
+    "SENOIA GA", 
+    1785, 
+    11478, 
+    877, 
+    11363
+  ], 
+  [
+    1642, 
+    "JEFF SUMMERS", 
+    50, 
+    "M", 
+    "SENOIA GA", 
+    1784, 
+    11479, 
+    877, 
+    11363
+  ], 
+  [
+    1643, 
+    "PHYLLIS HALL", 
+    52, 
+    "F", 
+    "SHARPSBURT GA", 
+    764, 
+    11480, 
+    877, 
+    11364
+  ], 
+  [
+    1644, 
+    "AMY FALZONE", 
+    29, 
+    "F", 
+    "ALPHARETTA GA", 
+    587, 
+    11514, 
+    879, 
+    11457
+  ], 
+  [
+    1645, 
+    "DENNIS LEATH", 
+    62, 
+    "M", 
+    "JASPER GA", 
+    1073, 
+    11518, 
+    880, 
+    11402
+  ], 
+  [
+    1646, 
+    "WANDA HALLER", 
+    53, 
+    "F", 
+    "POWDER SPRINGS GA", 
+    767, 
+    11541, 
+    881, 
+    11471
+  ], 
+  [
+    1647, 
+    "KATE BAWDEN", 
+    24, 
+    "F", 
+    "CANTON GA", 
+    126, 
+    11541, 
+    881, 
+    11500
+  ], 
+  [
+    1648, 
+    "BRIAN BAWDEN", 
+    27, 
+    "M", 
+    "CANTON GA", 
+    125, 
+    11542, 
+    881, 
+    11501
+  ], 
+  [
+    1649, 
+    "SARAH BOLING", 
+    40, 
+    "F", 
+    "SANDY SPRINGS GA", 
+    169, 
+    11606, 
+    886, 
+    11495
+  ], 
+  [
+    1650, 
+    "NANCY WAGES", 
+    60, 
+    "F", 
+    "DECATUR GA", 
+    1895, 
+    11618, 
+    887, 
+    11508
+  ], 
+  [
+    1651, 
+    "DIANNE MASON", 
+    49, 
+    "F", 
+    "KNIFEVILLE FL", 
+    1182, 
+    11656, 
+    890, 
+    11560
+  ], 
+  [
+    1652, 
+    "CAROL MARTIN", 
+    60, 
+    "F", 
+    "SMYRNA GA", 
+    1172, 
+    11757, 
+    898, 
+    11659
+  ], 
+  [
+    1653, 
+    "LYDIA WOODS", 
+    57, 
+    "F", 
+    "ATLANTA GA", 
+    2002, 
+    11781, 
+    900, 
+    11750
+  ], 
+  [
+    1654, 
+    "COLLEEN MELONEY", 
+    61, 
+    "F", 
+    "ALPHARETTA GA", 
+    1251, 
+    11819, 
+    903, 
+    -1
+  ], 
+  [
+    1655, 
+    "FARRAR BARKER", 
+    27, 
+    "F", 
+    "ATLANTA GA", 
+    101, 
+    11820, 
+    903, 
+    -1
+  ], 
+  [
+    1656, 
+    "KELLY BARKER", 
+    35, 
+    "M", 
+    "ATLANTA GA", 
+    102, 
+    11820, 
+    903, 
+    -1
+  ], 
+  [
+    1657, 
+    "BRIDGETTE JOHNSON", 
+    55, 
+    "F", 
+    "PANAMA CITY BEA FL", 
+    942, 
+    11821, 
+    903, 
+    -1
+  ], 
+  [
+    1658, 
+    "JOYCE LEATH", 
+    66, 
+    "F", 
+    "JASPER GA", 
+    1074, 
+    11851, 
+    905, 
+    11735
+  ], 
+  [
+    1659, 
+    "SUZANNE FLOWERS", 
+    32, 
+    "F", 
+    "MABLETON GA", 
+    614, 
+    11852, 
+    905, 
+    11765
+  ], 
+  [
+    1660, 
+    "JAN COLLINS", 
+    48, 
+    "F", 
+    "MARIETTA GA", 
+    366, 
+    11855, 
+    905, 
+    11812
+  ], 
+  [
+    1661, 
+    "HARRISON HUNT", 
+    20, 
+    "M", 
+    "WALESKA GA", 
+    2039, 
+    11859, 
+    906, 
+    11756
+  ], 
+  [
+    1662, 
+    "MARC TARTARO", 
+    37, 
+    "M", 
+    "MARIETTA GA", 
+    1802, 
+    11859, 
+    906, 
+    11755
+  ], 
+  [
+    1663, 
+    "SHELLI TREELY", 
+    49, 
+    "F", 
+    "OSCEOLA IN", 
+    1851, 
+    11864, 
+    906, 
+    11742
+  ], 
+  [
+    1664, 
+    "PEGGY SIMPSON", 
+    62, 
+    "F", 
+    "WHITE GA", 
+    1687, 
+    11884, 
+    908, 
+    11789
+  ], 
+  [
+    1665, 
+    "ANDY FREEMAN", 
+    40, 
+    "M", 
+    "POWDER SPRINGS GA", 
+    639, 
+    11897, 
+    909, 
+    11786
+  ], 
+  [
+    1666, 
+    "NEENA JOGLEKAR", 
+    45, 
+    "F", 
+    "ALPHARETTA GA", 
+    935, 
+    11945, 
+    912, 
+    11902
+  ], 
+  [
+    1667, 
+    "MICHELLE BARRON", 
+    47, 
+    "F", 
+    "MARIETTA GA", 
+    109, 
+    11992, 
+    916, 
+    11882
+  ], 
+  [
+    1668, 
+    "TINA LOGAN", 
+    42, 
+    "F", 
+    "MABLETON GA", 
+    1118, 
+    12076, 
+    922, 
+    12050
+  ], 
+  [
+    1669, 
+    "TONYA PHILLIPS", 
+    38, 
+    "F", 
+    "MABLETON GA", 
+    1437, 
+    12077, 
+    922, 
+    12050
+  ], 
+  [
+    1670, 
+    "CHRISTINE OSWALD", 
+    37, 
+    "F", 
+    "LILBURN GA", 
+    1378, 
+    12175, 
+    930, 
+    12060
+  ], 
+  [
+    1671, 
+    "ANITA HARRIS", 
+    50, 
+    "F", 
+    "ATLANTA GA", 
+    793, 
+    12184, 
+    930, 
+    12097
+  ], 
+  [
+    1672, 
+    "SHELIA SCOTT", 
+    53, 
+    "F", 
+    "L:ITHONIA GA", 
+    1628, 
+    12284, 
+    938, 
+    12181
+  ], 
+  [
+    1673, 
+    "MICHELLE COLLIER", 
+    54, 
+    "F", 
+    "ATLANTA GA", 
+    364, 
+    12397, 
+    947, 
+    12346
+  ], 
+  [
+    1674, 
+    "TIFFANY DEBROCK", 
+    34, 
+    "F", 
+    "SMYRNA GA", 
+    464, 
+    12398, 
+    947, 
+    12283
+  ], 
+  [
+    1675, 
+    "ROXANE RUSH", 
+    41, 
+    "F", 
+    "CANTON GA", 
+    1575, 
+    12508, 
+    955, 
+    12403
+  ], 
+  [
+    1676, 
+    "JEANNIE ROKOVITZ", 
+    39, 
+    "F", 
+    "WOODSTOCK GA", 
+    1554, 
+    12534, 
+    957, 
+    12430
+  ], 
+  [
+    1677, 
+    "REE MYERS", 
+    25, 
+    "F", 
+    "WOODSTOCK GA", 
+    1329, 
+    12580, 
+    961, 
+    12460
+  ], 
+  [
+    1678, 
+    "SUSAN MCPHERSON", 
+    52, 
+    "F", 
+    "CANTON GA", 
+    1243, 
+    12606, 
+    963, 
+    12485
+  ], 
+  [
+    1679, 
+    "BETH COPENHAVER", 
+    47, 
+    "F", 
+    "JOHNS CREEK GA", 
+    384, 
+    12626, 
+    964, 
+    12507
+  ], 
+  [
+    1680, 
+    "BENTE SMALL", 
+    46, 
+    "F", 
+    "LITHONIA GA", 
+    1697, 
+    12706, 
+    970, 
+    12557
+  ], 
+  [
+    1681, 
+    "JOHNNYE BAILEY", 
+    51, 
+    "F", 
+    "ATLANTA GA", 
+    81, 
+    12766, 
+    975, 
+    12703
+  ], 
+  [
+    1682, 
+    "BETHANY HARRIS", 
+    30, 
+    "F", 
+    "DECATUR GA", 
+    794, 
+    12766, 
+    975, 
+    12649
+  ], 
+  [
+    1683, 
+    "JAIME HARRIS", 
+    31, 
+    "M", 
+    "DECATUR GA", 
+    795, 
+    12768, 
+    975, 
+    12649
+  ], 
+  [
+    1684, 
+    "ROSEMARY MACMILLAN", 
+    50, 
+    "F", 
+    "ROSWELL GA", 
+    1149, 
+    12785, 
+    976, 
+    12671
+  ], 
+  [
+    1685, 
+    "DIANE ONESTA", 
+    50, 
+    "F", 
+    "ACWORTH GA", 
+    1372, 
+    12785, 
+    976, 
+    12672
+  ], 
+  [
+    1686, 
+    "ANN MANN", 
+    51, 
+    "F", 
+    "MARIETTA GA", 
+    1164, 
+    12786, 
+    976, 
+    12671
+  ], 
+  [
+    1687, 
+    "CATHERINE AGERBECK", 
+    35, 
+    "F", 
+    "BUFORD GA", 
+    16, 
+    12816, 
+    979, 
+    12752
+  ], 
+  [
+    1688, 
+    "KAY ROYCE", 
+    50, 
+    "F", 
+    "LOGANVILLE GA", 
+    1572, 
+    12994, 
+    992, 
+    12928
+  ], 
+  [
+    1689, 
+    "ROXANNE LAWSON", 
+    41, 
+    "F", 
+    "HOSCHTON GA", 
+    1065, 
+    12994, 
+    992, 
+    12930
+  ], 
+  [
+    1690, 
+    "STEPHANIE GOLIAS", 
+    43, 
+    "F", 
+    "WOODSTOCK GA", 
+    705, 
+    13008, 
+    993, 
+    12891
+  ], 
+  [
+    1691, 
+    "GEORGE MALONE", 
+    43, 
+    "M", 
+    "HUNTSVILLE AL", 
+    1162, 
+    13155, 
+    1005, 
+    13048
+  ], 
+  [
+    1692, 
+    "DEBORAH WHITE", 
+    52, 
+    "F", 
+    "WESTERVILLE OH", 
+    1958, 
+    13161, 
+    1005, 
+    13056
+  ], 
+  [
+    1693, 
+    "CHARLES COHN", 
+    79, 
+    "M", 
+    "AUSTELL GA", 
+    356, 
+    13299, 
+    1016, 
+    13188
+  ], 
+  [
+    1694, 
+    "AMIEE TEAL", 
+    37, 
+    "F", 
+    "MARIETTA GA", 
+    1813, 
+    13461, 
+    1028, 
+    13357
+  ], 
+  [
+    1695, 
+    "NICOLE MCCOY", 
+    30, 
+    "F", 
+    "CUMMING GA", 
+    1203, 
+    13522, 
+    1033, 
+    13408
+  ], 
+  [
+    1696, 
+    "TAMIKA PONDER", 
+    34, 
+    "F", 
+    "DOUGLASVILLE GA", 
+    1453, 
+    13522, 
+    1033, 
+    -1
+  ], 
+  [
+    1697, 
+    "NELLY HUNZINGER", 
+    71, 
+    "F", 
+    "HIRAM GA", 
+    891, 
+    13755, 
+    1050, 
+    13633
+  ], 
+  [
+    1698, 
+    "JUDY COOK", 
+    70, 
+    "F", 
+    "ACWORTH GA", 
+    375, 
+    13756, 
+    1051, 
+    13637
+  ], 
+  [
+    1699, 
+    "MAGGIE MERRITT", 
+    61, 
+    "F", 
+    "DECATUR GA", 
+    1263, 
+    14032, 
+    1072, 
+    13969
+  ], 
+  [
+    1700, 
+    "CLAUDIA CRENSHAW", 
+    59, 
+    "F", 
+    "CLARKSTON GA", 
+    404, 
+    14347, 
+    1096, 
+    14301
+  ], 
+  [
+    1701, 
+    "JOANNE CLENDENIN", 
+    59, 
+    "F", 
+    "ATLANTA GA", 
+    342, 
+    15240, 
+    1164, 
+    15119
+  ], 
+  [
+    1702, 
+    "JAMES CLENDENIN", 
+    57, 
+    "M", 
+    "ATLANTA GA", 
+    341, 
+    15240, 
+    1164, 
+    15120
+  ], 
+  [
+    1703, 
+    "LINDA MAHER WILLIAMS", 
+    57, 
+    "F", 
+    "DECATUR GA", 
+    1153, 
+    15240, 
+    1164, 
+    15120
+  ]
+]
diff --git a/elemental/examples/silvercomet/src/com/google/silvercomet/server/Server.java b/elemental/examples/silvercomet/src/com/google/silvercomet/server/Server.java
new file mode 100644
index 0000000..9e98967
--- /dev/null
+++ b/elemental/examples/silvercomet/src/com/google/silvercomet/server/Server.java
@@ -0,0 +1,22 @@
+package com.google.silvercomet.server;
+
+import com.google.common.flags.Flags;
+import com.google.gse.GoogleServletEngine;
+import com.google.gwt.gserver.GwtResourceServlet;
+import com.google.net.base.IpScanners;
+
+import java.io.IOException;
+
+public class Server {
+  public static void main(String[] args) throws IOException {
+    Flags.parse(args);
+    final GoogleServletEngine gse = new GoogleServletEngine();
+    gse.configure();
+    gse.setServerType("what_the_fuck_is_all_this_random_stuff");
+    gse.getPathDispatcher().addServlet("/*", new GwtResourceServlet(
+        Server.class.getClassLoader(),
+        IpScanners.ALLOW_ALL,
+        "SilverComet"));
+    gse.run();
+  }
+}
diff --git a/elemental/examples/simple/src/elemental/example/ElementalExample.gwt.xml b/elemental/examples/simple/src/elemental/example/ElementalExample.gwt.xml
new file mode 100644
index 0000000..68828e0
--- /dev/null
+++ b/elemental/examples/simple/src/elemental/example/ElementalExample.gwt.xml
@@ -0,0 +1,4 @@
+<module rename-to="elementalExample">
+  <inherits name="elemental.Elemental"/>
+  <entry-point class="elemental.example.client.ElementalExample" />
+</module>
diff --git a/elemental/examples/simple/src/elemental/example/client/ElementalExample.java b/elemental/examples/simple/src/elemental/example/client/ElementalExample.java
new file mode 100644
index 0000000..02e96a9
--- /dev/null
+++ b/elemental/examples/simple/src/elemental/example/client/ElementalExample.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.example.client;
+
+import static elemental.client.Browser.getDocument;
+import static elemental.client.Browser.getWindow;
+
+import com.google.gwt.core.client.EntryPoint;
+
+import elemental.html.Window;
+
+import elemental.dom.XMLHttpRequest;
+import elemental.events.Event;
+import elemental.events.EventListener;
+import elemental.html.ButtonElement;
+import elemental.html.DivElement;
+
+public class ElementalExample implements EntryPoint {
+
+  @Override
+  public void onModuleLoad() {
+    final ButtonElement btn = getDocument().createButtonElement();
+    btn.setInnerHTML("w00t?");
+    btn.getStyle().setColor("red");
+    getDocument().getBody().appendChild(btn);
+
+    final DivElement div = getDocument().createDivElement();
+    getDocument().getBody().appendChild(div);
+
+    EventListener listener = new EventListener() {
+      public void handleEvent(Event evt) {
+        final XMLHttpRequest xhr = getWindow().newXMLHttpRequest();
+        xhr.setOnLoad(new EventListener() {
+          @Override
+          public void handleEvent(Event evt) {
+            div.setInnerHTML(xhr.getResponseText());
+          }
+        });
+        xhr.open("GET", "/snippet.html");
+        xhr.send();
+
+        getWindow().setTimeout(new Window.TimerCallback() {
+          @Override
+          public void fire() {
+            getWindow().alert("timeout fired");
+          }
+        }, 1000);
+
+        btn.removeEventListener(Event.CLICK, this, false);
+      }
+    };
+
+    btn.addEventListener(Event.CLICK, listener, false);
+  }
+}
diff --git a/elemental/idl/README b/elemental/idl/README
new file mode 100644
index 0000000..549fd91
--- /dev/null
+++ b/elemental/idl/README
@@ -0,0 +1,7 @@
+GWT bindings generation code adapted from the Dart Project at http://code.google.com/p/dart/source/browse/trunk/dart/lib/
+
+How to update bindings:
+1) Update third_party/WebCore/ from trac.webkit.org or the Dart Project
+2) Modify elemental.idl to fix any issues (usually caused by covariant returns)
+3) Run build script to regenerate the bindings
+4) cp -r generated/src/elemental/* ../src/elemental/
diff --git a/elemental/idl/build b/elemental/idl/build
new file mode 100755
index 0000000..8f6b266
--- /dev/null
+++ b/elemental/idl/build
@@ -0,0 +1,13 @@
+#!/bin/sh
+# Re-builds all the generated code in ../java/elemental/ from the scraped IDL files
+# in w3c/. This will blow away all files labeled "generated code".
+ROOT=`dirname $0`
+python \
+  ${ROOT}/css/generate-style.py \
+  ${ROOT}/css/styles.txt \
+  ${ROOT}/templates/java_interface_CSSStyleDeclaration.darttemplate \
+  ${ROOT}/templates/jso_impl_CSSStyleDeclaration.darttemplate
+
+python ${ROOT}/scripts/elemental_fremontcutbuilder.py
+python ${ROOT}/scripts/elementaldomgenerator.py
+cp -R ${ROOT}/generated/src/elemental/* ${ROOT}/../java/elemental/
diff --git a/elemental/idl/css/CSSPropertyNames.in b/elemental/idl/css/CSSPropertyNames.in
new file mode 100644
index 0000000..3097b8f
--- /dev/null
+++ b/elemental/idl/css/CSSPropertyNames.in
@@ -0,0 +1,372 @@
+//
+// CSS property names
+//
+// Some properties are used internally, but are not part of CSS. They are used to get
+// HTML4 compatibility in the rendering engine.
+//
+// Microsoft extensions are documented here:
+// http://msdn.microsoft.com/workshop/author/css/reference/attributes.asp
+//
+
+// high-priority property names have to be listed first, to simplify the check
+// for applying them first.
+color
+direction
+display enum none block inline inline-block
+font
+font-family
+font-size dim
+font-style enum normal italic oblique
+font-weight enum normal bold bolder lighter
+font-variant
+text-rendering
+-webkit-font-feature-settings
+-webkit-font-kerning
+-webkit-font-smoothing
+-webkit-font-variant-ligatures
+-webkit-locale
+-webkit-text-orientation
+-webkit-text-size-adjust
+-webkit-writing-mode
+zoom
+
+// line height needs to be right after the above high-priority properties
+line-height
+
+// The remaining properties are listed in alphabetical order
+background
+background-attachment
+background-clip
+background-color
+background-image
+background-origin
+background-position
+background-position-x
+background-position-y
+background-repeat
+background-repeat-x
+background-repeat-y
+background-size
+border
+border-bottom
+border-bottom-color
+border-bottom-left-radius
+border-bottom-right-radius
+border-bottom-style
+border-bottom-width
+border-collapse
+border-color
+border-image
+border-image-outset
+border-image-repeat
+border-image-slice
+border-image-source
+border-image-width
+border-left
+border-left-color
+border-left-style
+border-left-width
+border-radius
+border-right
+border-right-color
+border-right-style
+border-right-width
+border-spacing
+border-style enum none hidden dotted dashed solid
+border-top
+border-top-color
+border-top-left-radius
+border-top-right-radius
+border-top-style
+border-top-width
+border-width dim
+bottom dim
+box-shadow
+box-sizing
+// -webkit-box-sizing worked in Safari 4 and earlier.
+caption-side
+clear
+clip
+content
+counter-increment
+counter-reset
+cursor enum default auto crosshair pointer move e-resize ne-resize nw-resize n-resize se-resize sw-resize s-resize w-resize text wait help col-resize row-resize
+empty-cells
+float
+font-stretch
+height dim
+image-rendering
+left dim
+letter-spacing
+list-style
+list-style-type enum none disc circle square decimal lower-alpha upper-alpha lower-roman upper-roman
+list-style-image
+list-style-position
+margin dim
+margin-bottom dim
+margin-left dim
+margin-right dim 
+margin-top dim
+max-height
+max-width
+min-height
+min-width
+opacity double
+// Honor -webkit-opacity as a synonym for opacity. This was the only syntax that worked in Safari 1.1,
+// and may be in use on some websites and widgets.
+orphans
+outline
+outline-color
+outline-offset
+outline-style
+outline-width
+overflow enum visible hidden scroll auto
+overflow-x enum visible hidden scroll auto
+overflow-y enum visible hidden scroll auto
+padding dim
+padding-bottom dim
+padding-left dim
+padding-right dim
+padding-top dim
+page
+page-break-after
+page-break-before
+page-break-inside
+pointer-events
+position enum static relative absolute fixed
+quotes
+resize
+right dim
+size
+src
+speak
+table-layout
+tab-size
+text-align
+text-decoration enum none underline overline line-through
+text-indent
+text-line-through
+text-line-through-color
+text-line-through-mode
+text-line-through-style
+text-line-through-width
+text-overflow
+text-overline
+text-overline-color
+text-overline-mode
+text-overline-style
+text-overline-width
+text-shadow
+text-transform
+text-underline
+text-underline-color
+text-underline-mode
+text-underline-style
+text-underline-width
+top dim
+unicode-bidi
+unicode-range
+vertical-align
+visibility enum visible hidden
+white-space enum pre nowrap pre-wrap pre-line
+widows
+width dim
+word-break
+word-spacing
+word-wrap
+z-index int
+-webkit-animation
+-webkit-animation-delay
+-webkit-animation-direction
+-webkit-animation-duration
+-webkit-animation-fill-mode
+-webkit-animation-iteration-count
+-webkit-animation-name
+-webkit-animation-play-state
+-webkit-animation-timing-function
+-webkit-appearance
+-webkit-aspect-ratio
+-webkit-backface-visibility
+-webkit-background-clip
+-webkit-background-composite
+-webkit-background-origin
+// -webkit-background-size differs from background-size only in the interpretation of
+// a single value: -webkit-background-size: l; is equivalent to background-size: l l;
+// whereas background-size: l; is equivalent to background-size: l auto;
+-webkit-background-size
+-webkit-border-after
+-webkit-border-after-color
+-webkit-border-after-style
+-webkit-border-after-width
+-webkit-border-before
+-webkit-border-before-color
+-webkit-border-before-style
+-webkit-border-before-width
+-webkit-border-end
+-webkit-border-end-color
+-webkit-border-end-style
+-webkit-border-end-width
+-webkit-border-fit
+-webkit-border-horizontal-spacing
+-webkit-border-image
+// -webkit-border-radius differs from border-radius only in the interpretation of
+// a value consisting of two lengths: "-webkit-border-radius: l1 l2;" is equivalent
+// to "border-radius: l1 / l2;"
+-webkit-border-radius
+-webkit-border-start
+-webkit-border-start-color
+-webkit-border-start-style
+-webkit-border-start-width
+-webkit-border-vertical-spacing
+-webkit-box-align
+-webkit-box-direction
+-webkit-box-flex
+-webkit-box-flex-group
+-webkit-box-lines
+-webkit-box-ordinal-group
+-webkit-box-orient
+-webkit-box-pack
+-webkit-box-reflect
+-webkit-box-shadow
+-webkit-color-correction
+-webkit-column-axis
+-webkit-column-break-after
+-webkit-column-break-before
+-webkit-column-break-inside
+-webkit-column-count
+-webkit-column-gap
+-webkit-column-rule
+-webkit-column-rule-color
+-webkit-column-rule-style
+-webkit-column-rule-width
+-webkit-column-span
+-webkit-column-width
+-webkit-columns
+#if defined(ENABLE_CSS_FILTERS) && ENABLE_CSS_FILTERS
+-webkit-filter
+#endif
+-webkit-flex
+-webkit-flex-align
+-webkit-flex-direction
+-webkit-flex-flow
+-webkit-flex-item-align
+-webkit-flex-line-pack
+-webkit-flex-order
+-webkit-flex-pack
+-webkit-flex-wrap
+-webkit-font-size-delta
+-webkit-grid-columns
+-webkit-grid-rows
+-webkit-grid-column
+-webkit-grid-row
+-webkit-highlight
+-webkit-hyphenate-character
+-webkit-hyphenate-limit-after
+-webkit-hyphenate-limit-before
+-webkit-hyphenate-limit-lines
+-webkit-hyphens
+-webkit-line-box-contain
+-webkit-line-align
+-webkit-line-break
+-webkit-line-clamp
+-webkit-line-grid
+-webkit-line-snap
+-webkit-logical-width
+-webkit-logical-height
+-webkit-margin-after-collapse
+-webkit-margin-before-collapse
+-webkit-margin-bottom-collapse
+-webkit-margin-top-collapse
+-webkit-margin-collapse
+-webkit-margin-after
+-webkit-margin-before
+-webkit-margin-end
+-webkit-margin-start
+-webkit-marquee
+-webkit-marquee-direction
+-webkit-marquee-increment
+-webkit-marquee-repetition
+-webkit-marquee-speed
+-webkit-marquee-style
+-webkit-mask
+-webkit-mask-attachment
+-webkit-mask-box-image
+-webkit-mask-box-image-outset
+-webkit-mask-box-image-repeat
+-webkit-mask-box-image-slice
+-webkit-mask-box-image-source
+-webkit-mask-box-image-width
+-webkit-mask-clip
+-webkit-mask-composite
+-webkit-mask-image
+-webkit-mask-origin
+-webkit-mask-position
+-webkit-mask-position-x
+-webkit-mask-position-y
+-webkit-mask-repeat
+-webkit-mask-repeat-x
+-webkit-mask-repeat-y
+-webkit-mask-size
+-webkit-match-nearest-mail-blockquote-color
+-webkit-max-logical-width
+-webkit-max-logical-height
+-webkit-min-logical-width
+-webkit-min-logical-height
+-webkit-nbsp-mode
+-webkit-padding-after
+-webkit-padding-before
+-webkit-padding-end
+-webkit-padding-start
+-webkit-perspective
+-webkit-perspective-origin
+-webkit-perspective-origin-x
+-webkit-perspective-origin-y
+-webkit-print-color-adjust
+-webkit-rtl-ordering
+-webkit-text-combine
+-webkit-text-decorations-in-effect
+-webkit-text-emphasis
+-webkit-text-emphasis-color
+-webkit-text-emphasis-position
+-webkit-text-emphasis-style
+-webkit-text-fill-color
+-webkit-text-security
+-webkit-text-stroke
+-webkit-text-stroke-color
+-webkit-text-stroke-width
+-webkit-transform
+-webkit-transform-origin
+-webkit-transform-origin-x
+-webkit-transform-origin-y
+-webkit-transform-origin-z
+-webkit-transform-style
+-webkit-transition
+-webkit-transition-delay
+-webkit-transition-duration
+-webkit-transition-property
+-webkit-transition-timing-function
+-webkit-user-drag
+-webkit-user-modify
+-webkit-user-select
+-webkit-flow-into
+-webkit-flow-from
+-webkit-region-overflow
+-webkit-shape-inside
+-webkit-shape-outside
+-webkit-wrap-margin
+-webkit-wrap-padding
+-webkit-region-break-after
+-webkit-region-break-before
+-webkit-region-break-inside
+-webkit-wrap-flow
+-webkit-wrap-through
+-webkit-wrap
+#if defined(ENABLE_TOUCH_EVENTS) && ENABLE_TOUCH_EVENTS
+-webkit-tap-highlight-color
+#endif
+#if defined(ENABLE_DASHBOARD_SUPPORT) && ENABLE_DASHBOARD_SUPPORT
+-webkit-dashboard-region
+#endif
+#if defined(ENABLE_OVERFLOW_SCROLLING)
+-webkit-overflow-scrolling
+#endif
diff --git a/elemental/idl/css/generate-style.py b/elemental/idl/css/generate-style.py
new file mode 100755
index 0000000..3478d27
--- /dev/null
+++ b/elemental/idl/css/generate-style.py
@@ -0,0 +1,174 @@
+#!/usr/bin/python2.4
+#
+# Copyright 2008 Google Inc. All Rights Reserved.
+
+"""Generates StyleBase.java based on list of styles in styles.txt.
+
+Usage: $0
+(No args, just run it, with styles.txt in the same directory as the script)
+"""
+
+__author__ = 'danilatos@google.com (Daniel Danilatos)'
+
+import os
+import re
+import string
+import sys
+
+CONST_PREFIX = '  public static final String '
+
+def main(argv):
+  if len(argv) != 4:
+    print 'Usage: input_file interface.java.snippet implementation.java.snippet'
+    sys.exit(-1)
+  input_file = argv[1]
+  output_intf = argv[2]
+  output_impl = argv[3]
+
+  output_intf_stream = open(output_intf, 'w')
+  output_impl_stream = open(output_impl, 'w')
+  input_stream = open(input_file, 'r')
+  GenerateStyleBase(input_stream, output_intf_stream, output_impl_stream)
+
+
+def GenerateStyleBase(input_stream, output_intf_stream, output_impl_stream):
+  """Generate the StyleBase.java file.
+
+  Args:
+    input_stream: A stream containing the configuration input (usually
+        styles.txt)
+    output_stream: A stream to write the output to
+  """
+
+  wintf = output_intf_stream.write
+  wimpl = output_impl_stream.write
+
+  # Write the generic setProperty() that's not in the IDL :-/
+  # Write Unit interface into the interface snippet
+  wintf("""
+package $PACKAGE;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * $CLASS_JAVADOC
+  */
+public interface $ID$EXTENDS {
+$!MEMBERS
+""")
+
+  wimpl("""package $PACKAGE;
+$IMPORTS
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class $ID$EXTENDS $IMPLEMENTS {
+  protected $ID() {}
+$!MEMBERS
+""")
+
+  wintf('public interface Unit {\n')
+  wintf('  public static final String PX = "px";\n')
+  wintf('  public static final String PCT = "%";\n')
+  wintf('  public static final String EM = "em";\n')
+  wintf('  public static final String EX = "ex";\n')
+  wintf('  public static final String PT = "pt";\n')
+  wintf('  public static final String PC = "pc";\n')
+  wintf('  public static final String IN = "in";\n')
+  wintf('  public static final String CM = "cm";\n')
+  wintf('  public static final String MM = "mm";\n')
+  wintf('}\n\n')
+
+
+  for line in input_stream:
+    line = re.sub('#.*$', '', line).strip()
+    if not line or line.startswith("//"): continue
+
+    # prop is the css property name
+    # value_type is the actual high-level type of the property
+    # output_mode is whether it is just a simple constant, or a dimension type,
+    #   or an enum, etc.
+    # params are additional line parameters, currently used for enum values
+    (prop, output_mode, value_type, params) = ParseLine(line)
+
+    method_suffix = PropToCapsCase(prop)
+    js_prop = method_suffix[0].lower() + method_suffix[1:]  # Camel case
+    if js_prop == 'float':
+      js_prop = "this['float']"
+    else:
+      js_prop = "this." + js_prop
+
+    if output_mode == 'enum':
+      wintf('\npublic interface %s {\n' % method_suffix)
+      for p in params:
+        wintf(CONST_PREFIX + PropToConstant(p) + ' = "' + p + '";\n')
+      wintf('}\n\n')
+
+    # getter
+    wintf('%s get%s();\n' % (value_type, method_suffix))
+    wimpl('public final native %s get%s() /*-{ return %s; }-*/;\n' % (value_type, method_suffix, js_prop))
+
+    # setter(s) & clearer(s)
+    wintf('void set%s(%s value);\n' % (method_suffix, value_type))
+    wintf('void clear%s();\n' % method_suffix)
+    wimpl('public final native void set%s(%s value) /*-{ %s = value; }-*/;\n' % (method_suffix, value_type, js_prop))
+    wimpl('public final native void clear%s() /*-{ %s = ""; }-*/;\n' % (method_suffix, js_prop))
+    if output_mode == 'dim':
+      wintf('void set%s(double value, String unit);\n' % (method_suffix))
+      wimpl('public final native void set%s(double value, String unit) /*-{ %s = value + unit; }-*/;\n' % (method_suffix, js_prop))
+ 
+  wintf('}')
+  wimpl('}')
+  output_intf_stream.close()
+  output_impl_stream.close()
+
+
+def ParseLine(line):
+  """Parses a line of the input file into useful parameters."""
+  bits = re.compile(r'\s+').split(line)
+  if len(bits) == 1:
+    output_mode = 'simple'
+    value_type = 'String'
+  elif bits[1] == 'enum':
+    output_mode = 'enum'
+    value_type = 'String' # PropToCapsCase(bits[0])
+  elif bits[1] == 'dim':
+    output_mode = 'dim'
+    value_type = 'String' # None  # lots of different types for dim properties
+  else:
+    output_mode = 'simple'
+    value_type = bits[1]
+
+  css_prop_name = bits[0]
+  additional_params = bits[2:]
+
+  return (css_prop_name, output_mode, value_type, additional_params)
+
+
+def PropToCapsCase(css_prop):
+  """Converts abc-def to AbcDef."""
+  return re.sub(' ', '', string.capwords(re.sub('-', ' ', css_prop)))
+
+
+def PropToConstant(css_prop):
+  """Converts abc-def to ABC_DEF."""
+  return css_prop.upper().replace('-', '_')
+
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/elemental/idl/css/styles.txt b/elemental/idl/css/styles.txt
new file mode 100644
index 0000000..0358bc5
--- /dev/null
+++ b/elemental/idl/css/styles.txt
@@ -0,0 +1,45 @@
+# List of css properties
+# If you add the word 'dim' on the end, then that means it's a dimension property
+# and will get px, em, ex, etc accessors
+# If you add the word 'int' on the end, then that means it has integral type
+# Add the word 'enum' followed by a list of values to generate an enum
+# as an inner class
+
+background-color
+background-image
+border-color
+border-style enum none hidden dotted dashed solid
+border-width dim
+bottom dim
+color
+cursor enum default auto crosshair pointer move e-resize ne-resize nw-resize n-resize se-resize sw-resize s-resize w-resize text wait help col-resize row-resize
+display enum none block inline inline-block
+font-size dim
+font-style enum normal italic oblique
+font-weight enum normal bold bolder lighter
+height dim
+left dim
+list-style-type enum none disc circle square decimal lower-alpha upper-alpha lower-roman upper-roman
+margin dim
+margin-bottom dim
+margin-left dim
+margin-right dim
+margin-top dim
+opacity double
+overflow enum visible hidden scroll auto
+overflow-x enum visible hidden scroll auto
+overflow-y enum visible hidden scroll auto
+padding dim
+padding-bottom dim
+padding-left dim
+padding-right dim
+padding-top dim
+position enum static relative absolute fixed
+right dim
+text-decoration enum none underline overline line-through
+top dim
+visibility enum visible hidden
+white-space enum pre nowrap pre-wrap pre-line
+width dim
+z-index int
+
diff --git a/elemental/idl/dart/dart.idl b/elemental/idl/dart/dart.idl
new file mode 100644
index 0000000..73f2390
--- /dev/null
+++ b/elemental/idl/dart/dart.idl
@@ -0,0 +1,247 @@
+
+// This file introduces / supplements and forces Dart declarations.
+
+module default {
+  FileList implements sequence<File>;
+  HTMLCollection implements sequence<Node>;
+  MediaList implements sequence<DOMString>;
+  NamedNodeMap implements sequence<Node>;
+  NodeList implements sequence<Node>;
+  StyleSheetList implements sequence<StyleSheet>;
+  TouchList implements sequence<Touch>;
+
+  Float32Array implements sequence<double>;
+  Float64Array implements sequence<double>;
+  Int8Array implements sequence<int>;
+  Int16Array implements sequence<int>;
+  Int32Array implements sequence<int>;
+  Uint8Array implements sequence<int>;
+  // Ugliness ahead: we cannot analyse inheritance right now when deducing if
+  // given interface is a typed array (database is not accessible), so I have
+  // to duplicate both sequence<int> and ArrayBufferView to make our heuristics
+  // work.
+  // FIXME: thread datatbase to all the clients that need it and probably
+  // move the method itself to database.
+  Uint8ClampedArray implements sequence<int>;
+  Uint8ClampedArray implements ArrayBufferView;
+  Uint16Array implements sequence<int>;
+  Uint32Array implements sequence<int>;
+
+  // Is List<int> because inherits from Uint8Array:
+  // Uint8ClampedArray implements sequence<int>;
+}
+
+module core {
+  [Supplemental]
+  interface Document {
+    [Suppressed] DOMObject getCSSCanvasContext(in DOMString contextId, in DOMString name, in long width, in long height);
+    CanvasRenderingContext getCSSCanvasContext(in DOMString contextId, in DOMString name, in long width, in long height);
+  };
+
+  DOMStringList implements sequence<DOMString>;
+};
+
+module dom {
+  // Force NodeSelector. WebKit defines these operations directly.
+  interface NodeSelector {
+    Element   querySelector(in DOMString selectors);
+    NodeList  querySelectorAll(in DOMString selectors);
+  };
+  Document implements NodeSelector;
+  DocumentFragment implements NodeSelector;
+  Element implements NodeSelector;
+
+  // Force ElementTraversal. WebKit defines these directly.
+  interface ElementTraversal {
+    getter attribute unsigned long childElementCount;
+    getter attribute Element firstElementChild;
+    getter attribute Element lastElementChild;
+    getter attribute Element nextElementSibling;
+    getter attribute Element previousElementSibling;
+  };
+  Element implements ElementTraversal;
+
+  [Callback]
+  interface TimeoutHandler {
+    void handleEvent();
+  };
+};
+
+module html {
+  [Supplemental]
+  interface Console {
+    [Suppressed] void debug();
+    [CallWith=ScriptArguments|CallStack] void debug(DOMObject arg);
+    [Suppressed] void error();
+    [CallWith=ScriptArguments|CallStack] void error(DOMObject arg);
+    [Suppressed] void info();
+    [CallWith=ScriptArguments|CallStack] void info(DOMObject arg);
+    [Suppressed] void log();
+    [CallWith=ScriptArguments|CallStack] void log(DOMObject arg);
+    [Suppressed] void warn();
+    [CallWith=ScriptArguments|CallStack] void warn(DOMObject arg);
+    [Suppressed] void trace();
+    [CallWith=ScriptArguments|CallStack] void trace(DOMObject arg);
+    [Suppressed] void assert(in boolean condition);
+    [CallWith=ScriptArguments|CallStack] void assertCondition(boolean condition, DOMObject arg);
+    [Suppressed] void timeEnd(in DOMString title);
+    [CallWith=ScriptArguments|CallStack] void timeEnd(DOMString title, DOMObject arg);
+    [Suppressed] void timeStamp();
+    [CallWith=ScriptArguments|CallStack] void timeStamp(DOMObject arg);
+    [Suppressed] void group();
+    [CallWith=ScriptArguments|CallStack] void group(DOMObject arg);
+    [Suppressed] void groupCollapsed();
+    [CallWith=ScriptArguments|CallStack] void groupCollapsed(DOMObject arg);
+  };
+
+  [Supplemental]
+  interface HTMLOptionsCollection {
+    [Suppressed] void add(in optional HTMLOptionElement element, in optional long before);
+  };
+
+  [Supplemental]
+  interface ImageData {
+    readonly attribute Uint8ClampedArray data;
+  };
+
+  [Supplemental]
+  interface WebGLContextEvent {
+    [Suppressed] void initEvent(in optional DOMString eventTypeArg,
+                                in optional boolean canBubbleArg,
+                                in optional boolean cancelableArg,
+                                in optional DOMString statusMessageArg);
+  };
+};
+
+module html {
+  [Supplemental]
+  interface WebGLRenderingContext {
+
+    //void         compressedTexImage2D(in unsigned long target, in long level, in unsigned long internalformat, in unsigned long width, in unsigned long height, in long border, in unsigned long imageSize, const void* data);
+    //void         compressedTexSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset, in unsigned long width, in unsigned long height, in unsigned long format, in unsigned long imageSize, const void* data);
+
+    any getBufferParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getBufferParameter();
+
+    any getFramebufferAttachmentParameter(in unsigned long target, in unsigned long attachment, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getFramebufferAttachmentParameter();
+
+    any getParameter(in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getParameter();
+
+    any getProgramParameter(in WebGLProgram program, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getProgramParameter();
+
+    any getRenderbufferParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getRenderbufferParameter();
+
+    any getShaderParameter(in WebGLShader shader, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getShaderParameter() raises(DOMException);
+
+    // TBD
+    // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+
+    DOMString[] getSupportedExtensions();
+    [Suppressed, StrictTypeChecking, Custom] void getSupportedExtensions();
+
+    any getTexParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getTexParameter();
+
+    any getUniform(in WebGLProgram program, in WebGLUniformLocation location) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getUniform();
+
+    any getVertexAttrib(in unsigned long index, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getVertexAttrib();
+  };
+}
+
+
+
+module canvas {
+  // TODO(dstockwell): Define these manually.
+  [Supplemental]
+  interface Float32Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Float64Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Int16Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Int32Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Int8Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Uint16Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Uint32Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Uint8Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+
+  [Supplemental]
+  interface Uint8ClampedArray {
+    // Avoid 'overriding static member BYTES_PER_ELEMENT'.
+    [Suppressed] const long BYTES_PER_ELEMENT = 1;
+
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+};
+
+module storage {
+  // TODO(vsm): Define new names for these (see b/4436830).
+  [Supplemental]
+  interface IDBCursor {
+    [DartName=continueFunction] void continue(in optional IDBKey key);
+  };
+  [Supplemental]
+  interface IDBIndex {
+    [DartName=getObject] IDBRequest get(in IDBKey key);
+  };
+  [Supplemental]
+  interface IDBObjectStore {
+    [DartName=getObject] IDBRequest get(in IDBKey key);
+    [DartName=getObject] IDBRequest get(in IDBKeyRange key);
+    [Suppressed] IDBRequest openCursor() raises (IDBDatabaseException);
+  };
+
+  interface EntrySync {
+    // Native implementation is declared to return EntrySync.
+    [Suppressed] DirectoryEntrySync getParent();
+    EntrySync getParent();
+  };
+};
+
+module html {
+  [Supplemental, Callback] // Add missing Callback attribute.
+  interface VoidCallback {
+  };
+};
+
+module svg {
+    interface SVGNumber {
+      [StrictTypeChecking, Custom] attribute double value;
+    };
+}
diff --git a/elemental/idl/docs/README b/elemental/idl/docs/README
new file mode 100644
index 0000000..0471d05
--- /dev/null
+++ b/elemental/idl/docs/README
@@ -0,0 +1 @@
+W3C documentation from MDN taken from the Dart project's MDN scraper.
diff --git a/elemental/idl/docs/database.json b/elemental/idl/docs/database.json
new file mode 100644
index 0000000..5875194
--- /dev/null
+++ b/elemental/idl/docs/database.json
@@ -0,0 +1 @@
+{"ErrorCallback":{"title":"JS_ReportErrorNumber","members":[],"srcUrl":"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_ReportErrorNumber","skipped":true,"cause":"Suspect title"},"SVGAnimatedLength":{"title":"SVGAnimatedLength","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedLength</code> interface is used for attributes of basic type <a title=\"https://developer.mozilla.org/en/SVG/Content_type#Length\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Content_type#Length\">&lt;length&gt;</a> which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/SVGAnimatedLength"},"HTMLScriptElement":{"title":"script","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.0 (1.7 or earlier)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>async</code> attribute</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>3.6 (1.9.2)\n</td> <td>10</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>defer</code> attribute</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>3.5 (1.9.1)\n</td> <td>4</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>async</code> attribute</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>defer</code> attribute</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>","examples":["&lt;!-- HTML4 and (x)HTML --&gt;\n&lt;script type=\"text/javascript\" src=\"javascript.js\"&gt;\n\n&lt;!-- HTML5 --&gt;\n&lt;script src=\"javascript.js\"&gt;&lt;/script&gt;"],"srcUrl":"https://developer.mozilla.org/En/HTML/Element/Script","summary":"<p>The <code>script</code> element is used to embed or reference an executable script within an <abbr>HTML</abbr> or <abbr>XHTML</abbr> document.</p>\n<p>Scripts without <code>async</code> or <code>defer</code> attributes are fetched and executed immediately, before the browser continues to parse the page.</p>","members":[{"obsolete":false,"url":"","name":"language","help":"Like the <code>type</code> attribute, this attribute identifies the scripting language in use. Unlike the <code>type</code> attribute, however, this attribute’s possible values were never standardized. The <code>type</code> attribute should be used instead."},{"obsolete":false,"url":"","name":"defer","help":"This Boolean attribute is set to indicate to a browser that the script is meant to be executed after the document has been parsed. Since this feature hasn't yet been implemented by all other major browsers, authors should not assume that the script’s execution will actually be deferred. Never call <code>document.write()</code> from a <code>defer</code> script (since Gecko 1.9.2, this will blow away the document). The <code>defer</code> attribute shouldn't be used on scripts that don't have the <code>src</code> attribute. Since Gecko 1.9.2, the <code>defer</code> attribute is ignored on scripts that don't have the <code>src</code> attribute. However, in Gecko 1.9.1 even inline scripts are deferred if the <code>defer</code> attribute is set."},{"obsolete":false,"url":"","name":"src","help":"This attribute specifies the <abbr>URI</abbr> of an external script; this can be used as an alternative to embedding a script directly within a document. <code>script</code> elements with an <code>src</code> attribute specified should not have a script embedded within its tags."},{"obsolete":false,"url":"","name":"async","help":"Set this Boolean attribute to indicate that the browser should, if possible, execute the script asynchronously. It has no effect on inline scripts (i.e., scripts that don't have the <strong>src</strong> attribute). In older browsers that don't support the <strong>async</strong> attribute, parser-inserted scripts block the parser; script-inserted scripts execute asynchronously in IE and WebKit, but synchronously in Opera and pre-4.0 Firefox. In Firefox 4.0, the <code>async</code> DOM&nbsp;property defaults to <code>true</code> for script-created scripts, so the default behavior matches the behavior of IE&nbsp;and WebKit. To request script-inserted external scripts be executed in the insertion order in browsers where the <code>document.createElement(\"script\").async</code> evaluates to <code>true</code> (such as Firefox 4.0), set <code>.async=false</code> on the scripts you want to maintain order. Never call <code>document.write()</code> from an <code>async</code> script. In Gecko 1.9.2, calling <code>document.write()</code> has an unpredictable effect. In Gecko 2.0, calling <code>document.write()</code> from an <code>async</code> script has no effect (other than printing a warning to the error console)."},{"obsolete":false,"url":"","name":"type","help":"This attribute identifies the scripting language of code embedded within a <code>script</code> element or referenced via the element’s <code>src</code> attribute. This is specified as a <abbr title=\"Multi-purpose Internet Mail Extensions\">MIME</abbr> type; examples of supported <abbr title=\"Multi-purpose Internet Mail Extensions\">MIME</abbr> types include <code>text/javascript</code>, <code>text/ecmascript</code>, <code>application/javascript</code>, and <code>application/ecmascript</code>. If this attribute is absent, the script is treated as JavaScript."}]},"WebKitTransitionEvent":{"title":"Recent changes from mechaxl","members":[],"srcUrl":"https://developer.mozilla.org/Special:Contributions?target=mechaxl","skipped":true,"cause":"Suspect title"},"Int32Array":{"title":"Int32Array","srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int32Array","seeAlso":"<li><a class=\"link-https\" title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"<p>The <code>Int32Array</code> type represents an array of twos-complement 32-bit signed integers.</p>\n<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>","constructor":"<div class=\"note\"><strong>Note:</strong> In these methods, <code><em>TypedArray</em></code> represents any of the <a title=\"en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses\">typed array object types</a>.</div>\n<table class=\"standard-table\"> <tbody> <tr> <td><code>Int32Array <a title=\"en/JavaScript typed arrays/Int32Array#Int32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int32Array#Int32Array()\">Int32Array</a>(unsigned long length);<br> </code></td> </tr> <tr> <td><code>Int32Array </code><code><a title=\"en/JavaScript typed arrays/Int32Array#Int32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int32Array#Int32Array%28%29\">Int32Array</a></code><code>(<em>TypedArray</em> array);<br> </code></td> </tr> <tr> <td><code>Int32Array </code><code><a title=\"en/JavaScript typed arrays/Int32Array#Int32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int32Array#Int32Array%28%29\">Int32Array</a></code><code>(sequence&lt;type&gt; array);<br> </code></td> </tr> <tr> <td><code>Int32Array </code><code><a title=\"en/JavaScript typed arrays/Int32Array#Int32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int32Array#Int32Array%28%29\">Int32Array</a></code><code>(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length);<br> </code></td> </tr> </tbody>\n</table><p>Returns a new <code>Int32Array</code> object.</p>\n<pre>Int32Array Int32Array(\n&nbsp; unsigned long length\n);\n\nInt32Array Int32Array(\n&nbsp; <em>TypedArray</em> array\n);\n\nInt32Array Int32Array(\n&nbsp; sequence&lt;type&gt; array\n);\n\nInt32Array Int32Array(\n&nbsp; ArrayBuffer buffer,\n&nbsp; optional unsigned long byteOffset,\n&nbsp; optional unsigned long length\n);\n</pre>\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>length</code></dt> <dd>The number of elements in the byte array. If unspecified, length of the array view will match the buffer's length.</dd> <dt><code>array</code></dt> <dd>An object of any of the typed array types (such as <code>Int16Array</code>), or a sequence of objects of a particular type, to copy into a new <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>. Each value in the source array is converted to a 32-bit signed integer before being copied into the new array.</dd> <dt><code>buffer</code></dt> <dd>An existing <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> to use as the storage for the new <code>Int32Array</code> object.</dd> <dt><code>byteOffset<br> </code></dt> <dd>The offset, in bytes, to the first byte in the specified buffer for the new view to reference. If not specified, the <code>Int32Array</code>'s view of the buffer will start with the first byte.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>Int32Array</code> object representing the specified data buffer.</p>\n</div>","members":[{"name":"subarray","help":"<p>Returns a new <code>Int32Array</code> view on the <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> store for this <code>Int32Array</code> object.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Int32Array</code> object.</dd> <dt><code>end</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The offset to one past the last element in the array to be referenced by the new <code>Int32Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Notes_2\"></span><h6 class=\"editable\">Notes</h6>\n<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>\n<div class=\"note\"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>\n</div>","idl":"<pre>Int32Array subarray(\n&nbsp; long begin,\n&nbsp; optional long end\n);\n</pre>","obsolete":false},{"name":"set","help":"<p>Sets multiple values in the typed array, reading input values from a specified array.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>array</code></dt> <dd>An array from which to copy values. All values from the source array are copied into the target array, unless the length of the source array plus the offset exceeds the length of the target array, in which case an exception is thrown. If the source array is a typed array, the two arrays may share the same underlying <code><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>; the browser will intelligently copy the source range of the buffer to the destination range.</dd> <dt>offset \n<span title=\"\">Optional</span>\n</dt> <dd>The offset into the target array at which to begin writing values from the source <code>array</code>. If you omit this value, 0 is assumed (that is, the source <code>array</code> will overwrite values in the target array starting at index 0).</dd>\n</dl>\n</div>","idl":"<pre>void set(\n&nbsp; <em>TypedArray</em> array,\n&nbsp; optional unsigned long offset\n);\n\nvoid set(\n&nbsp; type[] array,\n&nbsp; optional unsigned long offset\n);\n</pre>","obsolete":false},{"name":"BYTES_PER_ELEMENT","help":"The size, in bytes, of each array element.","obsolete":false},{"name":"length","help":"The number of entries in the array. <strong>Read only.</strong>","obsolete":false}]},"MediaQueryList":{"title":"MediaQueryList","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/MediaQueryList","specification":"The CSSOM&nbsp;View Module:&nbsp;The&nbsp;MediaQueryList Interface","seeAlso":"<li><a title=\"En/CSS/Media queries\" rel=\"internal\" href=\"https://developer.mozilla.org/En/CSS/Media_queries\">Media queries</a></li> <li><a title=\"en/CSS/Using media queries from code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/Using_media_queries_from_code\">Using media queries from code</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.matchMedia\">window.matchMedia()</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/MediaQueryListListener\">MediaQueryListListener</a></code>\n</li>","summary":"<div><strong>DRAFT</strong>\n<div>This page is not complete.</div>\n</div>\n\n<p></p>\n<p>A <code>MediaQueryList</code> object maintains a list of <a title=\"En/CSS/Media queries\" rel=\"internal\" href=\"https://developer.mozilla.org/En/CSS/Media_queries\">media queries</a> on a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document\">document</a></code>\n, and handles sending notifications to listeners when the media queries on the document change.</p>\n<p>This makes it possible to observe a document to detect when its media queries change, instead of polling the values periodically, if you need to programmatically detect changes to the values of media queries on a document.</p>","members":[{"name":"addListener","help":"<p>Adds a new listener to the media query list. If the specified listener is already in the list, this method has no effect.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>listener</code></dt> <dd>The <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/MediaQueryListListener\">MediaQueryListListener</a></code>\n to invoke when the media query's evaluated result changes.</dd> <div id=\"section_6\"><span id=\"removeListener()\"></span></div></dl></div>","idl":"<pre>void addListener(\n&nbsp; MediaQueryListListener listener\n); \n</pre>","obsolete":false},{"name":"removeListener","help":"<div id=\"section_5\"><dl><div id=\"section_6\"><p>Removes a listener from the media query list. Does nothing if the specified listener isn't already in the list.</p> \n</div></dl>\n</div><div id=\"section_7\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>listener</code></dt> <dd>The <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/MediaQueryListListener\">MediaQueryListListener</a></code>\n to stop calling on changes to the media query's evaluated result.</dd>\n</dl>\n</div>","idl":"<pre>void removeListener(\n&nbsp; MediaQueryListListener listener\n); \n</pre>","obsolete":false},{"name":"matches","help":"<code>true</code> if the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document\">document</a></code>\n currently matches the media query list; otherwise <code>false</code>. <strong>Read only.</strong>","obsolete":false},{"name":"media","help":"The serialized media query list.","obsolete":false}]},"DOMPlugin":{"title":"Plugin","summary":"The <code>Plugin</code> interface provides information about a browser plugin.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Plugin.item","name":"item","help":"Returns the MIME&nbsp;type of a supported content type, given the index number into a list of supported types."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Plugin.namedItem","name":"namedItem","help":"Returns the MIME&nbsp;type of a supported item."},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Plugin.description","name":"description","help":"A human readable description of the plugin. <strong>Read only.</strong>","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Plugin.filename","name":"filename","help":"The filename of the plugin file. <strong>Read only.</strong>","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Plugin.name","name":"name","help":"The name of the plugin. <strong>Read only.</strong>","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Plugin.version","name":"version","help":"The plugin's version number string. <strong>Read only.</strong>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/Plugin"},"HTMLDListElement":{"title":"HTMLDListElement","summary":"DOM&nbsp;definition list elements expose the <a title=\"http://www.w3.org/TR/html5/grouping-content.html#htmldlistelement\" class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/html5/grouping-content.html#htmldlistelement\" target=\"_blank\">HTMLDListElement</a> (or <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-52368974\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-52368974\" target=\"_blank\"><code>HTMLDListElement</code></a>) interface, which provides special properties (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating definition list elements. In \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>, this interface inherits from HTMLElement, but defines no additional members.","members":[{"name":"compact","help":"Indicates that spacing between list items should be reduced.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLDListElement"},"SVGRect":{"title":"SVGRect","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"<p>The <code>SVGRect</code> represents rectangular geometry. Rectangles are defined as consisting of a (x,y) coordinate pair identifying a minimum X value, a minimum Y value, and a width and height, which are usually constrained to be non-negative.</p>\n<p>An <code>SVGRect</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>","members":[{"name":"width","help":"The <em>width</em> coordinate of the rectangle, in user units.","obsolete":false},{"name":"height","help":"The <em>height</em> coordinate of the rectangle, in user units.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGRect"},"HTMLAppletElement":{"title":"applet","examples":["&lt;applet code=\"game.class\" align=\"left\" archive=\"game.zip\" height=\"250\" width=\"350\"&gt;\n\n&lt;param name=\"difficulty\" value=\"easy\"&gt;\n\n&lt;b&gt;Sorry, you need Java to play this game.&lt;/b&gt;\n\n&lt;/applet&gt;\n"],"summary":"Obsolete","members":[{"obsolete":false,"url":"","name":"datafld","help":"This attribute, supported by Internet Explorer 4 and higher, specifies the column name from the data source object that supplies the bound data. This attribute might be used to specify the various&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/param\">&lt;param&gt;</a></code>\n elements passed to the Java applet."},{"obsolete":false,"url":"","name":"width","help":"This attribute specifies in pixels the width that the applet needs."},{"obsolete":false,"url":"","name":"object","help":"This attribute specifies the URL of a serialized representation of an applet."},{"obsolete":false,"url":"","name":"code","help":"This attribute specifies the URL of the applet's class file to be loaded and executed. Applet filenames are identified by a .class filename extension. The URL specified by code might be relative to the <code>codebase</code> attribute."},{"obsolete":false,"url":"","name":"codebase","help":"This attribute gives the absolute or relative URL of the directory where applets' .class files referenced by the code attribute are stored."},{"obsolete":false,"url":"","name":"vspace","help":"This attribute specifies additional vertical space, in pixels, to be reserved above and below the applet."},{"obsolete":false,"url":"","name":"alt","help":"This attribute causes a descriptive text alternate to be displayed on browsers that do not support Java. Page designers should also remember that content enclosed within the <code>&lt;applet&gt;</code> element may also be rendered as alternative text."},{"obsolete":false,"url":"","name":"name","help":"This attribute assigns a name to the applet so that it can be identified by other resources; particularly scripts."},{"obsolete":false,"url":"","name":"align","help":"This attribute is used to position the applet on the page relative to content that might flow around it. The HTML 4.01 specification defines values of bottom, left, middle, right, and top, whereas Microsoft and Netscape also might support <strong>absbottom</strong>, <strong>absmiddle</strong>, <strong>baseline</strong>, <strong>center</strong>, and <strong>texttop</strong>."},{"obsolete":false,"url":"","name":"archive","help":"This attribute refers to an archived or compressed version of the applet and its associated class files, which might help reduce download time."},{"obsolete":false,"url":"","name":"height","help":"This attribute specifies the height, in pixels, that the applet needs."},{"obsolete":false,"url":"","name":"hspace","help":"This attribute specifies additional horizontal space, in pixels, to be reserved on either side of the applet."},{"obsolete":false,"url":"","name":"src","help":"As defined for Internet Explorer 4 and higher, this attribute specifies a URL for an associated file for the applet. The meaning and use is unclear and not part of the HTML standard."},{"obsolete":false,"url":"","name":"datasrc","help":"Like <code>datafld</code>, this attribute is used for data binding under Internet Explorer 4. It indicates the id of the data source object that supplies the data that is bound to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/param\">&lt;param&gt;</a></code>\n elements associated with the applet."},{"obsolete":false,"url":"","name":"mayscript","help":"In the Netscape implementation, this attribute allows access to an applet by programs in a scripting language embedded in the document."}],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/applet"},"SVGAnimatedPreserveAspectRatio":{"title":"SVGAnimatedPreserveAspectRatio","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGAnimatedPreserveAspectRatio</code> interface is used for attributes of type <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGPreserveAspectRatio\">SVGPreserveAspectRatio</a></code>\n which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"A read only <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGPreserveAspectRatio\">SVGPreserveAspectRatio</a></code>\n representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGPreserveAspectRatio\">SVGPreserveAspectRatio</a></code>\n will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> is always distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedPreserveAspectRatio"},"SVGPatternElement":{"title":"SVGPatternElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGPatternElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/pattern\">&lt;pattern&gt;</a></code>\n element.","members":[{"name":"patternUnits","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/patternUnits\" class=\"new\">patternUnits</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/pattern\">&lt;pattern&gt;</a></code>\n element. Takes one of the constants defined in <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes\" class=\"new\">SVGUnitTypes</a></code>\n.","obsolete":false},{"name":"patternContentUnits","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/patternContentUnits\" class=\"new\">patternContentUnits</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/pattern\">&lt;pattern&gt;</a></code>\n element. Takes one of the constants defined in <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes\" class=\"new\">SVGUnitTypes</a></code>\n.","obsolete":false},{"name":"patternTransform","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/patternTransform\" class=\"new\">patternTransform</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/pattern\">&lt;pattern&gt;</a></code>\n element.","obsolete":false},{"name":"width","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/width\">width</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/pattern\">&lt;pattern&gt;</a></code>\n element.","obsolete":false},{"name":"height","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/height\">height</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/pattern\">&lt;pattern&gt;</a></code>\n element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPatternElement"},"SVGPathSegCurvetoCubicSmoothAbs":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"HTMLMenuElement":{"title":"menu","examples":["&lt;menu type=\"toolbar\"&gt;\n  &lt;li&gt;\n    &lt;menu label=\"File\"&gt;\n      &lt;button type=\"button\" onclick=\"new()\"&gt;New...&lt;/button&gt;\n      &lt;button type=\"button\" onclick=\"save()\"&gt;Save...&lt;/button&gt;\n    &lt;/menu&gt;\n  &lt;/li&gt;\n  &lt;li&gt;\n    &lt;menu label=\"Edit\"&gt;\n      &lt;button type=\"button\" onclick=\"cut()\"&gt;Cut...&lt;/button&gt;\n      &lt;button type=\"button\" onclick=\"copy()\"&gt;Copy...&lt;/button&gt;\n      &lt;button type=\"button\" onclick=\"paste()\"&gt;Paste...&lt;/button&gt;\n    &lt;/menu&gt;\n  &lt;/li&gt;\n&lt;/menu&gt;"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/menu","seeAlso":"<li>Other list-related HTML&nbsp;Elements: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/li\">&lt;li&gt;</a></code>\n and the obsolete <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/dir\">&lt;dir&gt;</a></code>\n.</li> <li>The <code><a title=\"en/HTML/Global attributes#attr-contextmenu\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Global_attributes#attr-contextmenu\">contextmenu</a></code> <a title=\"en/HTML/Global attributes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Global_attributes\">global attribute</a> can be used on an element to refer to the <code>id</code> of a <code>menu</code> with the <code>context</code> \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu#attr-type\">type</a></code>\n</li>","summary":"<p>The HTML <em>menu</em> element (<code>&lt;menu&gt;</code>) represents an unordered list of menu choices, or commands.</p>\n<p>There is no limitation to the depth and nesting of lists defined with the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu\">&lt;menu&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n elements.</p>\n<div class=\"note\"><strong>Usage note: </strong> The <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu\">&lt;menu&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n both represent an unordered list of items. They differ in the way that the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n element only contains items to display while the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu\">&lt;menu&gt;</a></code>\n element contains interactive items, to act on.</div>\n<div class=\"note\"><strong>Note</strong>: This element was deprecated in HTML4, but reintroduced in HTML5.</div>","members":[]},"MessageEvent":{"title":"MessageEvent","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/WebSockets/WebSockets_reference/MessageEvent","seeAlso":"WebSocket","summary":"<div><strong>DRAFT</strong>\n<div>This page is not complete.</div>\n</div>\n\n<p></p>\n<p>A <code>MessageEvent</code> is sent to clients using WebSockets when data is received from the server. This is delivered to the listener indicated by the <code>WebSocket</code> object's <code>onmessage</code> attribute.</p>","members":[{"name":"data","help":"The data from the server.","obsolete":false}]},"SVGFEDiffuseLightingElement":{"title":"feDiffuseLighting","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDistantLight\">&lt;feDistantLight&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/fePointLight\">&lt;fePointLight&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpotLight\">&lt;feSpotLight&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"This filter takes in a light source and applies it to an image, using the alpha channel as a bump map.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/kernelUnitLength","name":"kernelUnitLength","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/surfaceScale","name":"surfaceScale","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/diffuseConstant","name":"diffuseConstant","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in","name":"in","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting"},"WebGLBuffer":{"title":"Using shaders to apply color in WebGL","members":[],"srcUrl":"https://developer.mozilla.org/en/WebGL/Using_shaders_to_apply_color_in_WebGL","skipped":true,"cause":"Suspect title"},"StorageEvent":{"title":"StorageEvent","seeAlso":"Specification","summary":"<div><div>\n\n<a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/storage/nsIDOMStorageEvent.idl\"><code>dom/interfaces/storage/nsIDOMStorageEvent.idl</code></a><span><a rel=\"internal\" href=\"https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces\" title=\"en/Interfaces/About_Scriptable_Interfaces\">Scriptable</a></span></div><span>Describes an event occurring on HTML5 client-side storage data.</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 2.0</div><div title=\"Introduced in Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\"></div><div title=\"Last changed in Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\"></div></div>\n<div>Inherits from: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMEvent\">nsIDOMEvent</a></code>\n<span>Last changed in Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n</span></div></div>\n<p></p>\n<p>A <code>StorageEvent</code> is sent to a window when a storage area changes.</p>\n<div class=\"geckoVersionNote\">\n<p>\n</p><div class=\"geckoVersionHeading\">Gecko 2.0 note<div>(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n</div></div>\n<p></p>\n<p>Although this event existed prior to Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n, it did not match the specification. The old event format is now represented by the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMStorageEventObsolete\">nsIDOMStorageEventObsolete</a></code>\n interface.</p>\n</div>","members":[{"name":"initStorageEvent","help":"<p>Initializes the event in a manner analogous to the similarly-named method in the DOM Events interfaces.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>typeArg</code></dt> <dd>The name of the event.</dd> <dt><code>canBubbleArg</code></dt> <dd>A boolean indicating whether the event bubbles up through the DOM or not.</dd> <dt><code>cancelableArg</code></dt> <dd>A boolean indicating whether the event is cancelable.</dd> <dt><code>keyArg</code></dt> <dd>The key whose value is changing as a result of this event.</dd> <dt><code>oldValueArg</code></dt> <dd>The key's old value.</dd> <dt><code>newValueArg</code></dt> <dd>The key's new value.</dd> <dt><code>urlArg</code></dt> <dd>Missing Description</dd> <dt><code>storageAreaArg</code></dt> <dd>The DOM&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Storage\">Storage</a></code>\n object representing the storage area on which this event occurred.</dd>\n</dl></div>","idl":"<pre class=\"eval\">void initStorageEvent(\n  in DOMString typeArg,\n  in boolean canBubbleArg,\n  in boolean cancelableArg,\n  in DOMString keyArg,\n  in DOMString oldValueArg,\n  in DOMString newValueArg,\n  in DOMString urlArg,\n  in nsIDOMStorage storageAreaArg\n);\n</pre>","obsolete":false},{"name":"key","help":"Represents the key changed. The <code>key</code> attribute is <code>null</code> when the change is caused by the storage <code>clear()</code> method. <strong>Read only.</strong>","obsolete":false},{"name":"newValue","help":"The new value of the <code>key</code>. The <code>newValue</code> is <code>null</code> when the change has been invoked by storage <code>clear()</code> method or the <code>key</code> has been removed from the storage. <strong>Read only.</strong>","obsolete":false},{"name":"oldValue","help":"The original value of the <code>key</code>. The <code>oldValue</code> is <code>null</code> when the change has been invoked by storage <code>clear()</code> method or the <code>key</code> has been newly added and therefor doesn't have any previous value. <strong>Read only.</strong>","obsolete":false},{"name":"storageArea","help":"Represents the Storage object that was affected. <strong>Read only.</strong>","obsolete":false},{"name":"url","help":"The URL of the document whose <code>key</code> changed. <strong>Read only.</strong>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/event/StorageEvent"},"SVGFEFloodElement":{"title":"feFlood","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animateColor\">&lt;animateColor&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The filter fills the filter subregion with the color and opacity defined by \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/flood-color\">flood-color</a></code> and \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/flood-opacity\">flood-opacity</a></code>.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feFlood"},"DirectoryReaderSync":{"title":"DirectoryReaderSync","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>13\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<div><strong>`DRAFT</strong> <div>This page is not complete.</div>\n</div>\n<p>The <code>DirectoryReaderSync</code> interface of the <a title=\"en/DOM/File_API/File_System_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File_API/File_System_API\">FileSystem API</a> lets a user list files and directories in a directory.</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/DirectoryReaderSync"},"NotificationCenter":{"title":"Search Results | Mozilla Developer Network","members":[],"srcUrl":"https://developer.mozilla.org/en-US/search?q=NotificationCenter","skipped":true,"cause":"Suspect title"},"HTMLAllCollection":{"title":"Gecko DOM Referenz","members":[],"srcUrl":"https://developer.mozilla.org/de/Gecko-DOM-Referenz","skipped":true,"cause":"Suspect title"},"SVGAnimatedNumber":{"title":"SVGAnimatedNumber","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedNumber</code> interface is used for attributes of basic type <a title=\"https://developer.mozilla.org/en/SVG/Content_type#Number\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Content_type#Number\">&lt;Number&gt;</a> which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedNumber"},"WorkerContext":{"title":"Using web workers","members":[],"srcUrl":"https://developer.mozilla.org/En/Using_web_workers","skipped":true,"cause":"Suspect title"},"SVGPathSegLinetoVerticalRel":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"EntityReference":{"title":"EntityReference","summary":"<p><span>NOTE:&nbsp;This is not implemented in Mozilla</span></p>\n<p>Read-only reference to an entity reference in the DOM tree. Has no properties or methods of its own but inherits from <a class=\"internal\" title=\"En/DOM/Node\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Node\"><code>Node</code></a>.</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/EntityReference","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...ml#ID-11C98490"},"FileCallback":{"title":"FileEntrySync","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/FileEntrySync","skipped":true,"cause":"Suspect title"},"SVGTests":{"title":"SVGTests","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>12.0 (12)\n</td> <td>9.0</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>12.0 (12)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"Interface <code>SVGTests</code> defines an interface which applies to all elements which have attributes \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/requiredFeatures\">requiredFeatures</a></code>, \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/requiredExtensions\" class=\"new\">requiredExtensions</a></code> and \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/systemLanguage\" class=\"new\">systemLanguage</a></code>.","members":[{"name":"hasExtension","help":"Returns true if the browser supports the given extension, specified by a URI.","obsolete":false},{"name":"requiredFeatures","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/requiredFeatures\">requiredFeatures</a></code> on the given element.","obsolete":false},{"name":"requiredExtensions","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/requiredExtensions\" class=\"new\">requiredExtensions</a></code> on the given element.","obsolete":false},{"name":"systemLanguage","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/systemLanguage\" class=\"new\">systemLanguage</a></code> on the given element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGTests"},"WorkerLocation":{"title":"Using web workers","members":[],"srcUrl":"https://developer.mozilla.org/En/Using_web_workers","skipped":true,"cause":"Suspect title"},"HTMLSelectElement":{"title":"HTMLSelectElement","examples":["<h5 class=\"editable\">Examples</h5>\n<div id=\"section_8\"><span id=\"Creating_Elements_from_Scratch\"></span><h6 class=\"editable\">Creating Elements from Scratch</h6>\n\n          <pre name=\"code\" class=\"js\">var sel = document.createElement(\"select\");\nvar opt1 = document.createElement(\"option\");\nvar opt2 = document.createElement(\"option\");\n\nopt1.value = \"1\";\nopt1.text = \"Option: Value 1\";\n\nopt2.value = \"2\";\nopt2.text = \"Option: Value 2\";\n\nsel.add(opt1, null);\nsel.add(opt2, null);\n\n/*\n  Produces the following, conceptually:\n\n  &lt;select&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n  &lt;/select&gt;\n*/</pre>\n        \n<p>From \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> and <span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Gecko&nbsp;7.0</span> the before parameter is optional. So the following is accepted.</p>\n<pre class=\"deki-transform\">...\nsel.add(opt1);\nsel.add(opt2);\n...\n</pre>\n</div><div id=\"section_9\"><span id=\"Append_to_an_Existing_Collection\"></span><h6 class=\"editable\">Append to an Existing Collection</h6>\n\n          <pre name=\"code\" class=\"js\">var sel = document.getElementById(\"existingList\");\n\nvar opt = document.createElement(\"option\");\nopt.value = \"3\";\nopt.text = \"Option: Value 3\";\n\nsel.add(opt, null);\n\n/*\n  Takes the existing following select object:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n  &lt;/select&gt;\n\n  And changes it to:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n    &lt;option value=\"3\"&gt;Option: Value 3&lt;/option&gt;\n  &lt;/select&gt;\n*/</pre>\n        \n<p>From \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> and <span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Gecko&nbsp;7.0</span> the before parameter is optional. So the following is accepted.</p>\n<pre class=\"deki-transform\">...\nsel.add(opt);\n...\n</pre>\n</div><div id=\"section_10\"><span id=\"Inserting_to_an_Existing_Collection\"></span><h6 class=\"editable\">Inserting to an Existing Collection</h6>\n\n          <pre name=\"code\" class=\"js\">var sel = document.getElementById(\"existingList\");\n\nvar opt = document.createElement(\"option\");\nopt.value = \"3\";\nopt.text = \"Option: Value 3\";\n\nsel.add(opt, sel.options[1]);\n\n/*\n  Takes the existing following select object:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n  &lt;/select&gt;\n\n  And changes it to:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"3\"&gt;Option: Value 3&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n  &lt;/select&gt;\n*/</pre>\n        \n<dl> <dt></dt>\n</dl>\n<p>\n\n</p><div><span>Obsolete since Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n</span><span id=\"blur()\"></span></div></div>","<h5 class=\"editable\">Example</h5>\n\n          <pre name=\"code\" class=\"js\">var sel = document.getElementById(\"existingList\");\nsel.remove(1);\n\n/*\n  Takes the existing following select object:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n    &lt;option value=\"3\"&gt;Option: Value 3&lt;/option&gt;\n  &lt;/select&gt;\n\n  And changes it to:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"3\"&gt;Option: Value 3&lt;/option&gt;\n  &lt;/select&gt;\n*/</pre>","<h4 class=\"editable\">Get information about the selected option</h4>\n\n          <pre name=\"code\" class=\"js\">/* assuming we have the following HTML\n&lt;select id='s'&gt;\n    &lt;option&gt;First&lt;/option&gt;\n    &lt;option selected&gt;Second&lt;/option&gt;\n    &lt;option&gt;Third&lt;/option&gt;\n&lt;/select&gt;\n*/\n\nvar select = document.getElementById('s');\n\n// return the index of the selected option\nalert(select.selectedIndex); // 1\n\n// return the value of the selected option\nalert(select.options[select.selectedIndex].value) // Second</pre>"],"summary":"<code>DOM select</code> elements share all of the properties and methods of other HTML elements described in the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a></code>\n section. They also have the specialized interface <a class=\"external\" title=\"http://dev.w3.org/html5/spec/the-button-element.html#htmlselectelement\" rel=\"external\" href=\"http://dev.w3.org/html5/spec/the-button-element.html#htmlselectelement\" target=\"_blank\">HTMLSelectElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\"external\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-94282980\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-94282980\" target=\"_blank\">HTMLSelectElement</a>).","members":[{"name":"setCustomValidity","help":"<p><span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> only. Sets the custom validity message for the selection element to the specified message. Use the empty string to indicate that the element does <em>not</em> have a custom validity error.</p>\n\n<div id=\"section_22\"><span id=\"Parameters_8\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>error</code></dt> <dd>The string to use for the custom validity message.</dd>\n</dl></div>","idl":"<pre class=\"eval\">void setCustomValidity(\n  in DOMString error\n);\n</pre>","obsolete":false},{"name":"add","help":"<p>Adds an element to the collection of <code>option</code> elements for this <code>select</code> element.</p>\n\n<div id=\"section_6\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>element</code></dt> <dd>An item to add to the collection of options.</dd> <dt><code>before</code> \n<span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Optional from Gecko 7.0</span>\n</dt> <dd>An item (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>&nbsp;index of an item) that the new item should be inserted before. If this parameter is <code>null</code> (or the index does not exist), the new element is appended to the end of the collection.</dd>\n</dl>\n<div id=\"section_7\"><span id=\"Examples\"></span><h5 class=\"editable\">Examples</h5>\n<div id=\"section_8\"><span id=\"Creating_Elements_from_Scratch\"></span><h6 class=\"editable\">Creating Elements from Scratch</h6>\n\n          <pre name=\"code\" class=\"js\">var sel = document.createElement(\"select\");\nvar opt1 = document.createElement(\"option\");\nvar opt2 = document.createElement(\"option\");\n\nopt1.value = \"1\";\nopt1.text = \"Option: Value 1\";\n\nopt2.value = \"2\";\nopt2.text = \"Option: Value 2\";\n\nsel.add(opt1, null);\nsel.add(opt2, null);\n\n/*\n  Produces the following, conceptually:\n\n  &lt;select&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n  &lt;/select&gt;\n*/</pre>\n        \n<p>From \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> and <span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Gecko&nbsp;7.0</span> the before parameter is optional. So the following is accepted.</p>\n<pre class=\"deki-transform\">...\nsel.add(opt1);\nsel.add(opt2);\n...\n</pre>\n</div><div id=\"section_9\"><span id=\"Append_to_an_Existing_Collection\"></span><h6 class=\"editable\">Append to an Existing Collection</h6>\n\n          <pre name=\"code\" class=\"js\">var sel = document.getElementById(\"existingList\");\n\nvar opt = document.createElement(\"option\");\nopt.value = \"3\";\nopt.text = \"Option: Value 3\";\n\nsel.add(opt, null);\n\n/*\n  Takes the existing following select object:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n  &lt;/select&gt;\n\n  And changes it to:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n    &lt;option value=\"3\"&gt;Option: Value 3&lt;/option&gt;\n  &lt;/select&gt;\n*/</pre>\n        \n<p>From \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> and <span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Gecko&nbsp;7.0</span> the before parameter is optional. So the following is accepted.</p>\n<pre class=\"deki-transform\">...\nsel.add(opt);\n...\n</pre>\n</div><div id=\"section_10\"><span id=\"Inserting_to_an_Existing_Collection\"></span><h6 class=\"editable\">Inserting to an Existing Collection</h6>\n\n          <pre name=\"code\" class=\"js\">var sel = document.getElementById(\"existingList\");\n\nvar opt = document.createElement(\"option\");\nopt.value = \"3\";\nopt.text = \"Option: Value 3\";\n\nsel.add(opt, sel.options[1]);\n\n/*\n  Takes the existing following select object:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n  &lt;/select&gt;\n\n  And changes it to:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"3\"&gt;Option: Value 3&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n  &lt;/select&gt;\n*/</pre>\n        \n<dl> <dt></dt>\n</dl>\n<p>\n\n</p><div><span>Obsolete since Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n</span><span id=\"blur()\"></span></div></div></div></div>","idl":"<pre class=\"eval\">void add(\n  in nsIDOMHTMLElement element,\n  in nsIDOMHTMLElement before \n<span style=\"border: 1px solid #9ED2A4; background-color: #C0FFC7; font-size: x-small; white-space: nowrap; padding: 2px;\" title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Optional from Gecko 7.0</span>\n\n);\nvoid add(\n  in HTMLElement element,\n  in long before \n<span style=\"border: 1px solid #9ED2A4; background-color: #C0FFC7; font-size: x-small; white-space: nowrap; padding: 2px;\" title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Optional from Gecko 7.0</span>\n\n);\n</pre>","obsolete":false},{"name":"item","help":"<div id=\"section_14\"><p><span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> Gets an item from the options collection for this <code>select</code> element. You can also access an item by specifying the index in array-style brackets or parentheses, without calling this method explicitly.</p>\n\n</div><div id=\"section_15\"><span id=\"Parameters_5\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>index</code></dt> <dd>The zero-based index into the collection of the option to get.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Return_value_2\"></span><h6 class=\"editable\">Return value</h6>\n<p>The node at the specified index, or <code>null</code> if such a node does not exist in the collection.</p>\n<p>\n</p><div>\n<span id=\"namedItem()\"></span></div></div>","idl":"<pre class=\"eval\">nsIDOMNode item(\n  in unsigned long index\n);\n</pre>","obsolete":false},{"name":"remove","help":"<p>Removes the element at the specified index from the options collection for this select element.</p>\n\n<div id=\"section_20\"><span id=\"Parameters_7\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>index</code></dt> <dd>The zero-based index of the option element to remove from the collection.</dd>\n</dl>\n<div id=\"section_21\"><span id=\"Example\"></span><h5 class=\"editable\">Example</h5>\n\n          <pre name=\"code\" class=\"js\">var sel = document.getElementById(\"existingList\");\nsel.remove(1);\n\n/*\n  Takes the existing following select object:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"2\"&gt;Option: Value 2&lt;/option&gt;\n    &lt;option value=\"3\"&gt;Option: Value 3&lt;/option&gt;\n  &lt;/select&gt;\n\n  And changes it to:\n\n  &lt;select id=\"existingList\" name=\"existingList\"&gt;\n    &lt;option value=\"1\"&gt;Option: Value 1&lt;/option&gt;\n    &lt;option value=\"3\"&gt;Option: Value 3&lt;/option&gt;\n  &lt;/select&gt;\n*/</pre>\n        \n<p>\n</p><div>\n<span id=\"setCustomValidity()\"></span></div></div></div>","idl":"<pre class=\"eval\">void remove(\n  in long index\n);\n</pre>","obsolete":false},{"name":"focus","help":"<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> Gives input focus to this element. \n\n<span title=\"\">Obsolete since <a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","idl":"<pre class=\"eval\">void focus();\n</pre>","obsolete":false},{"name":"blur","help":"<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> Removes input focus from this element. \n\n<span title=\"\">Obsolete since <a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","idl":"<pre class=\"eval\">void blur();\n</pre>","obsolete":false},{"name":"namedItem","help":"<div id=\"section_16\"><p><span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> Gets the item in the options collection with the specified name. The name string can match either the <strong>id</strong> or the <strong>name</strong> attribute of an option node. You can also access an item by specifying the name in array-style brackets or parentheses, without calling this method explicitly.</p>\n\n</div><div id=\"section_17\"><span id=\"Parameters_6\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>name</code></dt> <dd>The name of the option to get.</dd>\n</dl>\n</div><div id=\"section_18\"><span id=\"Return_value_3\"></span><h6 class=\"editable\">Return value</h6>\n<ul> <li>A node, if there is exactly one match.</li> <li><code>null</code> if there are no matches.</li> <li>A <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/NodeList\">NodeList</a></code>\n in tree order of nodes whose <strong>name</strong> or <strong>id</strong> attributes match the specified name.</li>\n</ul>\n</div>","idl":"<pre class=\"eval\">nsIDOMNode namedItem(\n  in DOMString name\n);\n</pre>","obsolete":false},{"name":"checkValidity","help":"<div id=\"section_11\"><p><span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> Checks whether the element has any constraints and whether it satisfies them. If the element fails its constraints, the browser fires a cancelable <code>invalid</code> event at the element (and returns false).</p>\n\n</div><div id=\"section_12\"><span id=\"Parameters_3\"></span>\n\n</div><div id=\"section_13\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A <code>false</code> value if the <code>select</code> element is a candidate for constraint evaluation and it does not satisfy its constraints. Returns true if the element is not constrained, or if it satisfies its constraints.</p>\n<p>\n\n</p><div><span>Obsolete since Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n</span><span id=\"focus()\"></span></div></div>","idl":"<pre class=\"eval\">boolean checkValidity();\n</pre>","obsolete":false},{"name":"autofocus","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/select#attr-autofocus\">autofocus</a></code>\n HTML attribute, which indicates whether the control should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form-associated element in a document can have this attribute specified. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Requires Gecko 2.0</span>","obsolete":false},{"name":"disabled","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/select#attr-disabled\">disabled</a></code>\n HTML attribute, which indicates whether the control is disabled. If it is disabled, it does not accept clicks.","obsolete":false},{"name":"form","help":"The form that this element is associated with. If this element is a descendant of a form element, then this attribute is the ID of that form element. If the element is not a descendant of a form element, then: <ul> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> The attribute can be the ID of any form element in the same document.</li> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> The attribute is null.</li> </ul> <strong>Read only.</strong>","obsolete":false},{"name":"labels","help":"A list of label elements associated with this select element.","obsolete":false},{"name":"length","help":"The number of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/option\">&lt;option&gt;</a></code>\n elements in this <code>select</code> element.","obsolete":false},{"name":"multiple","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/select#attr-multiple\">multiple</a></code>\n HTML attribute, whichindicates whether multiple items can be selected.","obsolete":false},{"name":"name","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/select#attr-name\">name</a></code>\n HTML attribute, containing the name of this control used by servers and DOM search functions.","obsolete":false},{"name":"options","help":"The set of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/option\">&lt;option&gt;</a></code>\n elements contained by this element. <strong>Read only.</strong>","obsolete":false},{"name":"required","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/select#attr-required\">required</a></code>\n HTML attribute, which indicates whether the user is required to select a value before submitting the form. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Requires Gecko 2.0</span>","obsolete":false},{"name":"selectedIndex","help":"The index of the first selected <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/option\">&lt;option&gt;</a></code>\n element.","obsolete":false},{"name":"selectedOptions","help":"The set of options that are selected. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":false},{"name":"size","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/select#attr-size\">size</a></code>\n HTML attribute, which contains the number of visible items in the control. The default is 1, \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> unless <strong>multiple</strong> is true, in which case it is 4.","obsolete":false},{"name":"tabIndex","help":"The element's position in the tabbing order. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> \n\n<span title=\"\">Obsolete since <a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/select.type","name":"type","help":"The form control's type. When <strong>multiple</strong> is true, it returns <code>select-multiple</code>; otherwise, it returns <code>select-one</code>.<strong>Read only.</strong>","obsolete":false},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the control does not satisfy (if any). This attribute is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.<strong>Read only.</strong> \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Requires Gecko 2.0</span>","obsolete":false},{"name":"validity","help":"The validity states that this control is in. <strong>Read only.</strong> \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Requires Gecko 2.0</span>","obsolete":false},{"name":"value","help":"The value of this form control, that is, of the first selected option.","obsolete":false},{"name":"willValidate","help":"Indicates whether the button is a candidate for constraint validation. It is false if any conditions bar it from constraint validation. <strong>Read only.</strong> \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Requires Gecko 2.0</span>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLSelectElement"},"HTMLFieldSetElement":{"title":"HTMLFieldSetElement","summary":"DOM&nbsp;<code>fieldset</code> elements expose the <a class=\" external\" title=\"http://dev.w3.org/html5/spec/forms.html#htmlfieldsetelement\" rel=\"external\" href=\"http://dev.w3.org/html5/spec/forms.html#htmlfieldsetelement\" target=\"_blank\">HTMLFieldSetElement</a>&nbsp; (\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-7365882\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-7365882\" target=\"_blank\">HTMLFieldSetElement</a>) interface, which provides special properties and methods (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of field-set elements.","members":[{"name":"checkValidity","help":"Always returns true because <code>fieldset</code> objects are never candidates for constraint validation.","obsolete":false},{"name":"setCustomValidity","help":"Sets a custom validity message for the field set. If this message is not the empty string, then the field set is suffering from a custom validity error, and does not validate.","obsolete":false},{"name":"disabled","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/fieldset#attr-disabled\">disabled</a></code>\n HTML&nbsp;attribute, indicating whether the user can interact with the control.","obsolete":false},{"name":"elements","help":"The elements belonging to this field set.","obsolete":false},{"name":"form","help":"The containing form element, if this element is in a form. Otherwise, the element the <a title=\"en/HTML/Element/fieldset#attr-name\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Element/fieldset#attr-name\">name content attribute</a> points to \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>. (<code>null</code> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span>.)","obsolete":false},{"name":"name","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/fieldset#attr-name\">name</a></code>\n HTML&nbsp;attribute, containing the name of the field set, used for submitting the form.","obsolete":false},{"name":"type","help":"Must be the string <code>fieldset</code>.","obsolete":false},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the element does not satisfy (if any). This is the empty string if the element&nbsp; is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.","obsolete":false},{"name":"validity","help":"The validity states that this element is in.","obsolete":false},{"name":"willValidate","help":"Always false because <code>fieldset</code> objects are never candidates for constraint validation.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLFieldSetElement"},"CompositionEvent":{"title":"CompositionEvent","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0 (9.0)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>9.0 (9.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/CompositionEvent","specification":"DOM&nbsp;Level 3: Composition Events","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOM_event_reference/compositionstart\">compositionstart</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOM_event_reference/compositionend\">compositionend</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOM_event_reference/compositionupdate\">compositionupdate</a></code>\n</li> <li><a title=\"UIEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Event/UIEvent\">UIEvent</a></li> <li><a title=\"Event\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/event\">Event</a></li>","summary":"<div><div>\n\n<a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/events/nsIDOMCompositionEvent.idl\"><code>dom/interfaces/events/nsIDOMCompositionEvent.idl</code></a><span><a rel=\"internal\" href=\"https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces\" title=\"en/Interfaces/About_Scriptable_Interfaces\">Scriptable</a></span></div><span>An event interface for composition events</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 9.0</div><div title=\"Introduced in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n\"></div><div title=\"Last changed in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n\"></div></div>\n<div>Inherits from: <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIDOMUIEvent&amp;ident=nsIDOMUIEvent\" class=\"new\">nsIDOMUIEvent</a></code>\n<span>Last changed in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n</span></div></div>\n<p></p>\n<p>The DOM <code>CompositionEvent</code> represents events that occur due to the user indirectly entering text.</p>","members":[{"name":"initCompositionEvent","help":"<p>Initializes the attributes of a composition event.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>typeArg</code></dt> <dd>The type of composition event; this will be one of <code>compositionstart</code>, <code>compositionupdate</code>, or <code>compositionend</code>.</dd> <dt><code>canBubbleArg</code></dt> <dd>Whether or not the event can bubble.</dd> <dt><code>cancelableArg</code></dt> <dd>Whether or not the event can be canceled.</dd> <dt><code>viewArg</code></dt> <dd>?</dd> <dt><code>dataArg</code></dt> <dd>The value of the <code>data</code> attribute.</dd> <dt><code>localeArg</code></dt> <dd>The value of the <code>locale</code> attribute.</dd>\n</dl>\n</div>","idl":"<pre>void initCompositionEvent(\n  in DOMString typeArg,\n  in boolean canBubbleArg,\n  in boolean cancelableArg,\n  in views::AbstractView viewArg,\n  in DOMString dataArg,\n  in DOMString localeArg\n);\n</pre>","obsolete":false},{"name":"data","help":"<p>For <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOM_event_reference/compositionstart\">compositionstart</a></code>\n events, this is the currently selected text that will be replaced by the string being composed. This value doesn't change even if content changes the selection range; rather, it indicates the string that was selected when composition started.</p> <p>For <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOM_event_reference/compositionupdate\">compositionupdate</a></code>\n, this is the string as it stands currently as editing is ongoing.</p> <p>For <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOM_event_reference/compositionend\">compositionend</a></code>\n events, this is the string as committed to the editor.</p> <p><strong>Read only</strong>.</p>","obsolete":false},{"name":"locale","help":"The locale of current input method (for example, the keyboard layout locale if the composition is associated with IME). <strong>Read only.</strong>","obsolete":false}]},"SVGRadialGradientElement":{"title":"SVGRadialGradientElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGRadialGradientElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/radialGradient\">&lt;radialGradient&gt;</a></code>\n element.","members":[{"name":"cx","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/cx\">cx</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/radialGradient\">&lt;radialGradient&gt;</a></code>\n element.","obsolete":false},{"name":"cy","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/cy\">cy</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/radialGradient\">&lt;radialGradient&gt;</a></code>\n element.","obsolete":false},{"name":"fx","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/fx\" class=\"new\">fx</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/radialGradient\">&lt;radialGradient&gt;</a></code>\n element.","obsolete":false},{"name":"fy","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/fy\" class=\"new\">fy</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/radialGradient\">&lt;radialGradient&gt;</a></code>\n element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGRadialGradientElement"},"TextMetrics":{"title":"TextMetrics","summary":"Returned by <a title=\"CanvasRenderingContext2D\" rel=\"internal\" href=\"https://developer.mozilla.org/CanvasRenderingContext2D\" class=\"new \">CanvasRenderingContext2D</a>'s <a title=\"CanvasRenderingContext2D.measureText\" rel=\"internal\" href=\"https://developer.mozilla.org/CanvasRenderingContext2D.measureText\" class=\"new \">measureText</a> method.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/TextMetrics","specification":"http://www.whatwg.org/specs/web-apps...ml#textmetrics"},"SVGScriptElement":{"title":"SVGScriptElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGScriptElement</code> interface corresponds to the SVG <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/script\">&lt;script&gt;</a></code>\n element.","members":[{"name":"type","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/type\" class=\"new\">type</a></code> on the given element. A <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n is raised with code <code>NO_MODIFICATION_ALLOWED_ERR</code> on an attempt to change the value of a read only attribut.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGScriptElement"},"SVGFEBlendElement":{"title":"feBlend","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The <code>feBlend</code> filter composes two objects together ruled by a certain blending mode. This is similar to what is known from image editing software when blending two layers. The mode is defined by the \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/mode\" class=\"new\">mode</a></code> attribute.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in2","name":"in2","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/mode","name":"mode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in","name":"in","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feBlend"},"HTMLAreaElement":{"title":"HTMLAreaElement","summary":"DOM area objects expose the <a class=\" external\" title=\"http://www.w3.org/TR/html5/the-map-element.html#htmlareaelement\" rel=\"external\" href=\"http://www.w3.org/TR/html5/the-map-element.html#htmlareaelement\" target=\"_blank\">HTMLAreaElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26019118\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26019118\" target=\"_blank\"><code>HTMLAreaElement</code></a>) interface, which provides special properties and methods (beyond the regular <a href=\"https://developer.mozilla.org/en/DOM/element\" rel=\"internal\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of area elements.","members":[{"name":"accessKey","help":"A single character that switches input focus to the control. \n\n<span title=\"\">Obsolete</span>&nbsp;in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"alt","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-alt\">alt</a></code>\n HTML attribute, containing alternative text for the element.","obsolete":false},{"name":"coords","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-coords\">coords</a></code>\n HTML attribute, containing coordinates to define the hot-spot region.","obsolete":false},{"name":"hash","help":"The fragment identifier (including the leading hash mark (#)), if any, in the referenced URL.","obsolete":false},{"name":"host","help":"The hostname and port (if it's not the default port) in the referenced URL.","obsolete":false},{"name":"hostname","help":"The hostname in the referenced URL.","obsolete":false},{"name":"href","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-href\">href</a></code>\n HTML attribute, containing a valid URL&nbsp;of a linked resource.","obsolete":false},{"name":"hreflang","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-hreflang\">hreflang</a></code>\n HTML&nbsp;attribute, indicating the language of the linked resource.","obsolete":false},{"name":"media","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-media\">media</a></code>\n HTML&nbsp;attribute, indicating target media of the linked resource.","obsolete":false},{"name":"noHref","help":"Indicates that this area is inactive. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"pathname","help":"The path name component, if any, of the referenced URL.","obsolete":false},{"name":"port","help":"The port component, if any, of the referenced URL.","obsolete":false},{"name":"protocol","help":"The protocol component (including trailing colon (:)), of the referenced URL.","obsolete":false},{"name":"rel","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-rel\">rel</a></code>\n HTML&nbsp;attribute, indicating relationships of the current document to the linked resource.","obsolete":false},{"name":"relList","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-rel\">rel</a></code>\n HTML&nbsp;attribute, indicating relationships of the current document to the linked resource, as a list of tokens.","obsolete":false},{"name":"search","help":"The search element (including leading question mark (?)), if any, of the referenced URL","obsolete":false},{"name":"shape","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-shape\">shape</a></code>\n HTML&nbsp;attribute, indicating the shape of the hot-spot, limited to known values.","obsolete":false},{"name":"tabIndex","help":"The element's position in the tabbin order. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"target","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-target\">target</a></code>\n HTML&nbsp;attribute, indicating the browsing context in which to open the linked resource.","obsolete":false},{"name":"type","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area#attr-type\">type</a></code>\n HTML&nbsp;attribute, indicating the MIME type of the linked resource.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLAreaElement"},"SQLError":{"title":"User talk:sdwilsh","members":[],"srcUrl":"https://developer.mozilla.org/User_talk:sdwilsh","skipped":true,"cause":"Suspect title"},"HTMLTableSectionElement":{"title":"thead","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.0 (1.7 or earlier)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>align/valign</code> attribute</td> <td>1.0</td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=915\" class=\"external\" title=\"\">\nbug 915</a>\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>char/charoff</code> attribute</td> <td>1.0</td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=2212\" class=\"external\" title=\"\">\nbug 2212</a>\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>bgcolor</code> attribute      </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>align/valign</code> attribute</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=915\" class=\"external\" title=\"\">\nbug 915</a>\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>char/charoff</code> attribute</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=2212\" class=\"external\" title=\"\">\nbug 2212</a>\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>bgcolor</code> attribute      </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody>\n</table>\n</div>","examples":["See <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/table\">&lt;table&gt;</a></code>\n for examples on<code> &lt;thead&gt;</code>."],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/thead","seeAlso":"<li>Other table-related HTML&nbsp;Elements: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/caption\">&lt;caption&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/col\">&lt;col&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/colgroup\">&lt;colgroup&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/table\">&lt;table&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/tbody\">&lt;tbody&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/td\">&lt;td&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/tfoot\">&lt;tfoot&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/th\">&lt;th&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/tr\">&lt;tr&gt;</a></code>\n;</li> <li>CSS properties and pseudo-classes that may be specially useful to style the <span>&lt;thead&gt;</span> element:&nbsp;<br> <ul> <li>the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/%3Anth-child\">:nth-child</a></code>\n pseudo-class to set the alignment on the cells of the column;</li> <li>the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/text-align\">text-align</a></code>\n property to align all cells content on the same character, like '.'.</li> </ul> </li>","summary":"The <em>HTML Table Head Element</em> (<code>&lt;thead&gt;</code>) defines a set of rows defining the head of the columns of the table.","members":[{"obsolete":false,"url":"","name":"valign","help":"This attribute specifies the vertical alignment of the text within each row of cells of the table header. Possible values for this attribute are: <ul> <li><span>baseline</span>, which will put the text as close to the bottom of the cell as it is possible, but align it on the <a class=\" external\" title=\"http://en.wikipedia.org/wiki/Baseline_(typography)\" rel=\"external\" href=\"http://en.wikipedia.org/wiki/Baseline_%28typography%29\" target=\"_blank\">baseline</a> of the characters instead of the bottom of them. If characters are all of the size, this has the same effect as <span>bottom</span>.</li> <li><span>bottom</span>, which will put the text as close to the bottom of the cell as it is possible;</li> <li><span>middle</span>, which will center the text in the cell;</li> <li>and <span>top</span>, which will put the text as close to the top of the cell as it is possible.</li> </ul> <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete (and not supported) in the latest standard: instead set the CSS&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/vertical-align\">vertical-align</a></code>\n property on it.</div>"},{"obsolete":false,"url":"","name":"bgcolor","help":"This attribute defines the background color of each cell of the column. It is one of the 6-digit hexadecimal code as defined in <a title=\"http://www.w3.org/Graphics/Color/sRGB\" class=\" external\" rel=\"external\" href=\"http://www.w3.org/Graphics/Color/sRGB\" target=\"_blank\">sRGB</a>, prefixed by a '#'. One of the sixteen predefined color strings may be used: <table width=\"80%\" cellspacing=\"10\" cellpadding=\"0\" border=\"0\" align=\"center\" summary=\"Table of color names and their sRGB values\"> <tbody> <tr> <td>&nbsp;</td> <td><span>black</span> = \"#000000\"</td> <td>&nbsp;</td> <td><span>green</span> = \"#008000\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>silver</span> = \"#C0C0C0\"</td> <td>&nbsp;</td> <td><span>lime</span> = \"#00FF00\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>gray</span> = \"#808080\"</td> <td>&nbsp;</td> <td><span>olive</span> = \"#808000\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>white</span> = \"#FFFFFF\"</td> <td>&nbsp;</td> <td><span>yellow</span> = \"#FFFF00\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>maroon</span> = \"#800000\"</td> <td>&nbsp;</td> <td><span>navy</span> = \"#000080\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>red</span> = \"#FF0000\"</td> <td>&nbsp;</td> <td><span>blue</span> = \"#0000FF\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>purple</span> = \"#800080\"</td> <td>&nbsp;</td> <td><span>teal</span> = \"#008080\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>fuchsia</span> = \"#FF00FF\"</td> <td>&nbsp;</td> <td><span>aqua</span> = \"#00FFFF\"</td> </tr> </tbody> </table> <div class=\"note\"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it is non-standard and only implemented in some versions of Microsoft Internet Explorer: the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/thead\">&lt;thead&gt;</a></code>\n element should be styled using <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a>. To give a similar effect to the <strong>bgcolor</strong> attribute, use the <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a> property <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/background-color\">background-color</a></code>\n, on the relevant <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/td\">&lt;td&gt;</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/th\">&lt;th&gt;</a></code>\n elements.</div>"},{"obsolete":false,"url":"","name":"char","help":"This attribute is used to set the character to align the cells in a column on. Typical values for this include a period (.) when attempting to align numbers or monetary values. If \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/tr#attr-align\">align</a></code>\n is not set to <span>char</span>, this attribute is ignored. <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete (and not supported) in the latest standard. To achieve the same effect as the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/thead#attr-char\">char</a></code>\n, in CSS3, you can use the character set using the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/thead#attr-char\">char</a></code>\n attribute as the value of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/text-align\">text-align</a></code>\n property \n<span class=\"unimplementedInlineTemplate\">Unimplemented</span>\n.</div>"},{"obsolete":false,"url":"","name":"align","help":"This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are: <ul> <li><span>left</span>, aligning the content to the left of the cell</li> <li><span>center</span>, centering the content in the cell</li> <li><span>right</span>, aligning the content to the right of the cell</li> <li><span>justify</span>, inserting spaces into the textual content so that the content is justified in the cell</li> <li><span>char</span>, aligning the textual content on a special character with a minimal offset, defined by the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/thead#attr-char\">char</a></code>\n and \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/thead#attr-charoff\">charoff</a></code>\n attributes \n<span class=\"unimplementedInlineTemplate\">Unimplemented (see<a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=2212\" class=\"external\" title=\"\">\nbug 2212</a>\n)</span>\n.</li> </ul> <p>If this attribute is not set,&nbsp; the <span>left</span> value is assumed.</p> <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete (not supported) in the latest standard. <ul> <li>To achieve the same effect as the <span>left</span>, <span>center</span>, <span>right</span> or <span>justify</span> values, use the CSS <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/text-align\">text-align</a></code>\n property on it.</li> <li>To achieve the same effect as the <span>char</span> value, in CSS3, you can use the value of the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/thead#attr-char\">char</a></code>\n as the value of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/text-align\">text-align</a></code>\n property \n<span class=\"unimplementedInlineTemplate\">Unimplemented</span>\n.</li> </ul> </div>"},{"obsolete":false,"url":"","name":"charoff","help":"This attribute is used to indicate the number of characters to offset the column data from the alignment characters specified by the <strong>char</strong> attribute. <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete (and not supported) in the latest standard.</div>"}]},"SVGNumberList":{"title":"SVGNumberList","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"<p>The <code>SVGNumberList</code> defines a list of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGNumber\">SVGNumber</a></code>\n objects.</p>\n<p>An <code>SVGNumberList</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>\n<div class=\"geckoVersionNote\"> <p>\n</p><div class=\"geckoVersionHeading\">Gecko 5.0 note<div>(Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n</div></div>\n<p></p> <p>Starting in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n,the <code>SVGNumberList</code> DOM interface is now indexable and can be accessed like arrays</p>\n</div>","members":[{"name":"clear","help":"<p>Clears all existing current items from the list, with the result being an empty list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"initialize","help":"<p>Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter. If the inserted item is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. The return value is the item inserted into the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"getItem","help":"<p>Returns the specified item from the list. The returned item is the item itself and not a copy. Any changes made to the item are immediately reflected in the list. The first item is number&nbsp;0.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"insertItemBefore","help":"<p>Inserts a new item into the list at the specified position. The first item is number 0. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to insert before is before the removal of the item. If the <code>index</code> is equal to 0, then the new item is inserted at the front of the list. If the index is greater than or equal to <code>numberOfItems</code>, then the new item is appended to the end of the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"replaceItem","help":"<p>Replaces an existing item in the list with a new item. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to replace is before the removal of the item.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>","obsolete":false},{"name":"removeItem","help":"<p>Removes an existing item from the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>","obsolete":false},{"name":"appendItem","help":"<p>Inserts a new item at the end of the list. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"numberOfItem","help":"The number of items in the list.","obsolete":false},{"name":"length","help":"The number of items in the list.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGNumberList"},"HTMLFrameSetElement":{"title":"frameset","summary":"<code>&lt;frameset&gt;</code> is an HTML element which is used to contain <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/frame\">&lt;frame&gt;</a></code>\n elements.","members":[],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/frameset"},"ClientRectList":{"title":"Interface documentation status","members":[],"srcUrl":"https://developer.mozilla.org/User:trevorh/Interface_documentation_status","skipped":true,"cause":"Suspect title"},"SVGStylable":{"title":"SVGStylable","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGStylable</code> interface is implemented on all objects corresponding to SVG elements that can have \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/style\">style</a></code>, {{SVGAttr(\"class\") and presentation attributes specified on them.","members":[{"name":"getPresentationAttribute","help":"Returns the base (i.e., static) value of a given presentation attribute as an object of type <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/CSSValue\" class=\"new\">CSSValue</a></code>\n. The returned object is live; changes to the objects represent immediate changes to the objects to which the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/CSSValue\" class=\"new\">CSSValue</a></code>\n is attached.","obsolete":false},{"name":"className","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/class\">class</a></code> on the given element.","obsolete":false},{"name":"style","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/style\">style</a></code> on the given element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGStylable"},"SVGPaint":{"title":"Content type","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Content_type","skipped":true,"cause":"Suspect title"},"SVGImageElement":{"title":"SVGImageElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGImageElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/image\">&lt;image&gt;</a></code>\n element.","members":[{"name":"width","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/width\">width</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/image\">&lt;image&gt;</a></code>\n element.","obsolete":false},{"name":"height","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/height\">height</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/image\">&lt;image&gt;</a></code>\n element.","obsolete":false},{"name":"preserveAspectRatio","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/image\">&lt;image&gt;</a></code>\n element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGImageElement"},"MediaQueryListListener":{"title":"MediaQueryListListener","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/MediaQueryListListener","specification":"The CSSOM&nbsp;View Module:&nbsp;The&nbsp;MediaQueryList Interface","seeAlso":"<li><a title=\"En/CSS/Media queries\" rel=\"internal\" href=\"https://developer.mozilla.org/En/CSS/Media_queries\">Media queries</a></li> <li><a title=\"en/CSS/Using media queries from code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/Using_media_queries_from_code\">Using media queries from code</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/MediaQueryList\">MediaQueryList</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.matchMedia\">window.matchMedia()</a></code>\n</li>","summary":"<div><strong>DRAFT</strong>\n<div>This page is not complete.</div>\n</div>\n\n<p></p>\n<p>A <code>MediaQueryList</code> object maintains a list of <a title=\"En/CSS/Media queries\" rel=\"internal\" href=\"https://developer.mozilla.org/En/CSS/Media_queries\">media queries</a> on a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document\">document</a></code>\n, and handles sending notifications to listeners when the media queries on the document change.</p>\n<p>This makes it possible to observe a document to detect when its media queries change, instead of polling the values periodically, if you need to programmatically detect changes to the values of media queries on a document.</p>","members":[]},"HTMLLinkElement":{"title":"link","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.0 (1.7 or earlier)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td>Alternative stylesheets</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.0 (1.9)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>disabled</code> attribute      </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>methods</code> attribute      </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td>4.0</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>sizes</code> attribute</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=441770\" class=\"external\" title=\"\">\nbug 441770</a>\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>load</code> and <code>error</code> events</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>9.0 (9.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td>Alternative stylesheets</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>disabled</code> attribute      </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>methods</code> attribute      </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td>4.0</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>sizes</code> attribute</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=441770\" class=\"external\" title=\"\">\nbug 441770</a>\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>load</code> and <code>error</code> events</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>9.0 (9.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <em>HTML Link Element</em> (&lt;link&gt;) specifies relationships between the current document and other documents. Possible uses for this element include defining a relational framework for navigation and linking the document to a style sheet.","members":[{"obsolete":false,"url":"","name":"target","help":"Defines the frame or window name that has the defined linking relationship or that will show the rendering of any linked resource."},{"obsolete":false,"url":"","name":"media","help":"This attribute specifies the media which the linked resource applies to. Its value must be a <a title=\"En/CSS/Media queries\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/Media_queries\">media query</a>. This attribute is mainly useful when linking to external stylesheets by allowing the user agent to pick the best adapted one for the device it runs on.<br> <div class=\"note\"><strong>Usage note:&nbsp;</strong> <p>&nbsp;</p> <ul> <li>In HTML 4, this can only be a simple white-space-separated list of media description literals, i.e., <a title=\"https://developer.mozilla.org/en/CSS/@media\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/@media\">media types and groups</a>, where defined and allowed as values for this attribute, such as <span>print</span>, <span>screen</span>, <span>aural</span>, <span>braille.</span> HTML5 extended this to any kind of <a title=\"En/CSS/Media queries\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/Media_queries\">media queries</a>, which are a superset of the allowed values of HTML 4.</li> <li>Browsers not supporting the <a title=\"En/CSS/Media queries\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/Media_queries\">CSS3 Media Queries</a> won't necessary recognized the adequate link; do not forget to set fallback links,&nbsp; the restricted set of media queries defined in HTML 4.</li> </ul> </div>"},{"obsolete":false,"url":"","name":"hreflang","help":"This attribute indicates the language of the linked resource. It is purely advisory. Allowed values are determined by <a class=\"external\" title=\"http://www.ietf.org/rfc/bcp/bcp47.txt\" rel=\"external\" href=\"http://www.ietf.org/rfc/bcp/bcp47.txt\" target=\"_blank\">BCP47</a> for HTML5 and by <a class=\"external\" title=\"http://www.ietf.org/rfc/rfc1766.txt\" rel=\"external\" href=\"http://www.ietf.org/rfc/rfc1766.txt\" target=\"_blank\">RFC1766</a> for HTML 4. Use this attribute only if the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/a#attr-href\">href</a></code>\n attribute is present."},{"obsolete":false,"url":"","name":"rel","help":"This attribute names a relationship of the linked document to the current document. The attribute must be a space-separated list of the <a title=\"en/HTML/Link types\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Link_types\">link types values</a>. The most common use of this attribute is to specify a link to an external style sheet:&nbsp;the <strong>rel</strong> attribute is set to <code>stylesheet</code>, and the <strong>href</strong> attribute is set to the URL of an external style sheet to format the page. WebTV also supports the use of the value <code>next</code> for <strong>rel</strong> to preload the next page in a document series."},{"obsolete":false,"url":"","name":"sizes","help":"This attribute defines the sizes of the icons for visual media contained in the resource. It must be present only if the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/link#attr-rel\">rel</a></code>\n contains the <span>icon</span> <a title=\"en/HTML/Link types\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Link_types\">link types value</a>. It may have the following values: <ul> <li><span>any</span>, meaning that the icon can be scaled to any size as it is in a vectorial format, like <span>image/svg</span>.</li> <li>a white-space separated list of sizes, each in the format <span><em>&lt;width in pixels&gt;</em>x<em>&lt;height in pixels&gt;</em></span> or <span><em>&lt;width in pixels&gt;</em>X<em>&lt;height in pixels&gt;</em></span>. Each of these sizes must be contained in the resource.</li> </ul> <div class=\"note\"><strong>Usage note:&nbsp;</strong> <p>&nbsp;</p> <ul> <li>Most icon format are only able to store one single icon; therefore most of the time the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element#attr-sizes\">sizes</a></code>\n contains only one entry. Among the major browsers, only the Apple's ICNS format allows the storage of multiple icons, and this format is only supported in WebKit.</li> <li>Apple's iOS does not support this attribute, hence Apple's iPhone and iPad use special, non-standard <a title=\"en/HTML/Link types\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Link_types\">link types values</a> to define icon to be used as Web Clip or start-up placeholder: <span>apple-touch-icon</span> and <span>apple-touch-startup-icon</span>.</li> </ul> </div>"},{"obsolete":false,"url":"","name":"methods","help":"The value of this attribute provides information about the functions that might be performed on an object. The values generally are given by the HTTP protocol when it is used, but it might (for similar reasons as for the <strong>title</strong> attribute) be useful to include advisory information in advance in the link. For example, the browser might choose a different rendering of a link as a function of the methods specified; something that is searchable might get a different icon, or an outside link might render with an indication of leaving the current site. This attribute is not well understood nor supported, even by the defining browser, Internet Explorer 4. See <a class=\"external\" href=\"http://msdn.microsoft.com/en-us/library/ms534168%28VS.85%29.aspx\" rel=\"external nofollow\" target=\"_blank\" title=\"http://msdn.microsoft.com/en-us/library/ms534168(VS.85).aspx\">Methods Property (MSDN)</a>."},{"obsolete":false,"url":"","name":"href","help":"This attribute specifies the <a title=\"https://developer.mozilla.org/en/URIs_and_URLs\" rel=\"internal\" href=\"https://developer.mozilla.org/en/URIs_and_URLs\">URL</a> of the linked resource. A URL might be absolute or relative."},{"obsolete":false,"url":"","name":"charset","help":"This attribute defines the character encoding of the linked resource. The value is a space- and/or comma-delimited list of character sets as defined in <a class=\"external\" title=\"http://tools.ietf.org/html/rfc2045\" rel=\"external\" href=\"http://tools.ietf.org/html/rfc2045\" target=\"_blank\">RFC 2045</a>. The default value is ISO-8859-1. <div class=\"note\"><strong>Usage note: </strong>This attribute is obsolete in HTML5 and <span>must</span><strong> not be used by authors</strong>. To achieve its effect, use the <span>Content-Type:</span> HTTP header on the linked resource.</div>"},{"obsolete":false,"url":"","name":"rev","help":"The value of this attribute shows the relationship of the current document to the linked document, as defined by the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/link#attr-href\">href</a></code>\n attribute. The attribute thus defines the reverse relationship compared to the value of the <strong>rel</strong> attribute. <a title=\"en/HTML/Link types\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Link_types\">Link types values</a> for the attribute are similar to the possible values for \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/link#attr-rel\">rel</a></code>\n.<br> <div class=\"note\"><strong>Usage note: </strong>This attribute is obsolete in HTML5. <strong>Do not use it</strong>. To achieve its effect, use the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/link#attr-rel\">rel</a></code>\n attribute with the opposite <a title=\"en/HTML/Link types\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Link_types\">link types values</a>, e.g. <span>made</span> should be replaced by <span>author</span>. Also this attribute doesn't mean <em>revision</em> and must not be used with a version number, which is unfortunately the case on numerous sites.</div>"},{"obsolete":false,"url":"","name":"type","help":"This attribute is used to define the type of the content linked to. The value of the attribute should be a MIME type such as <strong>text/html</strong>, <strong>text/css</strong>, and so on. The common use of this attribute is to define the type of style sheet linked and the most common current value is <strong>text/css</strong>, which indicates a Cascading Style Sheet format."},{"obsolete":false,"url":"","name":"disabled","help":"This attribute is used to disable a link relationship. In conjunction with scripting, this attribute could be used to turn on and off various style sheet relationships. <div class=\"note\"> <p><strong>Note: </strong>While there is no <code>disabled</code> attribute in the HTML standard, there <strong>is</strong> a <code>disabled</code> attribute on the <code>HTMLLinkElement</code> DOM object.</p> <p>The use of&nbsp;<code>disabled</code> as an HTML attribute is non-standard and only used by some Microsoft browsers. <span>Do not use it</span>. To achieve a similar effect, use one of the following techniques:</p> <ul> <li>If the <code>disabled</code> attribute has been added directly to the element on the page, do not include the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/link\">&lt;link&gt;</a></code>\n element instead;</li> <li>Set the <code>disabled</code> <strong>property</strong> of the DOM object via scripting.</li> </ul> </div>"}],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/link"},"CanvasPattern":{"title":"CanvasPattern","summary":"This is an opaque object created by <a title=\"en/DOM/CanvasRenderingContext2D\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D\">CanvasRenderingContext2D</a>'s <a title=\"en/DOM/CanvasRenderingContext2D.createPattern\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D.createPattern\" class=\"new \">createPattern</a> method (whether based on a image, canvas, or video).","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/CanvasPattern","specification":"http://www.whatwg.org/specs/web-apps...#canvaspattern"},"SVGAnimatedAngle":{"title":"SVGAnimatedAngle","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedAngle</code> interface is used for attributes of basic type <a title=\"https://developer.mozilla.org/en/SVG/Content_type#Angle\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Content_type#Angle\">&lt;angle&gt;</a> which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"A read only <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGAngle\">SVGAngle</a></code>\n representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGAngle\">SVGAngle</a></code>\n will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedAngle"},"ProgressEvent":{"title":"nsIDOMProgressEvent","seeAlso":"<li><a title=\"En/Using XMLHttpRequest\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest\">Using XMLHttpRequest</a></li> <li><a title=\"En/XMLHttpRequest\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XMLHttpRequest\">XMLHttpRequest</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIXMLHttpRequestEventTarget\">nsIXMLHttpRequestEventTarget</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/nsIXMLHttpRequest\">nsIXMLHttpRequest</a></code>\n</li>","summary":"<div><div>\n\n<a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/events/nsIDOMProgressEvent.idl\"><code>dom/interfaces/events/nsIDOMProgressEvent.idl</code></a><span><a rel=\"internal\" href=\"https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces\" title=\"en/Interfaces/About_Scriptable_Interfaces\">Scriptable</a></span></div><span>This interface represents the events sent with progress information while uploading data using the <code>XMLHttpRequest</code> object.</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 1.9.1</div><div title=\"Introduced in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n\"></div><div title=\"Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n\"></div></div>\n<div>Inherits from: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMEvent\">nsIDOMEvent</a></code>\n<span>Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n</span></div></div>\n<p></p>\n<p>The <code>nsIDOMProgressEvent</code> is used in the media elements (<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video\">&lt;video&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/audio\">&lt;audio&gt;</a></code>\n) to inform interested code of the progress of the media download. This implementation is a placeholder until the specification is complete, and is compatible with the WebKit ProgressEvent.</p>","members":[{"name":"initProgressEvent","help":"<p>Initializes the progress event object.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>typeArg</code></dt> <dd>The type of event. Must be one of \"<code>abort</code>\", \"<code>error</code>\", \"<code>load</code>\", \"<code>loadstart</code>\", or \"<code>progress</code>\".</dd> <dt><code>canBubbleArg</code></dt> <dd>Specifies whether or not the created event will bubble.</dd> <dt><code>cancelableArg</code></dt> <dd>Specifies whether or not the created event can be canceled.</dd> <dt><code>lengthComputableArg</code></dt> <dd>If the size of the data to be transferred is known, this should be <code>true</code>. Otherwise, specify <code>false</code>.</dd> <dt><code>loadedArg</code></dt> <dd>The number of bytes already transferred. Must be a non-negative value.</dd> <dt><code>totalArg</code></dt> <dd>The total number of bytes to be transferred. If <code>lengthComputable</code> is <code>false</code>, this must be zero.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void initProgressEvent(\n  in DOMString typeArg,\n  in boolean canBubbleArg,\n  in boolean cancelableArg,\n  in boolean lengthComputableArg,\n  in unsigned long long loadedArg,\n  in unsigned long long totalArg\n);\n</pre>","obsolete":false},{"name":"lengthComputable","help":"Specifies whether or not the total size of the transfer is known. <strong>Read only.</strong>","obsolete":false},{"name":"loaded","help":"The number of bytes transferred since the beginning of the operation. This doesn't include headers and other overhead, but only the content itself. <strong>Read only.</strong>","obsolete":false},{"name":"total","help":"The total number of bytes of content that will be transferred during the operation. If the total size is unknown, this value is zero. <strong>Read only.</strong>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMProgressEvent"},"Screen":{"title":"window.screen","examples":["if (screen.pixelDepth &lt; 8) {\n  // use low-color version of page\n} else { \n  // use regular, colorful page\n}\n"],"summary":"Returns a reference to the screen object associated with the window.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.left","name":"left","help":"Returns the distance in pixels from the left side of the main screen to the left side of the current screen."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.availWidth","name":"availWidth","help":"Returns the amount of horizontal space in pixels available to the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.top","name":"top","help":"Returns the distance in pixels from the top side of the current screen."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.colorDepth","name":"colorDepth","help":"Returns the color depth of the screen."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.height","name":"height","help":"Returns the height of the screen in pixels."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.availLeft","name":"availLeft","help":"Returns the first available pixel available from the left side of the screen."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.pixelDepth","name":"pixelDepth","help":"Gets the bit depth of the screen."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.width","name":"width","help":"Returns the width of the screen."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.availTop","name":"availTop","help":"Specifies the y-coordinate of the first pixel that is not allocated to permanent or semipermanent user interface features."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen.availHeight","name":"availHeight","help":"Specifies the height of the screen, in pixels, minus permanent or semipermanent user interface features displayed by the operating system, such as the Taskbar on Windows."}],"srcUrl":"https://developer.mozilla.org/en/DOM/window.screen"},"SVGLengthList":{"title":"SVGLengthList","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"<p>The <code>SVGLengthList</code> defines a list of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGLength\">SVGLength</a></code>\n objects.</p>\n<p>An <code>SVGLengthList</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>\n<div class=\"geckoVersionNote\">\n<p>\n</p><div class=\"geckoVersionHeading\">Gecko 5.0 note<div>(Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n</div></div>\n<p></p>\n<p>Starting in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n,the <code>SVGLengthList</code> DOM interface is now indexable and can be accessed like arrays</p>\n</div>","members":[{"name":"clear","help":"<p>Clears all existing current items from the list, with the result being an empty list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"initialize","help":"<p>Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter. If the inserted item is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. The return value is the item inserted into the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"getItem","help":"<p>Returns the specified item from the list. The returned item is the item itself and not a copy. Any changes made to the item are immediately reflected in the list. The first item is number&nbsp;0.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"insertItemBefore","help":"<p>Inserts a new item into the list at the specified position. The first item is number 0. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to insert before is before the removal of the item. If the <code>index</code> is equal to 0, then the new item is inserted at the front of the list. If the index is greater than or equal to <code>numberOfItems</code>, then the new item is appended to the end of the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"replaceItem","help":"<p>Replaces an existing item in the list with a new item. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to replace is before the removal of the item.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>","obsolete":false},{"name":"removeItem","help":"<p>Removes an existing item from the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>","obsolete":false},{"name":"appendItem","help":"<p>Inserts a new item at the end of the list. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"numberOfItem","help":"The number of items in the list.","obsolete":false},{"name":"length","help":"The number of items in the list.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGLengthList"},"SVGViewSpec":{"title":"SVGSVGElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGSVGElement","skipped":true,"cause":"Suspect title"},"HTMLModElement":{"title":"HTMLModElement","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/del\">&lt;del&gt;</a></code>\n&nbsp;HTML&nbsp;element</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ins\">&lt;ins&gt;</a></code>\n&nbsp;HTML&nbsp;element</li>","summary":"DOM mod (modification)&nbsp;objects expose the <a title=\"http://www.w3.org/TR/html5/edits.html#htmlmodelement\" class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/html5/edits.html#htmlmodelement\" target=\"_blank\">HTMLModElement</a> (or <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-79359609\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-79359609\" target=\"_blank\"><code>HTMLModElement</code></a>) interface, which provides special properties (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating modification elements.","members":[{"name":"cite","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/del#attr-cite\">cite</a></code>\n HTML attribute, containing a URI of a resource explaining the change.","obsolete":false},{"name":"datetime","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/del#attr-datetime\">datetime</a></code>\n HTML attribute, containing a date-and-time string representing a timestamp for the change.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLModElement"},"IDBKeyRange":{"title":"IDBKeyRange","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Asynchronous API</td> <td>12 \n<span title=\"prefix\">-webkit</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td>Synchronous API<br> (used with <a title=\"https://developer.mozilla.org/En/Using_web_workers\" rel=\"internal\" href=\"https://developer.mozilla.org/En/Using_web_workers\">WebWorkers</a>)</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Asynchronous API</td> <td><span title=\"Not supported.\">--</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>IDBKeyRange</code> interface of the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB API</a> represents a continuous interval over some data type that is used for keys. Records can be retrieved from object stores and indexes using keys or a range of keys. You can limit the range using lower and upper bounds. For example, you can iterate over all values of a key between x and y.","members":[{"name":"lowerBound","help":"<p>Creates a key range with only a lower bound. By default, it includes the lower endpoint value and is closed.</p>\n<pre>IDBKeyRange lowerBound (\n  in any bound, \n  in optional boolean open\n);\n</pre>\n<div id=\"section_17\"><span id=\"Parameters_3\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>bound</dt> <dd>The value of the lower bound.</dd> <dt>open</dt> <dd><em>Optional</em>. If false (default value), the range includes the lower-bound value.</dd>\n</dl>\n</div><div id=\"section_18\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>IDBKeyRange</code></dt> <dd>The newly created key range.</dd>\n</dl>\n</div><div id=\"section_19\"><span id=\"Exceptions_3\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBObjectStore\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBObjectStore\">DATA_ERR</a></code></dt> <dd>The value parameter was not passed a valid key.</dd>\n</dl>\n</div>","obsolete":false},{"name":"only","help":"<p>Creates a new key range containing a single value.</p>\n<pre>IDBKeyRange only (\n  in any value\n);\n</pre>\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>value</dt> <dd>The single value in the key range.</dd>\n</dl>\n</div><div id=\"section_14\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>IDBKeyRange</code></dt> <dd>The newly created key range.</dd>\n</dl>\n</div><div id=\"section_15\"><span id=\"Exceptions_2\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBObjectStore\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></dt> <dd>The value parameter was not passed a valid key.</dd>\n</dl>\n</div>","obsolete":false},{"name":"bound","help":"<p>Creates a key range with upper and lower bounds. The bounds can be open (that is, the bounds excludes the endpoint values) or closed (that is, the bounds includes the endpoint values). By default, the bounds include the endpoints and are closed.</p>\n<pre>IDBKeyRange bound (\n   in any lower,\n   in any upper, \n   in optional boolean lowerOpen, \n   in optional boolean upperOpen\n);\n</pre>\n<div id=\"section_9\"><span id=\"Parameters\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>lower</dt> <dd>The lower bound of the key range.</dd> <dt>upper</dt> <dd>The upper bound of the key range.</dd> <dt>lowerOpen</dt> <dd><em>Optional</em>. If false (default value), the range includes the lower bound value of the key range.</dd> <dt>upperOpen</dt> <dd><em>Optional</em>. If false (default value), the range includes the upper bound value of the key range.</dd>\n</dl>\n</div><div id=\"section_10\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>IDBKeyRange</code></dt> <dd>The newly created key range.</dd>\n</dl>\n</div><div id=\"section_11\"><span id=\"Exceptions\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBObjectStore\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></dt> <dd>The following conditions raise an exception: <ul> <li>The lower or upper parameters were not passed a valid key.</li> <li>The lower key is greater than the upper key.</li> <li>The lower key and upper key match and either of the bounds are open.</li> </ul> </dd>\n</dl>\n</div>","obsolete":false},{"name":"upperBound","help":"<p>Creates a new upper-bound key range. By default, it includes the upper endpoint value and is closed.</p>\n<pre>IDBKeyRange upperBound (\n  in any bound, \n  in optional boolean open\n);\n</pre>\n<div id=\"section_21\"><span id=\"Parameters_4\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>bound</dt> <dd>The value of the upper bound of the range.</dd> <dt>open</dt> <dd><em>Optional</em>. If false (default value), the range includes the lower-bound value.</dd>\n</dl>\n</div><div id=\"section_22\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>IDBKeyRange</code></dt> <dd>The newly created key range.</dd>\n</dl>\n</div><div id=\"section_23\"><span id=\"Exceptions_4\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBObjectStore\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></dt> <dd>The value parameter was not passed a valid key.</dd>\n</dl>\n</div>","obsolete":false},{"url":"","name":"upperOpen","help":"Returns false if the upper-bound value is included in the key range.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBKeyRange"},"HTMLParagraphElement":{"title":"HTMLParagraphElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/p\">&lt;p&gt;</a></code>\n HTML&nbsp;element","summary":"DOM p (paragraph) objects expose the <a title=\"http://www.w3.org/TR/html5/grouping-content.html#htmlparagraphelement\" class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/html5/grouping-content.html#htmlparagraphelement\" target=\"_blank\">HTMLParagraphElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-84675076\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-84675076\" target=\"_blank\"><code>HTMLParagraphElement</code></a>) interface, which provides special properties (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating div elements. In \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>, this interface inherits from HTMLElement, but defines no additional members.","members":[{"name":"align","help":"Enumerated attribute indicating alignment of the element's contents with respect to the surrounding context.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/HTMLParagraphElement"},"Int16Array":{"title":"Int16Array","srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int16Array","seeAlso":"<li><a class=\" link-https\" title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"<p>The <code>Int16Array</code> type represents an array of twos-complement 16-bit signed integers.</p>\n<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>","constructor":"<div class=\"note\"><strong>Note:</strong> In these methods, <code><em>TypedArray</em></code> represents any of the <a title=\"en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses\">typed array object types</a>.</div>\n<table class=\"standard-table\"> <tbody> <tr> <td><code>Int16Array <a title=\"en/JavaScript typed arrays/Int16Array#Int16Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int16Array#Int16Array()\">Int16Array</a>(unsigned long length);<br> </code></td> </tr> <tr> <td><code>Int16Array </code><code><a title=\"en/JavaScript typed arrays/Int16Array#Int16Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int16Array#Int16Array%28%29\">Int16Array</a></code><code>(<em>TypedArray</em> array);<br> </code></td> </tr> <tr> <td><code>Int16Array </code><code><a title=\"en/JavaScript typed arrays/Int16Array#Int16Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int16Array#Int16Array%28%29\">Int16Array</a></code><code>(sequence&lt;type&gt; array);<br> </code></td> </tr> <tr> <td><code>Int16Array </code><code><a title=\"en/JavaScript typed arrays/Int16Array#Int16Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int16Array#Int16Array%28%29\">Int16Array</a></code><code>(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length);<br> </code></td> </tr> </tbody>\n</table><p>Returns a new <code>Int16Array</code> object.</p>\n<pre>Int16Array Int16Array(\n&nbsp; unsigned long length\n);\n\nInt16Array Int16Array(\n&nbsp; <em>TypedArray</em> array\n);\n\nInt16Array Int16Array(\n&nbsp; sequence&lt;type&gt; array\n);\n\nInt16Array Int16Array(\n&nbsp; ArrayBuffer buffer,\n&nbsp; optional unsigned long byteOffset,\n&nbsp; optional unsigned long length\n);\n</pre>\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>length</code></dt> <dd>The number of elements in the byte array. If unspecified, length of the array view will match the buffer's length.</dd> <dt><code>array</code></dt> <dd>An object of any of the typed array types (such as <code>Int32Array</code>), or a sequence of objects of a particular type, to copy into a new <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>. Each value in the source array is converted to a 16-bit signed integer before being copied into the new array.</dd> <dt><code>buffer</code></dt> <dd>An existing <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> to use as the storage for the new <code>Int16Array</code> object.</dd> <dt><code>byteOffset<br> </code></dt> <dd>The offset, in bytes, to the first byte in the specified buffer for the new view to reference. If not specified, the <code>Int16Array</code>'s view of the buffer will start with the first byte.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>Int16Array</code> object representing the specified data buffer.</p>\n</div>","members":[{"name":"subarray","help":"<p>Returns a new <code>Int16Array</code> view on the <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> store for this <code>Int16Array</code> object.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Int16Array</code> object.</dd> <dt><code>end</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Int16Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Notes_2\"></span><h6 class=\"editable\">Notes</h6>\n<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>\n<div class=\"note\"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>\n</div>","idl":"<pre>Int16Array subarray(\n&nbsp; long begin,\n&nbsp; optional long end\n);\n</pre>","obsolete":false},{"name":"set","help":"<p>Sets multiple values in the typed array, reading input values from a specified array.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>array</code></dt> <dd>An array from which to copy values. All values from the source array are copied into the target array, unless the length of the source array plus the offset exceeds the length of the target array, in which case an exception is thrown. If the source array is a typed array, the two arrays may share the same underlying <code><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>; the browser will intelligently copy the source range of the buffer to the destination range.</dd> <dt>offset \n<span title=\"\">Optional</span>\n</dt> <dd>The offset into the target array at which to begin writing values from the source <code>array</code>. If you omit this value, 0 is assumed (that is, the source <code>array</code> will overwrite values in the target array starting at index 0).</dd>\n</dl>\n</div>","idl":"<pre>void set(\n&nbsp; <em>TypedArray</em> array,\n&nbsp; optional unsigned long offset\n);\n\nvoid set(\n&nbsp; type[] array,\n&nbsp; optional unsigned long offset\n);\n</pre>","obsolete":false},{"name":"BYTES_PER_ELEMENT","help":"The size, in bytes, of each array element.","obsolete":false},{"name":"length","help":"The number of entries in the array. <strong>Read only.</strong>","obsolete":false}]},"FileEntry":{"title":"FileEntry","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>13\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<div><strong>DRAFT</strong> <div>This page is not complete.</div>\n</div>\n<p>The <code>FileEntry</code> interface of the <a title=\"en/DOM/File_API/File_System_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File_API/File_System_API\">FileSystem API</a> represents a file in a file system.</p>","members":[{"name":"createWriter","help":"<p>Creates a new <code>FileWriter</code> associated with the file that the <code>FileEntry</code> represents.</p>\n<pre>void createWriter (\n in FileWriterCallback successCallback, optional ErrorCallback errorCallback\n);</pre> <div id=\"section_4\"><span id=\"Parameter\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id=\"section_5\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl> </div>","obsolete":false},{"name":"file","help":"<p>Returns a File that represents the current state of the file that this <code>FileEntry</code> represents.</p>\n<pre>void file (\n  <em>FileCallback successCallback, optional ErrorCallback errorCallback</em>\n);</pre>\n<div id=\"section_7\"><span id=\"Parameter_2\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id=\"section_8\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/FileEntry"},"NodeIterator":{"title":"NodeIterator","members":[{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NodeIterator.nextNode","name":"nextNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NodeIterator.previousNode","name":"previousNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NodeIterator.detach","name":"detach","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NodeIterator.expandEntityReferences","name":"expandEntityReferences","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NodeIterator.pointerBeforeReferenceNode","name":"pointerBeforeReferenceNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NodeIterator.filter","name":"filter","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NodeIterator.referenceNode","name":"referenceNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NodeIterator.whatToShow","name":"whatToShow","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NodeIterator.root","name":"root","help":""}],"srcUrl":"https://developer.mozilla.org/en/DOM/NodeIterator","specification":"DOM Level 2 Traversal: NodeIterator"},"SVGPathSegClosePath":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"FileWriterCallback":{"title":"FileEntrySync","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/FileEntrySync","skipped":true,"cause":"Suspect title"},"CanvasRenderingContext":{"title":"Interface Compatibility","members":[],"srcUrl":"https://developer.mozilla.org/En/Developer_Guide/Interface_Compatibility","skipped":true,"cause":"Suspect title"},"Uint32Array":{"title":"Uint32Array","srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint32Array","seeAlso":"<li><a title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" class=\" link-https\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"<p>The <code>Uint32Array</code> type represents an array of 32-bit unsigned integers.</p>\n<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>","constructor":"<div class=\"note\"><strong>Note:</strong> In these methods, <code><em>TypedArray</em></code> represents any of the <a title=\"en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses\">typed array object types</a>.</div>\n<table class=\"standard-table\"> <tbody> <tr> <td><code>Uint32Array <a title=\"en/JavaScript typed arrays/Uint32Array#Uint32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint32Array#Uint32Array()\">Uint32Array</a>(unsigned long length);<br> </code></td> </tr> <tr> <td><code>Uint32Array </code><code><a title=\"en/JavaScript typed arrays/Uint32Array#Uint32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint32Array#Uint32Array%28%29\">Uint32Array</a></code><code>(<em>TypedArray</em> array);<br> </code></td> </tr> <tr> <td><code>Uint32Array </code><code><a title=\"en/JavaScript typed arrays/Uint32Array#Uint32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint32Array#Uint32Array%28%29\">Uint32Array</a></code><code>(sequence&lt;type&gt; array);<br> </code></td> </tr> <tr> <td><code>Uint32Array </code><code><a title=\"en/JavaScript typed arrays/Uint32Array#Uint32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint32Array#Uint32Array%28%29\">Uint32Array</a></code><code>(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length);<br> </code></td> </tr> </tbody>\n</table><p>Returns a new <code>Uint32Array</code> object.</p>\n<pre>Uint32Array Uint32Array(\n&nbsp; unsigned long length\n);\n\nUint32Array Uint32Array(\n&nbsp; <em>TypedArray</em> array\n);\n\nUint32Array Uint32Array(\n&nbsp; sequence&lt;type&gt; array\n);\n\nUint32Array Uint32Array(\n&nbsp; ArrayBuffer buffer,\n&nbsp; optional unsigned long byteOffset,\n&nbsp; optional unsigned long length\n);\n</pre>\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>length</code></dt> <dd>The number of elements in the byte array. If unspecified, length of the array view will match the buffer's length.</dd> <dt><code>array</code></dt> <dd>An object of any of the typed array types (such as <code>Int16Array</code>), or a sequence of objects of a particular type, to copy into a new <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>. Each value in the source array is converted to a 32-bit unsigned integer before being copied into the new array.</dd> <dt><code>buffer</code></dt> <dd>An existing <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> to use as the storage for the new <code>Uint32Array</code> object.</dd> <dt><code>byteOffset<br> </code></dt> <dd>The offset, in bytes, to the first byte in the specified buffer for the new view to reference. If not specified, the <code>Uint32Array</code>'s view of the buffer will start with the first byte.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>Uint32Array</code> object representing the specified data buffer.</p>\n</div>","members":[{"name":"subarray","help":"<p>Returns a new <code>Uint32Array</code> view on the <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> store for this <code>Uint32Array</code> object.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Uint32Array</code> object.</dd> <dt><code>end</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Uint32Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Notes_2\"></span><h6 class=\"editable\">Notes</h6>\n<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>\n<div class=\"note\"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>\n</div>","idl":"<pre>Uint32Array subarray(\n&nbsp; long begin,\n&nbsp; optional long end\n);\n</pre>","obsolete":false},{"name":"set","help":"<p>Sets multiple values in the typed array, reading input values from a specified array.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>array</code></dt> <dd>An array from which to copy values. All values from the source array are copied into the target array, unless the length of the source array plus the offset exceeds the length of the target array, in which case an exception is thrown. If the source array is a typed array, the two arrays may share the same underlying <code><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>; the browser will intelligently copy the source range of the buffer to the destination range.</dd> <dt>offset \n<span title=\"\">Optional</span>\n</dt> <dd>The offset into the target array at which to begin writing values from the source <code>array</code>. If you omit this value, 0 is assumed (that is, the source <code>array</code> will overwrite values in the target array starting at index 0).</dd>\n</dl>\n</div>","idl":"<pre>void set(\n&nbsp; <em>TypedArray</em> array,\n&nbsp; optional unsigned long offset\n);\n\nvoid set(\n&nbsp; type[] array,\n&nbsp; optional unsigned long offset\n);\n</pre>","obsolete":false},{"name":"BYTES_PER_ELEMENT","help":"The size, in bytes, of each array element.","obsolete":false},{"name":"length","help":"The number of entries in the array. <strong>Read only.</strong>","obsolete":false}]},"NodeFilter":{"title":"NodeFilter","examples":["<pre name=\"code\" class=\"js\">var nodeIterator = document.createNodeIterator(\n  // Node to use as root\n  document.getElementById('someId'),\n\n  // Onlly consider nodes that are text nodes (nodeType 3)\n  NodeFilter.SHOW_TEXT,\n\n  // Object containing the function to use for the acceptNode method\n  // of the NodeFilter\n    { acceptNode: function(node) {\n      // Logic to determine whether to accept, reject or skip node\n      // In this case, only accept nodes that have content\n      // other than whitespace\n      if ( ! /^\\s*$/.test(node.data) ) {\n        return NodeFilter.FILTER_ACCEPT;\n      }\n    }\n  },\n  false\n);\n\n// Show the content of every non-empty text node that is a child of root\nvar node;\n\nwhile ((node = iterator.nextNode())) {\n  alert(node.data);\n}</pre>\n        \n<p>Note that in order for the iterator to accept a node, the <a href=\"#acceptNode\">acceptNode</a> function must return <a href=\"#FILTER_ACCEPT\">NodeFilter.FILTER_ACCEPT</a>.</p>"],"members":[{"obsolete":false,"url":"","name":"acceptNode","help":"The accept node method used by the filter is supplied as an object property when constructing the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/NodeIterator\">NodeIterator</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TreeWalker\">TreeWalker</a></code>\n."},{"name":"SHOW_ALL","help":"Shows all nodes.","obsolete":false},{"name":"SHOW_ATTRIBUTE","help":"Shows attribute <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Attr\">Attr</a></code>\n nodes. This is meaningful only when creating a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/NodeIterator\">NodeIterator</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TreeWalker\">TreeWalker</a></code>\n with an <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Attr\">Attr</a></code>\n node as its root; in this case, it means that the attribute node will appear in the first position of the iteration or traversal. Since attributes are never children of other nodes, they do not appear when traversing over the document tree.","obsolete":false},{"name":"SHOW_CDATA_SECTION","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/CDATASection\">CDATASection</a></code>\n&nbsp;nodes.","obsolete":false},{"name":"SHOW_COMMENT","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Comment\">Comment</a></code>\n&nbsp;nodes.","obsolete":false},{"name":"SHOW_DOCUMENT","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Document\">Document</a></code>\n&nbsp;nodes.","obsolete":false},{"name":"SHOW_DOCUMENT_FRAGMENT","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DocumentFragment\">DocumentFragment</a></code>\n&nbsp;nodes.","obsolete":false},{"name":"SHOW_DOCUMENT_TYPE","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DocumentType\">DocumentType</a></code>\n&nbsp;nodes.","obsolete":false},{"name":"SHOW_ELEMENT","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Element\">Element</a></code>\n&nbsp;nodes.","obsolete":false},{"name":"SHOW_ENTITY","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Entity\">Entity</a></code>\n&nbsp;nodes. This is meaningful only when creating a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/NodeIterator\">NodeIterator</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TreeWalker\">TreeWalker</a></code>\n with an <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Entity\">Entity</a></code>\n node as its root; in this case, it means that the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Entity\">Entity</a></code>\n node will appear in the first position of the traversal. Since entities are not part of the document tree, they do not appear when traversing over the document tree.","obsolete":false},{"name":"SHOW_ENTITY_REFERENCE","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/EntityReference\">EntityReference</a></code>\n&nbsp;nodes.","obsolete":false},{"name":"SHOW_NOTATION","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Notation\">Notation</a></code>\n nodes. This is meaningful only when creating a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/NodeIterator\">NodeIterator</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TreeWalker\">TreeWalker</a></code>\n with a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Notation\">Notation</a></code>\n node as its root; in this case, it means that the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Notation\">Notation</a></code>\n node will appear in the first position of the traversal. Since entities are not part of the document tree, they do not appear when traversing over the document tree.","obsolete":false},{"name":"SHOW_PROCESSING_INSTRUCTION","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/ProcessingInstruction\">ProcessingInstruction</a></code>\n&nbsp;nodes.","obsolete":false},{"name":"SHOW_TEXT","help":"Shows <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Text\">Text</a></code>\n&nbsp;nodes.","obsolete":false},{"url":"","name":"FILTER_ACCEPT","help":"Value returned by the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/NodeFilter.acceptNode\" class=\"new\">NodeFilter.acceptNode()</a></code>\n method when a node should be accepted.","obsolete":false},{"name":"FILTER_REJECT","help":"Value to be returned by the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/NodeFilter.acceptNode\" class=\"new\">NodeFilter.acceptNode()</a></code>\n method when a node should be rejected. The children of rejected nodes are not visited by the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/NodeIterator\">NodeIterator</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TreeWalker\">TreeWalker</a></code>\n object; this value is treated as \"skip this node and all its children\".","obsolete":false},{"name":"FILTER_SKIP","help":"Value to be returned by <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/NodeFilter.acceptNode\" class=\"new\">NodeFilter.acceptNode()</a></code>\n for nodes to be skipped by the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/NodeIterator\">NodeIterator</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TreeWalker\">TreeWalker</a></code>\n object. The children of skipped nodes are still considered. This is treated as \"skip this node but not its children\".","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/NodeFilter","specification":"DOM Level 2 Traversal: NodeFilter"},"WebKitCSSKeyframeRule":{"title":"CSSRule","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/cssRule","skipped":true,"cause":"Suspect title"},"RGBColor":{"title":"color value","members":[],"srcUrl":"https://developer.mozilla.org/en/CSS/color_value","skipped":true,"cause":"Suspect title"},"CanvasRenderingContext2D":{"title":"CanvasRenderingContext2D","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td colspan=\"6\">Methods</td> </tr> <tr> <td><code>arc()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>arcTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>beginPath()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>bezierCurveTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>clearRect()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>clip()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>closePath()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>createImageData()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.5 (1.9.1)</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>createLinearGradient()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>createPattern()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>createRadialGradient()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>drawImage()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>drawCustomFocusRing()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>\n<span class=\"unimplementedInlineTemplate\">Unimplemented (see<a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=540456\" class=\"external\" title=\"\">\nbug 540456</a>\n)</span>\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>drawSystemFocusRing()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>\n<span class=\"unimplementedInlineTemplate\">Unimplemented (see<a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=540456\" class=\"external\" title=\"\">\nbug 540456</a>\n)</span>\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>fill()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>fillRect()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>fillText()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.5 (1.9.1)</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>getImageData()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>isPointInPath()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>lineTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>measureText()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.5 (1.9.1)</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>moveTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>putImageData()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>quadraticCurveTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>rect()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>restore()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>rotate()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>save()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>scale()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>scrollPathIntoView()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>setTransform()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.0 (1.9.0)</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>stroke()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>strokeRect()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>strokeText()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.5 (1.9.1)</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>transform()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.0 (1.9.0)</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>translate()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td colspan=\"6\">Attributes</td> </tr> <tr> <td><code>canvas</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>fillstyle</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>font</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>globalAlpha</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>globalCompositeOperation</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>lineCap</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>lineJoin</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>lineWidth</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>miterLimit</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>shadowBlur</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>shadowColor</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>shadowOffsetX</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>shadowOffsetY</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>strokeStyle</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>textAlign</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>textBaseLine</code></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td colspan=\"6\">Methods</td> </tr> <tr> <td><code>arc()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>arcTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>beginPath()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>bezierCurveTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>clearRect()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>clip()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>closePath()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>createImageData()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>createLinearGradient()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>createPattern()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>createRadialGradient()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>drawImage()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>drawCustomFocusRing()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>drawSystemFocusRing()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>fill()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>fillRect()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>fillText()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>getImageData()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>isPointInPath()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>lineTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>measureText()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>moveTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>putImageData()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>quadraticCurveTo()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>rect()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>restore()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>rotate()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>save()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>scale()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>scrollPathIntoView()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>setTransform()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>stroke()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>strokeRect()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>strokeText()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>transform()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>translate()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td colspan=\"6\">Attributes</td> </tr> <tr> <td><code>canvas</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>fillstyle</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>font</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>globalAlpha</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>globalCompositeOperation</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>lineCap</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>lineJoin</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>lineWidth</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>miterLimit</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>shadowBlur</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>shadowColor</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>shadowOffsetX</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>shadowOffsetY</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>strokeStyle</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>textAlign</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>textBaseLine</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D","specification":"http://www.whatwg.org/specs/web-apps...eringcontext2d","summary":"The bulk of the operations available at present with <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/canvas\">&lt;canvas&gt;</a></code>\n are available through this interface, returned by a call to <code>getContext()</code> on the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/canvas\">&lt;canvas&gt;</a></code>\n element, with \"2d\" as its argument.","members":[{"name":"measureText","help":"","idl":"<pre class=\"eval\">nsIDOMTextMetrics measureText(\n  in DOMString text\n);\n</pre>","obsolete":false},{"name":"rotate","help":"","idl":"<pre class=\"eval\">void rotate(\n  in float angle\n);\n</pre>","obsolete":false},{"name":"arcTo","help":"<p>Adds an arc with the given control points and radius, connected to the previous point by a straight line.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>x1</code></dt> <dd></dd> <dt><code>y1</code></dt> <dd></dd> <dt><code>x2</code></dt> <dd></dd> <dt><code>y2</code></dt> <dd></dd> <dt><code>radius</code></dt> <dd>The arc's radius.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void arcTo(\n  in float x1,\n  in float y1,\n  in float x2,\n  in float y2,\n  in float radius\n);\n</pre>","obsolete":false},{"name":"transform","help":"","idl":"<pre class=\"eval\">void transform(\n  in float m11,\n  in float m12,\n  in float m21,\n  in float m22,\n  in float dx,\n  in float dy\n);\n</pre>","obsolete":false},{"name":"save","help":"Saves the current drawing style state using a stack so you can revert any change you make to it using restore().","idl":"<pre class=\"eval\">void save();\n</pre>","obsolete":false},{"name":"beginPath","help":"","idl":"<pre class=\"eval\">void beginPath();\n</pre>","obsolete":false},{"name":"strokeRect","help":"<p>Paints a rectangle which it starting point is at <em>(x, y)</em> and has a<em> w</em> width and a <em>h</em> height onto the canvas, using the current stroke style.</p>\n\n<div id=\"section_88\"><span id=\"Parameters_33\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>x</code></dt> <dd>The x axis for the starting point of the rectangle.</dd> <dt><code>y</code></dt> <dd>The y axis for the starting point of the rectangle.</dd> <dt><code>w</code></dt> <dd>The rectangle's width.</dd> <dt><code>h</code></dt> <dd>The rectangle's height.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void strokeRect(\n  in float x,\n  in float y,\n  in float w,\n  in float h\n);\n</pre>","obsolete":false},{"name":"createLinearGradient","help":"","idl":"<pre class=\"eval\">nsIDOMCanvasGradient createLinearGradient(\n  in float x0,\n  in float y0,\n  in float x1,\n  in float y1\n);\n</pre>","obsolete":false},{"name":"arc","help":"<p>Adds an arc to the path which it center is at <em>(x, y)</em> position with radius<em> r</em> starting at <em>startAngle</em> and ending at <em>endAngle</em> going in the given direction by <em>anticlockwise</em> (defaulting to clockwise).</p>\n\n<div id=\"section_11\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>x</code></dt> <dd>The x axis of the coordinate for the arc's center</dd> <dt><code>y</code></dt> <dd>The y axis of the coordinate for the arc's center.</dd> <dt><code>radius</code></dt> <dd>The arc's radius</dd> <dt><code>startAngle</code></dt> <dd>The starting point, measured from the x axis , from which it will be drawed expressed as radians.</dd> <dt><code>endAngle</code></dt> <dd>The end arc's angle to which it will be drawed expressed as radians.</dd> <dt><code>anticlockwise</code> \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Optional from Gecko 2.0</span>\n</dt> <dd>When <code>true</code> draws the arc anticlockwise, otherwise in a clockwise direction.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void arc(\n  in float x,\n  in float y,\n  in float radius,\n  in float startAngle,\n  in float endAngle,\n  in boolean anticlockwise [optional]\n);\n</pre>","obsolete":false},{"name":"bezierCurveTo","help":"","idl":"<pre class=\"eval\">void bezierCurveTo(\n  in float cp1x,\n  in float cp1y,\n  in float cp2x,\n  in float cp2y,\n  in float x,\n  in float y\n);\n</pre>","obsolete":false},{"name":"closePath","help":"","idl":"<pre class=\"eval\">void closePath();\n</pre>","obsolete":false},{"name":"drawSystemFocusRing","help":"","idl":"<pre class=\"eval\">void drawSystemFocusRing(Element element);\n</pre>","obsolete":false},{"name":"scale","help":"","idl":"<pre class=\"eval\">void scale(\n  in float x,\n  in float y\n);\n</pre>","obsolete":false},{"name":"createRadialGradient","help":"","idl":"<pre class=\"eval\">nsIDOMCanvasGradient createRadialGradient(\n  in float x0,\n  in float y0,\n  in float r0,\n  in float x1,\n  in float y1,\n  in float r1\n);\n</pre>","obsolete":false},{"name":"lineTo","help":"<p>Connects the last point in the subpath to the <code>x, y</code> coordinates with a straight line.</p>\n\n<div id=\"section_60\"><span id=\"Parameters_20\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>x</code></dt> <dd>The x axis of the coordinate for the end of the line.</dd> <dt><code>y</code></dt> <dd>The y axis of the coordinate for the end of the line.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void lineTo(\n  in float x,\n  in float y\n);\n</pre>","obsolete":false},{"name":"translate","help":"<p>Moves the origin point of the context to (x, y).</p>\n\n<div id=\"section_94\"><span id=\"Parameters_36\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>x</code></dt> <dd>The x axis for the point to be considered as the origin.</dd> <dt><code>y</code></dt> <dd>The x axis for the point to be considered as the origin.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void translate(\n  in float x,\n  in float y\n);\n</pre>","obsolete":false},{"name":"moveTo","help":"<p>Moves the starting point of a new subpath to the <strong>(x, y)</strong> coordinates.</p>\n\n<div id=\"section_65\"><span id=\"Parameters_22\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>x</code></dt> <dd>The x axis of the point.</dd> <dt><code>y</code></dt> <dd>The y axis of the point.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void moveTo(\n  in float x,\n  in float y\n);\n</pre>","obsolete":false},{"name":"scrollPathIntoView","help":"","idl":"<pre class=\"eval\">void scrollPathIntoView();\n</pre>","obsolete":false},{"name":"restore","help":"Restores the drawing style state to the last element on the 'state stack' saved by save()","idl":"<pre class=\"eval\">void restore();\n</pre>","obsolete":false},{"name":"createImageData","help":"","idl":"<pre class=\"eval\">void createImageData(in float width, in float height);\nImageData createImageData(ImageData imagedata);\n</pre>","obsolete":false},{"name":"createPattern","help":"<div id=\"section_31\"><span id=\"Parameters_10\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>image</code></dt> <dd>A DOM <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a></code>\n to use as the source image for the pattern. This can be any element, although typically you'll use an <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Image\" class=\"new\">Image</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/canvas\">&lt;canvas&gt;</a></code>\n.</dd> <dt><code>repetition</code></dt> <dd>?</dd>\n</dl>\n</div><div id=\"section_32\"><span id=\"Return_value_3\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new DOM canvas pattern object for use in pattern-based operations.</p>\n</div><div id=\"section_33\"><span id=\"Exceptions_thrown\"></span><h6 class=\"editable\">Exceptions thrown</h6>\n<dl> <dt><code>NS_ERROR_DOM_INVALID_STATE_ERR</code> \n<span title=\"(Firefox 10.0 / Thunderbird 10.0)\n\">Requires Gecko 10.0</span>\n</dt> <dd>The specified <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/canvas\">&lt;canvas&gt;</a></code>\n element for the <code>image</code> parameter is zero-sized (that is, one or both of its dimensions are 0 pixels).</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">nsIDOMCanvasPattern createPattern(\n  in nsIDOMHTMLElement image,\n  in DOMString repetition\n);\n</pre>","obsolete":false},{"name":"putImageData","help":"<h6 class=\"editable\">Compatibility notes</h6>\n<ul> <li>Starting in Gecko 10.0 (Firefox 10.0 / Thunderbird 10.0)\n, non-finite values to any of these parameters causes the call to putImageData() to be silently ignored, rather than throwing an exception.</li>\n</ul>","idl":"<pre class=\"eval\">void putImageData(\n  in long x,\n  in long y,\n  in unsigned long width,\n  in unsigned long height,\n  [array, size_is(dataLen)] in octet dataPtr,\n  in unsigned long dataLen,\n  in boolean hasDirtyRect,\n  in long dirtyX, [optional]\n  in long dirtyY, [optional]\n  in long dirtyWidth, [optional]\n  in long dirtyHeight [optional]\n);\n</pre>","obsolete":false},{"name":"clearRect","help":"<p>Clears the rectangle defined by it starting point at <em>(x, y)</em> and has a <em>w</em> width and a <em>h</em> height.</p>\n\n<div id=\"section_19\"><span id=\"Parameters_5\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>x</code></dt> <dd>The x axis of the coordinate for the rectangle starting point.</dd> <dt><code>y</code></dt> <dd>The y axis of the coordinate for the rectangle starting point.</dd> <dt><code>width</code></dt> <dd>The rectangle's width.</dd> <dt><code>height</code></dt> <dd>The rectangle's height.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void clearRect(\n  in float x,\n  in float y,\n  in float width,\n  in float height\n);\n</pre>","obsolete":false},{"name":"fill","help":"Fills the subpaths with the current fill style.","idl":"<pre class=\"eval\">void fill();\n</pre>","obsolete":false},{"name":"clip","help":"","idl":"<pre class=\"eval\">void clip();\n</pre>","obsolete":false},{"name":"rect","help":"","idl":"<pre class=\"eval\">void rect(\n  in float x,\n  in float y,\n  in float w,\n  in float h\n);\n</pre>","obsolete":false},{"name":"drawCustomFocusRing","help":"","idl":"<pre class=\"eval\">boolean drawCustomFocusRing(Element element);\n</pre>","obsolete":false},{"name":"stroke","help":"Strokes the subpaths with the current stroke style.","idl":"<pre class=\"eval\">void stroke();\n</pre>","obsolete":false},{"name":"setTransform","help":"","idl":"<pre class=\"eval\">void setTransform(\n  in float m11,\n  in float m12,\n  in float m21,\n  in float m22,\n  in float dx,\n  in float dy\n);\n</pre>","obsolete":false},{"name":"fillText","help":"","idl":"<pre class=\"eval\">void fillText(\n  in DOMString text,\n  in float x,\n  in float y,\n  in float maxWidth [optional]\n);\n</pre>","obsolete":false},{"name":"getImageData","help":"<p>Returns an <code><a class=\"external\" rel=\"external\" href=\"http://dev.w3.org/html5/2dcontext/Overview.html#imagedata\" title=\"http://dev.w3.org/html5/2dcontext/Overview.html#imagedata\" target=\"_blank\">ImageData</a></code> object representing the underlying pixel data for the area of the canvas denoted by the rectangle which starts at <em>(sx, sy)</em> and has a <em>sw</em> width and <em>sh</em> height.</p>\n\n<div id=\"section_53\"><span id=\"Parameters_18\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>sx</code></dt> <dd>The x axis of the coordinate for the rectangle startpoint from which the ImageData will be extracted.</dd> <dt><code>sy</code></dt> <dd>The x axis of the coordinate for the rectangle endpoint from which the ImageData will be extracted.</dd> <dt><code>sw</code></dt> <dd>The width of the rectangle from which the ImageData will be extracted.</dd> <dt><code>sh</code></dt> <dd>The height of the rectangle from which the ImageData will be extracted.</dd>\n</dl>\n</div><div id=\"section_54\"><span id=\"Return_value_6\"></span><h6 class=\"editable\">Return value</h6>\n<p>Returns an <code><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/2011/WD-2dcontext-20110405/#imagedata\" title=\"http://www.w3.org/TR/2011/WD-2dcontext-20110405/#imagedata\" target=\"_blank\">ImageData</a></code> object containing the image data for the given rectangle of the canvas.</p>\n</div>","idl":"<pre class=\"eval\">void getImageData(   \n  in double sx, \n  in double sy, \n  in double sw, \n  in double sh\n);\n</pre>","obsolete":false},{"name":"drawImage","help":"<p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>\n\n<div id=\"section_41\"><span id=\"Parameters_13\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/img\">&lt;img&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/canvas\">&lt;canvas&gt;</a></code>\n, and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video\">&lt;video&gt;</a></code>\n). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>\n</dl>\n<p>The diagram below illustrates the meanings of the various parameters.</p>\n<p><img alt=\"drawImage.png\" class=\"internal default\" src=\"https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png\"></p>\n</div><div id=\"section_42\"><span id=\"Exceptions_thrown_2\"></span><h6 class=\"editable\">Exceptions thrown</h6>\n<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>\n</dl>\n</div><div id=\"section_43\"><span id=\"Compatibility_notes\"></span><h6 class=\"editable\">Compatibility notes</h6>\n<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n now correctly supports CORS for drawing images across domains without <a title=\"en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F\">tainting the canvas</a>.</li>\n</ul>\n</div>","idl":"<pre class=\"eval\">void drawImage(\n  in nsIDOMElement image,\n  in float dx,\n  in float dy\n);\n\nvoid drawImage(\n  in nsIDOMElement image,\n  in float dx,\n  in float dy,\n  in float sw,\n  in float sh\n);\n\nvoid drawImage(\n  in nsIDOMElement image,\n  in float sx,\n  in float sy,\n  in float sw,\n  in float sh,\n  in float dx, \n  in float dy,\n  in float dw,\n  in float dh\n);\n</pre>","obsolete":false},{"name":"fillRect","help":"<p>Draws a filled rectangle at <em>(x, y) </em>position whose size is determined by <em>width</em> and <em>height</em>.</p>\n\n<div id=\"section_49\"><span id=\"Parameters_16\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>x</code></dt> <dd>The x axis of the coordinate for the rectangle starting point.</dd> <dt><code>y</code></dt> <dd>The y axis of the coordinate for the rectangle starting point.</dd> <dt><code>width</code></dt> <dd>The rectangle's width.</dd> <dt><code>height</code></dt> <dd>The rectangle's height.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void fillRect(\n  in float x,\n  in float y,\n  in float width,\n  in float height\n);\n</pre>","obsolete":false},{"name":"isPointInPath","help":"<p>Reports whether or not the specified point is contained in the current path.</p>\n\n<div id=\"section_56\"><span id=\"Parameters_19\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>x</code></dt> <dd>The X coordinate of the point to check.</dd> <dt><code>y</code></dt> <dd>The Y coordinate of the point to check.</dd>\n</dl>\n</div><div id=\"section_57\"><span id=\"Return_value_7\"></span><h6 class=\"editable\">Return value</h6>\n<p><code>true</code> if the specified point is contained in the current path; otherwise <code>false</code>.</p>\n</div><div id=\"section_58\"><span id=\"Compatibility_notes_2\"></span><h6 class=\"editable\">Compatibility notes</h6>\n<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n, this method incorrectly failed to multiply the specified point's coordinates by the current transformation matrix before comparing it to the path. Now this method works correctly even if the context is rotated, scaled, or otherwise transformed.</li>\n</ul>\n</div>","idl":"<pre class=\"eval\">boolean isPointInPath(\n  in float x,\n  in float y\n);\n</pre>","obsolete":false},{"name":"strokeText","help":"","idl":"<pre class=\"eval\">void strokeText(\n  in DOMString text,\n  in float x,\n  in float y,\n  in float maxWidth [optional]\n);\n</pre>","obsolete":false},{"name":"quadraticCurveTo","help":"","idl":"<pre class=\"eval\">void quadraticCurveTo(\n  in float cpx,\n  in float cpy,\n  in float x,\n  in float y\n);\n</pre>","obsolete":false},{"name":"DRAWWINDOW_DRAW_CARET","help":"Show the caret if appropriate when drawing. \n<span title=\"(Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n\">Requires Gecko 1.9.1</span>","obsolete":false},{"name":"DRAWWINDOW_DO_NOT_FLUSH","help":"Do not flush pending layout notifications that could otherwise be batched up. \n<span title=\"(Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n\">Requires Gecko 1.9.1</span>","obsolete":false},{"name":"DRAWWINDOW_DRAW_VIEW","help":"Draw scrollbars and scroll the viewport if they are present. \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false},{"name":"DRAWWINDOW_USE_WIDGET_LAYERS","help":"Use the widget layer manager if available. This means hardware acceleration may be used, but it might actually be slower or lower quality than normal. It will however more accurately reflect the pixels rendered to the screen. \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Requires Gecko 2.0</span>","obsolete":false},{"name":"DRAWWINDOW_ASYNC_DECODE_IMAGES","help":"Do not synchronously decode images - draw what we have. \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Requires Gecko 2.0</span>","obsolete":false},{"name":"canvas","help":"Back-reference to the canvas element for which this context was created. <strong>Read only.</strong>","obsolete":false},{"name":"fillStyle","help":"Color or style to use inside shapes. Default <code>#000</code> (black).","obsolete":false},{"name":"font","help":"Default value <code>10px sans-serif</code>.","obsolete":false},{"name":"globalAlpha","help":"Alpha value that is applied to shapes and images before they are composited onto the canvas. Default <code>1.0</code> (opaque).","obsolete":false},{"name":"globalCompositeOperation","help":"With <code>globalAplpha</code> applied this sets how shapes and images are drawn onto the existing bitmap. Possible values: <ul> <li><code>source-atop</code></li> <li><code>source-in</code></li> <li><code>source-out</code></li> <li><code>source-over</code> (default)</li> <li><code>destination-atop</code></li> <li><code>destination-in</code></li> <li><code>destination-out</code></li> <li><code>destination-over</code></li> <li><code>lighter</code></li> <li><code>xor</code></li> </ul>","obsolete":false},{"name":"lineCap","help":"Type of endings on the end of lines. Possible values: <code>butt</code> (default), <code>round</code>, <code>square</code>","obsolete":false},{"name":"lineJoin","help":"Defines the type of corners where two lines meet. Possible values: <code>round</code>, <code>bevel</code>, <code>miter</code> (default)","obsolete":false},{"name":"lineWidth","help":"Width of lines. Default <code>1.0</code>","obsolete":false},{"name":"miterLimit","help":"Default <code>10</code>.","obsolete":false},{"name":"shadowBlur","help":"Specifies the blurring effect. Default <code>0</code>","obsolete":false},{"name":"shadowColor","help":"Color of the shadow. Default fully-transparent black.","obsolete":false},{"name":"shadowOffsetX","help":"Horizontal distance the shadow will be offset. Default 0.","obsolete":false},{"name":"shadowOffsetY","help":"Vertical distance the shadow will be offset. Default 0.","obsolete":false},{"name":"strokeStyle","help":"Color or style to use for the lines around shapes. Default <code>#000</code> (black).","obsolete":false},{"name":"textAlign","help":"Possible values: <code>start</code> (default), <code>end</code>, <code>left</code>, <code>right</code> or <code>center</code>.","obsolete":false},{"name":"textBaseLine","help":"Possible values: <code>top</code>, <code>hanging</code>, <code>middle</code>, <code>alphabetic</code> (default), <code>ideographic</code>, <code>bottom</code>","obsolete":false},{"name":"webkitCurrentTransform","help":"Sets or gets the current transformation matrix. \n<span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Requires Gecko 7.0</span>","obsolete":false},{"name":"webkitCurrentTransformInverse","help":"Set or gets the current inversed transformation matrix. \n<span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Requires Gecko 7.0</span>","obsolete":false},{"name":"webkitDash","help":"An array which specifies the lengths of alternating dashes and gaps. \n<span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Requires Gecko 7.0</span>","obsolete":false},{"name":"webkitDashOffset","help":"Specifies where to start a dasharray on a line. \n<span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Requires Gecko 7.0</span>","obsolete":false},{"name":"webkitFillRule","help":"The <a class=\"external\" title=\"http://cairographics.org/manual/cairo-cairo-t.html#cairo-fill-rule-t\" rel=\"external\" href=\"http://cairographics.org/manual/cairo-cairo-t.html#cairo-fill-rule-t\" target=\"_blank\">fill rule</a> to use. This must be one of <code>evenodd</code> or <code>nonzero</code> (default).","obsolete":false},{"name":"webkitImageSmoothingEnabled","help":"Image smoothing mode; if disabled, images will not be smoothed if scaled. \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false},{"name":"webkitTextStyle","help":"<span title=\"(Firefox 3)\n\">Requires Gecko 1.9</span>\n \n\n<span class=\"deprecatedInlineTemplate\" title=\"\">Deprecated</span>\n\n Deprecated in favor of the HTML5 <code>font</code> attribute described above.","obsolete":true},{"name":"webkitLineDash","help":"An array which specifies the lengths of alternating dashes and gaps.","obsolete":false},{"name":"webkitLineDashOffset","help":"Specifies where to start a dasharray on a line.","obsolete":false}]},"StyleMedia":{"title":"style.media","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/style.media","skipped":true,"cause":"Suspect title"},"PerformanceTiming":{"title":"Navigation Timing","members":[],"srcUrl":"https://developer.mozilla.org/en/Navigation_timing","skipped":true,"cause":"Suspect title"},"DOMSettableTokenList":{"title":"HTMLOutputElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLOutputElement","skipped":true,"cause":"Suspect title"},"SVGDescElement":{"title":"SVGDescElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGDescElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/desc\">&lt;desc&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGDescElement"},"HTMLEmbedElement":{"title":"HTMLEmbedElement","summary":"<strong>Note:</strong>&nbsp;This topic describes the HTMLEmbedElement interface as defined in the HTML5 standard. It does not address earlier, non-standardized version of the interface.","members":[{"name":"height","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/embed#attr-height\">height</a></code>\n HTML&nbsp;attribute, containing the displayed height of the resource.","obsolete":false},{"name":"src","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/embed#attr-src\">src</a></code>\n HTML&nbsp;attribute, containing the address of the resource.","obsolete":false},{"name":"type","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/embed#attr-type\">type</a></code>\n HTML&nbsp;attribute, containing the type of the resource.","obsolete":false},{"name":"width","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/embed#attr-width\">width</a></code>\n HTML&nbsp;attribute, containing the displayed width of the resource.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLEmbedElement"},"CharacterData":{"title":"CharacterData","summary":"<code><a title=\"En/DOM/Text\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Text\">Text</a></code>, <code><a title=\"En/DOM/Comment\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Comment\">Comment</a></code>, and <code><a title=\"en/DOM/CDATASection\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CDATASection\">CDATASection</a></code> all implement CharacterData, which in turn also implements <code><a class=\"internal\" title=\"En/DOM/Node\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>. See <code>Node</code> for the remaining methods, properties, and constants.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/CharacterData.data","name":"data","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/CharacterData.length","name":"length","help":""}],"srcUrl":"https://developer.mozilla.org/En/DOM/CharacterData","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...ml#ID-FF21A306"},"IDBFactory":{"title":"IDBFactory","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td><code>open()</code> old specification</td> <td>12\n<span title=\"prefix\">webkit</span></td> <td>4.0 (2.0)\n\n<span title=\"prefix\">moz</span> until 9.0 (9.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>open()</code> new specification</td> <td><span title=\"Not supported.\">--</span></td> <td>10.0 (10.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>cmp ()</code></td> <td>16\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>deleteDatabase()</code></td> <td>17\n<span title=\"prefix\">webkit</span></td> <td>10.0 (10.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["<p>In the following code snippet, we open a database asynchronously and make a request. Event handlers are registered for responding to various situations.</p>\n\n          <pre name=\"code\" class=\"js\">// Taking care of the browser-specific prefixes.\nif ('webkitIndexedDB' in window) {\n   window.indexedDB = window.webkitIndexedDB;   \n} else if ('mozIndexedDB' in window) {\n   window.indexedDB = window.mozIndexedDB;\n... \n\n//Open a database called myAwesomeDatabase\nvar request = window.indexedDB.open('myAwesomeDatabase');\n//When a success event happens, do something.\nrequest.onsuccess = function(event) {\n        var db = this.result;\n        var transaction = db.transaction([], IDBTransaction.READ_ONLY);\n        var curRequest = transaction.objectStore('ObjectStore Name').openCursor();\n        curRequest.onsuccess = ...;\n    };\n//When an error event happens, do something else.\nrequest.onerror = function(event) {\n         ...;\n    };</pre>"],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBFactory","summary":"<p>The <code>IDBFactory</code> interface of the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB&nbsp;API</a> lets applications asynchronously access the indexed databases. The object that implements the interface is&nbsp; <code>window.indexedDB</code>. You open—that is, create and access—and delete a database with the object and not directly with <code>IDBFactory</code>.</p>\n<p>This interface still has vendor prefixes, that is to say, you have to make calls with <code>mozIndexedDB.open()</code> for Firefox and <code>webkitIndexedDB.open()</code> for Chrome.</p>","members":[{"name":"open","help":"<div class=\"warning\"><strong>Warning:</strong> The description documents the old specification. Some browsers still implement this method. The specifications have changed, but the changes have not yet been implemented by all browser. See the compatibility table for more information.</div>\n<p>Request opening a <a title=\"en/IndexedDB#gloss database connection\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_database_connection\">connection to a database</a>. The method returns &nbsp;an IDBRequest object&nbsp;immediately, and performs the opening operation asynchronously.&nbsp;</p>\n<p>The opening operation—which is performed in a separate thread—consists of the following steps:</p>\n<ol> <li>If a database named <code>myAwesomeDatabase</code> already exists: <ul> <li>Wait until any existing <code><a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a></code> transactions have finished.</li> <li>If the database has a deletion pending, wait until it has been deleted.</li> </ul> </li> <li>If no database with that name exists, create a database with the provided name, with the empty string as its version, and no object stores.</li> <li>Create a connection to the database.</li>\n</ol>\n<p>If the operation is successful, an <a title=\"en/IndexedDB/IDBSuccessEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent\">IDBSuccessEvent</a> is fired on the request object that is returned from this method, with its <a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a> attribute set to the new <a title=\"en/IndexedDB/IDBDatabase\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabase\">IDBDatabase</a> object for the connection.</p>\n<p>If an error occurs while the database connection is being opened, then an <a title=\"en/IndexedDB/IDBErrorEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent\">error event</a> is fired on the request object returned from this method, with its <a title=\"en/IndexedDB/IDBErrorEvent#attr code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code\"><code>code</code></a> and&nbsp; <code><a title=\"en/IndexedDB/IDBErrorEvent#attr message\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message\">message</a></code> set to appropriate values.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>name</dt> <dd>The name of the database.</dd> <dt>version</dt> <dd>The version of the database.</dd>\n</dl>\n</div><div id=\"section_6\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this request are fired. In the latest draft of the specification, which has not yet been implemented by browsers, the returned object is <code>IDBOpenRequest</code>.</dd>\n</dl>\n</div>","idl":"<pre>IDBRequest open(\n&nbsp; in DOMString name\n);</pre>","obsolete":false},{"name":"cmp","help":"<p>Compares two values as keys to determine equality and ordering for IndexedDB operations, such as storing and iterating. Do not use this method for comparing arbitrary JavaScript values, because many JavaScript values are either not valid IndexedDB keys (booleans and objects, for example) or are treated as equivalent IndexedDB keys (for example, since IndexedDB ignores arrays with non-numeric properties and treats them as empty arrays, so any non-numeric array are treated as equivalent).</p>\n<p>This throws an exception if either of the values is not a valid key. &nbsp;</p>\n\n<div id=\"section_11\"><span id=\"Parameters_3\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>first</dt> <dd>The first key to compare.</dd> <dt>second</dt> <dd>The second key to compare.</dd>\n</dl>\n</div><div id=\"section_12\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt>Integer</dt> <dd> <table class=\"standard-table\" width=\"434\"> <thead> <tr> <th scope=\"col\" width=\"216\">Returned value</th> <th scope=\"col\" width=\"206\">Description</th> </tr> </thead> <tbody> <tr> <td>-1</td> <td>1st key &lt; 2nd</td> </tr> <tr> <td>0</td> <td>1st key = 2nd</td> </tr> <tr> <td>1</td> <td>1st key &gt; 2nd</td> </tr> </tbody> </table> </dd>\n</dl>\n</div><div id=\"section_13\"><span id=\"Exceptions\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<br>\n<br>\n<br><table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Attribute</th> <th scope=\"col\" width=\"698\">Description</th> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR\">NON_TRANSIENT_ERR</a></code></td> <td>One of the supplied keys was not a valid key.</td> </tr> </thead> <tbody> </tbody>\n</table>\n</div>","idl":"<pre>int cmp(\n  in any first, in any second\n);\n</pre>","obsolete":false},{"name":"deleteDatabase","help":"<p>Request deleting a database. The method returns&nbsp;&nbsp;an IDBRequest object&nbsp;immediately, and performs the deletion operation&nbsp;asynchronously.</p>\n<p>The deletion operation (performed in a different thread) consists of the following steps:</p>\n<ol> <li>If there is no database with the given name, exit successfully.</li> <li>Fire an <a title=\"en/IndexedDB/IDBVersionChangeEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeEvent\">IDBVersionChangeEvent</a> at all connection objects connected to the named database, with <code><a title=\"en/IndexedDB/IDBVersionChangeEvent#attr version\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeEvent#attr_version\">version</a></code> set to <code>null</code>.</li> <li>If any connection objects connected to the database are still open, fire a <code>blocked</code> event at the request object returned by the <code>deleteDatabase</code> method, using <a title=\"en/IndexedDB/IDBVersionChangeEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeEvent\">IDBVersionChangeEvent</a> with <code><a title=\"en/IndexedDB/IDBVersionChangeEvent#attr version\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeEvent#attr_version\">version</a></code> set to <code>null</code>.</li> <li>Wait until all open connections to the database are closed.</li> <li>Delete the database.</li>\n</ol>\n<p>If the database is successfully deleted, then an <a title=\"en/IndexedDB/IDBSuccessEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent\">IDBSuccessEvent</a> is fired on the request object returned from this method, with its <code><a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a></code> set to <code>null</code>.</p>\n<p>If an error occurs while the database is being deleted, then an error event is fired on the request object that is returned from this method, with its <code><a title=\"en/IndexedDB/IDBErrorEvent#attr code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code\">code</a></code> and <code><a title=\"en/IndexedDB/IDBErrorEvent#attr message\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message\">message</a></code> set to appropriate values.</p>\n<p><strong>Tip:</strong> If the browser you are using hasn't implemented this yet, you can delete the object stores one by one, thus effectively removing the database.</p>\n\n<div id=\"section_8\"><span id=\"Parameters_2\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>name</dt> <dd>The name of the database.</dd>\n</dl>\n</div><div id=\"section_9\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this request are fired. In the latest draft of the specification, which has not yet been implemented by browsers, the returned object is <code>IDBOpenRequest</code>.</dd>\n</dl>\n</div>","idl":"<pre>IDBRequest deleteDatabase(\n  in DOMString name\n);\n</pre>","obsolete":false}]},"SVGLinearGradientElement":{"title":"SVGLinearGradientElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGLinearGradientElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/linearGradient\">&lt;linearGradient&gt;</a></code>\n element.","members":[{"name":"x1","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/x1\">x1</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/linearGradient\">&lt;linearGradient&gt;</a></code>\n element.","obsolete":false},{"name":"y1","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/y1\">y1</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/linearGradient\">&lt;linearGradient&gt;</a></code>\n element.","obsolete":false},{"name":"x2","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/x2\">x2</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/linearGradient\">&lt;linearGradient&gt;</a></code>\n element.","obsolete":false},{"name":"y2","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/y2\">y2</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/linearGradient\">&lt;linearGradient&gt;</a></code>\n element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGLinearGradientElement"},"AudioParam":{"title":"Using the Right Markup to Invoke Plugins","members":[],"srcUrl":"https://developer.mozilla.org/en/using_the_right_markup_to_invoke_plugins","skipped":true,"cause":"Suspect title"},"HTMLFontElement":{"title":"font","summary":"Obsolete","members":[{"obsolete":false,"url":"","name":"face","help":"This attribute contains a comma-sperated list of one or more font names. The document text in the default style is rendered in the first font face that the client's browser supports. If no font listed is installed on the local system, the browser typically defaults to the proportional or fixed-width font for that system."},{"obsolete":false,"url":"","name":"color","help":"This attribute sets the text color using either a named color or a color specified in the hexadecimal #RRGGBB format."},{"obsolete":false,"url":"","name":"size","help":"This attribute specifies the font size as either a numeric or relative value. Numeric values range from <span>1</span> to <span>7</span> with <span>1</span> being the smallest and <span>3</span> the default. It can be defined using a relative value, like <span>+2</span> or <span>-3</span>, which set it relative to the value of the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/basefont#attr-size\">size</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/basefont\">&lt;basefont&gt;</a></code>\n element, or relative to <span>3</span>, the default value, if none does exist."}],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/font"},"WebKitFlags":{"title":"JSClass.flags","summary":"<p>The <strong><code><a title=\"en/SpiderMonkey/JSAPI_Reference/JSClass\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JSClass\">JSClass</a>.flags</code></strong> field allows an application to enable optional <code>JSClass</code> features on a per-class basis. The <code>flags</code> field is of type <code>uint32</code>. Its value is the logical OR of zero or more of the following constants:</p>\n<table class=\"fullwidth-table\"> <tbody> <tr> <th>Flag</th> <th>Meaning</th> </tr> <tr> <td> <p><code>JSCLASS_HAS_PRIVATE</code></p> </td> <td> <p>This class uses private data. If this flag is set, each instance of the class has a field for private data. The field can be accessed using <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JS_GetPrivate\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetPrivate\">JS_GetPrivate</a></code> and <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JS_SetPrivate\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_SetPrivate\">JS_SetPrivate</a></code>.</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_HAS_PRIVATE\">MXR ID Search for <code>JSCLASS_HAS_PRIVATE</code></a>\n</p> </td> </tr> <tr> <td> <p><code>JSCLASS_NEW_ENUMERATE</code></p> </td> <td> <p>This class's <code>enumerate</code> hook is actually a <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JSClass.enumerate\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JSClass.enumerate\">JSNewEnumerateOp</a></code>, not a <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JSEnumerateOp\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JSEnumerateOp\">JSEnumerateOp</a></code>.</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_NEW_ENUMERATE\">MXR ID Search for <code>JSCLASS_NEW_ENUMERATE</code></a>\n</p> </td> </tr> <tr> <td> <p><code>JSCLASS_NEW_RESOLVE</code></p> </td> <td> <p>This class's <code>resolve</code> hook is actually a <code><a title=\"En/SpiderMonkey/JSAPI_Reference/JSNewResolveOp\" rel=\"internal\" href=\"https://developer.mozilla.org/En/SpiderMonkey/JSAPI_Reference/JSNewResolveOp\">JSNewResolveOp</a></code>, not a <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JSClass.resolve\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JSClass.resolve\">JSResolveOp</a></code>.</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_NEW_RESOLVE\">MXR ID Search for <code>JSCLASS_NEW_RESOLVE</code></a>\n</p> </td> </tr> <tr> <td> <p><code>JSCLASS_PRIVATE_IS_NSISUPPORTS</code></p> </td> <td> <p>Mozilla extension. The private field of each object of this class points to an <a title=\"en/XPCOM\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM\">XPCOM</a> object (see <code><a title=\"en/nsISupports\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsISupports\">nsISupports</a></code>). This is only meaningful if SpiderMonkey is built with <a title=\"en/XPConnect\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPConnect\">XPConnect</a> and the <code>JSCLASS_HAS_PRIVATE</code> flag is also set.</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_PRIVATE_IS_NSISUPPORTS\">MXR ID Search for <code>JSCLASS_PRIVATE_IS_NSISUPPORTS</code></a>\n</p> </td> </tr> <tr> <td> <p><code>JSCLASS_SHARE_ALL_PROPERTIES</code></p> </td> <td> <p>Instructs SpiderMonkey to automatically give all properties of objects of this class the <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JS_GetPropertyAttributes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetPropertyAttributes\">JSPROP_SHARED</a></code> attribute.</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_SHARE_ALL_PROPERTIES\">MXR ID Search for <code>JSCLASS_SHARE_ALL_PROPERTIES</code></a>\n</p> </td> </tr> <tr> <td> <p><code>JSCLASS_NEW_RESOLVE_GETS_START</code></p> </td> <td> <p>The <code>resolve</code> hook expects to receive the starting object in the prototype chain passed in via the <code>*objp</code> in/out parameter. (This is meaningful only if the <code>JSCLASS_NEW_RESOLVE</code> flag is also set.)</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_NEW_RESOLVE_GETS_START\">MXR ID Search for <code>JSCLASS_NEW_RESOLVE_GETS_START</code></a>\n</p> </td> </tr> <tr> <td id=\"JSCLASS_CONSTRUCT_PROTOTYPE\"> <p><code>JSCLASS_CONSTRUCT_PROTOTYPE</code></p> </td> <td> <p>Instructs <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JS_InitClass\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_InitClass\">JS_InitClass</a></code> to invoke the constructor when creating the class prototype.</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_CONSTRUCT_PROTOTYPE\">MXR ID Search for <code>JSCLASS_CONSTRUCT_PROTOTYPE</code></a>\n</p> </td> </tr> <tr> <td> <p><code>JSCLASS_HAS_RESERVED_SLOTS(n)</code></p> </td> <td> <p>Indicates that instances of this class have <code>n</code> <em>reserved slots</em>. <code>n</code> is an integer in the range <code>[0..255]</code>. The slots initially contain unspecified valid <code>jsval</code> values. They can be accessed using <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JS_GetReservedSlot\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetReservedSlot\">JS_GetReservedSlot</a></code> and <code><a title=\"en/JS_SetReservedSlot\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetReservedSlot\">JS_SetReservedSlot</a></code>.</p> <p>(The <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JSClass.reserveSlots\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JSClass.reserveSlots\">JSClass.reserveSlots</a></code> hook also allocates reserved slots to objects.)</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_HAS_RESERVED_SLOTS\">MXR ID Search for <code>JSCLASS_HAS_RESERVED_SLOTS</code></a>\n</p> </td> </tr> <tr> <td> <p><code>JSCLASS_IS_EXTENDED</code></p> </td> <td> <p>Indicates that this <code>JSClass</code> is really a <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JSExtendedClass\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JSExtendedClass\">JSExtendedClass</a></code>.</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_IS_EXTENDED\">MXR ID Search for <code>JSCLASS_IS_EXTENDED</code></a>\n</p> </td> </tr> <tr> <td> <p><code>JSCLASS_MARK_IS_TRACE</code></p> </td> <td> <p>Indicates that the <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JSClass.mark\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JSClass.mark\">mark</a></code> hook implements the new <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JSTraceOp\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JSTraceOp\">JSTraceOp</a></code> signature instead of the old <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JSClass.mark\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JSClass.mark\">JSMarkOp</a></code> signature. This is recommended for all new code that needs custom marking.</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_MARK_IS_TRACE\">MXR ID Search for <code>JSCLASS_MARK_IS_TRACE</code></a>\n</p> </td> </tr> <tr> <td> <p><code>JSCLASS_GLOBAL_FLAGS</code></p> </td> <td> <p>This flag is only relevant for the class of an object that is used as a global object. (ECMAScript specifies a single global object, but in SpiderMonkey the global object is the last object in the <a title=\"en/SpiderMonkey/JSAPI_Reference/JS_GetScopeChain\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetScopeChain\">scope chain</a>, which can be different objects at different times. This is actually quite subtle. <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JS_ExecuteScript\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_ExecuteScript\">JS_ExecuteScript</a></code> and similar APIs set the global object for the code they execute. <code><a title=\"en/SpiderMonkey/JSAPI_Reference/JS_SetGlobalObject\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_SetGlobalObject\">JS_SetGlobalObject</a></code> sets an object which is sometimes used as the global object, as a last resort.)</p> <p>Enable standard ECMAScript behavior for setting the prototype of certain objects, such as <code>Function</code> objects. If the global object does not have this flag, then scripts may cause nonstandard behavior by replacing standard constructors or prototypes (such as <code>Function.prototype</code>.)</p> <p>Objects that can end up with the wrong prototype object, if this flag is not present, include: <code>arguments</code> objects (\n<a rel=\"custom\" href=\"http://bclary.com/2004/11/07/#a-10.1.8\">§10.1.8</a>\n specifies \"the original <code>Object</code> prototype\"), <code>Function</code> objects (\n<a rel=\"custom\" href=\"http://bclary.com/2004/11/07/#a-13.2\">§13.2</a>\n specifies \"the original <code>Function</code> prototype\"), and objects created by many standard constructors (\n<a rel=\"custom\" href=\"http://bclary.com/2004/11/07/#a-15.4.2.1\">§15.4.2.1</a>\n and others).</p> <p><a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/ident?i=JSCLASS_GLOBAL_FLAGS\">MXR ID Search for <code>JSCLASS_GLOBAL_FLAGS</code></a>\n</p> </td> </tr> </tbody>\n</table>\n<p>SpiderMonkey reserves a few other flags for its internal use. They are <code>JSCLASS_IS_ANONYMOUS</code>, <code>JSCLASS_IS_GLOBAL</code>, and <code>JSCLASS_HAS_CACHED_PROTO</code>. JSAPI applications should not use these flags.</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/JSClass.flags"},"SVGTransformList":{"title":"SVGTransformList","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>length</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>9.0 (9.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>\n11.5</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>length</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>9.0 (9.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"<p>The <code>SVGTransformList</code> defines a list of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGTransform\">SVGTransform</a></code>\n objects.</p>\n<p>An <code>SVGTransformList</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>\n<div class=\"geckoVersionNote\"> <p>\n</p><div class=\"geckoVersionHeading\">Gecko 9.0 note<div>(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n</div></div>\n<p></p> <p>Starting in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n,the <code>SVGTransformList</code> DOM interface is now indexable and can be accessed like Arrays</p>\n</div>","members":[{"name":"clear","help":"<p>Clears all existing current items from the list, with the result being an empty list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"initialize","help":"<p>Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter. If the inserted item is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. The return value is the item inserted into the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"getItem","help":"<p>Returns the specified item from the list. The returned item is the item itself and not a copy. Any changes made to the item are immediately reflected in the list. The first item is number&nbsp;0.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"insertItemBefore","help":"<p>Inserts a new item into the list at the specified position. The first item is number 0. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to insert before is before the removal of the item. If the <code>index</code> is equal to 0, then the new item is inserted at the front of the list. If the index is greater than or equal to <code>numberOfItems</code>, then the new item is appended to the end of the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"replaceItem","help":"<p>Replaces an existing item in the list with a new item. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to replace is before the removal of the item.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>","obsolete":false},{"name":"removeItem","help":"<p>Removes an existing item from the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>","obsolete":false},{"name":"appendItem","help":"<p>Inserts a new item at the end of the list. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"numberOfItem","help":"The number of items in the list.","obsolete":false},{"name":"length","help":"The number of items in the list.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGTransformList"},"Metadata":{"title":"metadata","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> \n<tr><th scope=\"col\">Feature</th><th scope=\"col\">Chrome</th><th scope=\"col\">Firefox (Gecko)</th><th scope=\"col\">Internet Explorer</th><th scope=\"col\">Opera</th><th scope=\"col\">Safari</th></tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.5 (1.8)\n</td> <td>\n9.0</td> <td>\n8.0</td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>\n3.0</td> <td>1.0 (1.8)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<p>The chart is based on <a title=\"en/SVG/Compatibility sources\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Compatibility_sources\">these sources</a>.</p>","summary":"Metadata is structured data about data. Metadata which is included with SVG content should be specified within <code>metadata</code> elements. The contents of the <code>metadata</code> should be elements from other XML namespaces such as RDF, FOAF, etc.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/metadata"},"HTMLMeterElement":{"title":"meter","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>6.0</td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=555985\" class=\"external\" title=\"\">\nbug 555985</a>\n</td> <td><span title=\"Not supported.\">--</span></td> <td>11.0</td> <td>\n<em><a rel=\"custom\" href=\"http://nightly.webkit.org/\">Nightly build</a></em></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=555985\" class=\"external\" title=\"\">\nbug 555985</a>\n</td> <td><span title=\"Not supported.\">--</span></td> <td>11.0</td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["<div id=\"section_5\"><span id=\"Simple_example\"></span><h4 class=\"editable\">Simple example</h4>\n\n          <pre name=\"code\" class=\"xml\">&lt;p&gt;Heat the oven to &lt;meter min=\"200\" max=\"500\" value=\"350\"&gt;350 degrees&lt;/meter&gt;.&lt;/p&gt;</pre>\n        \n<p>On Google Chrome, the resulting meter looks like this:</p>\n<p><img class=\"internal default\" alt=\"meter1.png\" src=\"https://developer.mozilla.org/@api/deki/files/4940/=meter1.png\"></p>\n</div><div id=\"section_6\"><span id=\"Hilo_Range_example\"></span><span id=\"High_and_Low_range_example\"></span><h4 class=\"editable\">High and Low range example</h4>\n<p>Note that in this example the <strong>min</strong> attribute is omitted; this is allowed, as it will default to 0.</p>\n\n          <pre name=\"code\" class=\"xml\">&lt;p&gt;He got a &lt;meter low=\"69\" high=\"80\" max=\"100\" value=\"84\"&gt;B&lt;/meter&gt; on the exam.&lt;/p&gt;</pre>\n        \n<p>On Google Chrome, the resulting meter looks like this:</p>\n<p><img class=\"internal default\" alt=\"meter2.png\" src=\"https://developer.mozilla.org/@api/deki/files/4941/=meter2.png\"></p>\n</div>"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/meter","summary":"<p>The HTML <em>meter</em> element (<code>&lt;meter&gt;</code>) represents either a scalar value within a known range or a fractional value.</p>\n<div class=\"note\"><strong>Usage note: </strong>Unless the <strong>value</strong> attribute is between 0 and 1 (inclusive), the <strong>min</strong> attribute and <strong>max</strong> attribute should define the range so that the <strong>value</strong> attribute's value is within it.</div>","members":[{"obsolete":false,"url":"","name":"min","help":"The lower numeric bound of the measured range. This must be less than the maximum value (<strong>max</strong> attribute), if specified. If unspecified, the minimum value is 0."},{"obsolete":false,"url":"","name":"form","help":"This attribute associates the element with a <code>form</code> element that has ownership of the <code>meter</code> element. For example, a <code>meter</code> might be displaying a range corresponding to an <code>input</code> element of <strong>type</strong> <em>number</em>. This attribute is only used if the <code>meter</code> element is being used as a form-associated element; even then, it may be omitted if the element appears as a descendant of a <code>form</code> element."},{"obsolete":false,"url":"","name":"max","help":"The upper numeric bound of the measured range. This must be greater than the minimum value (<strong>min</strong> attribute), if specified. If unspecified, the maximum value is 1."},{"obsolete":false,"url":"","name":"optimum","help":"This attribute indicates the optimal numeric value. It must be within the range (as defined by the <strong>min</strong> attribute and <strong>max</strong> attribute). When used with the <strong>low</strong> attribute and <strong>high</strong> attribute, it gives an indication where along the range is considered preferable. For example, if it is between the <strong>min</strong> attribute and the <strong>low</strong> attribute, then the lower range is considered preferred."},{"obsolete":false,"url":"","name":"high","help":"The lower numeric bound of the high end of the measured range. This must be less than the maximum value (<strong>max</strong> attribute), and it also must be greater than the low value and minimum value (<strong>low</strong> attribute and <strong>min</strong> attribute, respectively), if any are specified. If unspecified, or if greater than the maximum value, the <strong>high</strong> value is equal to the maximum value."},{"obsolete":false,"url":"","name":"low","help":"The upper numeric bound of the low end of the measured range. This must be greater than the minimum value (<strong>min</strong> attribute), and it also must be less than the high value and maximum value (<strong>high</strong> attribute and <strong>max</strong> attribute, respectively), if any are specified. If unspecified, or if less than the minimum value, the <strong>low</strong> value is equal to the minimum value."},{"obsolete":false,"url":"","name":"value","help":"The current numeric value. This must be between the minimum and maximum values (<strong>min</strong> attribute and <strong>max</strong> attribute) if they are specified. If unspecified or malformed, the value is 0. If specified, but not within the range given by the <strong>min</strong> attribute and <strong>max</strong> attribute, the value is equal to the nearest end of the range."}]},"SVGStringList":{"title":"SVGStringList","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>12.0 (12)\n</td> <td>9.0</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>12.0 (12)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"<p>The <code>SVGStringList</code> defines a list of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMString\">DOMString</a></code>\n objects.</p>\n<p>An <code>SVGStringList</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>","members":[{"name":"clear","help":"<p>Clears all existing current items from the list, with the result being an empty list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"initialize","help":"<p>Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter. If the inserted item is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. The return value is the item inserted into the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"getItem","help":"<p>Returns the specified item from the list. The returned item is the item itself and not a copy. Any changes made to the item are immediately reflected in the list. The first item is number&nbsp;0.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"insertItemBefore","help":"<p>Inserts a new item into the list at the specified position. The first item is number 0. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to insert before is before the removal of the item. If the <code>index</code> is equal to 0, then the new item is inserted at the front of the list. If the index is greater than or equal to <code>numberOfItems</code>, then the new item is appended to the end of the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"replaceItem","help":"<p>Replaces an existing item in the list with a new item. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to replace is before the removal of the item.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>","obsolete":false},{"name":"removeItem","help":"<p>Removes an existing item from the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>","obsolete":false},{"name":"appendItem","help":"<p>Inserts a new item at the end of the list. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"numberOfItem","help":"The number of items in the list.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGStringList"},"HTMLDivElement":{"title":"HTMLDivElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/div\">&lt;div&gt;</a></code>\n HTML&nbsp;element","summary":"DOM&nbsp;div (document division) objects expose the <a title=\"http://www.w3.org/TR/html5/grouping-content.html#htmldivelement\" class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/html5/grouping-content.html#htmldivelement\" target=\"_blank\">HTMLDivElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-22445964\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-22445964\" target=\"_blank\"><code>HTMLDivElement</code></a>) interface, which provides special properties (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating div elements. In \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>, this interface inherits from HTMLElement, but defines no additional members.","members":[{"name":"align","help":"Enumerated attribute indicating alignment of the element's contents with respect to the surrounding context.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLDivElement"},"SVGAltGlyphItemElement":{"title":"altGlyphItem","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/glyph\">&lt;glyph&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/glyphRef\">&lt;glyphRef&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/altGlyphDef\">&lt;altGlyphDef&gt;</a></code>\n</li>","summary":"The <code>altGlyphItem</code> element provides a set of candidates for glyph substitution by the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/altGlyph\">&lt;altGlyph&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/altGlyphItem"},"TimeRanges":{"title":"TimeRanges","summary":"<p>The <code>TimeRanges</code> interface is used to represent a set of time ranges, primarily for the purpose of tracking which portions of media have been buffered when loading it for use by the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/audio\">&lt;audio&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video\">&lt;video&gt;</a></code>\n&nbsp;elements.</p>\n<p>A <code>TimeRanges</code> object includes one or more ranges of time, each specified by a starting and ending time offset. You reference each time range by using the <code>start()</code> and <code>end()</code> methods, passing the index number of the time range you want to retrieve.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/TimeRanges.start","name":"start","help":"Returns the time for the start of the range with the specified index."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/TimeRanges.end","name":"end","help":"Returns the time for the end of the specified range."},{"url":"https://developer.mozilla.org/en/DOM/TimeRanges.length","name":"length","help":"The number of time ranges represented by the time range object. <strong>Read only.</strong>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/TimeRanges","specification":"WHATWG Working Draft"},"ArrayBuffer":{"title":"ArrayBuffer","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>7</td> <td>4.0 (2)\n</td> <td>10</td> <td>11.6</td> <td>5.1</td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>4.0</td> <td>4.0 (2)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td>4.2</td> </tr> </tbody> </table>\n</div>","examples":["<p>In this example, we create a 32-byte buffer:</p>\n\n          <pre name=\"code\" class=\"js\">var buf = new ArrayBuffer(32);</pre>"],"srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer","seeAlso":"<li><a class=\"link-https\" title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"The <code>ArrayBuffer</code> is a data type that is used to represent a generic, fixed-length binary data buffer. You can't directly manipulate the contents of an <code>ArrayBuffer</code>; instead, you create an <a title=\"en/JavaScript typed arrays/ArrayBufferView\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView\"><code>ArrayBufferView</code></a> object which represents the buffer in a specific format, and use that to read and write the contents of the buffer.","members":[{"name":"byteLength","help":"The size, in bytes, of the array. This is established when the array is constructed and cannot be changed. <strong>Read only.</strong>","obsolete":false}]},"SVGElementInstance":{"title":"SVGUseElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGUseElement","skipped":true,"cause":"Suspect title"},"SVGFEMergeNodeElement":{"title":"feMergeNode","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The feMergeNode takes the result of another filter to be processed by its parent <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feMergeNode"},"HTMLOutputElement":{"title":"HTMLOutputElement","members":[{"name":"checkValidity","help":"<p>      in Gecko 2.0. Returns false if the element is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an <code>invalid</code> event at the element. It returns true if the element is not a candidate for constraint validation, or if it satisfies its constraints.</p> <p>The standard behavior is to always return true because <code>output</code> objects are never candidates for constraint validation.</p>","obsolete":false},{"name":"setCustomValidity","help":"Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.","obsolete":false},{"name":"defaultValue","help":"The default value of the element, initially the empty string.","obsolete":false},{"name":"form","help":"Indicates the control's form owner, reflecting the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/output#attr-form\">form</a></code>\n&nbsp;HTML&nbsp;attribute if it is defined.","obsolete":false},{"name":"htmlFor","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/output#attr-for\">for</a></code>\n HTML attribute, containing a list of IDs of other elements in the same document that contribute to (or otherwise affect) the calculated <strong>value</strong>.","obsolete":false},{"name":"labels","help":"A list of label elements associated with this output element.","obsolete":false},{"name":"name","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/output#attr-name\">name</a></code>\n HTML attribute, containing the name for the control that is submitted with form data.","obsolete":false},{"name":"type","help":"Must be the string <code>output</code>.","obsolete":false},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.","obsolete":false},{"name":"validity","help":"The validity states that this element is in.","obsolete":false},{"name":"value","help":"The value of the contents of the elements. Behaves like the <strong><a title=\"En/DOM/Node.textContent\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node.textContent\">textContent</a></strong> property.","obsolete":false},{"name":"willValidate","help":"<p>      in Gecko 2.0. Indicates whether the element is a candidate for constraint validation. It is false if any conditions bar it from constraint validation. (See <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=604673\" class=\"external\" title=\"\">\nbug 604673</a>\n.)</p> <p>The standard behavior is to always return false because <code>output</code> objects are never candidates for constraint validation.</p>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLOutputElement"},"Comment":{"title":"Comment","summary":"<p>A comment is used to add notations within markup; although it is generally not displayed, it is still available to be read in the source view (in Firefox:&nbsp;View -&gt; Page Source).&nbsp; These are represented in HTML and XML as content between <code>&lt;!--</code> and&nbsp; <code>--&gt; . </code>In XML, the character sequence \"--\" cannot be used within a comment.</p>\n<p>A comment has no special properties or methods of its own, but inherits those of <a title=\"En/DOM/CharacterData\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/CharacterData\">CharacterData</a> (which inherits from <a title=\"en/DOM/Node\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a>).</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/Comment","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...#ID-1728279322"},"HashChangeEvent":{"title":"window.onhashchange","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/window.onhashchange","skipped":true,"cause":"Suspect title"},"HTMLLabelElement":{"title":"HTMLLabelElement","summary":"DOM Label objects inherit all of the properties and methods of DOM <a title=\"en/DOM/element\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a>, and also expose the <a title=\"http://dev.w3.org/html5/spec/forms.html#htmllabelelement\" class=\" external\" rel=\"external\" href=\"http://dev.w3.org/html5/spec/forms.html#htmllabelelement\" target=\"_blank\">HTMLLabelElement</a>(or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-13691394\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-13691394\" target=\"_blank\">HTMLLabelElement</a>) interface.","members":[{"name":"accessKey","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/label#attr-accesskey\">accesskey</a></code>\n&nbsp;HTML&nbsp;attribute. In \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> this attribute is inherited from <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLElement\">HTMLElement</a></code>","obsolete":false},{"name":"control","help":"The labeled control.","obsolete":false},{"name":"form","help":"The form owner of this label.","obsolete":false},{"name":"htmlFor","help":"The ID of the labeled control. Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/label#attr-for\">for</a></code>\n attribute.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLLabelElement"},"CSSPageRule":{"title":"cssRule","members":[],"srcUrl":"https://developer.mozilla.org/pl/DOM/cssRule","skipped":true,"cause":"Suspect title"},"HTMLLegendElement":{"title":"HTMLLegendElement","summary":"DOM&nbsp;Legend objects inherit all of the properties and methods of DOM <a href=\"https://developer.mozilla.org/en/DOM/HTMLElement\" title=\"en/DOM/HTMLElement\" rel=\"internal\">HTMLElement</a>, and also expose the <a title=\"http://www.w3.org/TR/html5/forms.html#htmllegendelement\" class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/html5/forms.html#htmllegendelement\" target=\"_blank\">HTMLLegendElement</a> \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> (or <a class=\" external\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-21482039\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-21482039\" target=\"_blank\">HTMLLegendElement</a> \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span>) interface.","members":[{"name":"form","help":"The form that this legend belongs to. If the legend has a fieldset element as its parent, then this attribute returns the same value as the <strong>form</strong> attribute on the parent fieldset element. Otherwise, it returns null.","obsolete":false},{"name":"accessKey","help":"A single-character access key to give access to the element. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"align","help":"Alignment relative to the form set. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>, \n\n<span class=\"deprecatedInlineTemplate\" title=\"\">Deprecated</span>\n\n in \n<span>HTML 4.01</span>","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLLegendElement"},"SVGElement":{"title":"SVGElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGElement","seeAlso":"DOM <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/SVG/Element/element\" class=\"new\">&lt;element&gt;</a></code>\n reference","summary":"All of the SVG DOM interfaces that correspond directly to elements in the SVG language derive from the <code>SVGElement</code> interface.","members":[{"name":"id","help":"The value of the \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/id\" class=\"new\">id</a></code> attribute on the given element, or the empty string if <code>id</code> is not present. ","obsolete":false},{"name":"xmlbase","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/xml%3Abase\" class=\"new\">xml:base</a></code> on the given element.","obsolete":false},{"name":"ownerSVGElement","help":"The nearest ancestor <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element. <code>Null</code> if the given element is the outermost svg element.","obsolete":false},{"name":"viewportElement","help":"The element which established the current viewport. Often, the nearest ancestor <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element. <code>Null</code> if the given element is the outermost svg element.","obsolete":false}]},"SVGAnimatedRect":{"title":"SVGAnimatedRect","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedRect</code> interface is used for attributes of basic <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGRect\">SVGRect</a></code>\n which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"A read only <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGRect\">SVGRect</a></code>\n representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGRect\">SVGRect</a></code>\n will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/SVGAnimatedRect"},"HTMLKeygenElement":{"title":"HTMLKeygenElement","summary":"<strong>Note:</strong>&nbsp;This page describes the Keygen Element interface as specified, not as currently implemented by Gecko. See <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=101019\" class=\"external\" title=\"\">\nbug 101019</a>\n for details and status.","members":[{"name":"checkValidity","help":"Always returns true because <code>keygen</code> objects are never candidates for constraint validation.","obsolete":false},{"name":"setCustomValidity","help":"Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.","obsolete":false},{"name":"autofocus","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/keygen#attr-autofocus\">autofocus</a></code>\n&nbsp;HTML attribute, indicating that the form control should have input focus when the page loads.","obsolete":false},{"name":"challenge","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/keygen#attr-challenge\">challenge</a></code>\n HTML&nbsp;attribute, containing a challenge string that is packaged with the submitted key.","obsolete":false},{"name":"disabled","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/keygen#attr-disabled\">disabled</a></code>\n&nbsp;HTML attribute, indicating that the control is not available for interaction.","obsolete":false},{"name":"form","help":"Indicates the control's form owner, reflecting the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/keygen#attr-form\">form</a></code>\n&nbsp;HTML&nbsp;attribute if it is defined.","obsolete":false},{"name":"keytype","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/keygen#attr-keytype\">keytype</a></code>\n HTML&nbsp;attribute, containing the type of key used.","obsolete":false},{"name":"labels","help":"A list of label elements associated with this keygen element.","obsolete":false},{"name":"name","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/keygen#attr-name\">name</a></code>\n HTML attribute, containing the name for the control that is submitted with form data.","obsolete":false},{"name":"type","help":"Must be the value <code>keygen</code>.","obsolete":false},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.","obsolete":false},{"name":"validity","help":"The validity states that this element is in.","obsolete":false},{"name":"willValidate","help":"Always false because <code>keygen</code> objects are never candidates for constraint validation.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLKeygenElement"},"SVGFontElement":{"title":"SVGFontElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGFontElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font\">&lt;font&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGHFontElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font\">&lt;font&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font\">&lt;font&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"HTMLUListElement":{"title":"ul","seeAlso":"<li>Other list-related HTML&nbsp;Elements: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/li\">&lt;li&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu\">&lt;menu&gt;</a></code>\n and the obsolete <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/dir\">&lt;dir&gt;</a></code>\n;</li> <li>CSS properties that may be specially useful to style the <span>&lt;ul&gt;</span> element:&nbsp; <ul> <li>the <a title=\"en/CSS/list-style\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/list-style\">list-style</a> property, useful to choose the way the ordinal is displayed,</li> <li><a title=\"en/CSS_Counters\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS_Counters\">CSS counters</a>, useful to handle complex nested lists,</li> <li>the <a title=\"en/CSS/line-height\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/line-height\">line-height</a> property, useful to simulate the deprecated \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul#attr-compact\">compact</a></code>\n attribute,</li> <li>the <a title=\"en/CSS/margin\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/margin\">margin</a> property, useful to control the indent of the list.</li> </ul> </li>","summary":"<p>The HTML <em>unordered list</em> element (<code>&lt;ul&gt;</code>) represents an unordered list of items, namely a collection of items that do not have a numerical ordering, and their order in the list is meaningless. Typically, unordered-list items are displayed with a bullet, which can be of several forms, like a dot, a circle or a squared. The bullet style is not defined in the HTML description of the page, but in its associated CSS, using the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/list-style-type\">list-style-type</a></code>\n property.</p>\n<p>There is no limitation to the depth and imbrication of lists defined with the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n elements.</p>\n<div class=\"note\"><strong>Usage note: </strong> The <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n both represent a list of items. They differ in the way that, with the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n element, the order is meaningful. As a rule of thumb to determine which one to use, try changing the order of the list items; if the meaning is changed, the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n element should be used, else the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n is adequate.</div>","members":[{"obsolete":false,"url":"","name":"compact","help":"This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn't work in all browsers. <div class=\"note\"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it has been deprecated: the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n element should be styled using <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a>. To give a similar effect than the <span>compact</span> attribute, the <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a> property <a title=\"en/CSS/line-height\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/line-height\">line-height</a> can be used with a value of <span>80%</span>.</div>"},{"obsolete":false,"url":"","name":"type","help":"Used to set the bullet style for the list. The values defined under <a title=\"en/HTML3.2\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML3.2\" class=\"new \">HTML3.2</a> and the transitional version of <a title=\"en/HTML4.01\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML4.01\" class=\"new \">HTML 4.0/4.01</a> are<span>:</span> <ul> <li><code>circle</code>,</li> <li><code>disc</code>,</li> <li>and <code>square</code>.</li> </ul> <p>A fourth bullet type has been defined in the WebTV interface, but not all browsers support it: <code>triangle.</code></p> <p>If not present and if no <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a> <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/list-style-type\">list-style-type</a></code>\n property does apply to the element, the user agent decide to use a kind of bullets depending on the nesting level of the list.</p> <div class=\"note\"><strong>Usage note:</strong> Do not use this attribute, as it has been deprecated: use the <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a> <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/list-style-type\">list-style-type</a></code>\n property instead.</div>"}],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/ul"},"SVGMarkerElement":{"title":"marker","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> \n<tr><th scope=\"col\">Feature</th><th scope=\"col\">Chrome</th><th scope=\"col\">Firefox (Gecko)</th><th scope=\"col\">Internet Explorer</th><th scope=\"col\">Opera</th><th scope=\"col\">Safari</th></tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.5 (1.8)\n</td> <td>\n9.0</td> <td>\n9.0</td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>\n3.0</td> <td>1.0 (1.8)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<p>The chart is based on <a title=\"en/SVG/Compatibility sources\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Compatibility_sources\">these sources</a>.</p>","examples":["<tr> <th scope=\"col\">Source code</th> <th scope=\"col\">Output result</th> </tr> <tr> <td>\n          <pre name=\"code\" class=\"xml\">&lt;?xml version=\"1.0\"?&gt;\n&lt;svg width=\"120\" height=\"120\" viewBox=\"0 0 120 120\"\n     xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\"\n     xmlns:xlink=\"http://www.w3.org/1999/xlink\"&gt;\n\n    &lt;defs&gt;\n        &lt;marker id=\"Triangle\"\n                viewBox=\"0 0 10 10\" \n                refX=\"1\" refY=\"5\"\n                markerWidth=\"6\" \n                markerHeight=\"6\"\n                orient=\"auto\"&gt;\n            &lt;path d=\"M 0 0 L 10 5 L 0 10 z\" /&gt;\n\t    &lt;/marker&gt;\n    &lt;/defs&gt;\n\n    &lt;polyline points=\"10,90 50,80 90,20\"\n              fill=\"none\" stroke=\"black\" \n              stroke-width=\"2\"\n              marker-end=\"url(#Triangle)\" /&gt;\n&lt;/svg&gt;</pre>\n        </td> <td>\n<iframe src=\"https://developer.mozilla.org/@api/deki/services/developer.mozilla.org/39/images/f3ac8fb0-712a-178f-f696-81bc9eecbd0f.svg\" width=\"120px\" height=\"120px\" marginwidth=\"0\" marginheight=\"0\" hspace=\"0\" vspace=\"0\" frameborder=\"0\" scrolling=\"no\"></iframe>\n</td> </tr>"],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/marker","summary":"The <code>marker</code> element defines the graphics that is to be used for drawing arrowheads or polymarkers on a given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/path\">&lt;path&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/line\">&lt;line&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/polyline\">&lt;polyline&gt;</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/polygon\">&lt;polygon&gt;</a></code>\n element.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/transform","name":"transform","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/markerHeight","name":"markerHeight","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/externalResourcesRequired","name":"externalResourcesRequired","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/viewBox","name":"viewBox","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio","name":"preserveAspectRatio","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/refY","name":"refY","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/refX","name":"refX","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/markerWidth","name":"markerWidth","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/markerUnits","name":"markerUnits","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/orient","name":"orient","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":""}]},"KeyboardEvent":{"title":"KeyboardEvent","examples":["&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;script&gt;\n  var metaChar = false;\n  var exampleKey = 16;\n  function keyEvent(event) {\n    var key = event.keyCode || event.which;\n    var keychar = String.fromCharCode(key);\n    if (key == exampleKey) {\n      metaChar = true;\n    }\n    if (key != exampleKey) {\n      if (metaChar) {\n        alert(\"Combination of metaKey + \" + keychar);\n        metaChar = false;\n      } else {\n        alert(\"Key pressed \" + key);\n      }\n    }\n  }\n\n  function metaKeyUp (event) {\n    var key = event.keyCode || event.which;\n    if (key==exampleKey) {\n      metaChar = false;\n    }\n  }\n&lt;/script&gt;\n&lt;/head&gt;\n\n&lt;body onkeydown=\"keyEvent(event)\" onkeyup=\"metaKeyUp(event)\"&gt;\n&lt;/body&gt;\n&lt;/html&gt;"],"srcUrl":"https://developer.mozilla.org/en/DOM/KeyboardEvent","specification":"DOM&nbsp;3 Events:&nbsp;KeyboardEvent","summary":"<div class=\"deprecatedHeaderTemplate\"><p>Deprecated</p></div>\n<p></p>\n<p><code>KeyboardEvent</code> objects describe a user interaction with the keyboard. Each event describes a key; the event type (<code>keydown</code>, <code>keypress</code>, or <code>keyup</code>) identifies what kind of activity was performed.</p>\n<div class=\"note\"><strong>Note:</strong> The <code>KeyboardEvent</code> interface is deprecated in DOM&nbsp;Level 3 in favor of the new <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/TextInput\" class=\"new\">TextInput</a></code>\n interface and the corresponding <code>textinput</code> event, which have improved support for alternate input methods.&nbsp; However, DOM Level 3 <code>textinput</code> events are <a title=\"https://bugzilla.mozilla.org/show_bug.cgi?id=622245\" class=\" link-https\" rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=622245\" target=\"_blank\">not yet implemented</a> in Gecko (as of version 6.0), so code written for Gecko browsers should continue to use <code>KeyboardEvent</code> for now.</div>","members":[{"name":"initKeyboardEvent","help":"<p>Initializes the attributes of a keyboard event object.</p>\n\n<div id=\"section_11\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>typeArg</code></dt> <dd>The type of keyboard event; this will be one of <code>keydown</code>, <code>keypress</code>, or <code>keyup</code>.</dd> <dt><code>canBubbleArg</code></dt> <dd>Whether or not the event can bubble.</dd> <dt><code>cancelableArg</code></dt> <dd>Whether or not the event can be canceled.</dd> <dt><code>viewArg</code></dt> <dd>?</dd> <dt><code>charArg</code></dt> <dd>The value of the char attribute.</dd> <dt><code>keyArg</code></dt> <dd>The value of the key attribute.</dd> <dt><code>locationArg</code></dt> <dd>The value of the location attribute.</dd> <dt><code>modifiersListArg</code></dt> <dd>A whitespace-delineated list of modifier keys that should be considered to be active on the event's key. For example, specifying \"Control Shift\" indicates that the user was holding down the Control and Shift keys when pressing the key described by the event.</dd> <dt><code>repeatArg</code></dt> <dd>The value of the repeat attribute.</dd> <dt><code>localeArg</code></dt> <dd>The value of the locale attribute.</dd>\n</dl>\n</div>","idl":"<pre>void initKeyboardEvent(\n&nbsp;&nbsp;in DOMString typeArg,\n&nbsp;&nbsp;in boolean canBubbleArg,\n&nbsp;&nbsp;in boolean cancelableArg,\n&nbsp;&nbsp;in views::AbstractView viewArg,\n&nbsp;&nbsp;in DOMString charArg,\n&nbsp;&nbsp;in DOMString keyArg,\n&nbsp;&nbsp;in unsigned long locationArg,\n&nbsp;&nbsp;in DOMString modifiersListArg,\n&nbsp;&nbsp;in boolean repeat,\n&nbsp;&nbsp;in DOMString localeArg\n);\n</pre>","obsolete":false},{"name":"getModifierState","help":"<p>Returns the current state of the specified modifier key.</p>\n\n<div id=\"section_8\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>keyArg</code></dt> <dd>A string identifying the modifier key whose value you wish to determine. This may be an implementation-defined value or one of:&nbsp;\"Alt\", \"AltGraph\", \"CapsLock\", \"Control\", \"Fn\", \"Meta\", \"NumLock\", \"Scroll\", \"Shift\", \"SymbolLock\", or \"Win\".</dd>\n</dl>\n</div><div id=\"section_9\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p><code>true</code> if the specified modifier key is engaged; otherwise <code>false</code>.</p>\n</div>","idl":"<pre>boolean getModifierState(\n&nbsp;&nbsp;in DOMString keyArg\n);\n</pre>","obsolete":false},{"name":"DOM_VK_CANCEL","help":"Cancel key.","obsolete":false},{"name":"DOM_VK_HELP","help":"Help key.","obsolete":false},{"name":"DOM_VK_BACK_SPACE","help":"Backspace key.","obsolete":false},{"name":"DOM_VK_TAB","help":"Tab key.","obsolete":false},{"name":"DOM_VK_CLEAR","help":"Clear key.","obsolete":false},{"name":"DOM_VK_RETURN","help":"Return/enter key on the main keyboard.","obsolete":false},{"name":"DOM_VK_ENTER","help":"Enter key on the numeric keypad.","obsolete":false},{"name":"DOM_VK_SHIFT","help":"Shift key.","obsolete":false},{"name":"DOM_VK_CONTROL","help":"Control key.","obsolete":false},{"name":"DOM_VK_ALT","help":"Alt (Option on Mac)&nbsp;key.","obsolete":false},{"name":"DOM_VK_PAUSE","help":"Pause key.","obsolete":false},{"name":"DOM_VK_CAPS_LOCK","help":"Caps lock.","obsolete":false},{"name":"DOM_VK_ESCAPE","help":"Escape key.","obsolete":false},{"name":"DOM_VK_SPACE","help":"Space bar.","obsolete":false},{"name":"DOM_VK_PAGE_UP","help":"Page Up key.","obsolete":false},{"name":"DOM_VK_PAGE_DOWN","help":"Page Down key.","obsolete":false},{"name":"DOM_VK_END","help":"End key.","obsolete":false},{"name":"DOM_VK_HOME","help":"Home key.","obsolete":false},{"name":"DOM_VK_LEFT","help":"Left arrow.","obsolete":false},{"name":"DOM_VK_UP","help":"Up arrow.","obsolete":false},{"name":"DOM_VK_RIGHT","help":"Right arrow.","obsolete":false},{"name":"DOM_VK_DOWN","help":"Down arrow.","obsolete":false},{"name":"DOM_VK_SELECT","help":"","obsolete":false},{"name":"DOM_VK_PRINT","help":"","obsolete":false},{"name":"DOM_VK_EXECUTE","help":"","obsolete":false},{"name":"DOM_VK_PRINTSCREEN","help":"Print Screen key.","obsolete":false},{"name":"DOM_VK_INSERT","help":"Ins(ert) key.","obsolete":false},{"name":"DOM_VK_DELETE","help":"Del(ete)&nbsp;key.","obsolete":false},{"name":"DOM_VK_SEMICOLON","help":"","obsolete":false},{"name":"DOM_VK_EQUALS","help":"","obsolete":false},{"name":"DOM_VK_A","help":"","obsolete":false},{"name":"DOM_VK_B","help":"","obsolete":false},{"name":"DOM_VK_C","help":"","obsolete":false},{"name":"DOM_VK_D","help":"","obsolete":false},{"name":"DOM_VK_E","help":"","obsolete":false},{"name":"DOM_VK_F","help":"","obsolete":false},{"name":"DOM_VK_G","help":"","obsolete":false},{"name":"DOM_VK_H","help":"","obsolete":false},{"name":"DOM_VK_I","help":"","obsolete":false},{"name":"DOM_VK_J","help":"","obsolete":false},{"name":"DOM_VK_K","help":"","obsolete":false},{"name":"DOM_VK_L","help":"","obsolete":false},{"name":"DOM_VK_M","help":"","obsolete":false},{"name":"DOM_VK_N","help":"","obsolete":false},{"name":"DOM_VK_O","help":"","obsolete":false},{"name":"DOM_VK_P","help":"","obsolete":false},{"name":"DOM_VK_Q","help":"","obsolete":false},{"name":"DOM_VK_R","help":"","obsolete":false},{"name":"DOM_VK_S","help":"","obsolete":false},{"name":"DOM_VK_T","help":"","obsolete":false},{"name":"DOM_VK_U","help":"","obsolete":false},{"name":"DOM_VK_V","help":"","obsolete":false},{"name":"DOM_VK_W","help":"","obsolete":false},{"name":"DOM_VK_X","help":"","obsolete":false},{"name":"DOM_VK_Y","help":"","obsolete":false},{"name":"DOM_VK_Z","help":"","obsolete":false},{"name":"DOM_VK_CONTEXT_MENU","help":"","obsolete":false},{"name":"DOM_VK_MULTIPLY","help":"* on the numeric keypad.","obsolete":false},{"name":"DOM_VK_ADD","help":"+ on the numeric keypad.","obsolete":false},{"name":"DOM_VK_SEPARATOR","help":"","obsolete":false},{"name":"DOM_VK_SUBTRACT","help":"- on the numeric keypad.","obsolete":false},{"name":"DOM_VK_DECIMAL","help":"Decimal point on the numeric keypad.","obsolete":false},{"name":"DOM_VK_DIVIDE","help":"/ on the numeric keypad.","obsolete":false},{"name":"DOM_VK_NUM_LOCK","help":"Num Lock key.","obsolete":false},{"name":"DOM_VK_SCROLL_LOCK","help":"Scroll Lock key.","obsolete":false},{"name":"DOM_VK_COMMA","help":"Comma (\",\") key.","obsolete":false},{"name":"DOM_VK_PERIOD","help":"Period (\".\") key.","obsolete":false},{"name":"DOM_VK_SLASH","help":"Slash (\"/\") key.","obsolete":false},{"name":"DOM_VK_BACK_QUOTE","help":"Back tick (\"`\") key.","obsolete":false},{"name":"DOM_VK_OPEN_BRACKET","help":"Open square bracket (\"[\") key.","obsolete":false},{"name":"DOM_VK_BACK_SLASH","help":"Back slash (\"\\\") key.","obsolete":false},{"name":"DOM_VK_CLOSE_BRACKET","help":"Close square bracket (\"]\") key.","obsolete":false},{"name":"DOM_VK_QUOTE","help":"Quote ('\"') key.","obsolete":false},{"name":"DOM_VK_META","help":"Meta (Command on Mac)&nbsp;key.","obsolete":false},{"name":"DOM_VK_KANA","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_HANGUL","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_JUNJA","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_FINAL","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_HANJA","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_KANJI","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_CONVERT","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_NONCONVERT","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_ACCEPT","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_MODECHANGE","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_SELECT","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_PRINT","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_EXECUTE","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_VK_SLEEP","help":"Linux support for this keycode was added in Gecko 4.0.","obsolete":false},{"name":"DOM_KEY_LOCATION_STANDARD","help":"The key must not be distinguished between the left and right versions of the key, and was not pressed on the numeric keypad or a key that is considered to be part of the keypad.","obsolete":false},{"name":"DOM_KEY_LOCATION_LEFT","help":"The key was the left-hand version of the key; for example, this is the value of the <code>location</code> attribute when the left-hand Control key is pressed on a standard 101 key US&nbsp;keyboard. This value is only used for keys that have more that one possible location on the keyboard.","obsolete":false},{"name":"DOM_KEY_LOCATION_RIGHT","help":"The key was the right-hand version of the key; for example, this is the value of the <code>location</code> attribute when the right-hand Control key is pressed on a standard 101 key US&nbsp;keyboard. This value is only used for keys that have more that one possible location on the keyboard.","obsolete":false},{"name":"DOM_KEY_LOCATION_NUMPAD","help":"The key was on the numeric keypad, or has a virtual key code that corresponds to the numeric keypad.","obsolete":false},{"name":"DOM_KEY_LOCATION_MOBILE","help":"The key was on a mobile device; this can be on either a physical keypad or a virtual keyboard.","obsolete":false},{"name":"DOM_KEY_LOCATION_JOYSTICK","help":"The key was a button on a game controller or a joystick on a mobile device.","obsolete":false},{"name":"altKey","help":"<code>true</code> if the Alt (or Option, on Mac) key was active when the key event was generated. <strong>Read only.</strong>","obsolete":false},{"name":"char","help":"<p>The character value of the key. If the key corresponds to a printable character, this value is a non-empty Unicode string containing that character. If the key doesn't have a printable representation, this is an empty string. <strong>Read only.</strong></p> <div class=\"note\">Not yet implemented in Gecko.</div> <div class=\"note\"><strong>Note:</strong> If the key is used as a macro that inserts multiple characters, this attribute's value is the entire string, not just the first character.</div>","obsolete":false},{"name":"charCode","help":"<p>The Unicode reference number of the key; this attribute is used only by the <code>keypress</code>&nbsp;event. For keys whose <code>char</code> attribute contains multiple characters, this is the Unicode value of the first character in that attribute. <strong>Read only.</strong></p> <div class=\"warning\"><strong>Warning:</strong> This attribute is deprecated; you should use <code>char</code> instead, if available.</div>","obsolete":true},{"name":"ctrlKey","help":"<code>true</code> if the Control key was active when the key event was generated. <strong>Read only.</strong>","obsolete":false},{"name":"key","help":"<p>The key value of the key represented by the event. If the value has a printed representation, this attribute's value is the same as the <code>char</code> attribute. Otherwise, it's one of the key value strings specified in <a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/KeyboardEvent#Key_values\">Key values</a>. If the key can't be identified, this is the string \"Unidentified\". <strong>Read only.</strong></p> <div class=\"note\">Not yet implemented in Gecko.</div>","obsolete":false},{"name":"keyCode","help":"<p>A system and implementation dependent numerical code identifying the unmodified value of the pressed key. This is usually the decimal ASCII (<a rel=\"custom\" href=\"http://tools.ietf.org/html/20\">RFC 20</a>) or Windows 1252 code corresponding to the key; see <a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/KeyboardEvent#Virtual_key_codes\">Virtual key codes</a>&nbsp;for a list of common values. If the key can't be identified, this value is 0. <strong>Read only.</strong></p> <div class=\"warning\"><strong>Warning:</strong> This attribute is deprecated; you should use <code>key</code> instead, if available.</div>","obsolete":true},{"name":"locale","help":"<p>A locale string indicating the locale the keyboard is configured for. This may be the empty string if the browser or device doesn't know the keyboard's locale. <strong>Read only.</strong></p> <div class=\"note\"><strong>Note:</strong> This does not describe the locale of the data being entered. A user may be using one keyboard layout while typing text in a different language.</div>","obsolete":false},{"name":"location","help":"The location of the key on the keyboard or other input device; see <a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/KeyboardEvent#Key_location_constants\">Key location constants</a> below. <strong>Read only.</strong>","obsolete":false},{"name":"metaKey","help":"<code>true</code> if the Meta (or Command, on Mac) key was active when the key event was generated. <strong>Read only.</strong>","obsolete":false},{"name":"repeat","help":"true if the key is being held down such that it is automatically repeating. <strong>Read only.</strong>","obsolete":false},{"name":"shiftKey","help":"<code>true</code> if the Shift key was active when the key event was generated. <strong>Read only.</strong>","obsolete":false},{"name":"which","help":"<p>A system and implementation dependent numeric code identifying the unmodified value of the pressed key; this is usually the same as <code>keyCode</code>. <strong>Read only.</strong></p> <div class=\"warning\"><strong>Warning:</strong> This attribute is deprecated; you should use <code>key</code> instead, if available.</div>","obsolete":true}]},"Location":{"title":"window.location","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","examples":["<p>Whenever a property of the location object is modified, a document will be loaded using the URL as if <code>window.location.assign()</code> had been called with the modified URL.</p>\n<div id=\"section_8\"><span id=\"Replace_the_current_document_with_the_one_at_the_given_URL:\"></span><h5 class=\"editable\">Replace the current document with the one at the given URL:</h5>\n\n          <pre name=\"code\" class=\"js\">function goMoz() { \n   window.location = \"http://www.mozilla.org\";\n} \n\n// in html: &lt;button onclick=\"goMoz();\"&gt;Mozilla&lt;/button&gt;</pre>\n        \n<div class=\"note\"><strong>Note:</strong> The example above works in situations where <code>window.location.hash</code>&nbsp;does not need to be retained. However, in Gecko-based browsers, setting <code>window.location.pathname</code> in this manner will erase any information in <code>window.location.hash</code>, whereas in WebKit (and possibly other browsers), setting the pathname will not alter the the hash. If you need to change pathname but keep the hash as is, use the <code>replace()</code> method instead, which should work consistently across browsers.</div>\n<p><br> Consider the following example, which will reload the page by using the <code>replace()</code> method to insert the value of <code>window.location.pathname</code> into the hash (similar to Twitter's reload of <a class=\" external\" rel=\"external\" href=\"http://twitter.com/username\" title=\"http://twitter.com/username\" target=\"_blank\">http://twitter.com/username</a> to <a class=\" external\" rel=\"external\" href=\"http://twitter.com/#!/username\" title=\"http://twitter.com/#!/username\" target=\"_blank\">http://twitter.com/#!/username</a>):</p>\n\n          <pre name=\"code\" class=\"js\">function reloadPageWithHash() {\n  var initialPage = window.location.pathname;\n  window.location.replace('http://example.com/#' + initialPage);\n}</pre>\n        \n</div><div id=\"section_9\"><span id=\"Display_the_properties_of_the_current_URL_in_an_alert_dialog:\"></span><h5 class=\"editable\">Display the properties of the current URL in an alert dialog:</h5>\n\n          <pre name=\"code\" class=\"js\">function showLoc() {\n  var oLocation = window.location, aLog = [\"Property (Typeof): Value\", \"window.location (\" + (typeof oLocation) + \"): \" + oLocation ];\n  for (var sProp in oLocation){\n    aLog.push(sProp + \" (\" + (typeof oLocation[sProp]) + \"): \" +  (oLocation[sProp] || \"n/a\"));\n  }\n  alert(aLog.join(\"\\n\"));\n}\n\n// in html: &lt;button onclick=\"showLoc();\"&gt;Show location properties&lt;/button&gt;</pre>\n        \n</div><div id=\"section_10\"><span id=\"Send_a_string_of_data_to_the_server_by_modifying_the_search_property:\"></span><h5 class=\"editable\">Send a string of data to the server by modifying the <code>search</code> property:</h5>\n\n          <pre name=\"code\" class=\"js\">function sendData (sData) {\n  window.location.search = sData;\n}\n\n// in html: &lt;button onclick=\"sendData('Some data');\"&gt;Send data&lt;/button&gt;</pre>\n        \n<p>The current URL with \"?Some%20data\" appended is sent to the server (if no action is taken by the server, the current document is reloaded with the modified search string).</p>\n</div><div id=\"section_11\"><span id=\"Get_the_value_of_a_single_window.location.search_key:\"></span><h5 class=\"editable\">Get the value of a single <code>window.location.search</code> key:</h5>\n\n          <pre name=\"code\" class=\"js\">function loadPageVar (sVar) {\n  return unescape(window.location.search.replace(new RegExp(\"^(?:.*[&amp;\\\\?]\" + escape(sVar).replace(/[\\.\\+\\*]/g, \"\\\\$&amp;\") + \"(?:\\\\=([^&amp;]*))?)?.*$\", \"i\"), \"$1\"));\n}\n\nalert(loadPageVar(\"name\"));</pre>\n        \n</div><div id=\"section_12\"><span id=\"Nestle_the_variables_obtained_through_the_window.location.search_string_in_an_object_named_oGetVars.2C_also_attempting_to_recognize_their_typeof:\"></span><h5 class=\"editable\">Nestle the variables obtained through the <code>window.location.search</code> string in an object named <code>oGetVars</code>, also attempting to recognize their <code><a title=\"en/JavaScript/Reference/Operators/typeof\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference/Operators/typeof\">typeof</a></code>:</h5>\n\n          <pre name=\"code\" class=\"js\">var oGetVars = {};\n\nfunction buildValue(sValue) {\n  if (/^\\s*$/.test(sValue)) { return null; }\n  if (/^(true|false)$/i.test(sValue)) { return sValue.toLowerCase() === \"true\"; }\n  if (isFinite(sValue)) { return parseFloat(sValue); }\n  if (isFinite(Date.parse(sValue))) { return new Date(sValue); }\n  return sValue;\n}\n\nif (window.location.search.length &gt; 1) {\n  for (var aItKey, nKeyId = 0, aCouples = window.location.search.substr(1).split(\"&amp;\"); nKeyId &lt; aCouples.length; nKeyId++) {\n    aItKey = aCouples[nKeyId].split(\"=\");\n    oGetVars[unescape(aItKey[0])] = aItKey.length &gt; 1 ? buildValue(unescape(aItKey[1])) : null;\n  }\n}\n\n// alert(oGetVars.yourVar);</pre>\n        \n<p>…the same thing obtained by an anonymous constructor – useful for a global variable declaration:</p>\n\n          <pre name=\"code\" class=\"js\">var oGetVars = new (function (sSearch) {\n  var rNull = /^\\s*$/, rBool = /^(true|false)$/i;\n  function buildValue(sValue) {\n    if (rNull.test(sValue)) { return null; }\n    if (rBool.test(sValue)) { return sValue.toLowerCase() === \"true\"; }\n    if (isFinite(sValue)) { return parseFloat(sValue); }\n    if (isFinite(Date.parse(sValue))) { return new Date(sValue); }\n    return sValue;\n  }\n  if (sSearch.length &gt; 1) {\n    for (var aItKey, nKeyId = 0, aCouples = sSearch.substr(1).split(\"&amp;\"); nKeyId &lt; aCouples.length; nKeyId++) {\n      aItKey = aCouples[nKeyId].split(\"=\");\n      this[unescape(aItKey[0])] = aItKey.length &gt; 1 ? buildValue(unescape(aItKey[1])) : null;\n    }\n  }\n})(window.location.search);\n\n// alert(oGetVars.yourVar);</pre>\n        \n</div><div id=\"section_13\"><span id=\"Using_bookmars_without_changing_the_window.location.hash_property:\"></span><h5 class=\"editable\">Using bookmars without changing the <code>window.location.hash</code> property:</h5>\n\n          <pre name=\"code\" class=\"xml\">&lt;!doctype html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;meta content=\"text/html; charset=UTF-8\" http-equiv=\"Content-Type\" /&gt;\n&lt;title&gt;MDN Example&lt;/title&gt;\n&lt;script type=\"text/javascript\"&gt;\nfunction showNode (oNode) {\n  var nLeft = 0, nTop = 0;\n  for (var oItNode = oNode; oItNode; nLeft += oItNode.offsetLeft, nTop += oItNode.offsetTop, oItNode = oItNode.offsetParent);\n  document.documentElement.scrollTop = nTop;\n  document.documentElement.scrollLeft = nLeft;\n}\n\nfunction showBookmark (sBookmark, bUseHash) {\n  if (bUseHash) { window.location.hash = \"#\" + sBookmark; return; }\n  var oBookmark = document.getElementById(sBookmark);\n  if (oBookmark) { showNode(oBookmark); }\n}\n&lt;/script&gt;\n&lt;style type=\"text/css\"&gt;\nspan.intLink {\n  cursor: pointer;\n  color: #0000ff;\n  text-decoration: underline;\n}\n&lt;/style&gt;\n&lt;/head&gt;\n\n&lt;body&gt;\n&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ultrices dolor ac dolor imperdiet ullamcorper. Suspendisse quam libero, luctus auctor mollis sed, malesuada condimentum magna. Quisque in ante tellus, in placerat est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec a mi magna, quis mattis dolor. Etiam sit amet ligula quis urna auctor imperdiet nec faucibus ante. Mauris vel consectetur dolor. Nunc eget elit eget velit pulvinar fringilla consectetur aliquam purus. Curabitur convallis, justo posuere porta egestas, velit erat ornare tortor, non viverra justo diam eget arcu. Phasellus adipiscing fermentum nibh ac commodo. Nam turpis nunc, suscipit a hendrerit vitae, volutpat non ipsum.&lt;/p&gt;\n&lt;p&gt;Duis lobortis sapien quis nisl luctus porttitor. In tempor semper libero, eu tincidunt dolor eleifend sit amet. Ut nec velit in dolor tincidunt rhoncus non non diam. Morbi auctor ornare orci, non euismod felis gravida nec. Curabitur elementum nisi a eros rutrum nec blandit diam placerat. Aenean tincidunt risus ut nisi consectetur cursus. Ut vitae quam elit. Donec dignissim est in quam tempor consequat. Aliquam aliquam diam non felis convallis suscipit. Nulla facilisi. Donec lacus risus, dignissim et fringilla et, egestas vel eros. Duis malesuada accumsan dui, at fringilla mauris bibendum quis. Cras adipiscing ultricies fermentum. Praesent bibendum condimentum feugiat.&lt;/p&gt;\n&lt;p id=\"myBookmark1\"&gt;[&amp;nbsp;&lt;span class=\"intLink\" onclick=\"showBookmark('myBookmark2');\"&gt;Go to bookmark #2&lt;/span&gt;&amp;nbsp;]&lt;/p&gt;\n&lt;p&gt;Vivamus blandit massa ut metus mattis in fringilla lectus imperdiet. Proin ac ante a felis ornare vehicula. Fusce pellentesque lacus vitae eros convallis ut mollis magna pellentesque. Pellentesque placerat enim at lacus ultricies vitae facilisis nisi fringilla. In tincidunt tincidunt tincidunt. Nulla vitae tempor nisl. Etiam congue, elit vitae egestas mollis, ipsum nisi malesuada turpis, a volutpat arcu arcu id risus.&lt;/p&gt;\n&lt;p&gt;Nam faucibus, ligula eu fringilla pulvinar, lectus tellus iaculis nunc, vitae scelerisque metus leo non metus. Proin mattis lobortis lobortis. Quisque accumsan faucibus erat, vel varius tortor ultricies ac. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nec libero nunc. Nullam tortor nunc, elementum a consectetur et, ultrices eu orci. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a nisl eu sem vehicula egestas.&lt;/p&gt;\n&lt;p&gt;Aenean viverra varius mauris, sed elementum lacus interdum non. Phasellus sit amet lectus vitae eros egestas pellentesque fermentum eget magna. Quisque mauris nisl, gravida vitae placerat et, condimentum id metus. Nulla eu est dictum dolor pulvinar volutpat. Pellentesque vitae sollicitudin nunc. Donec neque magna, lobortis id egestas nec, sodales quis lectus. Fusce cursus sollicitudin porta. Suspendisse ut tortor in mauris tincidunt rhoncus. Maecenas tincidunt fermentum facilisis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.&lt;/p&gt;\n&lt;p&gt;Suspendisse turpis nisl, consectetur in lacinia ut, ornare vel mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin non lectus eu turpis vulputate cursus. Mauris interdum tincidunt erat id pharetra. Nullam in libero elit, sed consequat lectus. Morbi odio nisi, porta vitae molestie ut, gravida ut nunc. Ut non est dui, id ullamcorper orci. Praesent vel elementum felis. Maecenas ornare, dui quis auctor hendrerit, turpis sem ullamcorper odio, in auctor magna metus quis leo. Morbi at odio ante.&lt;/p&gt;\n&lt;p&gt;Curabitur est ipsum, porta ac viverra faucibus, eleifend sed eros. In sit amet vehicula tortor. Vestibulum viverra pellentesque erat a elementum. Integer commodo ultricies lorem, eget tincidunt risus viverra et. In enim turpis, porttitor ac ornare et, suscipit sit amet nisl. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque vel ultrices nibh. Sed commodo aliquam aliquam. Nulla euismod, odio ut eleifend mollis, nisi dui gravida nibh, vitae laoreet turpis purus id ipsum. Donec convallis, velit non scelerisque bibendum, diam nulla auctor nunc, vel dictum risus ipsum sit amet est. Praesent ut nibh sit amet nibh congue pulvinar. Suspendisse dictum porttitor tempor.&lt;/p&gt;\n&lt;p&gt;Vestibulum dignissim erat vitae lectus auctor ac bibendum eros semper. Integer aliquet, leo non ornare faucibus, risus arcu tristique dolor, a aliquet massa mauris quis arcu. In porttitor, lectus ac semper egestas, ligula magna laoreet libero, eu commodo mauris odio id ante. In hac habitasse platea dictumst. In pretium erat diam, nec consequat eros. Praesent augue mi, consequat sed porttitor at, volutpat vitae eros. Sed pretium pharetra dapibus. Donec auctor interdum erat, lacinia molestie nibh commodo ut. Maecenas vestibulum vulputate felis, ut ullamcorper arcu faucibus in. Curabitur id arcu est. In semper mollis lorem at pellentesque. Sed lectus nisl, vestibulum id scelerisque eu, feugiat et tortor. Pellentesque porttitor facilisis ultricies.&lt;/p&gt;\n&lt;p id=\"myBookmark2\"&gt;[&amp;nbsp;&lt;span class=\"intLink\" onclick=\"showBookmark('myBookmark1');\"&gt;Go to bookmark #1&lt;/span&gt; | &lt;span class=\"intLink\" onclick=\"showBookmark('myBookmark1', true);\"&gt;Go to bookmark #1 using location.hash&lt;/span&gt; | &lt;span class=\"intLink\" onclick=\"showBookmark('myBookmark3');\"&gt;Go to bookmark #3&lt;/span&gt;&amp;nbsp;]&lt;/p&gt;\n&lt;p&gt;Phasellus tempus fringilla nunc, eget sagittis orci molestie vel. Nulla sollicitudin diam non quam iaculis ac porta justo venenatis. Quisque tellus urna, molestie vitae egestas sit amet, suscipit sed sem. Quisque nec lorem eu velit faucibus tristique ut ut dolor. Cras eu tortor ut libero placerat venenatis ut ut massa. Sed quis libero augue, et consequat libero. Morbi rutrum augue sed turpis elementum sed luctus nisl molestie. Aenean vitae purus risus, a semper nisl. Pellentesque malesuada, est id sagittis consequat, libero mauris tincidunt tellus, eu sagittis arcu purus rutrum eros. Quisque eget eleifend mi. Duis pharetra mi ac eros mattis lacinia rutrum ipsum varius.&lt;/p&gt;\n&lt;p&gt;Fusce cursus pulvinar aliquam. Duis justo enim, ornare vitae elementum sed, porta a quam. Aliquam eu enim eu libero mollis tempus. Morbi ornare aliquam posuere. Proin faucibus luctus libero, sed ultrices lorem sagittis et. Vestibulum malesuada, ante nec molestie vehicula, quam diam mollis ipsum, rhoncus posuere mauris lectus in eros. Nullam feugiat ultrices augue, ac sodales sem mollis in.&lt;/p&gt;\n&lt;p id=\"myBookmark3\"&gt;&lt;em&gt;Here is the bookmark #3&lt;/em&gt;&lt;/p&gt;\n&lt;p&gt;Proin vitae sem non lorem pellentesque molestie. Nam tempus massa et turpis placerat sit amet sollicitudin orci sodales. Pellentesque enim enim, sagittis a lobortis ut, tempus sed arcu. Aliquam augue turpis, varius vel bibendum ut, aliquam at diam. Nam lobortis, dui eu hendrerit pellentesque, sem neque porttitor erat, non dapibus velit lectus in metus. Vestibulum sit amet felis enim. In quis est vitae nunc malesuada consequat nec nec sapien. Suspendisse aliquam massa placerat dui lacinia luctus sed vitae risus. Fusce tempus, neque id ultrices volutpat, mi urna auctor arcu, viverra semper libero sem vel enim. Mauris dictum, elit non placerat malesuada, libero elit euismod nibh, nec posuere massa arcu eu risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer urna velit, dapibus eget varius feugiat, pellentesque sit amet ligula. Maecenas nulla nisl, facilisis eu egestas scelerisque, mollis eget metus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi sed congue mi.&lt;/p&gt;\n&lt;p&gt;Fusce metus velit, pharetra at vestibulum nec, facilisis porttitor mi. Curabitur ligula sapien, fermentum vel porttitor id, rutrum sit amet magna. Sed sit amet sollicitudin turpis. Aenean luctus rhoncus dolor, et pulvinar ante egestas et. Donec ac massa orci, quis dapibus augue. Vivamus consectetur auctor pellentesque. Praesent vestibulum tincidunt ante sed consectetur. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce purus metus, imperdiet vitae iaculis convallis, bibendum vitae turpis.&lt;/p&gt;\n&lt;p&gt;Fusce aliquet molestie dolor, in ornare dui sodales nec. In molestie sollicitudin felis a porta. Mauris nec orci sit amet orci blandit tristique congue nec nunc. Praesent et tellus sollicitudin mauris accumsan fringilla. Morbi sodales, justo eu sollicitudin lacinia, lectus sapien ullamcorper eros, quis molestie urna elit bibendum risus. Proin eget tincidunt quam. Nam luctus commodo mauris, eu posuere nunc luctus non. Nulla facilisi. Vivamus eget leo rhoncus quam accumsan fringilla. Aliquam sit amet lorem est. Nullam vel tellus nibh, id imperdiet orci. Integer egestas leo eu turpis blandit scelerisque.&lt;/p&gt;\n&lt;p&gt;Etiam in blandit tellus. Integer sed varius quam. Vestibulum dapibus mi gravida arcu viverra blandit. Praesent tristique augue id sem adipiscing pellentesque. Sed sollicitudin, leo sed interdum elementum, nisi ante condimentum leo, eget ornare libero diam semper quam. Vivamus augue urna, porta eget ultrices et, dapibus ut ligula. Ut laoreet consequat faucibus. Praesent at lectus ut lectus malesuada mollis. Nam interdum adipiscing eros, nec sodales mi porta nec. Proin et quam vitae sem interdum aliquet. Proin vel odio at lacus vehicula aliquet.&lt;/p&gt;\n&lt;p&gt;Etiam placerat dui ut sem ornare vel vestibulum augue mattis. Sed semper malesuada mi, eu bibendum lacus lobortis nec. Etiam fringilla elementum risus, eget consequat urna laoreet nec. Etiam mollis quam non sem convallis vel consectetur lectus ullamcorper. Aenean mattis lacus quis ligula mattis eget vestibulum diam hendrerit. In non placerat mauris. Praesent faucibus nunc quis eros sagittis viverra. In hac habitasse platea dictumst. Suspendisse eget nisl erat, ac molestie massa. Praesent mollis vestibulum tincidunt. Fusce suscipit laoreet malesuada. Aliquam erat volutpat. Aliquam dictum elementum rhoncus. Praesent in est massa, pulvinar sodales nunc. Pellentesque gravida euismod mi ac convallis.&lt;/p&gt;\n&lt;p&gt;Mauris vel odio vel nulla facilisis lacinia. Aliquam ultrices est at leo blandit tincidunt. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse porttitor adipiscing facilisis. Duis cursus quam iaculis augue interdum porttitor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis vulputate magna ac metus pretium condimentum. In tempus, est eget vestibulum blandit, velit massa dignissim nisl, ut scelerisque lorem neque vel velit. Maecenas fermentum commodo viverra. Curabitur a nibh non velit aliquam cursus. Integer semper condimentum tortor a pellentesque. Pellentesque semper, nisl id porttitor vehicula, sem dui feugiat lacus, vitae consequat augue urna vel odio.&lt;/p&gt;\n&lt;p&gt;Vestibulum id neque nec turpis iaculis pulvinar et a massa. Vestibulum sed nibh vitae arcu eleifend egestas. Mauris fermentum ultrices blandit. Suspendisse vitae lorem libero. Aenean et pellentesque tellus. Morbi quis neque orci, eu dignissim dui. Fusce sollicitudin mauris ac arcu vestibulum imperdiet. Proin ultricies nisl sit amet enim imperdiet eu ornare dui tempus. Maecenas lobortis nisi a tortor vestibulum vel eleifend tellus vestibulum. Donec metus sapien, hendrerit a fermentum id, dictum quis libero.&lt;/p&gt;\n&lt;p&gt;Pellentesque a lorem nulla, in tempor justo. Duis odio nisl, dignissim sed consequat sit amet, hendrerit ac neque. Nunc ac augue nec massa tempor rhoncus. Nam feugiat, tellus a varius euismod, justo nisl faucibus velit, ut vulputate justo massa eu nibh. Sed bibendum urna quis magna facilisis in accumsan dolor malesuada. Morbi sit amet nunc risus, in faucibus sem. Nullam sollicitudin magna sed sem mollis id commodo libero condimentum. Duis eu massa et lacus semper molestie ut adipiscing sem.&lt;/p&gt;\n&lt;p&gt;Sed id nulla mi, eget suscipit eros. Aliquam tempus molestie rutrum. In quis varius elit. Nullam dignissim neque nec velit vulputate porttitor. Mauris ac ligula sit amet elit fermentum rhoncus. In tellus urna, pulvinar quis condimentum ut, porta nec justo. In hac habitasse platea dictumst. Proin volutpat elit id quam molestie ac commodo lacus sagittis. Quisque placerat, augue tempor placerat pulvinar, nisi nisi venenatis urna, eget convallis eros velit quis magna. Suspendisse volutpat iaculis quam, ut tristique lacus luctus quis.&lt;/p&gt;\n&lt;p&gt;Nullam commodo suscipit lacus non aliquet. Phasellus ac nisl lorem, sed facilisis ligula. Nam cursus lobortis placerat. Sed dui nisi, elementum eu sodales ac, placerat sit amet mauris. Pellentesque dapibus tellus ut ipsum aliquam eu auctor dui vehicula. Quisque ultrices laoreet erat, at ultrices tortor sodales non. Sed venenatis luctus magna, ultricies ultricies nunc fringilla eget. Praesent scelerisque urna vitae nibh tristique varius consequat neque luctus. Integer ornare, erat a porta tempus, velit justo fermentum elit, a fermentum metus nisi eu ipsum. Vivamus eget augue vel dui viverra adipiscing congue ut massa. Praesent vitae eros erat, pulvinar laoreet magna. Maecenas vestibulum mollis nunc in posuere. Pellentesque sit amet metus a turpis lobortis tempor eu vel tortor. Cras sodales eleifend interdum.&lt;/p&gt;\n&lt;/body&gt;\n&lt;/html&gt;</pre>\n        \n<div class=\"note\"><strong>Note:</strong> The function <code>showNode</code> is also an example of the use of the <code><a title=\"en/JavaScript/Reference/Statements/for\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference/Statements/for\">for</a></code> cycle without a <code>statement</code> section. In this case <strong>a semicolon is always put immediately after the declaration of the cycle</strong>.</div>\n<p>…the same thing but with a dynamic page scroll:</p>\n\n          <pre name=\"code\" class=\"js\">function showBookmark (sBookmark) {\n  /*\n  * nDuration: the duration in milliseconds of each scroll\n  * nFrames: number of frames for each scroll\n  */ \n  var  nDuration = 500, nFrames = 10,\n    nLeft = 0, nTop = 0, oNode = document.getElementById(sBookmark),\n    nScrTop = document.documentElement.scrollTop,\n    nScrLeft = document.documentElement.scrollLeft;\n\n  for (var oItNode = oNode; oItNode; nLeft += oItNode.offsetLeft, nTop += oItNode.offsetTop, oItNode = oItNode.offsetParent);\n\n  for (var nItFrame = 1; nItFrame &lt; nFrames + 1; nItFrame++) {\n    setTimeout(\"document.documentElement.scrollTop=\" + Math.round(nScrTop + ((nTop - nScrTop) * nItFrame / nFrames)) + \";document.documentElement.scrollLeft=\" + Math.round(nScrLeft + ((nTop - nScrLeft) * nItFrame / nFrames)) + \";\", Math.round(nDuration * nItFrame / nFrames));\n  }\n}</pre>\n        \n</div>","<p>Whenever a property of the location object is modified, a document will be loaded using the URL as if <code>window.location.assign()</code> had been called with the modified URL.</p>\n<div id=\"section_8\"><span id=\"Replace_the_current_document_with_the_one_at_the_given_URL:\"></span><h5 class=\"editable\">Replace the current document with the one at the given URL:</h5>\n\n          <pre name=\"code\" class=\"js\">function goMoz() { \n   window.location = \"http://www.mozilla.org\";\n} \n\n// in html: &lt;button onclick=\"goMoz();\"&gt;Mozilla&lt;/button&gt;</pre>\n        \n<div class=\"note\"><strong>Note:</strong> The example above works in situations where <code>window.location.hash</code>&nbsp;does not need to be retained. However, in Gecko-based browsers, setting <code>window.location.pathname</code> in this manner will erase any information in <code>window.location.hash</code>, whereas in WebKit (and possibly other browsers), setting the pathname will not alter the the hash. If you need to change pathname but keep the hash as is, use the <code>replace()</code> method instead, which should work consistently across browsers.</div>\n<p><br> Consider the following example, which will reload the page by using the <code>replace()</code> method to insert the value of <code>window.location.pathname</code> into the hash (similar to Twitter's reload of <a class=\" external\" rel=\"external\" href=\"http://twitter.com/username\" title=\"http://twitter.com/username\" target=\"_blank\">http://twitter.com/username</a> to <a class=\" external\" rel=\"external\" href=\"http://twitter.com/#!/username\" title=\"http://twitter.com/#!/username\" target=\"_blank\">http://twitter.com/#!/username</a>):</p>\n\n          <pre name=\"code\" class=\"js\">function reloadPageWithHash() {\n  var initialPage = window.location.pathname;\n  window.location.replace('http://example.com/#' + initialPage);\n}</pre>\n        \n</div><div id=\"section_9\"><span id=\"Display_the_properties_of_the_current_URL_in_an_alert_dialog:\"></span><h5 class=\"editable\">Display the properties of the current URL in an alert dialog:</h5>\n\n          <pre name=\"code\" class=\"js\">function showLoc() {\n  var oLocation = window.location, aLog = [\"Property (Typeof): Value\", \"window.location (\" + (typeof oLocation) + \"): \" + oLocation ];\n  for (var sProp in oLocation){\n    aLog.push(sProp + \" (\" + (typeof oLocation[sProp]) + \"): \" +  (oLocation[sProp] || \"n/a\"));\n  }\n  alert(aLog.join(\"\\n\"));\n}\n\n// in html: &lt;button onclick=\"showLoc();\"&gt;Show location properties&lt;/button&gt;</pre>\n        \n</div><div id=\"section_10\"><span id=\"Send_a_string_of_data_to_the_server_by_modifying_the_search_property:\"></span><h5 class=\"editable\">Send a string of data to the server by modifying the <code>search</code> property:</h5>\n\n          <pre name=\"code\" class=\"js\">function sendData (sData) {\n  window.location.search = sData;\n}\n\n// in html: &lt;button onclick=\"sendData('Some data');\"&gt;Send data&lt;/button&gt;</pre>\n        \n<p>The current URL with \"?Some%20data\" appended is sent to the server (if no action is taken by the server, the current document is reloaded with the modified search string).</p>\n</div><div id=\"section_11\"><span id=\"Get_the_value_of_a_single_window.location.search_key:\"></span><h5 class=\"editable\">Get the value of a single <code>window.location.search</code> key:</h5>\n\n          <pre name=\"code\" class=\"js\">function loadPageVar (sVar) {\n  return unescape(window.location.search.replace(new RegExp(\"^(?:.*[&amp;\\\\?]\" + escape(sVar).replace(/[\\.\\+\\*]/g, \"\\\\$&amp;\") + \"(?:\\\\=([^&amp;]*))?)?.*$\", \"i\"), \"$1\"));\n}\n\nalert(loadPageVar(\"name\"));</pre>\n        \n</div><div id=\"section_12\"><span id=\"Nestle_the_variables_obtained_through_the_window.location.search_string_in_an_object_named_oGetVars.2C_also_attempting_to_recognize_their_typeof:\"></span><h5 class=\"editable\">Nestle the variables obtained through the <code>window.location.search</code> string in an object named <code>oGetVars</code>, also attempting to recognize their <code><a title=\"en/JavaScript/Reference/Operators/typeof\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference/Operators/typeof\">typeof</a></code>:</h5>\n\n          <pre name=\"code\" class=\"js\">var oGetVars = {};\n\nfunction buildValue(sValue) {\n  if (/^\\s*$/.test(sValue)) { return null; }\n  if (/^(true|false)$/i.test(sValue)) { return sValue.toLowerCase() === \"true\"; }\n  if (isFinite(sValue)) { return parseFloat(sValue); }\n  if (isFinite(Date.parse(sValue))) { return new Date(sValue); }\n  return sValue;\n}\n\nif (window.location.search.length &gt; 1) {\n  for (var aItKey, nKeyId = 0, aCouples = window.location.search.substr(1).split(\"&amp;\"); nKeyId &lt; aCouples.length; nKeyId++) {\n    aItKey = aCouples[nKeyId].split(\"=\");\n    oGetVars[unescape(aItKey[0])] = aItKey.length &gt; 1 ? buildValue(unescape(aItKey[1])) : null;\n  }\n}\n\n// alert(oGetVars.yourVar);</pre>\n        \n<p>…the same thing obtained by an anonymous constructor – useful for a global variable declaration:</p>\n\n          <pre name=\"code\" class=\"js\">var oGetVars = new (function (sSearch) {\n  var rNull = /^\\s*$/, rBool = /^(true|false)$/i;\n  function buildValue(sValue) {\n    if (rNull.test(sValue)) { return null; }\n    if (rBool.test(sValue)) { return sValue.toLowerCase() === \"true\"; }\n    if (isFinite(sValue)) { return parseFloat(sValue); }\n    if (isFinite(Date.parse(sValue))) { return new Date(sValue); }\n    return sValue;\n  }\n  if (sSearch.length &gt; 1) {\n    for (var aItKey, nKeyId = 0, aCouples = sSearch.substr(1).split(\"&amp;\"); nKeyId &lt; aCouples.length; nKeyId++) {\n      aItKey = aCouples[nKeyId].split(\"=\");\n      this[unescape(aItKey[0])] = aItKey.length &gt; 1 ? buildValue(unescape(aItKey[1])) : null;\n    }\n  }\n})(window.location.search);\n\n// alert(oGetVars.yourVar);</pre>\n        \n</div><div id=\"section_13\"><span id=\"Using_bookmars_without_changing_the_window.location.hash_property:\"></span><h5 class=\"editable\">Using bookmars without changing the <code>window.location.hash</code> property:</h5>\n\n          <pre name=\"code\" class=\"xml\">&lt;!doctype html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;meta content=\"text/html; charset=UTF-8\" http-equiv=\"Content-Type\" /&gt;\n&lt;title&gt;MDN Example&lt;/title&gt;\n&lt;script type=\"text/javascript\"&gt;\nfunction showNode (oNode) {\n  var nLeft = 0, nTop = 0;\n  for (var oItNode = oNode; oItNode; nLeft += oItNode.offsetLeft, nTop += oItNode.offsetTop, oItNode = oItNode.offsetParent);\n  document.documentElement.scrollTop = nTop;\n  document.documentElement.scrollLeft = nLeft;\n}\n\nfunction showBookmark (sBookmark, bUseHash) {\n  if (bUseHash) { window.location.hash = \"#\" + sBookmark; return; }\n  var oBookmark = document.getElementById(sBookmark);\n  if (oBookmark) { showNode(oBookmark); }\n}\n&lt;/script&gt;\n&lt;style type=\"text/css\"&gt;\nspan.intLink {\n  cursor: pointer;\n  color: #0000ff;\n  text-decoration: underline;\n}\n&lt;/style&gt;\n&lt;/head&gt;\n\n&lt;body&gt;\n&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ultrices dolor ac dolor imperdiet ullamcorper. Suspendisse quam libero, luctus auctor mollis sed, malesuada condimentum magna. Quisque in ante tellus, in placerat est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec a mi magna, quis mattis dolor. Etiam sit amet ligula quis urna auctor imperdiet nec faucibus ante. Mauris vel consectetur dolor. Nunc eget elit eget velit pulvinar fringilla consectetur aliquam purus. Curabitur convallis, justo posuere porta egestas, velit erat ornare tortor, non viverra justo diam eget arcu. Phasellus adipiscing fermentum nibh ac commodo. Nam turpis nunc, suscipit a hendrerit vitae, volutpat non ipsum.&lt;/p&gt;\n&lt;p&gt;Duis lobortis sapien quis nisl luctus porttitor. In tempor semper libero, eu tincidunt dolor eleifend sit amet. Ut nec velit in dolor tincidunt rhoncus non non diam. Morbi auctor ornare orci, non euismod felis gravida nec. Curabitur elementum nisi a eros rutrum nec blandit diam placerat. Aenean tincidunt risus ut nisi consectetur cursus. Ut vitae quam elit. Donec dignissim est in quam tempor consequat. Aliquam aliquam diam non felis convallis suscipit. Nulla facilisi. Donec lacus risus, dignissim et fringilla et, egestas vel eros. Duis malesuada accumsan dui, at fringilla mauris bibendum quis. Cras adipiscing ultricies fermentum. Praesent bibendum condimentum feugiat.&lt;/p&gt;\n&lt;p id=\"myBookmark1\"&gt;[&amp;nbsp;&lt;span class=\"intLink\" onclick=\"showBookmark('myBookmark2');\"&gt;Go to bookmark #2&lt;/span&gt;&amp;nbsp;]&lt;/p&gt;\n&lt;p&gt;Vivamus blandit massa ut metus mattis in fringilla lectus imperdiet. Proin ac ante a felis ornare vehicula. Fusce pellentesque lacus vitae eros convallis ut mollis magna pellentesque. Pellentesque placerat enim at lacus ultricies vitae facilisis nisi fringilla. In tincidunt tincidunt tincidunt. Nulla vitae tempor nisl. Etiam congue, elit vitae egestas mollis, ipsum nisi malesuada turpis, a volutpat arcu arcu id risus.&lt;/p&gt;\n&lt;p&gt;Nam faucibus, ligula eu fringilla pulvinar, lectus tellus iaculis nunc, vitae scelerisque metus leo non metus. Proin mattis lobortis lobortis. Quisque accumsan faucibus erat, vel varius tortor ultricies ac. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nec libero nunc. Nullam tortor nunc, elementum a consectetur et, ultrices eu orci. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a nisl eu sem vehicula egestas.&lt;/p&gt;\n&lt;p&gt;Aenean viverra varius mauris, sed elementum lacus interdum non. Phasellus sit amet lectus vitae eros egestas pellentesque fermentum eget magna. Quisque mauris nisl, gravida vitae placerat et, condimentum id metus. Nulla eu est dictum dolor pulvinar volutpat. Pellentesque vitae sollicitudin nunc. Donec neque magna, lobortis id egestas nec, sodales quis lectus. Fusce cursus sollicitudin porta. Suspendisse ut tortor in mauris tincidunt rhoncus. Maecenas tincidunt fermentum facilisis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.&lt;/p&gt;\n&lt;p&gt;Suspendisse turpis nisl, consectetur in lacinia ut, ornare vel mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin non lectus eu turpis vulputate cursus. Mauris interdum tincidunt erat id pharetra. Nullam in libero elit, sed consequat lectus. Morbi odio nisi, porta vitae molestie ut, gravida ut nunc. Ut non est dui, id ullamcorper orci. Praesent vel elementum felis. Maecenas ornare, dui quis auctor hendrerit, turpis sem ullamcorper odio, in auctor magna metus quis leo. Morbi at odio ante.&lt;/p&gt;\n&lt;p&gt;Curabitur est ipsum, porta ac viverra faucibus, eleifend sed eros. In sit amet vehicula tortor. Vestibulum viverra pellentesque erat a elementum. Integer commodo ultricies lorem, eget tincidunt risus viverra et. In enim turpis, porttitor ac ornare et, suscipit sit amet nisl. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque vel ultrices nibh. Sed commodo aliquam aliquam. Nulla euismod, odio ut eleifend mollis, nisi dui gravida nibh, vitae laoreet turpis purus id ipsum. Donec convallis, velit non scelerisque bibendum, diam nulla auctor nunc, vel dictum risus ipsum sit amet est. Praesent ut nibh sit amet nibh congue pulvinar. Suspendisse dictum porttitor tempor.&lt;/p&gt;\n&lt;p&gt;Vestibulum dignissim erat vitae lectus auctor ac bibendum eros semper. Integer aliquet, leo non ornare faucibus, risus arcu tristique dolor, a aliquet massa mauris quis arcu. In porttitor, lectus ac semper egestas, ligula magna laoreet libero, eu commodo mauris odio id ante. In hac habitasse platea dictumst. In pretium erat diam, nec consequat eros. Praesent augue mi, consequat sed porttitor at, volutpat vitae eros. Sed pretium pharetra dapibus. Donec auctor interdum erat, lacinia molestie nibh commodo ut. Maecenas vestibulum vulputate felis, ut ullamcorper arcu faucibus in. Curabitur id arcu est. In semper mollis lorem at pellentesque. Sed lectus nisl, vestibulum id scelerisque eu, feugiat et tortor. Pellentesque porttitor facilisis ultricies.&lt;/p&gt;\n&lt;p id=\"myBookmark2\"&gt;[&amp;nbsp;&lt;span class=\"intLink\" onclick=\"showBookmark('myBookmark1');\"&gt;Go to bookmark #1&lt;/span&gt; | &lt;span class=\"intLink\" onclick=\"showBookmark('myBookmark1', true);\"&gt;Go to bookmark #1 using location.hash&lt;/span&gt; | &lt;span class=\"intLink\" onclick=\"showBookmark('myBookmark3');\"&gt;Go to bookmark #3&lt;/span&gt;&amp;nbsp;]&lt;/p&gt;\n&lt;p&gt;Phasellus tempus fringilla nunc, eget sagittis orci molestie vel. Nulla sollicitudin diam non quam iaculis ac porta justo venenatis. Quisque tellus urna, molestie vitae egestas sit amet, suscipit sed sem. Quisque nec lorem eu velit faucibus tristique ut ut dolor. Cras eu tortor ut libero placerat venenatis ut ut massa. Sed quis libero augue, et consequat libero. Morbi rutrum augue sed turpis elementum sed luctus nisl molestie. Aenean vitae purus risus, a semper nisl. Pellentesque malesuada, est id sagittis consequat, libero mauris tincidunt tellus, eu sagittis arcu purus rutrum eros. Quisque eget eleifend mi. Duis pharetra mi ac eros mattis lacinia rutrum ipsum varius.&lt;/p&gt;\n&lt;p&gt;Fusce cursus pulvinar aliquam. Duis justo enim, ornare vitae elementum sed, porta a quam. Aliquam eu enim eu libero mollis tempus. Morbi ornare aliquam posuere. Proin faucibus luctus libero, sed ultrices lorem sagittis et. Vestibulum malesuada, ante nec molestie vehicula, quam diam mollis ipsum, rhoncus posuere mauris lectus in eros. Nullam feugiat ultrices augue, ac sodales sem mollis in.&lt;/p&gt;\n&lt;p id=\"myBookmark3\"&gt;&lt;em&gt;Here is the bookmark #3&lt;/em&gt;&lt;/p&gt;\n&lt;p&gt;Proin vitae sem non lorem pellentesque molestie. Nam tempus massa et turpis placerat sit amet sollicitudin orci sodales. Pellentesque enim enim, sagittis a lobortis ut, tempus sed arcu. Aliquam augue turpis, varius vel bibendum ut, aliquam at diam. Nam lobortis, dui eu hendrerit pellentesque, sem neque porttitor erat, non dapibus velit lectus in metus. Vestibulum sit amet felis enim. In quis est vitae nunc malesuada consequat nec nec sapien. Suspendisse aliquam massa placerat dui lacinia luctus sed vitae risus. Fusce tempus, neque id ultrices volutpat, mi urna auctor arcu, viverra semper libero sem vel enim. Mauris dictum, elit non placerat malesuada, libero elit euismod nibh, nec posuere massa arcu eu risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer urna velit, dapibus eget varius feugiat, pellentesque sit amet ligula. Maecenas nulla nisl, facilisis eu egestas scelerisque, mollis eget metus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi sed congue mi.&lt;/p&gt;\n&lt;p&gt;Fusce metus velit, pharetra at vestibulum nec, facilisis porttitor mi. Curabitur ligula sapien, fermentum vel porttitor id, rutrum sit amet magna. Sed sit amet sollicitudin turpis. Aenean luctus rhoncus dolor, et pulvinar ante egestas et. Donec ac massa orci, quis dapibus augue. Vivamus consectetur auctor pellentesque. Praesent vestibulum tincidunt ante sed consectetur. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce purus metus, imperdiet vitae iaculis convallis, bibendum vitae turpis.&lt;/p&gt;\n&lt;p&gt;Fusce aliquet molestie dolor, in ornare dui sodales nec. In molestie sollicitudin felis a porta. Mauris nec orci sit amet orci blandit tristique congue nec nunc. Praesent et tellus sollicitudin mauris accumsan fringilla. Morbi sodales, justo eu sollicitudin lacinia, lectus sapien ullamcorper eros, quis molestie urna elit bibendum risus. Proin eget tincidunt quam. Nam luctus commodo mauris, eu posuere nunc luctus non. Nulla facilisi. Vivamus eget leo rhoncus quam accumsan fringilla. Aliquam sit amet lorem est. Nullam vel tellus nibh, id imperdiet orci. Integer egestas leo eu turpis blandit scelerisque.&lt;/p&gt;\n&lt;p&gt;Etiam in blandit tellus. Integer sed varius quam. Vestibulum dapibus mi gravida arcu viverra blandit. Praesent tristique augue id sem adipiscing pellentesque. Sed sollicitudin, leo sed interdum elementum, nisi ante condimentum leo, eget ornare libero diam semper quam. Vivamus augue urna, porta eget ultrices et, dapibus ut ligula. Ut laoreet consequat faucibus. Praesent at lectus ut lectus malesuada mollis. Nam interdum adipiscing eros, nec sodales mi porta nec. Proin et quam vitae sem interdum aliquet. Proin vel odio at lacus vehicula aliquet.&lt;/p&gt;\n&lt;p&gt;Etiam placerat dui ut sem ornare vel vestibulum augue mattis. Sed semper malesuada mi, eu bibendum lacus lobortis nec. Etiam fringilla elementum risus, eget consequat urna laoreet nec. Etiam mollis quam non sem convallis vel consectetur lectus ullamcorper. Aenean mattis lacus quis ligula mattis eget vestibulum diam hendrerit. In non placerat mauris. Praesent faucibus nunc quis eros sagittis viverra. In hac habitasse platea dictumst. Suspendisse eget nisl erat, ac molestie massa. Praesent mollis vestibulum tincidunt. Fusce suscipit laoreet malesuada. Aliquam erat volutpat. Aliquam dictum elementum rhoncus. Praesent in est massa, pulvinar sodales nunc. Pellentesque gravida euismod mi ac convallis.&lt;/p&gt;\n&lt;p&gt;Mauris vel odio vel nulla facilisis lacinia. Aliquam ultrices est at leo blandit tincidunt. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse porttitor adipiscing facilisis. Duis cursus quam iaculis augue interdum porttitor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis vulputate magna ac metus pretium condimentum. In tempus, est eget vestibulum blandit, velit massa dignissim nisl, ut scelerisque lorem neque vel velit. Maecenas fermentum commodo viverra. Curabitur a nibh non velit aliquam cursus. Integer semper condimentum tortor a pellentesque. Pellentesque semper, nisl id porttitor vehicula, sem dui feugiat lacus, vitae consequat augue urna vel odio.&lt;/p&gt;\n&lt;p&gt;Vestibulum id neque nec turpis iaculis pulvinar et a massa. Vestibulum sed nibh vitae arcu eleifend egestas. Mauris fermentum ultrices blandit. Suspendisse vitae lorem libero. Aenean et pellentesque tellus. Morbi quis neque orci, eu dignissim dui. Fusce sollicitudin mauris ac arcu vestibulum imperdiet. Proin ultricies nisl sit amet enim imperdiet eu ornare dui tempus. Maecenas lobortis nisi a tortor vestibulum vel eleifend tellus vestibulum. Donec metus sapien, hendrerit a fermentum id, dictum quis libero.&lt;/p&gt;\n&lt;p&gt;Pellentesque a lorem nulla, in tempor justo. Duis odio nisl, dignissim sed consequat sit amet, hendrerit ac neque. Nunc ac augue nec massa tempor rhoncus. Nam feugiat, tellus a varius euismod, justo nisl faucibus velit, ut vulputate justo massa eu nibh. Sed bibendum urna quis magna facilisis in accumsan dolor malesuada. Morbi sit amet nunc risus, in faucibus sem. Nullam sollicitudin magna sed sem mollis id commodo libero condimentum. Duis eu massa et lacus semper molestie ut adipiscing sem.&lt;/p&gt;\n&lt;p&gt;Sed id nulla mi, eget suscipit eros. Aliquam tempus molestie rutrum. In quis varius elit. Nullam dignissim neque nec velit vulputate porttitor. Mauris ac ligula sit amet elit fermentum rhoncus. In tellus urna, pulvinar quis condimentum ut, porta nec justo. In hac habitasse platea dictumst. Proin volutpat elit id quam molestie ac commodo lacus sagittis. Quisque placerat, augue tempor placerat pulvinar, nisi nisi venenatis urna, eget convallis eros velit quis magna. Suspendisse volutpat iaculis quam, ut tristique lacus luctus quis.&lt;/p&gt;\n&lt;p&gt;Nullam commodo suscipit lacus non aliquet. Phasellus ac nisl lorem, sed facilisis ligula. Nam cursus lobortis placerat. Sed dui nisi, elementum eu sodales ac, placerat sit amet mauris. Pellentesque dapibus tellus ut ipsum aliquam eu auctor dui vehicula. Quisque ultrices laoreet erat, at ultrices tortor sodales non. Sed venenatis luctus magna, ultricies ultricies nunc fringilla eget. Praesent scelerisque urna vitae nibh tristique varius consequat neque luctus. Integer ornare, erat a porta tempus, velit justo fermentum elit, a fermentum metus nisi eu ipsum. Vivamus eget augue vel dui viverra adipiscing congue ut massa. Praesent vitae eros erat, pulvinar laoreet magna. Maecenas vestibulum mollis nunc in posuere. Pellentesque sit amet metus a turpis lobortis tempor eu vel tortor. Cras sodales eleifend interdum.&lt;/p&gt;\n&lt;/body&gt;\n&lt;/html&gt;</pre>\n        \n<div class=\"note\"><strong>Note:</strong> The function <code>showNode</code> is also an example of the use of the <code><a title=\"en/JavaScript/Reference/Statements/for\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference/Statements/for\">for</a></code> cycle without a <code>statement</code> section. In this case <strong>a semicolon is always put immediately after the declaration of the cycle</strong>.</div>\n<p>…the same thing but with a dynamic page scroll:</p>\n\n          <pre name=\"code\" class=\"js\">function showBookmark (sBookmark) {\n  /*\n  * nDuration: the duration in milliseconds of each scroll\n  * nFrames: number of frames for each scroll\n  */ \n  var  nDuration = 500, nFrames = 10,\n    nLeft = 0, nTop = 0, oNode = document.getElementById(sBookmark),\n    nScrTop = document.documentElement.scrollTop,\n    nScrLeft = document.documentElement.scrollLeft;\n\n  for (var oItNode = oNode; oItNode; nLeft += oItNode.offsetLeft, nTop += oItNode.offsetTop, oItNode = oItNode.offsetParent);\n\n  for (var nItFrame = 1; nItFrame &lt; nFrames + 1; nItFrame++) {\n    setTimeout(\"document.documentElement.scrollTop=\" + Math.round(nScrTop + ((nTop - nScrTop) * nItFrame / nFrames)) + \";document.documentElement.scrollLeft=\" + Math.round(nScrLeft + ((nTop - nScrLeft) * nItFrame / nFrames)) + \";\", Math.round(nDuration * nItFrame / nFrames));\n  }\n}</pre>\n        \n</div>"],"srcUrl":"https://developer.mozilla.org/en/DOM/window.location","specification":"HTML Specification: window . location","seeAlso":"Manipulating the browser history","summary":"Returns a <a href=\"#Location_object\"> <code>Location</code> object</a>, which contains information about the URL of the document and provides methods for changing that URL. You can also assign to this property to load another URL.","members":[{"name":"assign","help":"Load the document at the provided URL.","obsolete":false},{"name":"reload","help":"Reload the document from the current URL. <code>forceget</code> is a boolean, which, when it is <code>true</code>, causes the page to always be reloaded from the server. If it is <code>false</code> or not specified, the browser may reload the page from its cache.","obsolete":false},{"name":"replace","help":"Replace the current document with the one at the provided URL. The difference from the <code>assign()</code> method is that after using <code>replace()</code> the current page will not be saved in session history, meaning the user won't be able to use the Back button to navigate to it.","obsolete":false},{"name":"toString","help":"Returns the string representation of the <code>Location</code> object's URL. See the <a title=\"en/Core_JavaScript_1.5_Reference/Global_Objects/Object/toString\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/toString\">JavaScript reference</a> for details.","obsolete":false},{"name":"hash","help":"the part of the URL that follows the # symbol, including the # symbol.<br> You can listen for the <a title=\"en/DOM/window.onhashchange\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window.onhashchange\">hashchange event</a> to get notified of changes to the hash in supporting browsers.","obsolete":false},{"name":"host","help":"the host name and port number.","obsolete":false},{"name":"hostname","help":"the host name (without the port number or square brackets).","obsolete":false},{"name":"href","help":"the entire URL.","obsolete":false},{"name":"pathname","help":"the path (relative to the host).","obsolete":false},{"name":"port","help":"the port number of the URL.","obsolete":false},{"name":"protocol","help":"the protocol of the URL.","obsolete":false},{"name":"search","help":"the part of the URL that follows the&nbsp;? symbol, including the&nbsp;? symbol.","obsolete":false},{"name":"assign","help":"Load the document at the provided URL.","obsolete":false},{"name":"reload","help":"Reload the document from the current URL. <code>forceget</code> is a boolean, which, when it is <code>true</code>, causes the page to always be reloaded from the server. If it is <code>false</code> or not specified, the browser may reload the page from its cache.","obsolete":false},{"name":"replace","help":"Replace the current document with the one at the provided URL. The difference from the <code>assign()</code> method is that after using <code>replace()</code> the current page will not be saved in session history, meaning the user won't be able to use the Back button to navigate to it.","obsolete":false},{"name":"toString","help":"Returns the string representation of the <code>Location</code> object's URL. See the <a title=\"en/Core_JavaScript_1.5_Reference/Global_Objects/Object/toString\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/toString\">JavaScript reference</a> for details.","obsolete":false},{"name":"hash","help":"the part of the URL that follows the # symbol, including the # symbol.<br> You can listen for the <a title=\"en/DOM/window.onhashchange\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window.onhashchange\">hashchange event</a> to get notified of changes to the hash in supporting browsers.","obsolete":false},{"name":"host","help":"the host name and port number.","obsolete":false},{"name":"hostname","help":"the host name (without the port number or square brackets).","obsolete":false},{"name":"href","help":"the entire URL.","obsolete":false},{"name":"pathname","help":"the path (relative to the host).","obsolete":false},{"name":"port","help":"the port number of the URL.","obsolete":false},{"name":"protocol","help":"the protocol of the URL.","obsolete":false},{"name":"search","help":"the part of the URL that follows the&nbsp;? symbol, including the&nbsp;? symbol.","obsolete":false}]},"OverflowEvent":{"title":"XUL Events","members":[],"srcUrl":"https://developer.mozilla.org/en/XUL/Events","skipped":true,"cause":"Suspect title"},"SVGPathSegMovetoAbs":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"SVGSymbolElement":{"title":"SVGSymbolElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGSymbolElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/symbol\">&lt;symbol&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGSymbolElement"},"HTMLDetailsElement":{"title":"details","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>12</td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=591737\" class=\"external\" title=\"\">\nbug 591737</a>\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>4.0</td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=591737\" class=\"external\" title=\"\">\nbug 591737</a>\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["&lt;details&gt;\n  &lt;summary&gt;Some details&lt;/summary&gt;\n  &lt;p&gt;More info about the details.&lt;/p&gt;\n&lt;/details&gt;"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/details","seeAlso":"&lt;summary&gt;","summary":"The HTML <em>details</em> element (<code>&lt;details&gt;</code>) is used as a disclosure widget from which the user the retrieve additional information.","members":[{"obsolete":false,"url":"","name":"open","help":"This Boolean attribute indicates whether the details will be shown to the user on page load. If omitted the details will be hidden."}]},"SVGTextPathElement":{"title":"textPath","examples":["&lt;?xml version=\"1.0\" standalone=\"no\"?&gt;\n&lt;!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \n  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"&gt;\n&lt;svg width=\"12cm\" height=\"3.6cm\" viewBox=\"0 0 1000 300\" version=\"1.1\"\n     xmlns=\"http://www.w3.org/2000/svg\" \n     xmlns:xlink=\"http://www.w3.org/1999/xlink\"&gt;\n  &lt;defs&gt;\n    &lt;path id=\"MyPath\"\n          d=\"M 100 200 \n             C 200 100 300   0 400 100\n             C 500 200 600 300 700 200\n             C 800 100 900 100 900 100\" /&gt;\n  &lt;/defs&gt;\n\n  &lt;use xlink:href=\"#MyPath\" fill=\"none\" stroke=\"red\"  /&gt;\n\n  &lt;text font-family=\"Verdana\" font-size=\"42.5\" fill=\"blue\" &gt;\n    &lt;textPath xlink:href=\"#MyPath\"&gt;\n      We go up, then we go down, then up again\n    &lt;/textPath&gt;\n  &lt;/text&gt;\n\n  &lt;!-- Show outline of canvas using 'rect' element --&gt;\n  &lt;rect x=\"1\" y=\"1\" width=\"998\" height=\"298\"\n        fill=\"none\" stroke=\"blue\" stroke-width=\"2\" /&gt;\n&lt;/svg&gt;"],"summary":"In addition to text drawn in a straight line, SVG also includes the ability to place text along the shape of a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/path\">&lt;path&gt;</a></code>\n element. To specify that a block of text is to be rendered along the shape of a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/path\">&lt;path&gt;</a></code>\n, include the given text within a <code>textPath</code> element which includes an <code>xlink:href</code> attribute with a reference to a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/path\">&lt;path&gt;</a></code>\n element.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/startOffset","name":"startOffset","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/spacing","name":"spacing","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/method","name":"method","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/externalResourcesRequired","name":"externalResourcesRequired","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":""}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/textPath"},"SVGTextPositioningElement":{"title":"SVGTextPositioningElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGTextPositioningElement</code> interface is inherited by text-related interfaces: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGTextElement\">SVGTextElement</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGTSpanElement\">SVGTSpanElement</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGTRefElement\">SVGTRefElement</a></code>\n and <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGAltGlyphElement\" class=\"new\">SVGAltGlyphElement</a></code>\n.","members":[{"name":"dx","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/dx\" class=\"new\">dx</a></code> on the given element.","obsolete":false},{"name":"dy","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/dy\" class=\"new\">dy</a></code> on the given element.","obsolete":false},{"name":"rotate","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/rotate\" class=\"new\">rotate</a></code> on the given element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGTextPositioningElement"},"SVGSwitchElement":{"title":"SVGSwitchElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGSwitchElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/switch\">&lt;switch&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGSwitchElement"},"SVGEllipseElement":{"title":"SVGEllipseElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGEllipseElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/ellipse\">&lt;ellipse&gt;</a></code>\n SVG Element","summary":"The <code>SVGEllipseElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/ellipse\">&lt;ellipse&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"cx","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/cx\">cx</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/ellipse\">&lt;ellipse&gt;</a></code>\n element.","obsolete":false},{"name":"cy","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/cy\">cy</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/ellipse\">&lt;ellipse&gt;</a></code>\n element.","obsolete":false},{"name":"rx","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/rx\">rx</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/ellipse\">&lt;ellipse&gt;</a></code>\n element.","obsolete":false},{"name":"ry","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/ry\">ry</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/ellipse\">&lt;ellipse&gt;</a></code>\n element.","obsolete":false}]},"Database":{"title":"The Places database","summary":"<div><p>This content covers features introduced in <a rel=\"custom\" href=\"https://developer.mozilla.org/en/Firefox_3_for_developers\">Firefox 3</a>.</p></div>\n<p></p>\n<p>This document provides a high-level overview of the overall database design of the <a title=\"en/Places\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Places\">Places</a> system. Places is designed to be a complete replacement for the Firefox bookmarks and history systems using <a title=\"en/Storage\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Storage\">Storage.</a></p>\n<p>View the <a class=\" external\" rel=\"external\" href=\"http://people.mozilla.org/~dietrich/places-erd.png\" title=\"http://people.mozilla.org/~dietrich/places-erd.png\" target=\"_blank\">schema diagram</a>.</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/The_Places_database"},"DOMException":{"title":"DOMException","summary":"<p>The following are the <strong>DOMException</strong> codes:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\">Code</th> <th scope=\"col\">'Abstract' Constant name</th> </tr> </thead> <tbody> <tr> <th colspan=\"2\">Level 1</th> </tr> <tr> <td><code>1</code></td> <td><code>INDEX_SIZE_ERR</code></td> </tr> <tr> <td><code>2</code></td> <td><code>DOMSTRING_SIZE_ERR</code></td> </tr> <tr> <td><code>3</code></td> <td><code>HIERARCHY_REQUEST_ERR</code></td> </tr> <tr> <td><code>4</code></td> <td><code>WRONG_DOCUMENT_ERR</code></td> </tr> <tr> <td><code>5</code></td> <td><code>INVALID_CHARACTER_ERR</code></td> </tr> <tr> <td><code>6</code></td> <td><code>NO_DATA_ALLOWED_ERR</code></td> </tr> <tr> <td><code>7</code></td> <td><code>NO_MODIFICATION_ALLOWED_ERR</code></td> </tr> <tr> <td><code>8</code></td> <td><code>NOT_FOUND_ERR</code></td> </tr> <tr> <td><code>9</code></td> <td><code>NOT_SUPPORTED_ERR</code></td> </tr> <tr> <td><code>10</code></td> <td><code>INUSE_ATTRIBUTE_ERR</code></td> </tr> <tr> <th colspan=\"2\">Level 2</th> </tr> <tr> <td><code>11</code></td> <td><code>INVALID_STATE_ERR</code></td> </tr> <tr> <td><code>12</code></td> <td><code>SYNTAX_ERR</code></td> </tr> <tr> <td><code>13</code></td> <td><code>INVALID_MODIFICATION_ERR</code></td> </tr> <tr> <td><code>14</code></td> <td><code>NAMESPACE_ERR</code></td> </tr> <tr> <td><code>15</code></td> <td><code>INVALID_ACCESS_ERR</code></td> </tr> <tr> <th colspan=\"2\"><strong>Level 3</strong></th> </tr> <tr> <td><code>16</code></td> <td><code>VALIDATION_ERR</code></td> </tr> <tr> <td><code>17</code></td> <td><code>TYPE_MISMATCH_ERR</code></td> </tr> </tbody>\n</table>","members":[],"srcUrl":"https://developer.mozilla.org/En/DOM/DOMException","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...ml#ID-17189187"},"Navigator":{"title":"window.navigator","examples":["alert(\"You're using \" + navigator.appName);\n"],"srcUrl":"https://developer.mozilla.org/en/DOM/window.navigator","specification":"Defined in <a class=\"external\" title=\"http://www.whatwg.org/html/#navigator\" rel=\"external\" href=\"http://www.whatwg.org/html/#navigator\" target=\"_blank\">HTML</a>.","seeAlso":"DOM Client Object Cross-Reference:navigator","summary":"Returns a reference to the navigator object, which can be queried for information about the application running the script.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.javaEnabled","name":"javaEnabled","help":"Indicates whether the host browser is Java-enabled or not."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.navigator.taintEnabled","name":"taintEnabled","help":"Returns <code>false</code>. JavaScript taint/untaint functions removed in JavaScript 1.2. Removed from Firefox 9."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.registerContentHandler","name":"registerContentHandler","help":"Allows web sites to register themselves as a possible handler for a given MIME type."},{"name":"webkitIsLocallyAvailable","help":"Lets code check to see if the document at a given URI is available without using the network.","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.navigator.registerProtocolHandler","name":"registerProtocolHandler","help":"Allows web sites to register themselves as a possible handler for a given protocol."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.navigator.preference","name":"preference","help":"Sets a user preference. This method is <a class=\"external\" rel=\"external\" href=\"http://www.faqts.com/knowledge_base/view.phtml/aid/1608/fid/125/lang/en\" title=\"http://www.faqts.com/knowledge_base/view.phtml/aid/1608/fid/125/lang/en\" target=\"_blank\">only available to privileged code</a> and is obsolete; you should use the XPCOM <a title=\"en/Preferences_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Preferences_API\">Preferences API</a> instead."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.appVersion","name":"appVersion","help":"Returns the version of the browser as a string. Do not rely on this property to return the correct value."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.appName","name":"appName","help":"Returns the official name of the browser. Do not rely on this property to return the correct value."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.cookieEnabled","name":"cookieEnabled","help":"Returns a boolean indicating whether cookies are enabled in the browser or not."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.productSub","name":"productSub","help":"Returns the build number of the current browser (e.g. \"20060909\")"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.userAgent","name":"userAgent","help":"Returns the user agent string for the current browser."},{"name":"webkitBattery","help":"Returns a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.navigator.mozBattery\">battery</a></code>\n object you can use to get information about the battery charging status.","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.navigator.securitypolicy","name":"securitypolicy","help":"Returns an empty string. In Netscape 4.7x, returns \"US &amp; CA domestic policy\" or \"Export policy\"."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.buildID","name":"buildID","help":"Returns the build identifier of the browser (e.g. \"2006090803\")"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.vendor","name":"vendor","help":"Returns the vendor name of the current browser (e.g. \"Netscape6\")"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/navigator.doNotTrack","name":"doNotTrack","help":"Reports the value of the user's do-not-track preference. When this value is \"yes\", your web site or application should not track the user."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.appCodeName","name":"appCodeName","help":"Returns the internal \"code\" name of the current browser. Do not rely on this property to return the correct value."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/navigator.id","name":"id","help":"Returns the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.navigator.id\" class=\"new\">id</a></code>\n object which you can use to add support for <a title=\"BrowserID\" rel=\"internal\" href=\"https://developer.mozilla.org/en/BrowserID\">BrowserID</a> to your web site."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.onLine","name":"onLine","help":"Returns a boolean indicating whether the browser is working online."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.vendorSub","name":"vendorSub","help":"Returns the vendor version number (e.g. \"6.1\")"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.mimeTypes","name":"mimeTypes","help":"Returns a list of the MIME types supported by the browser."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.plugins","name":"plugins","help":"Returns an array of the plugins installed in the browser."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.platform","name":"platform","help":"Returns a string representing the platform of the browser."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.language","name":"language","help":"Returns a string representing the language version of the browser."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.product","name":"product","help":"Returns the product name of the current browser. (e.g. \"Gecko\")"},{"obsolete":false,"url":"https://developer.mozilla.org/en/API/Mouse_Lock_API","name":"webkitPointer","help":"Returns a PointerLock object for the <a title=\"Mouse Lock API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/API/Mouse_Lock_API\">Mouse Lock API</a>."},{"name":"webkitNotification","help":"<dt><code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/navigator.webkitNotification\" class=\"new\">navigator.webkitNotification</a></code>\n</dt> <dd>Returns a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/navigator.mozNotification\">notification</a></code>\n object you can use to deliver notifications to the user from your web application.</dd>","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator.oscpu","name":"oscpu","help":"Returns a string that represents the current operating system."}]},"SVGViewElement":{"title":"SVGViewElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGViewElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/view\">&lt;view&gt;</a></code>\n SVG Element","summary":"The <code>SVGViewElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/view\">&lt;view&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"viewTarget","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewTarget\" class=\"new\">viewTarget</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/view\">&lt;view&gt;</a></code>\n element. A list of DOMString values which contain the names listed in the \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewTarget\" class=\"new\">viewTarget</a></code> attribute. Each of the DOMString values can be associated with the corresponding element using the getElementById() method call.","obsolete":false}]},"Text":{"title":"Text","summary":"<p>In the <a title=\"en/DOM\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM\">DOM</a>, the Text interface represents the textual content of an <a class=\"internal\" title=\"En/DOM/Element\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">Element</a> or <a class=\"internal\" title=\"En/DOM/Attr\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Attr\">Attr</a>.&nbsp; If an element has no markup within its content, it has a single child implementing Text that contains the element's text.&nbsp; However, if the element contains markup, it is parsed into information items and Text nodes that form its children.</p>\n<p>New documents have a single Text node for each block of text.&nbsp; Over time, more Text nodes may be created as the document's content changes.&nbsp; The <code>Node.normalize()</code>&nbsp;method merges adjacent Text objects back into a single node for each block of text.</p>\n<p>Text also implements the <a title=\"En/DOM/CharacterData\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/CharacterData\">CharacterData</a> interface (which implements the Node interface).</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Text.replaceWholeText","name":"replaceWholeText","help":"Replaces the text of the current node and all logically adjacent nodes with the specified text. <div class=\"note\"><strong>Note: </strong>Do not use this method as it has been removed from the standard and is no longer implemented in recent browsers, like Firefox 10.</div>"},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Text.splitText","name":"splitText","help":"Breaks the node into two nodes at a specified offset."},{"url":"https://developer.mozilla.org/En/DOM/Text.isElementContentWhitespace","name":"isElementContentWhitespace","help":"<p>Returns whether or not the text node contains only whitespace.&nbsp; Read only.</p> <div class=\"note\"><strong>Note: </strong>Do not use this property as it has been removed from the standard and is no longer implemented in recent browsers, like Firefox 10.</div>","obsolete":false},{"url":"https://developer.mozilla.org/En/DOM/Text.wholeText","name":"wholeText","help":"Returns all text of all Text nodes logically adjacent to this node, concatenated in document order.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/Text","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...#ID-1312295772"},"SVGAnimatedTransformList":{"title":"SVGAnimatedTransformList","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>9.0 (9.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>9.0 (9.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGAnimatedTransformList</code> interface is used for attributes which take a list of numbers and which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"A read only <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGTransformList\">SVGTransformList</a></code>\n representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGTransformList\">SVGTransformList</a></code>\n will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedTransformList"},"PerformanceNavigation":{"title":"Navigation Timing","members":[],"srcUrl":"https://developer.mozilla.org/en/Navigation_timing","skipped":true,"cause":"Suspect title"},"SVGPathElement":{"title":"SVGPathElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/path\">&lt;path&gt;</a></code>\n SVG Element","summary":"The <code>SVGPathElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/path\">&lt;path&gt;</a></code>\n element.","members":[{"name":"getTotalLength","help":"Returns the computed value for the total length of the path using the browser's distance-along-a-path algorithm, as a distance in the current user coordinate system.","obsolete":false},{"name":"getPointAtLength","help":"Returns the (x,y) coordinate in user space which is distance units along the path, utilizing the browser's distance-along-a-path algorithm.","obsolete":false},{"name":"getPathSegAtLength","help":"Returns the index into <code>pathSegList</code> which is <code>distance</code> units along the path, utilizing the user agent's distance-along-a-path algorithm.","obsolete":false},{"name":"createSVGPathSegClosePath","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegClosePath\" class=\"new\">SVGPathSegClosePath</a></code>\n object.","obsolete":false},{"name":"createSVGPathSegMovetoAbs","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegMovetoAbs\" class=\"new\">SVGPathSegMovetoAbs</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"createSVGPathSegMovetoRel","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegMovetoRel\" class=\"new\">SVGPathSegMovetoRel</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The relative Y coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"createSVGPathSegLinetoAbs","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoAbs\" class=\"new\">SVGPathSegLinetoAbs</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"createSVGPathSegLinetoRel","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoRel\" class=\"new\">SVGPathSegLinetoRel</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The relative Y coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"createSVGPathSegCurvetoCubicAbs","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoCubicAbs\" class=\"new\">SVGPathSegCurvetoCubicAbs</a></code>\n object.<br> <br> Parameters: <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>x1</em></code><br> The absolute X coordinate for the first control point.</li> <li><code>float <em>y1</em></code><br> The absolute Y coordinate for the first control point.</li> <li><code>float <em>x2</em></code><br> The absolute X coordinate for the second control point.</li> <li><code>float <em>y2</em></code><br> The absolute Y coordinate for the second control point.</li> </ul>","obsolete":false},{"name":"createSVGPathSegCurvetoCubicRel","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoCubicRel\" class=\"new\">SVGPathSegCurvetoCubicRel</a></code>\n object.<br> <br> Parameters: <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The relative Y coordinate for the end point of this path segment.</li> <li><code>float <em>x1</em></code><br> The relative X coordinate for the first control point.</li> <li><code>float <em>y1</em></code><br> The relative Y coordinate for the first control point.</li> <li><code>float <em>x2</em></code><br> The relative X coordinate for the second control point.</li> <li><code>float <em>y2</em></code><br> The relative Y coordinate for the second control point.</li> </ul>","obsolete":false},{"name":"createSVGPathSegCurvetoQuadraticAbs","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoQuadraticAbs\" class=\"new\">SVGPathSegCurvetoQuadraticAbs</a></code>\n object.<br> <br> Parameters: <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>x1</em></code><br> The absolute X coordinate for the first control point.</li> <li><code>float <em>y1</em></code><br> The absolute Y coordinate for the first control point.</li> </ul>","obsolete":false},{"name":"createSVGPathSegCurvetoQuadraticRel","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoQuadraticRel\" class=\"new\">SVGPathSegCurvetoQuadraticRel</a></code>\n object.<br> <br> Parameters: <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The relative Y coordinate for the end point of this path segment.</li> <li><code>float <em>x1</em></code><br> The relative X coordinate for the first control point.</li> <li><code>float <em>y1</em></code><br> The relative Y coordinate for the first control point.</li> </ul>","obsolete":false},{"name":"createSVGPathSegArcAbs","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegArcAbs\" class=\"new\">SVGPathSegArcAbs</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>r1</em></code><br> The x-axis radius for the ellipse.</li> <li><code>float <em>r2 </em></code><br> The y-axis radius for the ellipse.</li> <li><code>float <em>angle </em></code><br> The rotation angle in degrees for the ellipse's x-axis relative to the x-axis of the user coordinate system.</li> <li><code>boolean <em>largeArcFlag </em></code><br> The value of the large-arc-flag parameter.</li> <li><code>boolean <em>sweepFlag </em></code><br> The value of the large-arc-flag parameter.</li> </ul>","obsolete":false},{"name":"createSVGPathSegArcRel","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegArcRel\" class=\"new\">SVGPathSegArcRel</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The relative Y coordinate for the end point of this path segment.</li> <li><code>float <em>r1</em></code><br> The x-axis radius for the ellipse.</li> <li><code>float <em>r2 </em></code><br> The y-axis radius for the ellipse.</li> <li><code>float <em>angle </em></code><br> The rotation angle in degrees for the ellipse's x-axis relative to the x-axis of the user coordinate system.</li> <li><code>boolean <em>largeArcFlag </em></code><br> The value of the large-arc-flag parameter.</li> <li><code>boolean <em>sweepFlag </em></code><br> The value of the large-arc-flag parameter.</li> </ul>","obsolete":false},{"name":"createSVGPathSegLinetoHorizontalAbs","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoHorizontalAbs\" class=\"new\">SVGPathSegLinetoHorizontalAbs</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"createSVGPathSegLinetoHorizontalRel","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoHorizontalRel\" class=\"new\">SVGPathSegLinetoHorizontalRel</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"createSVGPathSegLinetoVerticalAbs","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoVerticalAbs\" class=\"new\">SVGPathSegLinetoVerticalAbs</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"createSVGPathSegLinetoVerticalRel","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoVerticalRel\" class=\"new\">SVGPathSegLinetoVerticalRel</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>y</em></code><br> The relative Y coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"createSVGPathSegCurvetoCubicSmoothAbs","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoCubicSmoothAbs\" class=\"new\">SVGPathSegCurvetoCubicSmoothAbs</a></code>\n object.<br> <br> Parameters <ul> <li><code>float <em>x </em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y </em></code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>x2 </em></code><br> The absolute X coordinate for the second control point.</li> <li><code>float <em>y2 </em></code><br> The absolute Y coordinate for the second control point.</li> </ul>","obsolete":false},{"name":"createSVGPathSegCurvetoCubicSmoothRel","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoCubicSmoothRel\" class=\"new\">SVGPathSegCurvetoCubicSmoothRel</a></code>\n object.<br> <br> Parameters <ul> <li><code>float <em>x </em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y </em></code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>x2 </em></code><br> The absolute X coordinate for the second control point.</li> <li><code>float <em>y2 </em></code><br> The absolute Y coordinate for the second control point.</li> </ul>","obsolete":false},{"name":"createSVGPathSegCurvetoQuadraticSmoothAbs","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoQuadraticSmoothAbs\" class=\"new\">SVGPathSegCurvetoQuadraticSmoothAbs</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"createSVGPathSegCurvetoQuadraticSmoothRel","help":"Returns a stand-alone, parentless <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoQuadraticSmoothRel\" class=\"new\">SVGPathSegCurvetoQuadraticSmoothRel</a></code>\n object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>","obsolete":false},{"name":"pathLength","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/pathLength\">pathLength</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/path\">&lt;path&gt;</a></code>\n element.","obsolete":false}]},"HTMLCanvasElement":{"title":"HTMLCanvasElement","examples":["<p>First do your drawing on the canvas, then call <code>canvas.toDataURL()</code> to get the data: URL for the canvas.</p>\n\n          <pre name=\"code\" class=\"js\">function test() {\n var canvas = document.getElementById(\"canvas\");\n var url = canvas.toDataURL();\n \n var newImg = document.createElement(\"img\");\n newImg.src = url;\n document.body.appendChild(newImg);\n}</pre>","<p>Once you've drawn content into a canvas, you can convert it into a file of any supported image format. The code snippet below, for example, takes the image in the canvas element whose ID&nbsp;is \"canvas\", obtains a copy of it as a PNG&nbsp;image, then appends a new <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/img\">&lt;img&gt;</a></code>\n element to the document, whose source image is the one created using the canvas.</p>\n\n          <pre name=\"code\" class=\"js\">function test() {\n var canvas = document.getElementById(\"canvas\");\n canvas.toBlob(function(blob) {\n    var newImg = document.createElement(\"img\"),\n        url = URL.createObjectURL(blob);\n    newImg.onload = function() {\n        // no longer need to read the blob so it's revoked\n        URL.revokeObjectURL(url);\n    };\n    newImg.src = url;\n    document.body.appendChild(newImg);\n });\n}</pre>\n        \n<p>You can use this technique in association with mouse events in order to dynamically change images (grayscale versus color in this example):</p>\n\n          <pre name=\"code\" class=\"xml\">&lt;!doctype html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /&gt;\n&lt;title&gt;MDC Example&lt;/title&gt;\n&lt;script type=\"text/javascript\"&gt;\nfunction showColorImg() {\n    this.style.display = \"none\";\n    this.nextSibling.style.display = \"inline\";\n}\n\nfunction showGrayImg() {\n    this.previousSibling.style.display = \"inline\";\n    this.style.display = \"none\";\n}\n\nfunction removeColors() {\n    var aImages = document.getElementsByClassName(\"grayscale\"), nImgsLen = aImages.length, oCanvas = document.createElement(\"canvas\"), oCtx = oCanvas.getContext(\"2d\");\n    for (var nWidth, nHeight, oImgData, oGrayImg, nPixel, aPix, nPixLen, nImgId = 0; nImgId &lt; nImgsLen; nImgId++) {\n        oColorImg = aImages[nImgId];\n        nWidth = oColorImg.offsetWidth;\n        nHeight = oColorImg.offsetHeight;\n        oCanvas.width = nWidth;\n        oCanvas.height = nHeight;\n        oCtx.drawImage(oColorImg, 0, 0);\n        oImgData = oCtx.getImageData(0, 0, nWidth, nHeight);\n        aPix = oImgData.data;\n        nPixLen = aPix.length;\n        for (nPixel = 0; nPixel &lt; nPixLen; nPixel += 4) {\n            aPix[nPixel + 2] = aPix[nPixel + 1] = aPix[nPixel] = (aPix[nPixel] + aPix[nPixel + 1] + aPix[nPixel + 2]) / 3;\n        }\n        oCtx.putImageData(oImgData, 0, 0);\n        oGrayImg = new Image();\n        oGrayImg.src = oCanvas.toDataURL();\n        oGrayImg.onmouseover = showColorImg;\n        oColorImg.onmouseout = showGrayImg;\n        oCtx.clearRect(0, 0, nWidth, nHeight);\n        oColorImg.style.display = \"none\";\n        oColorImg.parentNode.insertBefore(oGrayImg, oColorImg);\n    }\n}\n&lt;/script&gt;\n&lt;/head&gt;\n\n&lt;body onload=\"removeColors();\"&gt;\n&lt;p&gt;&lt;img class=\"grayscale\" src=\"chagall.jpg\" alt=\"\" /&gt;&lt;/p&gt;\n&lt;/body&gt;\n&lt;/html&gt;</pre>\n        \n<p>Note that here we're creating a PNG&nbsp;image; if you add a second parameter to the <code>toBlob()</code>&nbsp;call, you can specify the image type. For example, to get the image in JPEG format:</p>\n<pre class=\"deki-transform\"> canvas.toBlob(function(blob){...}, \"image/jpeg\", 0.95); // JPEG at 95% quality</pre>\n<p>\n<a rel=\"internal\" href=\"https://developer.mozilla.org/samples/domref/mozGetAsFile.html\" title=\"samples/domref/mozGetAsFile.html\" class=\" new\"><span>View the live example</span></a> (uses <code>mozGetAsFile()</code>)</p>"],"summary":"DOM&nbsp;canvas elements expose the <code><a class=\"external\" href=\"http://www.w3.org/TR/html5/the-canvas-element.html#htmlcanvaselement\" rel=\"external nofollow\" target=\"_blank\" title=\"http://www.w3.org/TR/html5/the-canvas-element.html#htmlcanvaselement\">HTMLCanvasElement</a></code> interface, which provides properties and methods for manipulating the layout and presentation of canvas elements. The <code>HTMLCanvasElement</code> interface inherits the properties and methods of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a></code>\n object interface.","members":[{"name":"getContext","help":"Returns a drawing context on the canvas, or null if the context ID is not supported. A drawing context lets you draw on the canvas. The currently accepted values are \"2d\" and \"experimental-webgl\". The \"experimental-webgl\" context is only available on browsers that implement <a title=\"En/WebGL\" rel=\"internal\" href=\"https://developer.mozilla.org/en/WebGL\">WebGL</a>. Calling getContext with \"2d\" returns a <code><a href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D\" rel=\"internal\">CanvasRenderingContext2D</a></code> Object, whereas calling it with \"experimental-webgl\" returns a <code>WebGLRenderingContext</code> Object.","obsolete":false},{"name":"toDataURL","help":"<p>Returns a <code>data:</code> URL containing a representation of the image in the format specified by <code>type</code> (defaults to PNG).</p> <ul> <li>If the height or width of the canvas is 0, <code>\"data:,</code>\" representing the empty string, is returned.</li> <li>If the type requested is not <code>image/png</code>, and the returned value starts with <code>data:image/png</code>, then the requested type is not supported.</li> <li>Chrome supports the&nbsp;<code>image/webp&nbsp;</code>type.</li> <li>If the requested type is <code>image/jpeg&nbsp;</code>or&nbsp;<code>image/webp</code>, then the second argument, if it is between 0.0 and 1.0, is treated as indicating image quality; if the second argument is anything else, the default value for image quality is used. Other arguments are ignored.</li> </ul>","obsolete":false},{"name":"webkitGetAsFile","help":"Returns a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n object representing the image contained in the canvas; this file is a memory-based file, with the specified <code>name</code> and. If <code>type</code> is not specified, the image type is <code>image/png</code>.","obsolete":false},{"name":"height","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/canvas#attr-height\">height</a></code>\n HTML attribute, specifying the height of the coordinate space in CSS pixels.","obsolete":false},{"name":"width","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/canvas#attr-width\">width</a></code>\n HTML attribute, specifying the width of the coordinate space in CSS pixels.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLCanvasElement"},"SVGAltGlyphElement":{"title":"altGlyph","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr>\n\n</tr><tr><th scope=\"col\">Feature</th><th scope=\"col\">Chrome</th><th scope=\"col\">Firefox (Gecko)</th><th scope=\"col\">Internet Explorer</th><th scope=\"col\">Opera</th><th scope=\"col\">Safari</th></tr> <tr><td>Basic support</td> <td>1.0</td> <td>4.0 (2.0)\n <a href=\"#supportGecko\">[1]</a></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>\n10.6</td> <td>\n4.0</td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>4.0 (2.0)\n <a href=\"#supportGecko\">[1]</a></td> <td><span title=\"Not supported.\">--</span></td> <td>11.0\n</td> <td>\n4.0</td> </tr> </tbody> </table>\n</div>\n<p id=\"supportGecko\">[1] partial support, see <a href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=456286\" rel=\"external\">bug 456286</a> and <a href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=571808\" rel=\"external\">bug 571808</a>.</p>\n<p>The chart is based on <a title=\"en/SVG/Compatibility sources\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Compatibility_sources\">these sources</a>.</p>","srcUrl":"https://developer.mozilla.org/en/SVG/Element/altGlyph","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/tspan\">&lt;tspan&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/glyph\">&lt;glyph&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/altGlyphDef\">&lt;altGlyphDef&gt;</a></code>\n</li>","summary":"The <code>altGlyph</code> element allows sophisticated selection of the glyphs used to render its child character data.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/format","name":"format","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/rotate","name":"rotate","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/dx","name":"dx","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/glyphRef","name":"glyphRef","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/dy","name":"dy","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/externalResourcesRequired","name":"externalResourcesRequired","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":""}]},"DeviceOrientationEvent":{"title":"DeviceOrientationEvent","examples":["if (window.DeviceOrientationEvent) {\n    window.addEventListener(\"deviceorientation\", function( event ) {\n\t//alpha: rotation around z-axis\n\tvar rotateDegrees = event.alpha;\n\t//gamma: left to right\n\tvar leftToRight = event.gamma;\n\t//beta: front back motion\n\tvar frontToBack = event.beta;\n\t\t\t\t \n\thandleOrientationEvent( frontToBack, leftToRight, rotateDegrees );\n    }, false);\n}\n\nvar handleOrientationEvent = function( frontToBack, leftToRight, rotateDegrees ){\n    //do something amazing\n};"],"srcUrl":"https://developer.mozilla.org/en/DOM/DeviceOrientationEvent","specification":"DeviceOrientation specification","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DeviceMotionEvent\">DeviceMotionEvent</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.ondeviceorientation\">window.ondeviceorientation</a></code>\n</li> <li><a title=\"Detecting device orientation\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Detecting_device_orientation\">Detecting device orientation</a></li> <li><a title=\"Orientation and motion data explained\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Orientation_and_motion_data_explained\">Orientation and motion data explained</a></li>","summary":"A <code>DeviceOrientationEvent</code> object describes an event that provides information about the current orientation of the device as compared to the Earth coordinate frame. See <a title=\"Orientation and motion data explained\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Orientation_and_motion_data_explained\">Orientation and motion data explained</a> for details.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/DeviceOrientationEvent.alpha","name":"alpha","help":"The current orientation of the device around the Z axis; that is, how far the device is rotated around a line perpendicular to the device. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/DeviceOrientationEvent.absolute","name":"absolute","help":"This attribute's value is <code>true</code> if the orientation is provided as a difference between the device coordinate frame and the Earth coordinate frame; if the device can't detect the Earth coordinate frame, this value is <code>false</code>. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/DeviceOrientationEvent.beta","name":"beta","help":"The current orientation of the device around the X axis; that is, how far the device is tipped forward or backward. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/DeviceOrientationEvent.gamma","name":"gamma","help":"<dl><dd>The current orientation of the device around the Y axis; that is, how far the device is turned left or right. <strong>Read only.</strong></dd>\n</dl>\n<div class=\"note\"><strong>Note:</strong> If the browser is not able to provide notification information, all values are 0.</div>"}]},"Geolocation":{"title":"nsIDOMGeoGeolocation","members":[{"name":"getCurrentPosition","help":"<p>Acquires the user's current position via a new position object. If this fails, <code>errorCallback</code> is invoked with an <code>nsIDOMGeoPositionError</code> argument.</p>\n\n<div id=\"section_8\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>successCallback</code></dt> <dd>An <code><a class=\"internal\" title=\"En/NsIDOMGeoPositionCallback\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionCallback\">nsIDOMGeoPositionCallback</a></code> to be called when the current position is available.</dd>\n</dl>\n<dl> <dt><code>errorCallback</code></dt> <dd>An <code><a class=\"internal\" title=\"En/NsIDOMGeoPositionErrorCallback\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionErrorCallback\"> nsIDOMGeoPositionErrorCallback</a></code> that is called if an error occurs while retrieving the position; this parameter is optional.</dd>\n</dl>\n<dl> <dt><code>options</code></dt> <dd>An <code><a class=\"internal\" title=\"En/NsIDOMGeoPositionOptions\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionOptions\">nsIDOMGeoPositionOptions</a></code> object specifying options; this parameter is optional.</dd>\n</dl>\n</div>","idl":"<pre>void getCurrentPosition(\n&nbsp;&nbsp;in nsIDOMGeoPositionCallback successCallback,\n&nbsp;&nbsp;[optional] in nsIDOMGeoPositionErrorCallback errorCallback, \n &nbsp;[optional] in nsIDOMGeoPositionOptions options\n);</pre>","obsolete":false},{"name":"clearWatch","help":"When the <code>clearWatch()</code> method is called, the <code>watch()</code> process stops calling for new position identifiers and cease invoking callbacks.","idl":"<pre>void clearWatch(\n&nbsp;&nbsp;in unsigned short watchId\n);</pre>","obsolete":false},{"name":"watchPosition","help":"<p>Similar to <a title=\"En/NsIDOMGeoGeolocation#getCurrentPosition()\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation#getCurrentPosition()\"><code>getCurrentPosition()</code></a>, except it continues to call the callback with updated position information periodically until <a title=\"En/NsIDOMGeoGeolocation#clearWatch()\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation#clearWatch()\"><code>clearWatch()</code></a>&nbsp;is called.</p>\n\n<div id=\"section_10\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>successCallback</code></dt> <dd>An <code><a class=\"internal\" title=\"En/NsIDOMGeoPositionCallback\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionCallback\">nsIDOMGeoPositionCallback</a></code> that is to be called whenever new position information is available.</dd>\n</dl>\n<dl> <dt><code>errorCallback</code></dt> <dd>An <code><a class=\"internal\" title=\"En/NsIDOMGeoPositionErrorCallback\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionErrorCallback\"> nsIDOMGeoPositionErrorCallback</a></code> to call when an error occurs; this is an optional parameter.</dd>\n</dl>\n<dl> <dt><code>options</code></dt> <dd>An <code><a class=\"internal\" title=\"En/NsIDOMGeoPositionOptions\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionOptions\">nsIDOMGeoPositionOptions</a></code> object specifying options; this parameter is optional.</dd>\n</dl>\n</div><div id=\"section_11\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>An ID&nbsp;number that can be used to reference the watcher in the future when calling <code><a title=\"en/nsIDOMGeolocation#clearWatch()\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation#clearWatch()\">clearWatch()</a></code>.</p>\n</div>","idl":"<pre>unsigned short watchPosition(\n&nbsp;&nbsp;in nsIDOMGeoPositionCallback successCallback,\n&nbsp;&nbsp;[optional] in nsIDOMGeoPositionErrorCallback errorCallback,\n&nbsp;&nbsp;[optional] in nsIDOMGeoPositionOptions options\n);</pre>","obsolete":false},{"name":"lastPosition","help":"The most recently retrieved location as seen by the provider. May be <code>null</code>. <strong>Read only.</strong>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/nsIDOMGeolocation;"},"SVGPathSegCurvetoQuadraticRel":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"SVGFitToViewBox":{"title":"SVGPatternElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPatternElement","skipped":true,"cause":"Suspect title"},"SVGAnimatedLengthList":{"title":"SVGAnimatedLengthList","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedLengthList</code> interface is used for attributes of type <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGLengthList\">SVGLengthList</a></code>\n which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"A read only <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGLengthList\">SVGLengthList</a></code>\n representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGLengthList\">SVGLengthList</a></code>\n will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedLengthList"},"HTMLTableCellElement":{"title":"td","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.0 (1.7 or earlier)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>align/valign</code> attribute</td> <td>1.0</td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=915\" class=\"external\" title=\"\">\nbug 915</a>\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>char/charoff</code> attribute</td> <td>1.0</td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=2212\" class=\"external\" title=\"\">\nbug 2212</a>\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>bgcolor</code> attribute      </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>align/valign</code> attribute</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=915\" class=\"external\" title=\"\">\nbug 915</a>\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>char/charoff</code> attribute</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=2212\" class=\"external\" title=\"\">\nbug 2212</a>\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>bgcolor</code> attribute      </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["Please see the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/table\">&lt;table&gt;</a></code>\n page for examples on <code>&lt;td&gt;</code>."],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/td","seeAlso":"Other table-related HTML&nbsp;Elements: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/caption\">&lt;caption&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/col\">&lt;col&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/colgroup\">&lt;colgroup&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/table\">&lt;table&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/tbody\">&lt;tbody&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/tfoot\">&lt;tfoot&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/th\">&lt;th&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/thead\">&lt;thead&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/tr\">&lt;tr&gt;</a></code>\n.","summary":"The <em>HTML Table Cell Element</em> (<code>&lt;td&gt;</code>) defines a cell that content data.","members":[{"obsolete":false,"url":"","name":"rowspan","help":"This attribute contains a non-negative integer value that indicates for how many rows the cell extends. Its default value is <span>1</span>; if its value is set to <span>0</span>, it extends until the end of the table section (<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/thead\">&lt;thead&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/tbody\">&lt;tbody&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/tfoot\">&lt;tfoot&gt;</a></code>\n, even if implicitly defined, that the cell belongs to. Values higher than 65534 are clipped down to 65534."},{"obsolete":false,"url":"","name":"valign","help":"This attribute specifies the vertical alignment of the text within each row of cells of the table header. Possible values for this attribute are: <ul> <li><span>baseline</span>, which will put the text as close to the bottom of the cell as it is possible, but align it on the <a class=\"external\" title=\"http://en.wikipedia.org/wiki/Baseline_(typography)\" rel=\"external\" href=\"http://en.wikipedia.org/wiki/Baseline_%28typography%29\" target=\"_blank\">baseline</a> of the characters instead of the bottom of them. If characters are all of the size, this has the same effect as <span>bottom</span>.</li> <li><span>bottom</span>, which will put the text as close to the bottom of the cell as it is possible;</li> <li><span>middle</span>, which will center the text in the cell;</li> <li>and <span>top</span>, which will put the text as close to the top of the cell as it is possible.</li> </ul> <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete (and not supported) in the latest standard: instead set the CSS&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/vertical-align\">vertical-align</a></code>\n property on it.</div>"},{"obsolete":false,"url":"","name":"bgcolor","help":"This attribute defines the background color of each cell of the column. It is one of the 6-digit hexadecimal codes as defined in <a class=\"external\" title=\"http://www.w3.org/Graphics/Color/sRGB\" rel=\"external\" href=\"http://www.w3.org/Graphics/Color/sRGB\" target=\"_blank\">sRGB</a>, prefixed by a '#'. One of the sixteen predefined color strings may be used: <table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"10\" summary=\"Table of color names and their sRGB values\" width=\"80%\"> <tbody> <tr> <td>&nbsp;</td> <td><span>black</span> = \"#000000\"</td> <td>&nbsp;</td> <td><span>green</span> = \"#008000\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>silver</span> = \"#C0C0C0\"</td> <td>&nbsp;</td> <td><span>lime</span> = \"#00FF00\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>gray</span> = \"#808080\"</td> <td>&nbsp;</td> <td><span>olive</span> = \"#808000\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>white</span> = \"#FFFFFF\"</td> <td>&nbsp;</td> <td><span>yellow</span> = \"#FFFF00\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>maroon</span> = \"#800000\"</td> <td>&nbsp;</td> <td><span>navy</span> = \"#000080\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>red</span> = \"#FF0000\"</td> <td>&nbsp;</td> <td><span>blue</span> = \"#0000FF\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>purple</span> = \"#800080\"</td> <td>&nbsp;</td> <td><span>teal</span> = \"#008080\"</td> </tr> <tr> <td>&nbsp;</td> <td><span>fuchsia</span> = \"#FF00FF\"</td> <td>&nbsp;</td> <td><span>aqua</span> = \"#00FFFF\"</td> </tr> </tbody> </table> <div class=\"note\"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it is non-standard and only implemented some versions of Microsoft Internet Explorer: the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/td\">&lt;td&gt;</a></code>\n element should be styled using <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a>. To give a similar effect to the <strong>bgcolor</strong> attribute, use the <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a> property <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/background-color\">background-color</a></code>\n instead.</div>"},{"obsolete":false,"url":"","name":"headers","help":"This attributes a list of space-separated strings, each corresponding to the <strong>id</strong> attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/th\">&lt;th&gt;</a></code>\n elements that applies to this element."},{"obsolete":false,"url":"","name":"align","help":"This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are: <ul> <li><span>left</span>, aligning the content to the left of the cell</li> <li><span>center</span>, centering the content in the cell</li> <li><span>right</span>, aligning the content to the right of the cell</li> <li><span>justify</span>, inserting spaces into the textual content so that the content is justified in the cell</li> <li><span>char</span>, aligning the textual content on a special character with a minimal offset, defined by the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/td#attr-char\">char</a></code>\n and \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/td#attr-charoff\">charoff</a></code>\n attributes \n<span class=\"unimplementedInlineTemplate\">Unimplemented (see<a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=2212\" class=\"external\" title=\"\">\nbug 2212</a>\n)</span>\n.</li> </ul> <p>If this attribute is not set,&nbsp; the <span>left</span> value is assumed.</p> <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete (not supported) in the latest standard. <ul> <li>To achieve the same effect as the <span>left</span>, <span>center</span>, <span>right</span> or <span>justify</span> values, use the CSS <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/text-align\">text-align</a></code>\n property on it.</li> <li>To achieve the same effect as the <span>char</span> value, in CSS3, you can use the value of the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/td#attr-char\">char</a></code>\n as the value of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/text-align\">text-align</a></code>\n property \n<span class=\"unimplementedInlineTemplate\">Unimplemented</span>\n.</li> </ul> </div>"},{"obsolete":false,"url":"","name":"scope","help":""},{"obsolete":false,"url":"","name":"axis","help":"This attribute contains a list of space-separated strings. Each string is the ID of a group of cells that this header applies to. <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete in the latest standard: instead use the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/td#attr-scope\">scope</a></code>\n attribute.</div>"},{"obsolete":false,"url":"","name":"abbr","help":"This attribute contains a short abbreviated description of the content of the cell. Some user-agents, such as speech readers, may present this description before the content itself. <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete in the latest standard: instead either consider starting the cell content by an independent abbreviated content itself or use the abbreviated content as the cell content and use the long content as the description of the cell by putting it in the <strong>title</strong> attribute.</div>"},{"obsolete":false,"url":"","name":"char","help":"This attribute is used to set the character to align the cells in a column on. Typical values for this include a period (.) when attempting to align numbers or monetary values. If \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/td#attr-align\">align</a></code>\n is not set to <span>char</span>, this attribute is ignored. <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete (and not supported) in the latest standard. To achieve the same effect as the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/thead#attr-char\">char</a></code>\n, in CSS3, you can use the character set using the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/th#attr-char\">char</a></code>\n attribute as the value of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/text-align\">text-align</a></code>\n property \n<span class=\"unimplementedInlineTemplate\">Unimplemented</span>\n.</div>"},{"obsolete":false,"url":"","name":"colspan","help":"This attribute contains a non-negative integer value that indicates for how many columns the cell extends. Its default value is <span>1</span>; if its value is set to <span>0</span>, it extends until the end of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/colgroup\">&lt;colgroup&gt;</a></code>\n, even if implicitly defined, that the cell belongs to. Values higher than 1000 are clipped down to 1000."},{"obsolete":false,"url":"","name":"charoff","help":"This attribute is used to indicate the number of characters to offset the column data from the alignment characters specified by the <strong>char</strong> attribute. <div class=\"note\"><strong>Note: </strong>Do not use this attribute as it is obsolete (and not supported) in the latest standard.</div>"}]},"DOMWindow":{"title":"window","seeAlso":"Working with windows in chrome code","summary":"<p>This section provides a brief reference for all of the methods, properties, and events available through the DOM <code>window</code> object. The <code>window</code> object implements the <code>Window</code> interface, which in turn inherits from the <code><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Views/views.html#Views-AbstractView\" title=\"http://www.w3.org/TR/DOM-Level-2-Views/views.html#Views-AbstractView\" target=\"_blank\">AbstractView</a></code> interface. Some additional global functions, namespaces objects, and constructors, not typically associated with the window, but available on it, are listed in the <a title=\"https://developer.mozilla.org/en/JavaScript/Reference\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference\">JavaScript Reference</a>.</p>\n<p>The <code>window</code> object represents the window itself. The <code>document</code> property of a <code>window</code> points to the <a title=\"en/DOM/document\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document\">DOM document</a> loaded in that window. A window for a given document can be obtained using the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document.defaultView\">document.defaultView</a></code>\n property.</p>\n<p>In a tabbed browser, such as Firefox, each tab contains its own <code>window</code> object (and if you're writing an extension, the browser window itself is a separate window too - see <a title=\"en/Working_with_windows_in_chrome_code#Content_windows\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Working_with_windows_in_chrome_code#Content_windows\">Working with windows in chrome code</a> for more information). That is, the <code>window</code> object is not shared between tabs in the same window. Some methods, namely <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.resizeTo\">window.resizeTo</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.resizeBy\">window.resizeBy</a></code>\n apply to the whole window and not to the specific tab the <code>window</code> object belongs to. Generally, anything that can't reasonably pertain to a tab pertains to the window instead.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.captureEvents","name":"captureEvents","help":"Registers the window to capture all events of the specified type."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.showModalDialog","name":"showModalDialog","help":"Displays a modal dialog."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.routeEvent","name":"routeEvent","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.sizeToContent","name":"sizeToContent","help":"Sizes the window according to its content."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollTo","name":"scrollTo","help":"Scrolls to a particular set of coordinates in the document."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.setTimeout","name":"setTimeout","help":"Sets a delay for executing a function."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.matchMedia","name":"matchMedia","help":"Returns a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/MediaQueryList\">MediaQueryList</a></code>\n object representing the specified media query string."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.minimize","name":"minimize","help":"Minimizes the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scroll","name":"scroll","help":"Scrolls the window to a particular place in the document."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.clearTimeout","name":"clearTimeout","help":"Cancels the repeated execution set using <code>setTimeout</code>."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.setInterval","name":"setInterval","help":"Execute a function each X milliseconds."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.moveTo","name":"moveTo","help":"Moves the window to the specified coordinates."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollByLines","name":"scrollByLines","help":"Scrolls the document by the given number of lines."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.alert","name":"alert","help":"Displays an alert dialog."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.dispatchEvent","name":"dispatchEvent","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.moveBy","name":"moveBy","help":"Moves the current window by a specified amount."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.btoa","name":"btoa","help":"Creates a base-64 encoded ASCII string from a string of binary data."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.releaseEvents","name":"releaseEvents","help":"Releases the window from trapping events of a specific type."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.find","name":"find","help":"Searches for a given string in a window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.postMessage","name":"postMessage","help":"Provides a secure means for one window to send a string of data to another window, which need not be within the same domain as the first, in a secure manner."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.maximize","name":"maximize","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.escape","name":"escape","help":"Encodes a string."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.blur","name":"blur","help":"Sets focus away from the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.home","name":"home","help":"Returns the browser to the home page."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.disableExternalCapture","name":"disableExternalCapture","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.updateCommands","name":"updateCommands","help":"<dd>Updates the state of commands of the current chrome window (UI).</dd> <dt><a class=\"internal\" title=\"En/DOM/window.XPCNativeWrapper\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCNativeWrapper\">window.XPCNativeWrapper</a></dt> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.XPCSafeJSObjectWrapper\">window.XPCSafeJSObjectWrapper</a></code>\n</dt>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.stop","name":"stop","help":"This method stops window loading."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.clearImmediate","name":"clearImmediate","help":"Cancels the repeated execution set using <code>setImmediate</code>."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.atob","name":"atob","help":"Decodes a string of data which has been encoded using base-64 encoding."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.focus","name":"focus","help":"Sets focus on the current window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.prompt","name":"prompt","help":"<dd>Returns the text entered by the user in a prompt dialog.</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.QueryInterface\">window.QueryInterface</a></code>\n</dt>"},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.setResizable","name":"setResizable","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.getComputedStyle","name":"getComputedStyle","help":"Gets computed style for the specified element. Computed style indicates the computed values of all CSS properties of the element."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.clearInterval","name":"clearInterval","help":"Cancels the repeated execution set using <code>setInterval</code>."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollBy","name":"scrollBy","help":"Scrolls the document in the window by the given amount."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.getAttention","name":"getAttention","help":"Flashes the application icon."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.openDialog","name":"openDialog","help":"Opens a new dialog window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.open","name":"open","help":"Opens a new window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.resizeTo","name":"resizeTo","help":"Dynamically resizes window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.restore","name":"restore","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.getAttentionWithCycleCount","name":"getAttentionWithCycleCount","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.close","name":"close","help":"Closes the current window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.print","name":"print","help":"Opens the Print Dialog to print the current document."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.dump","name":"dump","help":"Writes a message to the console."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.enableExternalCapture","name":"enableExternalCapture","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.forward","name":"forward","help":"<dd>Moves the window one document forward in the history.</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.GeckoActiveXObject\">window.GeckoActiveXObject</a></code>\n</dt>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.removeEventListener","name":"removeEventListener","help":"Removes an event listener from the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.setImmediate","name":"setImmediate","help":"Execute a function after the browser has finished other heavy tasks"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.setCursor","name":"setCursor","help":"Changes the cursor for the current window"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.back","name":"back","help":"Moves back one in the window history."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollByPages","name":"scrollByPages","help":"Scrolls the current document by the specified number of pages."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.addEventListener","name":"addEventListener","help":"Register an event handler to a specific event type on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.unescape","name":"unescape","help":"Unencodes a value that has been encoded in hexadecimal (e.g. a cookie)."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.confirm","name":"confirm","help":"Displays a dialog with a message that the user needs to respond to."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.getSelection","name":"getSelection","help":"Returns the selection object representing the selected item(s)."},{"name":"webkitRequestAnimationFrame","help":"Tells the browser that an animation is in progress, requesting that the browser schedule a repaint of the window for the next animation frame. This will cause a <code>MozBeforePaint</code> event to fire before that repaint occurs.","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.resizeBy","name":"resizeBy","help":"Resizes the current window by a certain amount."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollX","name":"scrollX","help":"Returns the number of pixels that the document has already been scrolled horizontally."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Storage#sessionStorage","name":"sessionStorage","help":"A storage object for storing data within a single page session."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.self","name":"self","help":"Returns an object reference to the window object itself."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.statusbar","name":"statusbar","help":"Returns the statusbar object, whose visibility can be toggled in the window."},{"name":"webkitAnimationStartTime","help":"The time in milliseconds since epoch at which the current animation cycle began.","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.fullScreen","name":"fullScreen","help":"This property indicates whether the window is displayed in full screen or not."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.dialogArguments","name":"dialogArguments","help":"Gets the arguments passed to the window (if it's a dialog box) at the time <code><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.showModalDialog\">window.showModalDialog()</a></code>\n</code> was called. This is an <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIArray\">nsIArray</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.history","name":"history","help":"Returns a reference to the history object."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.outerWidth","name":"outerWidth","help":"Gets the width of the outside of the browser window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.closed","name":"closed","help":"<dd>This property indicates whether the current window is closed or not.</dd> <dt><a title=\"en/Components_object\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Components_object\">window.Components</a></dt> <dd>The entry point to many <a title=\"en/XPCOM\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM\">XPCOM</a> features. Some properties, e.g. <a title=\"en/Components.classes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Components.classes\">classes</a>, are only available to sufficiently privileged code.</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.directories","name":"directories","help":"Synonym of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.personalbar\">window.personalbar</a></code>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollX","name":"pageXOffset","help":"An alias for <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.scrollX\">window.scrollX</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.top","name":"top","help":"<dd>Returns a reference to the topmost window in the window hierarchy. This property is read only.</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.URL\">window.URL</a></code>\n \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Requires Gecko 2.0</span>\n</dt> <dd>A DOM&nbsp;URL&nbsp;object, which provides the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.URL.createObjectURL\">window.URL.createObjectURL()</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.URL.revokeObjectURL\">window.URL.revokeObjectURL()</a></code>\n methods.</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screenX","name":"screenX","help":"Returns the horizontal distance of the left border of the user's browser from the left side of the screen."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.content","name":"content","help":"Returns a reference to the content element in the current window. The variant with underscore is deprecated."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollbars","name":"scrollbars","help":"Returns the scrollbars object, whose visibility can be toggled in the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.personalbar","name":"personalbar","help":"Returns the personalbar object, whose visibility can be toggled in the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screen","name":"screen","help":"Returns a reference to the screen object associated with the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.defaultStatus","name":"defaultStatus","help":"Gets/sets the status bar text for the given window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.screenY","name":"screenY","help":"Returns the vertical distance of the top border of the user's browser from the top side of the screen."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.messageManager","name":"messageManager","help":"Returns the <a title=\"en/The message manager\" rel=\"internal\" href=\"https://developer.mozilla.org/en/The_message_manager\">message manager</a> object for this window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.toolbar","name":"toolbar","help":"Returns the toolbar object, whose visibility can be toggled in the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.length","name":"length","help":"Returns the number of frames in the window. See also <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.frames\">window.frames</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.outerHeight","name":"outerHeight","help":"Gets the height of the outside of the browser window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollMaxY","name":"scrollMaxY","help":"The maximum offset that the window can be scrolled to vertically (i.e., the document height minus the viewport height)."},{"name":"webkitPaintCount","help":"Returns the number of times the current document has been rendered to the screen in this window. This can be used to compute rendering performance.","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Storage#localStorage","name":"localStorage","help":"Returns a reference to the local storage object used to store data that may only be accessed by the origin that created it."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.innerHeight","name":"innerHeight","help":"Gets the height of the content area of the browser window including, if rendered, the horizontal scrollbar."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.name","name":"name","help":"Gets/sets the name of the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.parent","name":"parent","help":"Returns a reference to the parent of the current window or subframe."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.innerWidth","name":"innerWidth","help":"Gets the width of the content area of the browser window including, if rendered, the vertical scrollbar."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.opener","name":"opener","help":"Returns a reference to the window that opened this current window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.status","name":"status","help":"Gets/sets the text in the statusbar at the bottom of the browser."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.globalStorage","name":"globalStorage","help":"Multiple storage objects that are used for storing data across multiple pages. Note that this is non-standard; it is recommended that you use <a class=\"internal\" title=\"en/DOM/Storage#localStorage\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Storage#localStorage\">window.localStorage</a> instead."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.returnValue","name":"returnValue","help":"The return value to be returned to the function that called <code><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.showModalDialog\">window.showModalDialog()</a></code>\n</code> to display the window as a modal dialog."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.locationbar","name":"locationbar","help":"Returns the locationbar object, whose visibility can be toggled in the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.navigator","name":"navigator","help":"Returns a reference to the navigator object."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.document","name":"document","help":"Returns a reference to the document that the window contains."},{"name":"webkitInnerScreenX","help":"Returns the horizontal (X)&nbsp;coordinate of the top-left corner of the window's viewport, in screen coordinates. This value is reported in CSS&nbsp;pixels. See <code>mozScreenPixelsPerCSSPixel</code> in <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMWindowUtils\">nsIDOMWindowUtils</a></code>\n for a conversion factor to adapt to screen pixels if needed.","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.frames","name":"frames","help":"Returns an array of the subframes in the current window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.menubar","name":"menubar","help":"Returns the menubar object, whose visibility can be toggled in the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.location","name":"location","help":"Gets/sets the location, or current URL, of the window object."},{"name":"webkitInnerScreenY","help":"Returns the vertical (Y)&nbsp;coordinate of the top-left corner of the window's viewport, in screen coordinates. This value is reported in CSS&nbsp;pixels. See <code>mozScreenPixelsPerCSSPixel</code> for a conversion factor to adapt to screen pixels if needed.","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.applicationCache","name":"applicationCache","help":"An <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/nsIDOMOfflineResourceList\">nsIDOMOfflineResourceList</a></code>\n object providing access to the offline resources for the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.window","name":"window","help":"<dd>Returns a reference to the current window.</dd> <dt>window[0], window[1], etc.</dt> <dd>Returns a reference to the <code>window</code> object in the frames. See <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.frames\">window.frames</a></code>\n for more details.</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.controllers","name":"controllers","help":"Returns the XUL controller objects for the current chrome window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.frameElement","name":"frameElement","help":"Returns the element in which the window is embedded, or null if the window is not embedded."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollY","name":"scrollY","help":"Returns the number of pixels that the document has already been scrolled vertically."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollMaxX","name":"scrollMaxX","help":"<dd>The maximum offset that the window can be scrolled to horizontally.</dd> <dd>(i.e., the document width minus the viewport width)</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.sidebar","name":"sidebar","help":"Returns a reference to the window object of the sidebar."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.pkcs11","name":"pkcs11","help":"Formerly provided access to install and remove PKCS11 modules. Now this property is always null."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.crypto","name":"crypto","help":"Returns the browser crypto object."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.scrollY","name":"pageYOffset","help":"An alias for <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.scrollY\">window.scrollY</a></code>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onabort","name":"onabort","help":"An event handler property for abort events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onclose","name":"onclose","help":"An event handler property for handling the window close event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmousemove","name":"onmousemove","help":"An event handler property for mousemove events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.onpageshow","name":"onpageshow","help":"An event handler property for pageshow events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onunload","name":"onunload","help":"An event handler property for unload events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onkeydown","name":"onkeydown","help":"An event handler property for keydown events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onsubmit","name":"onsubmit","help":"An event handler property for submits on window forms."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onblur","name":"onblur","help":"An event handler property for blur events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmouseout","name":"onmouseout","help":"An event handler property for mouseout events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onload","name":"onload","help":"An event handler property for window loading."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onscroll","name":"onscroll","help":"An event handler property for window scrolling."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onresize","name":"onresize","help":"An event handler property for window resizing."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.ondragdrop","name":"ondragdrop","help":"An event handler property for drag and drop events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onpopstate","name":"onpopstate","help":"An event handler property for popstate events, which are fired when navigating to a session history entry representing a state object."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onbeforeunload","name":"onbeforeunload","help":"An event handler property for before-unload events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmousedown","name":"onmousedown","help":"An event handler property for mousedown events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmouseup","name":"onmouseup","help":"An event handler property for mouseup events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onhashchange","name":"onhashchange","help":"An event handler property for hash change events on the window; called when the part of the URL after the hash mark (\"#\") changes."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onchange","name":"onchange","help":"An event handler property for change events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onerror","name":"onerror","help":"An event handler property for errors raised on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onselect","name":"onselect","help":"An event handler property for window selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onreset","name":"onreset","help":"An event handler property for reset events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmouseover","name":"onmouseover","help":"An event handler property for mouseover events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onkeypress","name":"onkeypress","help":"An event handler property for keypress events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmozbeforepaint","name":"onmozbeforepaint","help":"An event handler property for the <code>MozBeforePaint</code> event, which is sent before repainting the window if the event has been requested by a call to the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.mozRequestAnimationFrame\" class=\"new\">window.mozRequestAnimationFrame()</a></code>\n method."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onclick","name":"onclick","help":"An event handler property for click events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.ondevicemotion","name":"ondevicemotion","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onpaint","name":"onpaint","help":"An event handler property for paint events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.onpagehide","name":"onpagehide","help":"An event handler property for pagehide events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onfocus","name":"onfocus","help":"An event handler property for focus events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onkeyup","name":"onkeyup","help":"An event handler property for keyup events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.ondeviceorientation","name":"ondeviceorientation","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.oncontextmenu","name":"oncontextmenu","help":"An event handler property for right-click events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onabort","name":"onabort","help":"An event handler property for abort events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmousemove","name":"onmousemove","help":"An event handler property for mousemove events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.onpageshow","name":"onpageshow","help":"An event handler property for pageshow events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onunload","name":"onunload","help":"An event handler property for unload events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onkeydown","name":"onkeydown","help":"An event handler property for keydown events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onsubmit","name":"onsubmit","help":"An event handler property for submits on window forms."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onblur","name":"onblur","help":"An event handler property for blur events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmouseout","name":"onmouseout","help":"An event handler property for mouseout events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onload","name":"onload","help":"An event handler property for window loading."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onscroll","name":"onscroll","help":"An event handler property for window scrolling."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onresize","name":"onresize","help":"An event handler property for window resizing."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onpopstate","name":"onpopstate","help":"An event handler property for popstate events, which are fired when navigating to a session history entry representing a state object."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onbeforeunload","name":"onbeforeunload","help":"An event handler property for before-unload events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmousedown","name":"onmousedown","help":"An event handler property for mousedown events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmouseup","name":"onmouseup","help":"An event handler property for mouseup events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onhashchange","name":"onhashchange","help":"An event handler property for hash change events on the window; called when the part of the URL after the hash mark (\"#\") changes."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onchange","name":"onchange","help":"An event handler property for change events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onerror","name":"onerror","help":"An event handler property for errors raised on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onselect","name":"onselect","help":"An event handler property for window selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onreset","name":"onreset","help":"An event handler property for reset events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onmouseover","name":"onmouseover","help":"An event handler property for mouseover events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onkeypress","name":"onkeypress","help":"An event handler property for keypress events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onclick","name":"onclick","help":"An event handler property for click events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.ondevicemotion","name":"ondevicemotion","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/window.onpagehide","name":"onpagehide","help":"An event handler property for pagehide events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onfocus","name":"onfocus","help":"An event handler property for focus events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.onkeyup","name":"onkeyup","help":"An event handler property for keyup events on the window."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.ondeviceorientation","name":"ondeviceorientation","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/window.oncontextmenu","name":"oncontextmenu","help":"An event handler property for right-click events on the window."}],"srcUrl":"https://developer.mozilla.org/en/DOM/window"},"HTMLOListElement":{"title":"ol","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p> <div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.0 (1.7 or earlier)\n</td> <td>1.0</td> <td>1.0</td> <td>1.0</td> </tr> <tr> <td><code>reversed</code> attribute</td> <td><span title=\"Not supported.\">--</span> \n<a rel=\"external\" href=\"https://bugs.webkit.org/show_bug.cgi?id=36724\" class=\"external\" title=\"RESOLVED FIXED - Add support for &lt;ol reversed&gt;\">\nWebKit bug 36724</a></td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=601912\" class=\"external\" title=\"\">\nbug 601912</a>\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span> \n<a rel=\"external\" href=\"https://bugs.webkit.org/show_bug.cgi?id=36724\" class=\"external\" title=\"RESOLVED FIXED - Add support for &lt;ol reversed&gt;\">\nWebKit bug 36724</a></td> </tr> </tbody> </table> </div> <div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> <tr> <td><code>reversed</code> attribute</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span> <a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=601912\" class=\"external\" title=\"\">\nbug 601912</a>\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table> </div>","examples":["<div id=\"section_6\"><span id=\"Simple_example\"></span><h4 class=\"editable\">Simple example</h4> \n          <pre name=\"code\" class=\"xml\">&lt;ol&gt;\n  &lt;li&gt;first item&lt;/li&gt;\n  &lt;li&gt;second item&lt;/li&gt;\n  &lt;li&gt;third item&lt;/li&gt;\n&lt;/ol&gt;</pre>\n         <p>Above HTML will output:</p> <ol> <li>first item</li> <li>second item</li> <li>third item</li> </ol> </div><div id=\"section_7\"><span id=\"Using_the_start_attribute\"></span><h4 class=\"editable\">Using the <span><code>start</code></span> attribute</h4> \n          <pre name=\"code\" class=\"xml\">&lt;ol start=\"7\"&gt;\n  &lt;li&gt;first item&lt;/li&gt;\n  &lt;li&gt;second item&lt;/li&gt;\n  &lt;li&gt;third item&lt;/li&gt;\n&lt;/ol&gt;</pre>\n         <p>Above HTML will output:</p> <ol start=\"7\"> <li>first item</li> <li>second item</li> <li>third item</li> </ol> </div><div id=\"section_8\"><span id=\"Nesting_lists\"></span><h4 class=\"editable\">Nesting lists</h4> \n          <pre name=\"code\" class=\"xml\">&lt;ol&gt;\n  &lt;li&gt;first item&lt;/li&gt;\n  &lt;li&gt;second item      &lt;!-- Look, the closing &lt;/li&gt; tag is not placed here! --&gt;\n    &lt;ol&gt;\n      &lt;li&gt;second item first subitem&lt;/li&gt;\n      &lt;li&gt;second item second subitem&lt;/li&gt;\n      &lt;li&gt;second item third subitem&lt;/li&gt;\n    &lt;/ol&gt;\n  &lt;/li&gt;                &lt;!-- Here is the closing &lt;/li&gt; tag --&gt;\n  &lt;li&gt;third item&lt;/li&gt;\n&lt;/ol&gt;</pre>\n         <p>Above HTML will output:</p> <ol> <li>first item</li> <li>second item <ol> <li>second item first subitem</li> <li>second item second subitem</li> <li>second item third subitem</li> </ol> </li> <li>third item</li> </ol> </div><div id=\"section_9\"><span id=\"Nested_.3Col.3E_and_.3Cul.3E\"></span><h4 class=\"editable\">Nested &lt;ol&gt; and &lt;ul&gt;</h4> \n          <pre name=\"code\" class=\"xml\">&lt;ol&gt;\n  &lt;li&gt;first item&lt;/li&gt;\n  &lt;li&gt;second item      &lt;!-- Look, the closing &lt;/li&gt; tag is not placed here! --&gt;\n    &lt;ul&gt;\n      &lt;li&gt;second item first subitem&lt;/li&gt;\n      &lt;li&gt;second item second subitem&lt;/li&gt;\n      &lt;li&gt;second item third subitem&lt;/li&gt;\n    &lt;/ul&gt;\n  &lt;/li&gt;                &lt;!-- Here is the closing &lt;/li&gt; tag --&gt;\n  &lt;li&gt;third item&lt;/li&gt;\n&lt;/ol&gt;</pre>\n         <p>Above HTML will output:</p> <ol> <li>first item</li> <li>second item <ul> <li>second item first subitem</li> <li>second item second subitem</li> <li>second item third subitem</li> </ul> </li> <li>third item</li> </ol> </div>"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/ol","seeAlso":"<li>Other list-related HTML&nbsp;Elements: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/li\">&lt;li&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu\">&lt;menu&gt;</a></code>\n and the obsolete <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/dir\">&lt;dir&gt;</a></code>\n;</li> <li>CSS properties that may be specially useful to style the <span>&lt;ol&gt;</span> element:&nbsp; <ul> <li>the <a title=\"en/CSS/list-style\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/list-style\">list-style</a> property, useful to choose the way the ordinal is displayed,</li> <li><a title=\"en/CSS_Counters\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS_Counters\">CSS counters</a>, useful to handle complex nested lists,</li> <li>the <a title=\"en/CSS/line-height\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/line-height\">line-height</a> property, useful to simulate the deprecated \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol#attr-compact\">compact</a></code>\n attribute,</li> <li>the <a title=\"en/CSS/margin\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/margin\">margin</a> property, useful to control the indent of the list.</li> </ul> </li>","summary":"<p>The HTML <em>ordered list</em> element (<code>&lt;ol&gt;</code>) represents an ordered list of items. Typically, ordered-list items are displayed with a preceding numbering, which can be of any form, like numerals, letters or Romans numerals or even simple bullets. This numbered style is not defined in the HTML description of the page, but in its associated CSS, using the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/list-style-type\">list-style-type</a></code>\n property.</p>\n<p>There is no limitation to the depth and imbrication of lists defined with the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n elements.</p>\n<div class=\"note\"><strong>Usage note: </strong> The <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n both represent a list of items. They differ in the way that, with the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n element, the order is meaningful. As a rule of thumb to determine which one to use, try changing the order of the list items; if the meaning is changed, the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n element should be used, else the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n is adequate.</div>","members":[{"obsolete":false,"url":"","name":"compact","help":"This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn't work in all browsers. <div class=\"note\"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it has been deprecated: the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n element should be styled using <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a>. To give a similar effect than the <span>compact</span> attribute, the <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a> property <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/line-height\">line-height</a></code>\n can be used with a value of <span>80%</span>.</div>"},{"obsolete":false,"url":"","name":"reversed","help":"This Boolean attribute specifies that the items of the item are specified in the reverse order, i.e. that the least important one is listed first. Browsers, by default, numbered the items in the reverse order too."},{"obsolete":false,"url":"","name":"start","help":"This integer attribute specifies the start value for numbering the individual list items. Although the ordering type of list elements might be Roman numerals, such as XXXI, or letters, the value of start is always represented as a number. To start numbering elements from the letter \"C\", use <code>&lt;ol start=\"3\"&gt;</code>. <div class=\"note\"><strong>Note</strong>: that attribute was deprecated in HTML4, but reintroduced in HTML5.</div>"},{"obsolete":false,"url":"","name":"type","help":"Indicates the numbering type: <ul> <li><span><code>'a'</code></span> indicates lowercase letters,</li> <li><span id=\"1284454877507S\">&nbsp;</span><span><code>'<span id=\"1284454878023E\">&nbsp;</span>A'</code></span> indicates uppercase letters,</li> <li><span><code>'i'</code></span> indicates lowercase Roman numerals,</li> <li><span><code>'I'</code></span> indicates uppercase Roman numerals,</li> <li>and <span><code>'1'</code></span> indicates numbers.</li> </ul> <p>The type set is used for the entire list unless a different \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/li#attr-type\">type</a></code>\n attribute is used within an enclosed <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/li\">&lt;li&gt;</a></code>\n element.</p> <div class=\"note\"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it has been deprecated: use the <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a> <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/list-style-type\">list-style-type</a></code>\n property instead.</div>"}]},"IDBRequest":{"title":"IDBRequest","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>12 \n<span title=\"prefix\">-webkit</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["<p>In the following code snippet, we open a database asynchronously and make a request. Event handlers are registered for responding to various situations.</p>\n\n          <pre name=\"code\" class=\"js\">var request = window.indexedDB.open('Database Name');\nrequest.onsuccess = function(event) {\n        var db = this.result;\n        var transaction = db.transaction([], IDBTransaction.READ_ONLY);\n        var curRequest = transaction.objectStore('ObjectStore Name').openCursor();\n        curRequest.onsuccess = ...;\n    };\nrequest.onerror = function(event) {\n         ...;\n    };</pre>"],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBRequest","summary":"<p>The <code>IDBRequest</code> interface of the IndexedDB&nbsp;API provides access to results of asynchronous requests to databases and database objects using event handler attributes. Each reading and writing operation on a database is done using a request.</p>\n<p>The request object does not initially contain any information about the result of the operation, but once information becomes available, an event is fired on the request, and the information becomes available through the properties of the <code>IDBRequest</code> instance.</p>\n<p>Inherits from: <a title=\"en/DOM/EventTarget\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/EventTarget\">EventTarget</a></p>","members":[{"url":"","name":"DONE","help":"The request has completed or an error has occurred. Initially false","obsolete":false},{"url":"","name":"LOADING","help":"The request has been started, but its result is not yet available.","obsolete":false},{"name":"onerror","help":"","obsolete":false},{"name":"onsuccess","help":"","obsolete":false}]},"SVGFEComponentTransferElement":{"title":"feComponentTransfer","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFuncA\">&lt;feFuncA&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFuncB\">&lt;feFuncB&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFuncG\">&lt;feFuncG&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFuncR\">&lt;feFuncR&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The color of each pixel is modified by changing each channel (R, G, B, and A) to the result of what the children <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFuncR\">&lt;feFuncR&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFuncB\">&lt;feFuncB&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFuncG\">&lt;feFuncG&gt;</a></code>\n, and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFuncA\">&lt;feFuncA&gt;</a></code>\n return.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer"},"HTMLQuoteElement":{"title":"HTMLQuoteElement","summary":"DOM quote objects expose the <a class=\" external\" title=\"http://www.w3.org/TR/html5/grouping-content.html#htmlquoteelement\" rel=\"external\" href=\"http://www.w3.org/TR/html5/grouping-content.html#htmlquoteelement\" target=\"_blank\">HTMLQuoteElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-70319763\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-70319763\" target=\"_blank\"><code>HTMLQuoteElement</code></a>) interface, which provides special properties&nbsp; (beyond the regular <a href=\"https://developer.mozilla.org/en/DOM/element\" rel=\"internal\">element</a> object interface they also have available to them by inheritance) for manipulating quote elements.","members":[{"name":"cite","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/blockquote#attr-cite\">cite</a></code>\n HTML attribute, containing a URL for the source of the quotation.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLQuoteElement"},"HTMLOptionElement":{"title":"HTMLOptionElement","summary":"<p>DOM&nbsp;<em>option</em> elements elements share all of the properties and methods of other HTML elements described in the <a title=\"en/DOM/element\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> section. They also have the specialized interface <a title=\"http://dev.w3.org/html5/spec/the-button-element.html#htmloptionelement\" class=\" external\" rel=\"external\" href=\"http://dev.w3.org/html5/spec/the-button-element.html#htmloptionelement\" target=\"_blank\">HTMLOptionElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\"external\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-70901257\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-70901257\" target=\"_blank\">HTMLOptionElement</a>).</p>\n<p>No methods are defined on this interface.</p>","members":[{"name":"defaultSelected","help":"Reflects the value of the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/option#attr-selected\">selected</a></code>\n HTML attribute. which indicates whether the option is selected by default.","obsolete":false},{"name":"disabled","help":"Reflects the value of the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/option#attr-disabled\">disabled</a></code>\n HTML&nbsp;attribute, which indicates that the option is unavailable to be selected. An option can also be disabled if it is a child of an <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/optgroup\">&lt;optgroup&gt;</a></code>\n element that is disabled.","obsolete":false},{"name":"form","help":"If the option is a descendent of a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/select\">&lt;select&gt;</a></code>\n element, then this property has the same value as the <code>form</code> property of the corresponding {{DomXref(\"HTMLSelectElement\") object; otherwise, it is null.","obsolete":false},{"name":"index","help":"The position of the option within the list of options it belongs to, in tree-order. If the option is not part of a list of options, the value is 0.","obsolete":false},{"name":"label","help":"Reflects the value of the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/option#attr-label\">label</a></code>\n HTML attribute, which provides a label for the option. If this attribute isn't specifically set, reading it returns the element's text content.","obsolete":false},{"name":"selected","help":"Indicates whether the option is selected.","obsolete":false},{"name":"text","help":"Contains the text content of the element.","obsolete":false},{"name":"value","help":"Reflects the value of the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/option#attr-value\">value</a></code>\n HTML attribute, if it exists; otherwise reflects value of the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/textContent\" class=\"new\">textContent</a></code>\n&nbsp;IDL&nbsp;attribute.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLOptionElement"},"SVGFETileElement":{"title":"feTile","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"An input image is tiled and the result used to fill a target. The effect is similar to the one of a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/pattern\">&lt;pattern&gt;</a></code>\n.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feTile"},"SVGPathSegList":{"title":"User talk:Jeff Schiller","members":[],"srcUrl":"https://developer.mozilla.org/User_talk:Jeff_Schiller","skipped":true,"cause":"Suspect title"},"XSLTProcessor":{"title":"XSLTProcessor","summary":"<p>XSLTProcesor is an object providing an interface to XSLT engine in Mozilla. It is available to unprivileged JavaScript.</p>\n<ul> <li><a title=\"en/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations\">Using the Mozilla JavaScript interface to XSL Transformations</a></li> <li><a title=\"en/The_XSLT//JavaScript_Interface_in_Gecko\" rel=\"internal\" href=\"https://developer.mozilla.org/en/The_XSLT%2F%2FJavaScript_Interface_in_Gecko\">The XSLT/JavaScript Interface in Gecko</a></li>\n</ul>","members":[],"srcUrl":"https://developer.mozilla.org/en/XSLTProcessor"},"WebKitPoint":{"title":"Point","summary":"The <code>Point</code> class offers methods for performing common geometry operations on two dimensional points.","constructor":"<p>Creates a new <code>Point</code> object.</p>\n<pre>let p = new Point(x, y);\n</pre>\n<p>The new point, <code>p</code>, has the specified X&nbsp;and Y&nbsp;coordinates.</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/JavaScript_code_modules/Geometry.jsm/Point"},"NamedNodeMap":{"title":"NamedNodeMap","summary":"A collection of nodes returned by <a title=\"En/DOM/Element.attributes\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node.attributes\"><code>Element.attributes</code></a> (also potentially for <code><a title=\"En/DOM/DocumentType.entities\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DocumentType.entities\" class=\"new internal\">DocumentType.entities</a></code>, <code><a title=\"En/DOM/DocumentType.notations\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DocumentType.notations\" class=\"new internal\">DocumentType.notations</a></code>). <code>NamedNodeMap</code>s are not in any particular order (unlike <code><a title=\"En/DOM/NodeList\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/NodeList\">NodeList</a></code>), although they may be accessed by an index as in an array (they may also be accessed with the <code>item</code>() method). A NamedNodeMap object are live and will thus be auto-updated if changes are made to their contents internally or elsewhere.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/NamedNodeMap.length","name":"length","help":""}],"srcUrl":"https://developer.mozilla.org/en/DOM/NamedNodeMap","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...#ID-1780488922"},"DOMParser":{"title":"DOMParser","summary":"This page redirects to a page that no longer exists <a rel=\"internal\" class=\"new\" href=\"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/DOMParser\">en/Document_Object_Model_(DOM)/DOMParser</a>.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOMParser"},"HTMLObjectElement":{"title":"HTMLObjectElement","summary":"DOM <code>Object</code> objects expose the <a title=\"http://dev.w3.org/html5/spec/the-iframe-element.html#htmlobjectelement\" class=\" external\" rel=\"external nofollow\" href=\"http://dev.w3.org/html5/spec/the-iframe-element.html#htmlobjectelement\" target=\"_blank\">HTMLObjectElement</a> (or <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-9893177\" title=\"http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-9893177\" target=\"_blank\">HTMLObjectElement</a>) interface, which provides special properties and methods (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of Object element, representing external resources.","members":[{"name":"checkValidity","help":"Always returns true, because <code>object</code> objects are never candidates for constraint validation.","obsolete":false},{"name":"setCustomValidity","help":"Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.","obsolete":false},{"name":"align","help":"Alignment of the object relative to its context. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"archive","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object#attr-archive\">archive</a></code>\n&nbsp;HTML attribute, containing a list of archives for resources for this object. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"border","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object#attr-border\">border</a></code>\n&nbsp;HTML attribute, specifying the width of a border around the object. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"code","help":"The name of an applet class file, containing either the applet's subclass, or the path to get to the class, including the class file itself. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"codeBase","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object#attr-codebase\">codebase</a></code>\n&nbsp;HTML attribute, specifying the base path to use to resolve relative URIs. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"codeType","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object#attr-codetype\">codetype</a></code>\n&nbsp;HTML attribute, specifying the content type of the data. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"contentDocument","help":"The active document of the object element's nested browsing context, if any; otherwise null.","obsolete":false},{"name":"contentWindow","help":"The window proxy of the object element's nested browsing context, if any; otherwise null.","obsolete":false},{"name":"data","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object#attr-data\">data</a></code>\n HTML&nbsp;attribute, specifying the address of a resource's data.","obsolete":false},{"name":"declare","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object#attr-declare\">declare</a></code>\n HTML&nbsp;attribute, indicating that this is a declaration, not an instantiation, of the object. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"form","help":"The object element's form owner, or null if there isn't one.","obsolete":false},{"name":"height","help":"Reflects the {{htmlattrxref(\"height\", \"object)}}&nbsp;HTML attribute, specifying the displayed height of the resource in CSS pixels.","obsolete":false},{"name":"hspace","help":"Horizontal space in pixels around the control. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"name","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object#attr-name\">name</a></code>\n&nbsp;HTML attribute, specifying the name of the object (\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span>, or of a browsing context (\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":false},{"name":"standby","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object#attr-standby\">standby</a></code>\n HTML&nbsp;attribute, specifying a message to display while the object loads. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"tabIndex","help":"he position of the element in the tabbing navigation order for the current document. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"type","help":"Reflects the {{htmlattrxref(\"type\", \"object)}}&nbsp;HTML attribute, specifying the MIME type of the resource.","obsolete":false},{"name":"useMap","help":"Reflects the {{htmlattrxref(\"usemap\", \"object)}}&nbsp;HTML attribute, specifying a {{HTMLElement(\"map\")}} element to use.","obsolete":false},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.","obsolete":false},{"name":"validity","help":"The validity states that this element is in.","obsolete":false},{"name":"vspace","help":"Horizontal space in pixels around the control. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>.","obsolete":true},{"name":"width","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object#attr-width\">width</a></code>\n&nbsp;HTML attribute, specifying the displayed width of the resource in CSS pixels.","obsolete":false},{"name":"willValidate","help":"Indicates whether the element is a candidate for constraint validation. Always false for <code>object</code> objects.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLObjectElement"},"HTMLPreElement":{"title":"pre","examples":["<pre name=\"code\" class=\"xml\">&lt;!-- Some example CSS code --&gt;\n&lt;pre&gt;\nbody {\n  color:red;\n}\n&lt;/pre&gt;</pre>\n        \n<div id=\"section_4\"><span id=\"Result\"></span><h4 class=\"editable\">Result</h4>\n<p>&nbsp;</p>\n<pre>body {\n  color:red;\n}\n</pre>\n</div>"],"summary":"This element represents preformatted text. Text within this element is typically displayed in a non-proportional font exactly as it is laid out in the file. Whitespaces inside this element are displayed as typed.","members":[],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/pre"},"TouchList":{"title":"TouchList","examples":["See the <a title=\"en/DOM/Touch events#Example\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Touch_events#Example\">example on the main Touch events article</a>."],"srcUrl":"https://developer.mozilla.org/en/DOM/TouchList","seeAlso":"<li><a title=\"en/DOM/Touch events\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Touch_events\">Touch events</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TouchEvent\">TouchEvent</a></code>\n</li>","summary":"A <code>TouchList</code> represents a list of all of the points of contact with a touch surface; for example, if the user has three fingers on the screen (or trackpad), the corresponding <code>TouchList</code> would have one <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n object for each finger, for a total of three entries.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/TouchList.identifiedTouch","name":"identifiedTouch","help":"Returns the first <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n&nbsp;item in the list whose identifier matches a specified value."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/TouchList.item","name":"item","help":"Returns the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n object at the specified index in the list. You can also simply reference the <code>TouchList</code> using array syntax (<code>touchList[x]</code>)."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/TouchList.length","name":"length","help":"The number of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n&nbsp;objects in the <code>TouchList</code>. <strong>Read only.</strong>"}]},"History":{"title":"window.history","examples":["history.back();     // equivalent to clicking back button\nhistory.go(-1);     // equivalent to history.back();\n"],"srcUrl":"https://developer.mozilla.org/en/DOM/window.history","specification":"HTML5 History interface","summary":"Returns a reference to the <code>History</code> object, which provides an interface for manipulating the browser <em>session history</em> (pages visited in the tab or frame that the current page is loaded in).","members":[{"name":"back","help":"<p>Goes to the previous page in session history, the same action as when the user clicks the browser's Back button. Equivalent to <code>history.go(-1)</code>.</p> <div class=\"note\"><strong>Note:</strong> Calling this method to go back beyond the first page in the session history has no effect and doesn't raise an exception.</div>","obsolete":false},{"name":"forward","help":"<p>Goes to the next page in session history, the same action as when the user clicks the browser's Forward button; this is equivalent to <code>history.go(1)</code>.</p> <div class=\"note\"><strong>Note:</strong> Calling this method to go back beyond the last page in the session history has no effect and doesn't raise an exception.</div>","obsolete":false},{"name":"go","help":"Loads a page from the session history, identified by its relative location to the current page, for example <code>-1</code> for the previous page or <code>1</code> for the next page. When <code><em>integerDelta</em></code> is out of bounds (e.g. -1 when there are no previously visited pages in the session history), the method doesn't do anything and doesn't raise an exception. Calling <code>go()</code> without parameters or with a non-integer argument has no effect (unlike Internet Explorer, <a class=\"external\" title=\"http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx\" rel=\"external\" href=\"http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx\" target=\"_blank\">which supports string URLs as the argument</a>).","obsolete":false},{"name":"pushState","help":"<p>Pushes the given data onto the session history stack with the specified title and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title=\"en/DOM/Manipulating the browser history\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history\">manipulating the browser history</a>.</p> <div class=\"note\"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n, the object is serialized using <a title=\"en/DOM/The structured clone algorithm\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm\">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>","obsolete":false},{"name":"replaceState","help":"<p>Updates the most recent entry on the history stack to have the specified data, title, and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title=\"en/DOM/Manipulating the browser history\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history\">manipulating the browser history</a>.</p> <div class=\"note\"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n, the object is serialized using <a title=\"en/DOM/The structured clone algorithm\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm\">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>","obsolete":false},{"name":"length","help":"Read-only. Returns the number of elements in the session history, including the currently loaded page. For example, for a page loaded in a new tab this property returns <code>1</code>.","obsolete":false},{"name":"current","help":"Returns the URL of the active item of the session history. This property is not available to web content and is not supported by other browsers. Use <code><a title=\"en/DOM/window.location\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window.location\">location.href</a></code> instead.","obsolete":false},{"name":"next","help":"Returns the URL of the next item in the session history. This property is not available to web content and is not supported by other browsers.","obsolete":false},{"name":"previous","help":"Returns the URL of the previous item in the session history. This property is not available to web content and is not supported by other browsers.","obsolete":false},{"name":"state","help":"Returns the state at the top of the history stack. This is a way to look at the state without having to wait for a <code>popstate</code> event. <strong>Read only.</strong>","obsolete":false},{"name":"back","help":"<p>Goes to the previous page in session history, the same action as when the user clicks the browser's Back button. Equivalent to <code>history.go(-1)</code>.</p> <div class=\"note\"><strong>Note:</strong> Calling this method to go back beyond the first page in the session history has no effect and doesn't raise an exception.</div>","obsolete":false},{"name":"forward","help":"<p>Goes to the next page in session history, the same action as when the user clicks the browser's Forward button; this is equivalent to <code>history.go(1)</code>.</p> <div class=\"note\"><strong>Note:</strong> Calling this method to go back beyond the last page in the session history has no effect and doesn't raise an exception.</div>","obsolete":false},{"name":"go","help":"Loads a page from the session history, identified by its relative location to the current page, for example <code>-1</code> for the previous page or <code>1</code> for the next page. When <code><em>integerDelta</em></code> is out of bounds (e.g. -1 when there are no previously visited pages in the session history), the method doesn't do anything and doesn't raise an exception. Calling <code>go()</code> without parameters or with a non-integer argument has no effect (unlike Internet Explorer, <a class=\"external\" title=\"http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx\" rel=\"external\" href=\"http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx\" target=\"_blank\">which supports string URLs as the argument</a>).","obsolete":false},{"name":"pushState","help":"<p>Pushes the given data onto the session history stack with the specified title and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title=\"en/DOM/Manipulating the browser history\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history\">manipulating the browser history</a>.</p> <div class=\"note\"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n, the object is serialized using <a title=\"en/DOM/The structured clone algorithm\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm\">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>","obsolete":false},{"name":"replaceState","help":"<p>Updates the most recent entry on the history stack to have the specified data, title, and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title=\"en/DOM/Manipulating the browser history\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history\">manipulating the browser history</a>.</p> <div class=\"note\"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n, the object is serialized using <a title=\"en/DOM/The structured clone algorithm\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm\">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>","obsolete":false},{"name":"length","help":"Read-only. Returns the number of elements in the session history, including the currently loaded page. For example, for a page loaded in a new tab this property returns <code>1</code>.","obsolete":false},{"name":"current","help":"Returns the URL of the active item of the session history. This property is not available to web content and is not supported by other browsers. Use <code><a title=\"en/DOM/window.location\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window.location\">location.href</a></code> instead.","obsolete":false},{"name":"next","help":"Returns the URL of the next item in the session history. This property is not available to web content and is not supported by other browsers.","obsolete":false},{"name":"previous","help":"Returns the URL of the previous item in the session history. This property is not available to web content and is not supported by other browsers.","obsolete":false},{"name":"state","help":"Returns the state at the top of the history stack. This is a way to look at the state without having to wait for a <code>popstate</code> event. <strong>Read only.</strong>","obsolete":false},{"name":"back","help":"<p>Goes to the previous page in session history, the same action as when the user clicks the browser's Back button. Equivalent to <code>history.go(-1)</code>.</p> <div class=\"note\"><strong>Note:</strong> Calling this method to go back beyond the first page in the session history has no effect and doesn't raise an exception.</div>","obsolete":false},{"name":"forward","help":"<p>Goes to the next page in session history, the same action as when the user clicks the browser's Forward button; this is equivalent to <code>history.go(1)</code>.</p> <div class=\"note\"><strong>Note:</strong> Calling this method to go back beyond the last page in the session history has no effect and doesn't raise an exception.</div>","obsolete":false},{"name":"go","help":"Loads a page from the session history, identified by its relative location to the current page, for example <code>-1</code> for the previous page or <code>1</code> for the next page. When <code><em>integerDelta</em></code> is out of bounds (e.g. -1 when there are no previously visited pages in the session history), the method doesn't do anything and doesn't raise an exception. Calling <code>go()</code> without parameters or with a non-integer argument has no effect (unlike Internet Explorer, <a class=\"external\" title=\"http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx\" rel=\"external\" href=\"http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx\" target=\"_blank\">which supports string URLs as the argument</a>).","obsolete":false},{"name":"pushState","help":"<p>Pushes the given data onto the session history stack with the specified title and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title=\"en/DOM/Manipulating the browser history\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history\">manipulating the browser history</a>.</p> <div class=\"note\"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n, the object is serialized using <a title=\"en/DOM/The structured clone algorithm\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm\">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>","obsolete":false},{"name":"replaceState","help":"<p>Updates the most recent entry on the history stack to have the specified data, title, and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title=\"en/DOM/Manipulating the browser history\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history\">manipulating the browser history</a>.</p> <div class=\"note\"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n, the object is serialized using <a title=\"en/DOM/The structured clone algorithm\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm\">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>","obsolete":false},{"name":"length","help":"Read-only. Returns the number of elements in the session history, including the currently loaded page. For example, for a page loaded in a new tab this property returns <code>1</code>.","obsolete":false},{"name":"current","help":"Returns the URL of the active item of the session history. This property is not available to web content and is not supported by other browsers. Use <code><a title=\"en/DOM/window.location\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window.location\">location.href</a></code> instead.","obsolete":false},{"name":"next","help":"Returns the URL of the next item in the session history. This property is not available to web content and is not supported by other browsers.","obsolete":false},{"name":"previous","help":"Returns the URL of the previous item in the session history. This property is not available to web content and is not supported by other browsers.","obsolete":false},{"name":"state","help":"Returns the state at the top of the history stack. This is a way to look at the state without having to wait for a <code>popstate</code> event. <strong>Read only.</strong>","obsolete":false},{"name":"back","help":"<p>Goes to the previous page in session history, the same action as when the user clicks the browser's Back button. Equivalent to <code>history.go(-1)</code>.</p> <div class=\"note\"><strong>Note:</strong> Calling this method to go back beyond the first page in the session history has no effect and doesn't raise an exception.</div>","obsolete":false},{"name":"forward","help":"<p>Goes to the next page in session history, the same action as when the user clicks the browser's Forward button; this is equivalent to <code>history.go(1)</code>.</p> <div class=\"note\"><strong>Note:</strong> Calling this method to go back beyond the last page in the session history has no effect and doesn't raise an exception.</div>","obsolete":false},{"name":"go","help":"Loads a page from the session history, identified by its relative location to the current page, for example <code>-1</code> for the previous page or <code>1</code> for the next page. When <code><em>integerDelta</em></code> is out of bounds (e.g. -1 when there are no previously visited pages in the session history), the method doesn't do anything and doesn't raise an exception. Calling <code>go()</code> without parameters or with a non-integer argument has no effect (unlike Internet Explorer, <a class=\"external\" title=\"http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx\" rel=\"external\" href=\"http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx\" target=\"_blank\">which supports string URLs as the argument</a>).","obsolete":false},{"name":"pushState","help":"<p>Pushes the given data onto the session history stack with the specified title and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title=\"en/DOM/Manipulating the browser history\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history\">manipulating the browser history</a>.</p> <div class=\"note\"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n, the object is serialized using <a title=\"en/DOM/The structured clone algorithm\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm\">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>","obsolete":false},{"name":"replaceState","help":"<p>Updates the most recent entry on the history stack to have the specified data, title, and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title=\"en/DOM/Manipulating the browser history\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history\">manipulating the browser history</a>.</p> <div class=\"note\"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n, the object is serialized using <a title=\"en/DOM/The structured clone algorithm\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm\">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>","obsolete":false},{"name":"length","help":"Read-only. Returns the number of elements in the session history, including the currently loaded page. For example, for a page loaded in a new tab this property returns <code>1</code>.","obsolete":false},{"name":"current","help":"Returns the URL of the active item of the session history. This property is not available to web content and is not supported by other browsers. Use <code><a title=\"en/DOM/window.location\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window.location\">location.href</a></code> instead.","obsolete":false},{"name":"next","help":"Returns the URL of the next item in the session history. This property is not available to web content and is not supported by other browsers.","obsolete":false},{"name":"previous","help":"Returns the URL of the previous item in the session history. This property is not available to web content and is not supported by other browsers.","obsolete":false},{"name":"state","help":"Returns the state at the top of the history stack. This is a way to look at the state without having to wait for a <code>popstate</code> event. <strong>Read only.</strong>","obsolete":false}]},"SVGPathSegCurvetoQuadraticSmoothRel":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"SVGFEMorphologyElement":{"title":"feMorphology","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"This filter is used to erode or dilate the input image. It's usefulness lies especially in fattening or thinning effects.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in","name":"in","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/radius","name":"radius","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/operator","name":"operator","help":""}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feMorphology"},"HTMLSpanElement":{"title":"span","examples":["<pre name=\"code\" class=\"xml\">&lt;p&gt;&lt;span&gt;Some text&lt;/span&gt;&lt;/p&gt;</pre>\n        \n<div id=\"section_6\"><span id=\"Result\"></span><h4 class=\"editable\">Result</h4>\n<p><span>Some text</span></p></div>"],"summary":"This HTML element is a generic inline container for phrasing content, which does not inherently represent anything. It can be used to group elements for styling purposes (using the <strong>class</strong> or <strong>id</strong> attributes), or because they share attribute values, such as <strong>lang</strong>. It should be used only when no other semantic element is appropriate. &lt;span&gt; is very much like a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/div\">&lt;div&gt;</a></code>\n element, but <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/div\">&lt;div&gt;</a></code>\n is a block-level element whereas a &lt;span&gt; is an inline element.","members":[],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/span"},"SVGAnimateElement":{"title":"SVGAnimateElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimateElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimateElement"},"MetadataCallback":{"title":"EntrySync","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/EntrySync","skipped":true,"cause":"Suspect title"},"EntriesCallback":{"title":"DirectoryReaderSync","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/DirectoryReaderSync","skipped":true,"cause":"Suspect title"},"UIEvent":{"title":"UIEvent","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/UIEvent","specification":"DOM&nbsp;3 Events: UIEvent","seeAlso":"Event","summary":"<div><div>\n\n<a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/events/nsIDOMUIEvent.idl\"><code>dom/interfaces/events/nsIDOMUIEvent.idl</code></a><span><a rel=\"internal\" href=\"https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces\" title=\"en/Interfaces/About_Scriptable_Interfaces\">Scriptable</a></span></div><span>A basic event interface for all user interface events</span><div><div>1.0</div><div>11.0</div><div title=\"Introduced in Gecko 1.0 \n\"></div><div title=\"Last changed in Gecko 9.0 \n\"></div></div>\n<div>Inherits from: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMEvent\">nsIDOMEvent</a></code>\n<span>Last changed in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n</span></div></div>\n<p></p>\n<p>The DOM <code>UIEvent</code> represents simple user interface events.</p>","members":[{"name":"initUIEvent","help":"<p>Initializes the UIEvent object.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>typeArg</code></dt> <dd>The type of UI event.</dd> <dt><code>canBubbleArg</code></dt> <dd>Whether or not the event can bubble.</dd> <dt><code>cancelableArg</code></dt> <dd>Whether or not the event can be canceled.</dd> <dt><code>viewArg</code></dt> <dd>Specifies the <code>view</code> attribute value. This may be <code>null</code>.</dd> <dt><code>detailArg</code></dt> <dd>Specifies the detail attribute value.</dd>\n</dl>\n</div>","idl":"<pre><code>void initUIEvent(\n  in DOMString typeArg,\n  in boolean canBubbleArg,\n  in boolean cancelableArg,\n  in views::AbstractView viewArg,\n  in long detailArg\n);</code>\n</pre>","obsolete":false},{"name":"detail","help":"Detail about the event, depending on the type of event. <strong>Read only.</strong>","obsolete":false},{"name":"view","help":"A view which generated the event. <strong>Read only.</strong>","obsolete":false}]},"SVGStopElement":{"title":"SVGStopElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGStopElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/stop\">&lt;stop&gt;</a></code>\n element.","members":[{"name":"offset","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/offset\" class=\"new\">offset</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/stop\">&lt;stop&gt;</a></code>\n element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGStopElement"},"SVGGradientElement":{"title":"SVGGradientElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGGradient</code> interface is a base interface used by <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGLinearGradientElement\">SVGLinearGradientElement</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGRadialGradientElement\">SVGRadialGradientElement</a></code>\n.","members":[{"name":"SVG_SPREADMETHOD_UNKNOWN","help":"The type is not one of predefined types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.","obsolete":false},{"name":"SVG_SPREADMETHOD_PAD","help":"Corresponds to value <em>pad</em>.","obsolete":false},{"name":"SVG_SPREADMETHOD_REFLECT","help":"Corresponds to value <em>reflect</em>.","obsolete":false},{"name":"SVG_SPREADMETHOD_REPEAT","help":"Corresponds to value <em>repeat</em>.","obsolete":false},{"name":"gradientUnits","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/gradientUnits\" class=\"new\">gradientUnits</a></code> on the given element. Takes one of the constants defined in <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes\" class=\"new\">SVGUnitTypes</a></code>\n.","obsolete":false},{"name":"gradientTransform","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/gradientTransform\" class=\"new\">gradientTransform</a></code> on the given element.","obsolete":false},{"name":"spreadMethod","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/spreadMethod\" class=\"new\">spreadMethod</a></code> on the given element. One of the Spread Method Types defined on this interface.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGGradientElement"},"SVGMatrix":{"title":"SVGMatrix","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"<p>Many of SVG's graphics operations utilize 2x3 matrices of the form:</p>\n<pre>[a c e]\n[b d f]</pre>\n<p>which, when expanded into a 3x3 matrix for the purposes of matrix arithmetic, become:</p>\n<pre>[a c e]\n[b d f]\n[0 0 1]\n</pre>\n<p>An <code>SVGMatrix</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>","members":[{"name":"multiply","help":"Performs matrix multiplication. This matrix is post-multiplied by another matrix, returning the resulting new matrix.","obsolete":false},{"name":"inverse","help":"<p>Return the inverse matrix</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>SVG_MATRIX_NOT_INVERTABLE</code> is raised if the matrix is not invertable.</li> </ul>","obsolete":false},{"name":"translate","help":"Post-multiplies a translation transformation on the current matrix and returns the resulting matrix.","obsolete":false},{"name":"scale","help":"Post-multiplies a uniform scale transformation on the current matrix and returns the resulting matrix.","obsolete":false},{"name":"scaleNonUniform","help":"Post-multiplies a non-uniform scale transformation on the current matrix and returns the resulting matrix.","obsolete":false},{"name":"rotate","help":"Post-multiplies a rotation transformation on the current matrix and returns the resulting matrix.","obsolete":false},{"name":"rotateFromVector","help":"<p>Post-multiplies a rotation transformation on the current matrix and returns the resulting matrix. The rotation angle is determined by taking (+/-) atan(y/x). The direction of the vector (x,&nbsp;y) determines whether the positive or negative angle value is used.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>SVG_INVALID_VALUE_ERR</code> is raised if one of the parameters has an invalid value.</li> </ul>","obsolete":false},{"name":"flipX","help":"Post-multiplies the transformation [-1&nbsp;0&nbsp;0&nbsp;1&nbsp;0&nbsp;0] and returns the resulting matrix.","obsolete":false},{"name":"flipY","help":"Post-multiplies the transformation [1&nbsp;0&nbsp;0&nbsp;-1&nbsp;0&nbsp;0] and returns the resulting matrix.","obsolete":false},{"name":"skewX","help":"Post-multiplies a skewX transformation on the current matrix and returns the resulting matrix.","obsolete":false},{"name":"skewY","help":"Post-multiplies a skewY transformation on the current matrix and returns the resulting matrix.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGMatrix"},"IDBTransaction":{"title":"IDBTransaction","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>12\n<span title=\"prefix\">-webkit</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["<p>In the following code snippet, we open a transaction and add data to the object store.&nbsp;&nbsp;Because the specification is still evolving, Chrome uses prefixes in the methods.&nbsp;Chrome uses the&nbsp;<code>webkit</code>&nbsp;prefix.&nbsp;<span>For example,&nbsp;</span><span>instead of just&nbsp;</span><span><code>IDBTransaction.READ_WRITE</code>, </span><span>use <code>webkitIDBTransaction.READ_WRITE</code>.&nbsp;</span><span>Firefox does not use prefixes, except in the opening method (<code>mozIndexedDB</code>)</span><span>. </span><span>Event handlers are registered for responding to various situations.</span></p>\n\n          <pre name=\"code\" class=\"js\">// Take care of the browser prefixes.\nif (window.indexedDb) {\n} else if (window.webkitIndexedDB) {\n    window.indexedDB = window.webkitIndexedDB;\n    window.IDBTransaction = window.webkitIDBTransaction;\n} else if (window.mozIndexedDB) {\n    window.indexedDB = window.mozIndexedDB;\n} else {\n   /* Browser not supported. */\n}\n   \n...   \n\nvar idbReq = window.indexedDB.open('Database Name');\nidbReq.onsuccess = function(event) {\n   var db = this.result;\n   var trans = db.transaction(['monster_store','hero_store'], IDBTransaction.READ_WRITE);\n   var store = trans.objectStore('monster_store');\n   var req = store.put(value, key);\n   req.onsuccess = ...\n   req.onerror = ...\n};\nidbReq.onerror = function(event) {\n    ...\n};</pre>"],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBTransaction","summary":"<p>The <code>IDBTransaction</code> interface of the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB&nbsp;API</a> provides a static, asynchronous transaction on a database using event handler attributes. All reading and writing of data are done within transactions. You actually use <code><a title=\"en/IndexedDB/IDBDatabase\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabase\">IDBDatabase</a></code> to start transactions and use <code>IDBTransaction</code> to set the mode of the transaction and access an object store and make your request. You can also use it to abort transactions.</p>\n<p>Inherits from: <a title=\"en/DOM/EventTarget\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/EventTarget\">EventTarget</a></p>","members":[{"name":"abort","help":"<p>Returns immediately, and undoes all the changes to objects in the database associated with this transaction. If this transaction has been aborted or completed, then this method throws an <a title=\"en/IndexedDB/IDBErrorEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent\">error event</a>, with its <a title=\"en/IndexedDB/IDBErrorEvent#attr code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code\">code</a> set to <code><a title=\"en/IndexedDB/IDBDatabaseException#ABORT ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#ABORT_ERR\">ABORT_ERR</a></code> and a suitable <a title=\"en/IndexedDB/IDBEvent#attr message\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBEvent#attr_message\">message</a>.</p>\n\n<p>All pending <a title=\"IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\"><code>IDBRequest</code></a> objects created during this transaction have their <code>errorCode</code> set to <code>ABORT_ERR</code>.</p>\n<div id=\"section_12\"><span id=\"Exceptions\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a>, with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></dt> <dd>The transaction has already been committed or aborted.</dd>\n</dl>\n</div>","idl":"<pre>void abort(\n);\n</pre>","obsolete":false},{"name":"objectStore","help":"<p>Returns an object store that has already been added to the scope of this transaction. Every call to this method on the same transaction object, with the same name, returns the same <a title=\"en/IndexedDB/IDBObjectStore\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBObjectStore\">IDBObjectStore</a> instance. If this method is called on a different transaction object, a different IDBObjectStore instance is returned.</p>\n\n<div id=\"section_14\"><span id=\"Parameters\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>name</dt> <dd>The name of the requested object store.</dd>\n</dl>\n</div><div id=\"section_15\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"IDBObjectStore\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBObjectStore\">IDBObjectStore</a></code></dt> <dd>An object for accessing the requested object store.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Exceptions_2\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>The method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_FOUND_ERR</a></code></dt> <dd>The requested object store is not in this transaction's scope.</dd> <dt><code><a title=\"en/IndexedDB/DatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_ALLOWED_ERR</a></code></dt> <dd>request is made on a source object that has been deleted or removed..</dd>\n</dl>\n</div>","idl":"<pre><code>IDBObjectStore objectStore(\n&nbsp; in DOMString name\n) raises (IDBDatabaseException);</code>\n</pre>","obsolete":false},{"url":"","name":"READ_ONLY","help":"Allows data to be read but not changed.&nbsp;","obsolete":false},{"url":"","name":"READ_WRITE","help":"Allows reading and writing of data in existing data stores to be changed.","obsolete":false},{"url":"","name":"VERSION_CHANGE","help":"Allows any operation to be performed, including ones that delete and create object stores and indexes. This mode is for updating the version number of transactions that were started using the <a title=\"en/IndexedDB/IDBDatabase#setVersion\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabase#setVersion\"><code>setVersion()</code></a> method of <a title=\"en/IndexedDB/IDBDatabase\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabase\">IDBDatabase</a> objects. Transactions of this mode cannot run concurrently with other transactions.","obsolete":false},{"url":"","name":"db","help":"The database connection that this transaction is associated with.","obsolete":false},{"url":"","name":"mode","help":"The mode for isolating access to data in the object stores that are in the scope of the transaction. For possible values, see Constants. The default value is <code><a href=\"#const_read_only\" title=\"#const read only\">READ_ONLY</a></code>.","obsolete":false},{"url":"","name":"onabort","help":"The event handler for the <code>onabort</code> event.","obsolete":false},{"url":"","name":"oncomplete","help":"The event handler for the <code>oncomplete</code> event.","obsolete":false},{"url":"","name":"onerror","help":"The event handler for the <code>error </code>event.","obsolete":false},{"name":"onabort","help":"","obsolete":false},{"name":"oncomplete","help":"","obsolete":false},{"name":"onerror","help":"","obsolete":false}]},"Entry":{"title":"Entry","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>13\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<div><strong>DRAFT</strong> <div>This page is not complete.</div>\n</div>\n<p>The <code>Entry</code> interface of the <a title=\"en/DOM/File_API/File_System_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File_API/File_System_API\">FileSystem API</a> represents entries in a file system. The entries can be a file&nbsp;or a <a href=\"https://developer.mozilla.org/en/DOM/File_API/File_system_API/DirectoryEntry\" rel=\"internal\" title=\"en/DOM/File_API/File_system_API/DirectoryEntry\">DirectoryEntry</a>.</p>","members":[{"name":"getMetadata","help":"<p>Look up metadata about this entry.</p>\n<pre>void getMetada (\n  in MetadataCallback ErrorCallback\n);</pre>\n<div id=\"section_6\"><span id=\"Parameter\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>successCallback</dt> <dd>A callback that is called with the time of the last modification.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_7\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"getParent","help":"<p>Look up the parent <code>DirectoryEntry</code> containing this entry. If this entry is the root of its filesystem, its parent is itself.</p>\n<pre>void getParent (\n  <em>(in EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_21\"><span id=\"Parameter_6\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCellback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_22\"><span id=\"Returns_6\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"remove","help":"<p>Deletes a file or directory. You cannot delete an empty directory or the root directory of a filesystem.</p>\n<pre>void remove (\n  <em>(in VoidCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_18\"><span id=\"Parameter_5\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_19\"><span id=\"Returns_5\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"copyTo","help":"<p>Copy an entry to a different location on the file system. You cannot copy an entry inside itself if it is a directory nor can you copy it into its parent if a name different from its current one isn't provided. Directory copies are always recursive—that is, they copy all contents of the directory.</p>\n<pre>void vopyTo (\n  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_12\"><span id=\"Parameter_3\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_13\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"moveTo","help":"<p>Move an entry to a different location on the file system. You cannot do the following:</p>\n<ul> <li>move a directory inside itself or to any child at any depth;</li> <li>move an entry into its parent if a name different from its current one isn't provided;</li> <li>move a file to a path occupied by a directory;</li> <li>move a directory to a path occupied by a file;</li> <li>move any element to a path occupied by a directory which is not empty.</li>\n</ul>\n<p>Moving a file over an existing file&nbsp;replaces that existing file. A move of a directory on top of an existing empty directory&nbsp;replaces that directory.</p>\n<pre>void moveTo (\n  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_9\"><span id=\"Parameter_2\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_10\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"toURL","help":"<p>Returns a URL that can be used to identify this entry. It has no specific expiration. Bcause it describes a location on disk, it is valid for as long as that location exists. Users can supply&nbsp;<code>mimeType</code>&nbsp;to simulate the optional mime-type header associated with HTTP downloads.</p>\n<pre>DOMString toURL (\n  <em>(in </em>optional DOMString mimeType<em>);</em>\n);</pre>\n<div id=\"section_15\"><span id=\"Parameter_4\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>mimeType</dt> <dd>For a FileEntry, the mime type to be used to interpret the file, when loaded through this URL.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>DOMString</code></dt>\n</dl>\n</div>","obsolete":false},{"url":"","name":"filesystem","help":"The file system on which the entry resides.","obsolete":false},{"url":"","name":"fullpath","help":"The full&nbsp;absolute path&nbsp;from the root to the entry. An&nbsp;absolute path&nbsp;is a&nbsp;relative path&nbsp;from the root directory, prepended with a '/'. A relative path describes how to get from a particular directory to a file or directory. All methods that accept paths are on DirectoryEntry or DirectoryEntrySync objects; the paths, if relative, are interpreted as being relative to the directories represented by these objects.","obsolete":false},{"url":"","name":"isDirectory","help":"The entry is a directory.","obsolete":false},{"url":"","name":"isFile","help":"The entry is a file.","obsolete":false},{"url":"","name":"name","help":"The name of the entry, excluding the path leading to it.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/Entry"},"WheelEvent":{"title":"nsIDOMMouseScrollEvent","members":[],"srcUrl":"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMMouseScrollEvent","skipped":true,"cause":"Suspect title"},"Coordinates":{"title":"Drawing shapes","members":[],"srcUrl":"https://developer.mozilla.org/en/Canvas_tutorial/Drawing_shapes","skipped":true,"cause":"Suspect title"},"HTMLDocument":{"title":"HTMLDocument","summary":"<p><code>HTMLDocument</code> is an abstract interface of the <a title=\"en/DOM\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM\">DOM</a> which provides access to special properties and methods not present by default on a regular (XML) document.</p>\n<p>Its methods and properties are noted (as asterisks) on the <a title=\"en/DOM/document\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document\">document</a> page.</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLDocument","specification":"http://www.w3.org/TR/DOM-Level-2-HTM...ml#ID-26809268"},"SVGDefsElement":{"title":"SVGDefsElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>SVGDefsElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/defs\">&lt;defs&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGDefsElement"},"Touch":{"title":"Touch","examples":["See the <a title=\"en/DOM/Touch events#Example\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Touch_events#Example\">example on the main Touch events article</a>."],"srcUrl":"https://developer.mozilla.org/en/DOM/Touch","specification":"Touch Events Specification","seeAlso":"<li><a title=\"en/DOM/Touch events\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Touch_events\">Touch events</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TouchList\">TouchList</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TouchEvent\">TouchEvent</a></code>\n</li>","summary":"A <code>Touch</code> object represents a single point of contact between the user and a touch-sensitive interface device (which may be, for example, a touchscreen or a trackpad).","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.screenY","name":"screenY","help":"The Y coordinate of the touch point relative to the screen, not including any scroll offset. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.pageY","name":"pageY","help":"The Y coordinate of the touch point relative to the viewport, including any scroll offset. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.identifier","name":"identifier","help":"A unique identifier for this <code>Touch</code> object. A given touch (say, by a finger) will have the same identifier for the duration of its movement around the surface. This lets you ensure that you're tracking the same touch all the time. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.clientY","name":"clientY","help":"The Y coordinate of the touch point relative to the viewport, not including any scroll offset. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.pageX","name":"pageX","help":"The X coordinate of the touch point relative to the viewport, including any scroll offset. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.clientX","name":"clientX","help":"The X coordinate of the touch point relative to the viewport, not including any scroll offset. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.radiusX","name":"radiusX","help":"The X radius of the ellipse that most closely circumscribes the area of contact with the screen. The value is in pixels of the same scale as <code>screenX</code>. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.rotationAngle","name":"rotationAngle","help":"The angle (in degrees)&nbsp;that the ellipse described by radiusX and radiusY must be rotated, clockwise, to most accurately cover the area of contact between the user and the surface. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.screenX","name":"screenX","help":"The X coordinate of the touch point relative to the screen, not including any scroll offset. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.force","name":"force","help":"The amount of pressure being applied to the surface by the user, as a float between 0.0 (no pressure) and 1.0 (maximum pressure). <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Touch.radiusY","name":"radiusY","help":"The Y radius of the ellipse that most closely circumscribes the area of contact with the screen. The value is in pixels of the same scale as <code>screenY</code>. <strong>Read only.</strong>"}]},"HTMLDataListElement":{"title":"HTMLDataListElement","seeAlso":"The <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/datalist\">&lt;datalist&gt;</a></code>\n element, which implements this interface.","summary":"DOM Datalist objects expose the <a class=\" external\" title=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-datalist-element\" rel=\"external\" href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-datalist-element\" target=\"_blank\">HTMLDataListElement</a> interface, which provides special properties (beyond the <a href=\"https://developer.mozilla.org/en/DOM/element\" rel=\"internal\">element</a> object interface they also have available to them by inheritance) to manipulate <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/datalist\">&lt;datalist&gt;</a></code>\n elements and their content.","members":[{"name":"options","help":"A collection of the contained option elements.","obsolete":false},{"name":"options","help":"A collection of the contained option elements.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLDataListElement"},"CSSValue":{"title":"text-overflow","members":[],"srcUrl":"https://developer.mozilla.org/en/CSS/text-overflow","skipped":true,"cause":"Suspect title"},"HTMLBaseElement":{"title":"HTMLBaseElement","summary":"The <code>base</code> object exposes the <a class=\" external\" title=\"http://www.w3.org/TR/html5/semantics.html#htmlbaseelement\" rel=\"external\" href=\"http://www.w3.org/TR/html5/semantics.html#htmlbaseelement\" target=\"_blank\">HTMLBaseElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\"external\" target=\"_blank\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-73629039\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-73629039\">HTMLBaseElement</a>) interface which contains the base URI&nbsp;for a document.&nbsp; This object inherits all of the properties and methods as described in the <a class=\"internal\" title=\"en/DOM/element\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> section.","members":[{"name":"href","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/base#attr-href\">href</a></code>\n HTML attribute, containing a base URL for relative URLs in the document.","obsolete":false},{"name":"target","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/base#attr-target\">target</a></code>\n HTML attribute, containing a default target browsing context or frame for elements that do not have a target reference specified.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLBaseElement"},"CanvasGradient":{"title":"CanvasGradient","summary":"This is an opaque object representing a gradient and returned by <a title=\"en/DOM/CanvasRenderingContext2D\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D\">CanvasRenderingContext2D</a>'s <a title=\"en/DOM/CanvasRenderingContext2D.createLinearGradient\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D\">createLinearGradient</a> or <a title=\"en/DOM/CanvasRenderingContext2D.createRadialGradient\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D\">createRadialGradient</a> methods.","members":[{"name":"addColorStop","help":"","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/CanvasGradient","specification":"http://www.whatwg.org/specs/web-apps...canvasgradient"},"HTMLLIElement":{"title":"li","examples":["<pre name=\"code\" class=\"xml\">&lt;ol&gt;\n    &lt;li&gt;first item&lt;/li&gt;\n    &lt;li&gt;second item&lt;/li&gt;\n    &lt;li&gt;third item&lt;/li&gt;\n&lt;/ol&gt;</pre>\n        \n<p>The above HTML will output:</p>\n<ol> <li>first item</li> <li>second item</li> <li>third item</li>\n</ol>\n\n          <pre name=\"code\" class=\"xml\">&lt;ul&gt;\n    &lt;li&gt;first item&lt;/li&gt;\n    &lt;li&gt;second item&lt;/li&gt;\n    &lt;li&gt;third item&lt;/li&gt;\n&lt;/ul&gt;</pre>\n        \n<ul> <li>first item</li> <li>second item</li> <li>third item</li>\n</ul>\n<p>For more detailed examples, see the <a title=\"en/HTML/Element/ol#Examples\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Element/ol#Examples\">&lt;ol&gt;</a> and <a title=\"en/HTML/Element/ul#Examples\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Element/ul#Examples\">&lt;ul&gt;</a> pages.</p>"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/li","seeAlso":"<li>Other list-related HTML&nbsp;Elements: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/li\">&lt;li&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu\">&lt;menu&gt;</a></code>\n and the obsolete <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/dir\">&lt;dir&gt;</a></code>\n;</li> <li>CSS properties that may be specially useful to style the <span>&lt;li&gt;</span> element: <ul> <li>the <a title=\"en/CSS/list-style\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/list-style\">list-style</a> property, to choose the way the ordinal is displayed,</li> <li><a title=\"en/CSS_Counters\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS_Counters\">CSS counters</a>, to handle complex nested lists,</li> <li>the <a title=\"en/CSS/margin\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/margin\">margin</a> property, to control the indent of the list item.</li> </ul> </li>","summary":"The <em>HTML List item element</em> (<code>&lt;li&gt;</code>) is used to represent a list item. It should be contained in an ordered list (<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n), an unordered list (<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n) or a menu (<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu\">&lt;menu&gt;</a></code>\n), where it represents a single entity in that list. In menus and unordered lists, list items are ordinarily displayed using bullet points. In order lists, they are usually displayed with some ascending counter on the left such as a number or letter","members":[{"obsolete":false,"url":"","name":"type","help":"This character attributes indicates the numbering type: <ul> <li><code>a</code>: lowercase letters</li> <li><code>A</code>: uppercase letters</li> <li><code>i</code>: lowercase Roman numerals</li> <li><code>I</code>: uppercase Roman numerals</li> <li><code>1</code>: numbers</li> </ul> This type overrides the one used by its parent <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n element, if any.<br> <div class=\"note\"><strong>Usage note:</strong> This attribute has been deprecated: use the CSS <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/list-style-type\">list-style-type</a></code>\n property instead.</div>"},{"obsolete":false,"url":"","name":"value","help":"This integer attributes indicates the current ordinal value of the item in the list as defined by the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n element. The only allowed value for this attribute is a number, even if the list is displayed with Roman numerals or letters. List items that follow this one continue numbering from the value set. The <strong>value</strong> attribute has no meaning for unordered lists (<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n) or for menus (<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu\">&lt;menu&gt;</a></code>\n). <div class=\"note\"><strong>Note</strong>: This attribute was deprecated in HTML4, but reintroduced in HTML5.</div> <div class=\"geckoVersionNote\"> <p>\n</p><div class=\"geckoVersionHeading\">Gecko 9.0 note<div>(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n</div></div>\n<p></p> <p>Prior to <span title=\"(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n\">Gecko&nbsp;9.0</span>, negative values were incorrectly converted to 0. Starting in <span title=\"(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n\">Gecko&nbsp;9.0</span> all integer values are correctly parsed.</p> </div>"}]},"HTMLImageElement":{"title":"HTMLImageElement","examples":["var img1 = new Image(); // DOM 0\nimg1.src = 'image1.png';\nimg1.alt = 'alt';\ndocument.body.appendChild(img1);\n\nvar img2 = document.createElement('img'); // use DOM <a href=\"http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/html/nsIDOMHTMLImageElement.idl\" title=\"http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/html/nsIDOMHTMLImageElement.idl\">HTMLImageElement</a>\nimg2.src = 'image2.jpg';\nimg2.alt = 'alt text';\ndocument.body.appendChild(img2);\n\n// using first image in the document\nalert(document.images[0].src);\n"],"summary":"DOM image objects expose the <a title=\"http://www.w3.org/TR/html5/embedded-content-1.html#htmlimageelement\" class=\" external\" rel=\"external\" href=\"http://www.w3.org/TR/html5/embedded-content-1.html#htmlimageelement\" target=\"_blank\">HTMLImageElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-17701901\" class=\" external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-17701901\" target=\"_blank\"><code>HTMLImageElement</code></a>) interface, which provides special properties and methods (beyond the regular <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a></code>\n object interface they also have available to them by inheritance) for manipulating the layout and presentation of input elements.","members":[{"name":"align","help":"Indicates the alignment of the image with respect to the surrounding context.","obsolete":true},{"name":"alt","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/img#attr-alt\">alt</a></code>\n HTML attribute, indicating fallback context for the image.","obsolete":false},{"name":"border","help":"Width of the border around the image.","obsolete":true},{"name":"complete","help":"True if the browser has fetched the image, and it is in a <a title=\"en/HTML/Element/Img#Image Format\" rel=\"internal\" href=\"https://developer.mozilla.org/En/HTML/Element/Img#Image_Format\">supported image type</a> that was decoded without errors.","obsolete":false},{"name":"crossOrigin","help":"The CORS setting for this image element. See <a title=\"en/HTML/CORS settings attributes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/CORS_settings_attributes\">CORS&nbsp;settings attributes</a> for details.","obsolete":false},{"name":"height","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/img#attr-height\">height</a></code>\n HTML attribute, indicating the rendered height of the image in CSS&nbsp;pixels.","obsolete":false},{"name":"hspace","help":"Space to the left and right of the image.","obsolete":true},{"name":"isMap","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/img#attr-ismap\">ismap</a></code>\n HTML attribute, indicating that the image is part of a server-side image map.","obsolete":false},{"name":"longDesc","help":"URI of a long description of the image.","obsolete":true},{"name":"naturalHeight","help":"Intrinsic height of the image in CSS&nbsp;pixels, if it is available; otherwise, 0.","obsolete":false},{"name":"naturalWidth","help":"Intrinsic width of the image in CSS&nbsp;pixels, if it is available; otherwise, 0.","obsolete":false},{"name":"src","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element#attr-src\">src</a></code>\n HTML attribute, containing the URL of the image.","obsolete":false},{"name":"useMap","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/img#attr-usemap\">usemap</a></code>\n HTML attribute, containing a partial URL of a map element.","obsolete":false},{"name":"vspace","help":"Space above and below the image.","obsolete":true},{"name":"width","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/img#attr-width\">width</a></code>\n HTML attribute, indicating the rendered width of the image in CSS&nbsp;pixels.","obsolete":false},{"name":"lowsrc","help":"A reference to a low-quality (but faster to load) copy of the image.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLImageElement"},"StringCallback":{"title":"HTTP server for unit tests","members":[],"srcUrl":"https://developer.mozilla.org/En/Httpd.js/HTTP_server_for_unit_tests","skipped":true,"cause":"Suspect title"},"SVGAngle":{"title":"SVGAngle","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"<p>The <code>SVGAngle</code> interface correspond to the <a title=\"https://developer.mozilla.org/en/SVG/Content_type#Angle\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Content_type#Angle\">&lt;angle&gt;</a> basic data type.</p>\n<p>An <code>SVGAngle</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>","members":[{"name":"newValueSpecifiedUnits","help":"<p>Reset the value as a number with an associated unitType, thereby replacing the values for all of the attributes on the object.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NOT_SUPPORTED_ERR</code> is raised if <code>unitType</code> is <code>SVG_ANGLETYPE_UNKNOWN</code> or not a valid unit type constant (one of the other <code>SVG_ANGLETYPE_*</code> constants defined on this interface).</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"convertToSpecifiedUnits","help":"Preserve the same underlying stored value, but reset the stored unit identifier to the given <code><em>unitType</em></code>. Object attributes <code>unitType</code>, <code>valueInSpecifiedUnits</code> and <code>valueAsString</code> might be modified as a result of this method.","obsolete":false},{"name":"SVG_ANGLETYPE_UNKNOWN","help":"The unit type is not one of predefined unit types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.","obsolete":false},{"name":"SVG_ANGLETYPE_UNSPECIFIED","help":"No unit type was provided (i.e., a unitless value was specified). For angles, a unitless value is treated the same as if degrees were specified.","obsolete":false},{"name":"SVG_ANGLETYPE_DEG","help":"The unit type was explicitly set to degrees.","obsolete":false},{"name":"SVG_ANGLETYPE_RAD","help":"The unit type is radians.","obsolete":false},{"name":"SVG_ANGLETYPE_GRAD","help":"The unit type is gradians.","obsolete":false},{"name":"unitType","help":"The type of the value as specified by one of the SVG_ANGLETYPE_* constants defined on this interface.","obsolete":false},{"name":"value","help":"<p>The value as a floating point value, in user units. Setting this attribute will cause <code>valueInSpecifiedUnits</code> and <code>valueAsString</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</p>","obsolete":false},{"name":"valueInSpecifiedUnits","help":"<p>The value as a floating point value, in the units expressed by <code>unitType</code>. Setting this attribute will cause <code>value</code> and <code>valueAsString</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</p>","obsolete":false},{"name":"valueAsString","help":"<p>The value as a string value, in the units expressed by <code>unitType</code>. Setting this attribute will cause <code>value</code>, <code>valueInSpecifiedUnits</code> and <code>unitType</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>SYNTAX_ERR</code> is raised if the assigned string cannot be parsed as a valid <a title=\"https://developer.mozilla.org/en/SVG/Content_type#Angle\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Content_type#Angle\">&lt;angle&gt;</a>.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAngle"},"DocumentType":{"title":"DocumentType","summary":"<p><span>NOTE:&nbsp;This interface is not fully supported in Mozilla at present, including for indicating internalSubset information which Gecko generally does otherwise support.</span></p>\n<p><code>DocumentType</code> inherits <a title=\"en/DOM/Node\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a>'s properties, methods, and constants as well as the following properties of its own:</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/DocumentType.name","name":"name","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/DocumentType.systemId","name":"systemId","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/DocumentType.publicId","name":"publicId","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/DocumentType.internalSubset","name":"internalSubset","help":""}],"srcUrl":"https://developer.mozilla.org/en/DOM/DocumentType","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...l#ID-412266927"},"HTMLTableElement":{"title":"HTMLTableElement","summary":"<code>table</code> objects expose the <code><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-64060425\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-64060425\" target=\"_blank\">HTMLTableElement</a></code> interface, which provides special properties and methods (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\" title=\"en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of tables in HTML.\n","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.deleteTHead","name":"deleteTHead","help":"<b>deleteTHead</b> removes the table header.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.createTFoot","name":"createTFoot","help":"<b>createTFoot</b> creates a table footer.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.insertRow","name":"insertRow","help":"<b>insertRow</b> inserts a new row.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.deleteCaption","name":"deleteCaption","help":"<b>deleteCaption</b> removes the table caption.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.createCaption","name":"createCaption","help":"<b>createCaption</b> creates a new caption for the table.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.deleteTFoot","name":"deleteTFoot","help":"<b>deleteTFoot</b> removes a table footer.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.createTHead","name":"createTHead","help":"<b>createTHead</b> creates a table header.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.deleteRow","name":"deleteRow","help":"<b>deleteRow</b> removes a row.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.caption","name":"caption","help":"<b>caption</b> returns the table caption.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.tFoot","name":"tFoot","help":"<b>tFoot</b> returns the table footer.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.rows","name":"rows","help":"<b>rows</b> returns the rows in the table.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.width","name":"width","help":"<b>width</b> gets/sets the width of the table.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.cellSpacing","name":"cellSpacing","help":"<b>cellSpacing</b> gets/sets the spacing around the table.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.tHead","name":"tHead","help":"<b>tHead</b> returns the table head.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.bgColor","name":"bgColor","help":"<b>bgColor</b> gets/sets the background color of the table.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.align","name":"align","help":"<b>align</b> gets/sets the alignment of the table.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.cellPadding","name":"cellPadding","help":"<b>cellPadding</b> gets/sets the cell padding.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.tBodies","name":"tBodies","help":"<b>tBodies</b> returns the table bodies.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.summary","name":"summary","help":"<b>summary</b> gets/sets the table summary.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.frame","name":"frame","help":"<b>frame</b> specifies which sides of the table have borders.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.rules","name":"rules","help":"<b>rules</b> specifies which interior borders are visible.\n"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/table.border","name":"border","help":"<b>border</b> gets/sets the table border.\n"}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLTableElement"},"CSSRuleList":{"title":"CSSRuleList","examples":["// get the first style sheet’s first rule\nvar first_rule = document.styleSheets[0].cssRules[0];"],"srcUrl":"https://developer.mozilla.org/en/DOM/CSSRuleList","specification":"<li><a title=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList\" class=\" external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList\" target=\"_blank\">DOM Level 2 Style: <code>CSSRuleList</code> interface</a></li> <li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-cssRules\" title=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-cssRules\" target=\"_blank\">DOM Level 2 Style: <code>CSSStyleSheet</code> attribute <code>cssRules</code></a></li> <li><a title=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule-cssRules\" class=\" external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule-cssRules\" target=\"_blank\">DOM Level 2 Style: <code>CSSMediaRule</code> attribute </a><code><a title=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule-cssRules\" class=\" external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule-cssRules\" target=\"_blank\">cssRules</a></code></li> <li><a title=\"http://dev.w3.org/csswg/css3-animations/#DOM-CSSKeyframesRule\" class=\" external\" rel=\"external\" href=\"http://dev.w3.org/csswg/css3-animations/#DOM-CSSKeyframesRule\" target=\"_blank\">CSS Animations: <code>CSSKeyframesRule</code> interface</a></li>","seeAlso":"CSSRule","summary":"A <code>CSSRuleList</code> is an array-like object containing an ordered collection of <code><a title=\"en/DOM/cssRule\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/cssRule\">CSSRule</a></code> objects.","members":[]},"SVGSVGElement":{"title":"SVGSVGElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGSVGElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/circle\">&lt;circle&gt;</a></code>\n SVG Element","summary":"The <code>SVGSVGElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n elements, as well as methods to manipulate them. This interface contains also various miscellaneous commonly-used utility methods, such as matrix operations and the ability to control the time of redraw on visual rendering devices.","members":[{"name":"suspendRedraw","help":"<p>Takes a time-out value which indicates that redraw shall not occur until:</p> <ol> <li>the corresponding unsuspendRedraw() call has been made,</li> <li>an unsuspendRedrawAll() call has been made, or</li> <li>its timer has timed out.</li> </ol> <p>In environments that do not support interactivity (e.g., print media), then redraw shall not be suspended. Calls to <code>suspendRedraw()</code> and <code>unsuspendRedraw()</code> should, but need not be, made in balanced pairs.</p> <p>To suspend redraw actions as a collection of SVG DOM changes occur, precede the changes to the SVG DOM with a method call similar to:</p> <p><code>suspendHandleID = suspendRedraw(maxWaitMilliseconds);</code></p> <p>and follow the changes with a method call similar to:</p> <p><code>unsuspendRedraw(suspendHandleID);</code></p> <p>Note that multiple suspendRedraw calls can be used at once and that each such method call is treated independently of the other suspendRedraw method calls.</p>","obsolete":false},{"name":"unsuspendRedraw","help":"Cancels a specified <code>suspendRedraw()</code> by providing a unique suspend handle ID that was returned by a previous <code>suspendRedraw()</code> call.","obsolete":false},{"name":"unsuspendRedrawAll","help":"Cancels all currently active <code>suspendRedraw()</code> method calls. This method is most useful at the very end of a set of SVG DOM calls to ensure that all pending <code>suspendRedraw()</code> method calls have been cancelled.","obsolete":false},{"name":"forceRedraw","help":"In rendering environments supporting interactivity, forces the user agent to immediately redraw all regions of the viewport that require updating.","obsolete":false},{"name":"pauseAnimations","help":"Suspends (i.e., pauses) all currently running animations that are defined within the SVG document fragment corresponding to this <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element, causing the animation clock corresponding to this document fragment to stand still until it is unpaused.","obsolete":false},{"name":"unpauseAnimations","help":"Unsuspends (i.e., unpauses) currently running animations that are defined within the SVG document fragment, causing the animation clock to continue from the time at which it was suspended.","obsolete":false},{"name":"animationsPaused","help":"Returns true if this SVG document fragment is in a paused state.","obsolete":false},{"name":"getCurrentTime","help":"Returns the current time in seconds relative to the start time for the current SVG document fragment. If getCurrentTime is called before the document timeline has begun (for example, by script running in a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/script\">&lt;script&gt;</a></code>\n element before the document's SVGLoad event is dispatched), then 0 is returned.","obsolete":false},{"name":"setCurrentTime","help":"Adjusts the clock for this SVG document fragment, establishing a new current time. If <code>setCurrentTime</code> is called before the document timeline has begun (for example, by script running in a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/script\">&lt;script&gt;</a></code>\n element before the document's SVGLoad event is dispatched), then the value of seconds in the last invocation of the method gives the time that the document will seek to once the document timeline has begun.","obsolete":false},{"name":"getIntersectionList","help":"Returns the list of graphics elements whose rendered content intersects the supplied rectangle. Each candidate graphics element is to be considered a match only if the same graphics element can be a target of pointer events as defined in \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/pointer-events\">pointer-events</a></code> processing.","obsolete":false},{"name":"getEnclosureList","help":"Returns the list of graphics elements whose rendered content is entirely contained within the supplied rectangle. Each candidate graphics element is to be considered a match only if the same graphics element can be a target of pointer events as defined in \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/pointer-events\">pointer-events</a></code> processing.","obsolete":false},{"name":"checkIntersection","help":"Returns true if the rendered content of the given element intersects the supplied rectangle. Each candidate graphics element is to be considered a match only if the same graphics element can be a target of pointer events as defined in \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/pointer-events\">pointer-events</a></code> processing.","obsolete":false},{"name":"checkEnclosure","help":"Returns true if the rendered content of the given element is entirely contained within the supplied rectangle. Each candidate graphics element is to be considered a match only if the same graphics element can be a target of pointer events as defined in \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/pointer-events\">pointer-events</a></code> processing.","obsolete":false},{"name":"deselectAll","help":"Unselects any selected objects, including any selections of text strings and type-in bars.","obsolete":false},{"name":"createSVGNumber","help":"Creates an <code>SVGNumber</code> object outside of any document trees. The object is initialized to a value of zero.","obsolete":false},{"name":"createSVGLength","help":"Creates an <code>SVGLength</code> object outside of any document trees. The object is initialized to a value of zero user units.","obsolete":false},{"name":"createSVGAngle","help":"Creates an <code>SVGAngle</code> object outside of any document trees. The object is initialized to a value of zero degrees (unitless).","obsolete":false},{"name":"createSVGPoint","help":"Creates an <code>SVGPoint</code> object outside of any document trees. The object is initialized to the point (0,0) in the user coordinate system.","obsolete":false},{"name":"createSVGMatrix","help":"Creates an <code>SVGMatrix</code> object outside of any document trees. The object is initialized to the identity matrix.","obsolete":false},{"name":"createSVGRect","help":"Creates an <code>SVGRect</code> object outside of any document trees. The object is initialized such that all values are set to 0 user units.","obsolete":false},{"name":"createSVGTransform","help":"Creates an <code>SVGTransform</code> object outside of any document trees. The object is initialized to an identity matrix transform (<code>SVG_TRANSFORM_MATRIX</code>).","obsolete":false},{"name":"createSVGTransformFromMatrix","help":"Creates an <code>SVGTransform</code> object outside of any document trees. The object is initialized to the given matrix transform (i.e., <code>SVG_TRANSFORM_MATRIX</code>). The values from the parameter matrix are copied, the matrix parameter is not adopted as <code>SVGTransform::matrix</code>.","obsolete":false},{"name":"getElementById","help":"Searches this SVG document fragment (i.e., the search is restricted to a subset of the document tree) for an Element whose id is given by <em>elementId</em>. If an Element is found, that Element is returned. If no such element exists, returns null. Behavior is not defined if more than one element has this id.","obsolete":false},{"name":"width","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/width\">width</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element.","obsolete":false},{"name":"height","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/height\">height</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element.","obsolete":false},{"name":"contentScriptType","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/contentScriptType\">contentScriptType</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element.","obsolete":false},{"name":"contentStyleType","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/contentStyleType\">contentStyleType</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element.","obsolete":false},{"name":"viewport","help":"The position and size of the viewport (implicit or explicit) that corresponds to this <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element. When the browser is actually rendering the content, then the position and size values represent the actual values when rendering. The position and size values are unitless values in the coordinate system of the parent element. If no parent element exists (i.e., <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element represents the root of the document tree), if this SVG document is embedded as part of another document (e.g., via the HTML <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object\">&lt;object&gt;</a></code>\n element), then the position and size are unitless values in the coordinate system of the parent document. (If the parent uses CSS or XSL layout, then unitless values represent pixel units for the current CSS or XSL viewport.)","obsolete":false},{"name":"pixelUnitToMillimeterX","help":"Size of a pixel units (as defined by CSS2) along the x-axis of the viewport, which represents a unit somewhere in the range of 70dpi to 120dpi, and, on systems that support this, might actually match the characteristics of the target medium. On systems where it is impossible to know the size of a pixel, a suitable default pixel size is provided.","obsolete":false},{"name":"pixelUnitToMillimeterY","help":"Corresponding size of a pixel unit along the y-axis of the viewport.","obsolete":false},{"name":"screenPixelToMillimeterX","help":"User interface (UI) events in DOM Level 2 indicate the screen positions at which the given UI event occurred. When the browser actually knows the physical size of a \"screen unit\", this attribute will express that information; otherwise, user agents will provide a suitable default value such as .28mm.","obsolete":false},{"name":"screenPixelToMillimeterY","help":"Corresponding size of a screen pixel along the y-axis of the viewport.","obsolete":false},{"name":"useCurrentView","help":"The initial view (i.e., before magnification and panning) of the current innermost SVG document fragment can be either the \"standard\" view (i.e., based on attributes on the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element such as \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewBox\" class=\"new\">viewBox</a></code>) or to a \"custom\" view (i.e., a hyperlink into a particular <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/view\">&lt;view&gt;</a></code>\n or other element). If the initial view is the \"standard\" view, then this attribute is false. If the initial view is a \"custom\" view, then this attribute is true.","obsolete":false},{"name":"currentView","help":"The definition of the initial view (i.e., before magnification and panning) of the current innermost SVG document fragment. The meaning depends on the situation:<br> <ul> <li>If the initial view was a \"standard\" view, then: <ul> <li>the values for \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewBox\" class=\"new\">viewBox</a></code>, \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code> and \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/zoomAndPan\" class=\"new\">zoomAndPan</a></code> within \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/currentView\" class=\"new\">currentView</a></code> will match the values for the corresponding DOM attributes that are on <code>SVGSVGElement</code> directly</li> <li>the values for \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/transform\">transform</a></code> and \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewTarget\" class=\"new\">viewTarget</a></code> within \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/currentView\" class=\"new\">currentView</a></code> will be null</li> </ul> </li> <li>If the initial view was a link into a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/view\">&lt;view&gt;</a></code>\n element, then: <ul> <li>the values for \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewBox\" class=\"new\">viewBox</a></code>, \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code> and \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/zoomAndPan\" class=\"new\">zoomAndPan</a></code> within \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/currentView\" class=\"new\">currentView</a></code> will correspond to the corresponding attributes for the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/view\">&lt;view&gt;</a></code>\n element</li> <li>the values for \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/transform\">transform</a></code> and \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewTarget\" class=\"new\">viewTarget</a></code> within \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/currentView\" class=\"new\">currentView</a></code> will be null</li> </ul> </li> <li>If the initial view was a link into another element (i.e., other than a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/view\">&lt;view&gt;</a></code>\n), then: <ul> <li>the values for \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewBox\" class=\"new\">viewBox</a></code>, \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code> and \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/zoomAndPan\" class=\"new\">zoomAndPan</a></code> within \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/currentView\" class=\"new\">currentView</a></code> will match the values for the corresponding DOM attributes that are on <code>SVGSVGElement</code> directly for the closest ancestor <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element</li> <li>the values for \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/transform\">transform</a></code> within \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/currentView\" class=\"new\">currentView</a></code> will be null</li> <li>the \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewTarget\" class=\"new\">viewTarget</a></code> within \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/currentView\" class=\"new\">currentView</a></code> will represent the target of the link</li> </ul> </li> <li>If the initial view was a link into the SVG document fragment using an SVG view specification fragment identifier (i.e., #svgView(...)), then: <ul> <li>the values for \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewBox\" class=\"new\">viewBox</a></code>, \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>, \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/zoomAndPan\" class=\"new\">zoomAndPan</a></code>, \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/transform\">transform</a></code> and \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/viewTarget\" class=\"new\">viewTarget</a></code> within \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/currentView\" class=\"new\">currentView</a></code> will correspond to the values from the SVG view specification fragment identifier</li> </ul> </li> </ul>","obsolete":false},{"name":"currentTranslate","help":"On an outermost <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element, the corresponding translation factor that takes into account user \"magnification\".","obsolete":false},{"name":"currentScale","help":"On an outermost <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element, this attribute indicates the current scale factor relative to the initial view to take into account user magnification and panning operations. DOM attributes <code>currentScale</code> and <code>currentTranslate</code> are equivalent to the 2x3 matrix <code>[a b c d e f] = [currentScale 0 0 currentScale currentTranslate.x currentTranslate.y]</code>. If \"magnification\" is enabled (i.e., <code>zoomAndPan=\"magnify\"</code>), then the effect is as if an extra transformation were placed at the outermost level on the SVG document fragment (i.e., outside the outermost <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/svg\">&lt;svg&gt;</a></code>\n element).","obsolete":false}]},"SVGPreserveAspectRatio":{"title":"SVGPreserveAspectRatio","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"<p>The <code>SVGPreserveAspectRatio</code> interface corresponds to the \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code> attribute, which is available for some of SVG's elements.</p>\n<p>An <code>SVGPreserveAspectRatio</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>","members":[{"name":"SVG_PRESERVEASPECTRATIO_UNKNOWN","help":"The enumeration was set to a value that is not one of predefined types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_NONE","help":"Corresponds to value <code>none</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_XMINYMIN","help":"Corresponds to value <code>xMinYMin</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_XMIDYMIN","help":"Corresponds to value <code>xMidYMin</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_XMAXYMIN","help":"Corresponds to value <code>xMaxYMin</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_XMINYMID","help":"Corresponds to value <code>xMinYMid</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_XMIDYMID","help":"Corresponds to value <code>xMidYMid</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_XMAXYMID","help":"Corresponds to value <code>xMaxYMid</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_XMINYMAX","help":"Corresponds to value <code>xMinYMax</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_XMIDYMAX","help":"Corresponds to value <code>xMidYMax</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_PRESERVEASPECTRATIO_XMAXYMAX","help":"Corresponds to value <code>xMaxYMax</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_MEETORSLICE_UNKNOWN","help":"The enumeration was set to a value that is not one of predefined types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.","obsolete":false},{"name":"SVG_MEETORSLICE_MEET","help":"Corresponds to value <code>meet</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"SVG_MEETORSLICE_SLICE","help":"Corresponds to value <code>slice</code> for attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio\">preserveAspectRatio</a></code>.","obsolete":false},{"name":"align","help":"The type of the alignment value as specified by one of the SVG_PRESERVEASPECTRATIO_* constants defined on this interface.","obsolete":false},{"name":"meetOrSlice","help":"The type of the meet-or-slice value as specified by one of the SVG_MEETORSLICE_* constants defined on this interface.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPreserveAspectRatio"},"MediaError":{"title":"HTMLMediaElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLMediaElement","skipped":true,"cause":"Suspect title"},"WebSocket":{"title":"WebSocket","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td>Sub-protocol support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>7.0 (7.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td>Sub-protocol support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>7.0 (7.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/WebSockets/WebSockets_reference/WebSocket","seeAlso":"<li><a title=\"en/WebSockets/Writing WebSocket client applications\" rel=\"internal\" href=\"https://developer.mozilla.org/en/WebSockets/Writing_WebSocket_client_applications\">Writing WebSocket client applications</a></li> <li><a class=\"external\" title=\"http://dev.w3.org/html5/websockets/\" rel=\"external\" href=\"http://dev.w3.org/html5/websockets/\" target=\"_blank\">HTML5:&nbsp;WebSockets</a></li>","summary":"<div><p><strong>This is an experimental feature</strong><br>Because this feature is still in development in some browsers, check the <a href=\"#AutoCompatibilityTable\">compatibility table</a> for the proper prefixes to use in various browsers.</p></div>\n<p></p>\n<p>The <code>WebSocket</code> object provides the API&nbsp;for creating and managing a <a title=\"en/WebSockets\" rel=\"internal\" href=\"https://developer.mozilla.org/en/WebSockets\">WebSocket</a> connection to a server, as well as for sending and receiving data on the connection.</p>","members":[{"name":"send","help":"<p>Transmits data to the server over the WebSocket connection.</p>\n\n<div id=\"section_11\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>data</code></dt> <dd>A text string to send to the server.</dd>\n</dl>\n</div><div id=\"section_12\"><span id=\"Exceptions_thrown_2\"></span><h6 class=\"editable\">Exceptions thrown</h6>\n<dl> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The connection is not currently <code>OPEN</code>.</dd> <dt><code>SYNTAX_ERR</code></dt> <dd>The data is a string that has unpaired surrogates.</dd>\n</dl>\n</div><div id=\"section_13\"><span id=\"Remarks\"></span><h6 class=\"editable\">Remarks</h6>\n<div class=\"geckoVersionNote\"> <p>\n</p><div class=\"geckoVersionHeading\">Gecko 6.0 note<div>(Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n</div></div>\n<p></p> <p>Gecko's implementation of the <code>send()</code>&nbsp;method differs somewhat from the specification in Gecko 6.0; Gecko returns a <code>boolean</code> indicating whether or not the connection is still open (and, by extension, that the data was successfully queued or transmitted); this is corrected in Gecko 8.0 (Firefox 8.0 / Thunderbird 8.0 / SeaMonkey 2.5)\n. In addition, at this time, Gecko does not support <code><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code> or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n data types.</p>\n</div>\n</div>","idl":"<pre class=\"eval\">void send(\n  in DOMString data\n);\n\nvoid send(\n&nbsp; in ArrayBuffer data\n);\n\nvoid send(\n&nbsp; in Blob data\n); \n</pre>","obsolete":false},{"name":"close","help":"<p>Closes the WebSocket connection or connection attempt, if any. If the connection is already <code>CLOSED</code>, this method does nothing.</p>\n\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>code</code> \n<span title=\"\">Optional</span>\n</dt> <dd>A numeric value indicating the status code explaining why the connection is being closed. If this parameter is not specified, a default value of 1000 (indicating a normal \"transaction complete\"&nbsp;closure)&nbsp;is assumed. See the <a title=\"en/WebSockets/WebSockets reference/CloseEvent#Status codes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent#Status_codes\">list of status codes</a> on the <a title=\"en/WebSockets/WebSockets reference/CloseEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent\"><code>CloseEvent</code></a> page for permitted values.</dd> <dt><code>reason</code> \n<span title=\"\">Optional</span>\n</dt> <dd>A human-readable string explaining why the connection is closing. This string must be no longer than 123 UTF-8 characters.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Exceptions_thrown\"></span><h6 class=\"editable\">Exceptions thrown</h6>\n<dl> <dt><code>INVALID_ACCESS_ERR</code></dt> <dd>An invalid <code>code</code> was specified.</dd> <dt><code>SYNTAX_ERR</code></dt> <dd>The <code>reason</code> string is too long or contains unpaired surrogates.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void close(\n&nbsp; in optional unsigned short code,\n&nbsp;&nbsp;in optional DOMString reason\n);\n</pre>","obsolete":false},{"name":"CONNECTING","help":"The connection is not yet open.","obsolete":false},{"name":"OPEN","help":"The connection is open and ready to communicate.","obsolete":false},{"name":"CLOSING","help":"The connection is in the process of closing.","obsolete":false},{"name":"CLOSED","help":"The connection is closed or couldn't be opened.","obsolete":false},{"name":"binaryType","help":"A string indicating the type of binary data being transmitted by the connection. This should be either \"blob\"&nbsp;if DOM&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n&nbsp;objects are being used or \"arraybuffer\" if <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> objects are being used.","obsolete":false},{"name":"bufferedAmount","help":"The number of bytes of data that have been queued using calls to  but not yet transmitted to the network. This value does not reset to zero when the connection is closed; if you keep calling , this will continue to climb. <strong>Read only.</strong>","obsolete":false},{"name":"extensions","help":"The extensions selected by the server. This is currently only the empty string or a list of extensions as negotiated by the connection.","obsolete":false},{"name":"onclose","help":"An event listener to be called when the WebSocket connection's <code>readyState</code> changes to <code>CLOSED</code>. The listener receives a <a title=\"en/WebSockets/WebSockets reference/CloseEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent\"><code>CloseEvent</code></a> named \"close\".","obsolete":false},{"name":"onerror","help":"An event listener to be called when an error occurs. This is a simple event named \"error\".","obsolete":false},{"name":"onmessage","help":"An event listener to be called when a message is received from the server. The listener receives a <a title=\"en/WebSockets/WebSockets reference/MessageEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/WebSockets/WebSockets_reference/MessageEvent\"><code>MessageEvent</code></a> named \"message\".","obsolete":false},{"name":"onopen","help":"An event listener to be called when the WebSocket connection's <code>readyState</code> changes to <code>OPEN</code>; this indicates that the connection is ready to send and receive data. The event is a simple one with the name \"open\".","obsolete":false},{"name":"protocol","help":"A string indicating the name of the sub-protocol the server selected; this will be one of the strings specified in the <code>protocols</code> parameter when creating the WebSocket object.","obsolete":false},{"name":"readyState","help":"The current state of the connection; this is one of the <a rel=\"custom\" href=\"https://developer.mozilla.org/en/WebSockets/WebSockets_reference/WebSocket#Ready_state_constants\">Ready state constants</a>. <strong>Read only.</strong>","obsolete":false},{"name":"url","help":"The URL&nbsp;as resolved by the constructor. This is always an absolute URL. <strong>Read only.</strong>","obsolete":false}]},"SVGAnimatedInteger":{"title":"SVGAnimatedInteger","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedInteger</code> interface is used for attributes of basic type <a title=\"https://developer.mozilla.org/en/SVG/Content_type#Integer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Content_type#Integer\">&lt;integer&gt;</a> which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedInteger"},"PositionError":{"title":"Using geolocation","members":[],"srcUrl":"https://developer.mozilla.org/en/Using_geolocation","skipped":true,"cause":"Suspect title"},"Worker":{"title":"Worker","srcUrl":"https://developer.mozilla.org/En/DOM/Worker","seeAlso":"<li><a class=\"internal\" title=\"en/Using DOM workers\" rel=\"internal\" href=\"https://developer.mozilla.org/En/Using_web_workers\">Using web workers</a></li> <li><a title=\"https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers\">Functions available to workers</a></li> <li>\n<a rel=\"custom\" href=\"http://www.w3.org/TR/workers/\">Web Workers - W3C</a><span title=\"Working Draft\">WD</span></li> <li><a class=\"external\" title=\"http://www.whatwg.org/specs/web-workers/current-work/\" rel=\"external\" href=\"http://www.whatwg.org/specs/web-workers/current-work/\" target=\"_blank\">Web Workers specification - WHATWG</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SharedWorker\">SharedWorker</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/ChromeWorker\">ChromeWorker</a></code>\n</li>","summary":"<p>Workers are background tasks that can be easily created and can send messages back to their creators. Creating a worker is as simple as calling the <code>Worker()</code>&nbsp;constructor, specifying a script to be run in the worker thread.</p>\n<p>Of note is the fact that workers may in turn spawn new workers as long as those workers are hosted within the same origin as the parent page.&nbsp; In addition, workers may use <a title=\"En/XMLHttpRequest\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/XMLHttpRequest\"><code>XMLHttpRequest</code></a> for network I/O, with the exception that the <code>responseXML</code> and <code>channel</code> attributes on <code>XMLHttpRequest</code> always return <code>null</code>.</p>\n<p>For a list of global functions available to workers, see <a title=\"En/DOM/Worker/Functions available to workers\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers\">Functions available to workers</a>.</p>\n<div class=\"geckoVersionNote\">\n<p>\n</p><div class=\"geckoVersionHeading\">Gecko 2.0 note<div>(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n</div></div>\n<p></p>\n<p>If you want to use workers in extensions, and would like to have access to <a title=\"en/js-ctypes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/js-ctypes\">js-ctypes</a>, you should use the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/ChromeWorker\">ChromeWorker</a></code>\n object instead.</p>\n</div>\n<p>See <a class=\"internal\" title=\"en/Using DOM workers\" rel=\"internal\" href=\"https://developer.mozilla.org/En/Using_web_workers\">Using web workers</a> for examples and details.</p>","constructor":"<p>The constructor creates a web worker that executes the script at the specified URL. This script must obey the <a title=\"Same origin policy for JavaScript\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript\">same-origin policy</a>. Note that there is a disagreement among browser manufacturers about whether a data URI is of the same origin or not. Though Gecko 10.0 (Firefox 10.0 / Thunderbird 10.0)\n and later accept data URIs, that's not the case in all other browsers.</p>\n<pre>Worker(\n&nbsp;&nbsp;in DOMString aStringURL\n);\n</pre>\n<div id=\"section_6\"><span id=\"Parameters\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt><code>aStringURL</code></dt> <dd>The URL of the script the worker is to execute. It must obey the same-origin policy (or be a data URI for Gecko 10.0 or later).</dd>\n</dl>\n<div id=\"section_7\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>Worker</code>.</p>\n</div></div>","members":[{"name":"postMessage","help":"<p>Sends a message to the worker's inner scope. This accepts a single parameter, which is the data to send to the worker. The data may be any value or JavaScript object that does not contain functions or cyclical references (since the object is converted to <a class=\"internal\" title=\"En/JSON\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JSON\">JSON</a> internally).</p>\n\n<div id=\"section_10\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>aMessage<br> </code></dt> <dd>The object to deliver to the worker; this will be in the data field in the event delivered to the <code>onmessage</code> handler. This may be any value or JavaScript object that does not contain functions or cyclical references (since the object is converted to <a class=\"internal\" title=\"En/JSON\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JSON\">JSON</a> internally).</dd>\n</dl>\n</div>","idl":"<pre>void postMessage(\n&nbsp;&nbsp;in JSObject aMessage\n);\n</pre>","obsolete":false},{"name":"terminate","help":"<p>Immediately terminates the worker. This does not offer the worker an opportunity to finish its operations; it is simply stopped at once.</p>\n<pre>void terminate();\n</pre>","obsolete":false},{"name":"onmessage","help":"An event listener that is called whenever a <code>MessageEvent</code> with type <code>message</code> bubbles through the worker. The message is stored in the event's <code>data</code> member.","obsolete":false},{"name":"onerror","help":"An event listener that is called whenever an <code>ErrorEvent</code> with type <code>error</code> bubbles through the worker.","obsolete":false}]},"Rect":{"title":"rect","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\nFeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari <table class=\"compat-table\"> <tbody> <tr> <td>Basic support</td> <td>1.0</td> <td>1.5 (1.8)\n</td> <td>\n9.0</td> <td>\n8.0</td> <td>\n3.0.4</td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>\n3.0</td> <td>1.0 (1.8)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>\n3.0.4</td> </tr> </tbody> </table>\n</div>\n<p>The chart is based on <a title=\"en/SVG/Compatibility sources\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Compatibility_sources\">these sources</a>.</p>","srcUrl":"https://developer.mozilla.org/en/SVG/Element/rect","seeAlso":"&lt;path&gt;","summary":"The <code>rect</code> element is an SVG basic shape, used to create rectangles based on the position of a corner and their width and height. It may also be used to create rectangles with rounded corners.","members":[]},"SVGPathSegMovetoRel":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"HTMLDirectoryElement":{"title":"dir","seeAlso":"<li>Other list-related HTML&nbsp;Elements: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ol\">&lt;ol&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/ul\">&lt;ul&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/li\">&lt;li&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/menu\">&lt;menu&gt;</a></code>\n;</li> <li>CSS properties that may be specially useful to style the <span>&lt;dir&gt;</span> element:&nbsp; <ul> <li>the <a title=\"en/CSS/list-style\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/list-style\">list-style</a> property, useful to choose the way the ordinal is displayed,</li> <li><a title=\"en/CSS_Counters\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS_Counters\">CSS counters</a>, useful to handle complex nested lists,</li> <li>the <a title=\"en/CSS/line-height\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/line-height\">line-height</a> property, useful to simulate the deprecated \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/dir#attr-compact\">compact</a></code>\n attribute,</li> <li>the <a title=\"en/CSS/margin\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/margin\">margin</a> property, useful to control the indent of the list.</li> </ul> </li>","summary":"Obsolete","members":[{"obsolete":false,"url":"","name":"compact","help":"This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn't work in all browsers. <div class=\"note\"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it has been deprecated: the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/dir\">&lt;dir&gt;</a></code>\n element should be styled using <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a>. To give a similar effect than the <span>compact</span> attribute, the <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a> property <a title=\"en/CSS/line-height\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/line-height\">line-height</a> can be used with a value of <span>80%</span>.</div>"}],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/dir"},"SVGPointList":{"title":"SVGAnimatedPoints","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedPoints","skipped":true,"cause":"Suspect title"},"SVGFESpecularLightingElement":{"title":"feSpecularLighting","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDistantLight\">&lt;feDistantLight&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/fePointLight\">&lt;fePointLight&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpotLight\">&lt;feSpotLight&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/kernelUnitLength","name":"kernelUnitLength","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/surfaceScale","name":"surfaceScale","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/specularExponent","name":"specularExponent","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/specularConstant","name":"specularConstant","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in","name":"in","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting"},"NodeSelector":{"title":"Locating DOM elements using selectors","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/Locating_DOM_elements_using_selectors","skipped":true,"cause":"Suspect title"},"FileException":{"title":"FileException","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>13\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<strong>DRAFT</strong> <div>This page is not complete.</div>","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/FileException"},"SVGAnimationElement":{"title":"SVGAnimationElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimationElement</code> interface is the base interface for all of the animation element interfaces: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGAnimateElement\">SVGAnimateElement</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGSetElement\">SVGSetElement</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGAnimateColorElement\">SVGAnimateColorElement</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGAnimateMotionElement\">SVGAnimateMotionElement</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGAnimateTransformElement\">SVGAnimateTransformElement</a></code>\n.","members":[{"name":"getStartTime","help":"Returns the begin time, in seconds, for this animation element's current interval, if it exists, regardless of whether the interval has begun yet. If there is no current interval, then a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code INVALID_STATE_ERR is thrown.","obsolete":false},{"name":"getCurrentTime","help":"Returns the current time in seconds relative to time zero for the given time container.","obsolete":false},{"name":"getSimpleDuration","help":"Returns the number of seconds for the simple duration for this animation. If the simple duration is undefined (e.g., the end time is indefinite), then a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code NOT_SUPPORTED_ERR is raised.","obsolete":false},{"name":"targetElement","help":"The element which is being animated.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimationElement"},"SVGAnimatedBoolean":{"title":"SVGAnimatedBoolean","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedBoolean</code> interface is used for attributes of type boolean which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/SVGAnimatedBoolean"},"XPathExpression":{"title":"XPathExpression","summary":"An XPathExpression is a compiled XPath query returned from <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.createExpression\" title=\"en/DOM/document.createExpression\">document.createExpression()</a>. It has a method <code>evaluate()</code> which can be used to execute the compiled XPath.\n","members":[],"srcUrl":"https://developer.mozilla.org/en/XPathExpression"},"HTMLCollection":{"title":"HTMLCollection","compatibility":"Different browsers behave differently when there are more than one elements matching the string used as an index (or <code>namedItem</code>'s argument). Firefox 8 behaves as specified in DOM 2 and DOM4, returning the first matching element. WebKit browsers and Internet Explorer in this case return another <code>HTMLCollection</code> and Opera returns a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/NodeList\">NodeList</a></code>\n of all matching elements.","srcUrl":"https://developer.mozilla.org/en/DOM/HTMLCollection","specification":"<li><a class=\"external\" title=\"http://www.w3.org/TR/html5/common-dom-interfaces.html#htmlcollection-0\" rel=\"external\" href=\"http://www.w3.org/TR/html5/common-dom-interfaces.html#htmlcollection-0\" target=\"_blank\">HTML 5, Section 2.7.2, Collections</a></li> <li><a class=\"external\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-75708506\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-75708506\" target=\"_blank\">DOM&nbsp;Level 2 HTML, Section 1.4, Miscellaneous Object Definitions</a></li> <li><a class=\"external\" title=\"http://www.w3.org/TR/domcore/#interface-htmlcollection\" rel=\"external\" href=\"http://www.w3.org/TR/domcore/#interface-htmlcollection\" target=\"_blank\">DOM4: HTMLCollection</a></li>","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/NodeList\">NodeList</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLOptionsCollection\">HTMLOptionsCollection</a></code>\n</li>","summary":"<p><code>HTMLCollection</code> is an interface representing a generic collection of elements (in document order) and offers methods and properties for traversing the list.</p>\n<div class=\"note\"><strong>Note:</strong> This interface is called <code>HTMLCollection</code> for historical reasons (before DOM4, collections implementing this interface could only have HTML elements as their items).</div>\n<p><code>HTMLCollection</code>s in the HTML DOM are live; they are automatically updated when the underlying document is changed.</p>","members":[{"name":"item","help":"Returns the specific node at the given zero-based <code>index</code> into the list. Returns <code>null</code> if the <code>index</code> is out of range.","obsolete":false},{"name":"namedItem","help":"Returns the specific node whose ID or, as a fallback, name matches the string specified by <code>name</code>. Matching by name is only done as a last resort, only in HTML, and only if the referenced element supports the <code>name</code> attribute. Returns <code>null</code> if no node exists by the given name.","obsolete":false},{"name":"length","help":"The number of items in the collection. <strong>Read only</strong>.","obsolete":false}]},"HTMLFrameElement":{"title":"frame","examples":["&lt;frameset cols=\"50%,50%\"&gt;\n  &lt;frame src=\"https://developer.mozilla.org/en/HTML/Element/iframe\" /&gt;\n  &lt;frame src=\"https://developer.mozilla.org/en/HTML/Element/frame\" /&gt;\n&lt;/frameset&gt;"],"summary":"<p><code>&lt;frame&gt;</code> is an HTML element which defines a particular area in which another HTML document can be displayed. A frame should be used within a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/frameset\">&lt;frameset&gt;</a></code>\n.</p>\n<p>Using the <code>&lt;frame&gt;</code> element is not encouraged because of certain disadvantages such as performance problems and lack of accessibility for users with screen readers. Instead of the <code>&lt;frame&gt;</code> element, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/iframe\">&lt;iframe&gt;</a></code>\n&nbsp;may be preferred.</p>","members":[{"obsolete":false,"url":"","name":"src","help":"This attribute is specify document which will be displayed by frame."},{"obsolete":false,"url":"","name":"name","help":"This attribute is used to labeling frames. Without labeling all links will open in the frame that they are in."},{"obsolete":false,"url":"","name":"scrolling","help":"This attribute defines existence of scrollbar. If this attribute is not used, browser put a scrollbar when necessary. There are two choices; \"yes\" for showing a scrollbar even when it is not necessary and \"no\" for do not showing a scrollbar even when it is necessary."},{"obsolete":false,"url":"","name":"noresize","help":"This attribute avoid resizing of frames by users."},{"obsolete":false,"url":"","name":"marginheight","help":"This attribute defines how tall the margin between frames will be."},{"obsolete":false,"url":"","name":"frameborder","help":"This attribute allows you to put borders for frames."},{"obsolete":false,"url":"","name":"marginwidth","help":"This attribute defines how wide the margin between frames will be."}],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/frame"},"SVGTRefElement":{"title":"SVGTRefElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGTRefElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/tref\">&lt;tref&gt;</a></code>\n SVG Element","summary":"The <code>SVGTRefElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/tref\">&lt;tref&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[]},"Counter":{"title":"CSS Counters","srcUrl":"https://developer.mozilla.org/en/CSS_Counters","specification":"CSS 2.1","seeAlso":"<ul> <li><a title=\"en/CSS/counter-reset\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/counter-reset\">counter-reset</a></li> <li><a title=\"en/CSS/counter-increment\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/counter-increment\">counter-increment</a></li>\n</ul>\n<p><em>There is an additional example available at <a class=\" external\" rel=\"external\" href=\"http://www.mezzoblue.com/archives/2006/11/01/counter_intu/\" title=\"http://www.mezzoblue.com/archives/2006/11/01/counter_intu/\" target=\"_blank\">http://www.mezzoblue.com/archives/20.../counter_intu/</a>. This blog entry was posted on November 01, 2006, but appears to be accurate.</em></p>","summary":"CSS counters are an implementation of <a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/CSS21/generate.html#counters\" title=\"http://www.w3.org/TR/CSS21/generate.html#counters\" target=\"_blank\">Automatic counters and numbering</a> in CSS 2.1. The value of a counter is manipulated through the use of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/counter-reset\">counter-reset</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/counter-increment\">counter-increment</a></code>\n and is displayed on a page using the <code>counter()</code> or <code>counters()</code> function of the <code><a title=\"en/CSS/content\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/content\">content</a></code> property.","members":[]},"WebKitAnimation":{"title":"CSS animations","examples":["<strong>Note:</strong> The examples here use the <code>-moz-</code> prefix on the animation CSS properties for brevity; the live examples you can click to see in your browser also include the <code>-webkit-</code> prefixed versions."],"srcUrl":"https://developer.mozilla.org/en/CSS/CSS_animations","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Event/AnimationEvent\">AnimationEvent</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation\">animation</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-delay\">animation-delay</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-direction\">animation-direction</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-duration\">animation-duration</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-fill-mode\">animation-fill-mode</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-iteration-count\">animation-iteration-count</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-name\">animation-name</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-play-state\">animation-play-state</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-timing-function\">animation-timing-function</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/@keyframes\">@keyframes</a></code>\n</li> <li><a title=\"en/CSS/CSS animations/Detecting CSS animation support\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/CSS_animations/Detecting_CSS_animation_support\">Detecting CSS animation support</a></li> <li>This <a class=\"external\" title=\"http://hacks.mozilla.org/2011/06/add-on-sdk-and-the-beta-of-add-on-builder-now-available/\" rel=\"external\" href=\"http://hacks.mozilla.org/2011/06/add-on-sdk-and-the-beta-of-add-on-builder-now-available/\" target=\"_blank\">post</a> from Mozilla hacks, provides two additional examples: <ul> <li><a class=\" external\" rel=\"external\" href=\"http://jsfiddle.net/T88X5/3/light/\" title=\"http://jsfiddle.net/T88X5/3/light/\" target=\"_blank\">http://jsfiddle.net/T88X5/3/light/</a></li> <li><a class=\" external\" rel=\"external\" href=\"http://jsfiddle.net/RtvCB/9/light/\" title=\"http://jsfiddle.net/RtvCB/9/light/\" target=\"_blank\">http://jsfiddle.net/RtvCB/9/light/</a></li> </ul> </li>","summary":"<p>CSS&nbsp;animations make it possible to animate transitions from one CSS style configuration to another. Animations consist of two components:&nbsp;A style describing the animation and a set of keyframes that indicate the start and end states of the animation's CSS style, as well as possible intermediate waypoints along the way.</p>\n<p>There are three key advantages to CSS&nbsp;animations over traditional script-driven animation techniques:</p>\n<ol> <li>They're easy to use for simple animations; you can create them without even having to know JavaScript.</li> <li>The animations run well, even under moderate system load. Simple animations can often perform poorly in JavaScript (unless they're well made). The rendering engine can use frame-skipping and other techniques to keep the performance as smooth as possible.</li> <li>Letting the browser control the animation sequence lets the browser optimize performance and efficiency by, for example, reducing the update frequency of animations running in tabs that aren't currently visible.</li>\n</ol>","members":[]},"SVGGlyphElement":{"title":"SVGGlyphElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGGlyphElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/glyph\">&lt;glyph&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGGlyphElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/glyph\">&lt;glyph&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/glyph\">&lt;glyph&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"SVGPathSegCurvetoQuadraticSmoothAbs":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"HTMLTableCaptionElement":{"title":"HTMLTableCaptionElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/caption\">&lt;caption&gt;</a></code>\n&nbsp;HTML&nbsp;element","summary":"DOM table caption elements expose the <a title=\"http://www.w3.org/TR/html5/tabular-data.html#htmltablecaptionelement\" class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/html5/tabular-data.html#htmltablecaptionelement\" target=\"_blank\">HTMLTableCaptionElement</a> (or <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-12035137\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-12035137\" target=\"_blank\"><code>HTMLTableCaptionElement</code></a>) interface, which provides special properties (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating definition list elements. In <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML 5</a></span>, this interface inherits from HTMLElement, but defines no additional members.","members":[{"name":"align","help":"Enumerated attribute indicating alignment of the caption with respect to the table.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLTableCaptionElement"},"Crypto":{"title":"JavaScript crypto","summary":"Non-standard","members":[],"srcUrl":"https://developer.mozilla.org/en/JavaScript_crypto"},"Entity":{"title":"Entity","summary":"<p><span>NOTE:&nbsp;This is not implemented in Mozilla</span></p>\n<p>Read-only reference to a DTD entity. Also inherits the methods and properties of <a title=\"En/DOM/Node\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Node\"><code>Node</code></a>.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Entity.xmlEncoding","name":"xmlEncoding","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Entity.systemId","name":"systemId","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Entity.inputEncoding","name":"inputEncoding","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Entity.xmlVersion","name":"xmlVersion","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Entity.notationName","name":"notationName","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Entity.publicId","name":"publicId","help":""}],"srcUrl":"https://developer.mozilla.org/en/DOM/Entity","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...ml#ID-527DCFF2"},"CloseEvent":{"title":"CloseEvent","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>8.0 (8.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>8.0 (8.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent","seeAlso":"WebSocket","summary":"A <code>CloseEvent</code> is sent to clients using WebSockets when the connection is closed. This is delivered to the listener indicated by the <code>WebSocket</code> object's <code>onclose</code> attribute.","members":[{"name":"code","help":"The WebSocket connection close code provided by the server. See <a title=\"en/XPCOM_Interface_Reference/nsIWebSocketChannel#Status_codes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIWebSocketChannel#Status_codes\">Status codes</a> for possible values.","obsolete":false},{"name":"reason","help":"A string indicating the reason the server closed the connection. This is specific to the particular server and sub-protocol.","obsolete":false},{"name":"wasClean","help":"Indicates whether or not the connection was cleanly closed.","obsolete":false}]},"TextEvent":{"title":"document.createEvent","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/document.createEvent","skipped":true,"cause":"Suspect title"},"SVGTSpanElement":{"title":"SVGTSpanElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGTSpanElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/tspan\">&lt;tspan&gt;</a></code>\n SVG Element","summary":"The <code>SVGTSpanElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/tspan\">&lt;tspan&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[]},"Event":{"title":"Event","seeAlso":"<ul> <li><a class=\"internal\" title=\"En/Listening to events\" rel=\"internal\" href=\"https://developer.mozilla.org/En/Listening_to_events\">Listening to events</a></li> <li><a class=\"internal\" title=\"En/Listening to events on all tabs\" rel=\"internal\" href=\"https://developer.mozilla.org/En/Listening_to_events_on_all_tabs\">Listening to events on all tabs</a></li> <li><a title=\"Creating and triggering custom events\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Creating_and_triggering_events\">Creating and triggering custom events</a></li> <li><a class=\"internal\" title=\"En/DOM/Mouse gesture events\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Mouse_gesture_events\">Mouse gesture events</a></li> <li><a title=\"https://wiki.mozilla.org/Events\" class=\" link-https\" rel=\"external\" href=\"https://wiki.mozilla.org/Events\" target=\"_blank\">Mozilla related events</a></li>\n</ul>\n<p></p>\n<div><img alt=\"Replacing Emoji...\" src=\"data:image/gif;base64,R0lGODlhEAAQAOYAAP////7+/qOjo/39/enp6bW1tfn5+fr6+vX19fz8/Kurq+3t7cDAwLGxscfHx+Xl5fT09LS0tPf398HBwc/Pz+bm5gMDA+Tk5N/f38TExO7u7pqamsLCwtTU1OLi4jw8PKioqLCwsPLy8q2trbKystvb26qqqtnZ2dfX17u7uyYmJs3NzdjY2Lm5uZ6ensvLy66urvv7++zs7FJSUurq6oWFhfb29kpKStzc3AwMDNHR0aSkpCkpKefn511dXb29vaenp8zMzLe3t/Hx8dDQ0FlZWWZmZsrKyqampvDw8ODg4Li4uL+/v+jo6PPz88jIyHp6eqWlpb6+vk5OTsPDw8bGxsXFxRQUFGpqat3d3fj4+NbW1rq6ury8vJCQkG5ubhwcHN7e3paWloKCgoyMjImJiWFhYXR0dFRUVIeHh5OTk0ZGRo6OjldXV39/fzIyMnd3d9ra2nx8fDY2NnFxcUFBQWxsbJSUlHh4eKGhoaKioi0tLSMjI4CAgNLS0qysrCH/C05FVFNDQVBFMi4wAwEAAAAh+QQEBQAAACwAAAAAEAAQAAAHyIAAggADgi1oCYOKghVfHQAbVwkHLSWLAE1vPgBqYAAUAj2KFQQAETw/ZXwrOy8ABwQBA2NFPwg+XjoFUSE2FREgEgAYNTNwNlqCk08CBReKL1GFih0sgyk7USAelxAOEwxHQGxeYmGXIi0kDVKDFzoBixjPgxIZG38xiz8CVCIAAZYICOKtA4QhSrogYAHEhAEAJSoAICDgxIsCDwRsAZDkxDQABkhECJBhBAArUTRcIqDgAQAOCgIggIHiUgBhAFakiGcgkaBAACH5BAQFAAAALAAAAAANAAsAAAdvgACCAAOCG3SFg4IXcDgAX3MDWjdMgzI+bgBnHwB3Fg4ADxoAHGgcUDcnFnSEYmNBEnIuOgwgKjIVABUCcmISB4IHIksCg1tcAYoAHSxBP0IFPcoAEA4TDQ0FTdMiLYMLYcmKGBcABhRIITHKPwKBACH5BAQFAAAALAAAAAAQAAgAAAdkgACCAAOCCmSFg4oAPWIPAGVmA04+XYsASWMuAGxGnDxUigROAERQHRtYKDw1AAZZAQMRIHEGG1wYQQ1rMh1FORoAGgwCEQYxggkQchZvBQGDF0TQiml3gysME1ULl00bTAxHgQAh+QQEBQAAACwDAAAADQAKAAAHZ4AAAQAAUkADhIkAMgUEAEhpAwhjRIkIJgUAIGUAAlM6ihh6KCNkODMuABAYATgHXFQXKEx2MlZTdTYCQjEJhAkIbjwzPwEXRIOKG0CJVQuKhBdpZGIwBU3QADgfPCpTC2HJiSFdiYEAIfkEBAUAAAAsBQAAAAsADgAAB3mAAAA6TAGChwALABwmARIuHYcpABlAAC1QOIcCHg55F3IFADYeAVwUMjhBXkkUXz42MQmCA1piM2dBAYaII6KIiE1jX1hkwAAeRTdrX7yHJA6HMYgBN3x5ig4dEEMsRhd3V21aAicvBQ96UgBbGwkRARkjAFZRioKBACH5BAQFAAAALAgAAQAIAA8AAAdigAoBBy0lAIcjABQCFYcAITI7LwBaFwEPWSFOcWpjNgADBiNQYiyOABxPp4cLG2U1Lo49UF92ZY4FVqsBZipnSgAXJm0EAm9vNmRLFgUAcSQDiT58BI6CF2DNhykBACIJjoEAIfkEBAUAAAAsBgACAAoADgAAB22AABkjABQCPQCJHg4hMjsvAAcEARQyD1khNhURIBIJiQMHTwIhGImnAEeQqKcaI0g7BawyG15eSKwcK6yJAWMzZA8AO0pxQmYEBUVmWiFfbQ4qLgAeRwMDPlMAZzwoqGhTARVrUqhQcAMAnqeBACH5BAQFAAAALAMABQANAAsAAAdygAJCMQkAAAMHTwIFFwAXRAGGkh0sklULkpIQDhMMRwVNmYYaJgohUgsskZlEKJJIbQiZAXpQIDIALR5GYhcYGW4aR301WgATYBFjaCszIQAERAMaPHADZ3UAajNhlh84AF9zAzJGVZIDsgBeWIVahYaBACH5BAQFAAAALAAACAAQAAgAAAdlgBMNDUAoAIeIIi0kDVKIFAIDiIcYF5NDUDl7NpMAKQJUIgAJHzkbBFAbND0dGyIoQCYGAEtZAEcqChtnJ1AcAEknkodDN1MDXmYAI3IVnQAdcxMAZD4BSWUvzwEQhztjkloJiIEAIfkEBAUAAAAsAAAGAA0ACgAAB2SAAIJWGwOChx0sUDMzZkGHhxAOfUVtRRmQgiIthywkhpAYFwBDZHt1Epk/AgNGfGU9Yn8LMihdCCwAR5gdM0shaiV5W5AQX3QBIGUAP1EahxdGKwBINQEiMCiHAakAKS6GBgmBACH5BAQFAAAALAAAAwALAA0AAAdygABPGAA6Ah4OITI7Az5XLiJYGTIPWSEATWx8c04xAAADB58ADmQDo59eWF9wHaifeGs3aEevqCUMp68QSG1GBq8DblMuCw0MQ0NKXQAUFAAYUA5MBQ8CozZeagE/IwBWow81JwATCgEIowESnyspAQCBACH5BAQFAAAALAAAAAAIAA8AAAdhgACCAAmCOoM4b4ccg0N8dQAZACgeAFUWIQ0DM3MKCGhQJ5NYKmgIB4MAHF4DgjtlZGolg2RYWGcoqYIXRAGDEiluZagAAxtQBUkZHRAAfnEAPQInL4MGJBEBkoIECg+qgQA7\" title=\"Replacing Emoji...\"></div>","summary":"<p>This chapter describes the DOM Event Model. The <a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event\" title=\"http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event\" target=\"_blank\">Event</a> interface itself is described, as well as the interfaces for event registration on nodes in the DOM, and <a title=\"en/DOM/element.addEventListener\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element.addEventListener\">event listeners</a>, and several longer examples that show how the various event interfaces relate to one another.</p>\n<p>There is an excellent diagram that clearly explains the three phases of event flow through the DOM in the <a class=\"external\" title=\"http://www.w3.org/TR/DOM-Level-3-Events/#dom-event-architecture\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-3-Events/#dom-event-architecture\" target=\"_blank\">DOM Level 3 Events draft</a>.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.stopPropagation","name":"stopPropagation","help":"Stops the propagation of events further along in the DOM."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.preventDefault","name":"preventDefault","help":"Cancels the event (if it is cancelable)."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/event.preventCapture","name":"preventCapture","help":"Obsolete, use <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/event.stopPropagation\">event.stopPropagation</a></code>\n instead."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.stopImmediatePropagation","name":"stopImmediatePropagation","help":"For this particular event, no other listener will be called. Neither those attached on the same element, nor those attached on elements which will be traversed later (in capture phase, for instance)"},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/event.preventBubble","name":"preventBubble","help":"Prevents the event from bubbling. Obsolete, use <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/event.stopPropagation\">event.stopPropagation</a></code>\n instead."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.initEvent","name":"initEvent","help":"Initializes the value of an Event created through the <code>DocumentEvent</code> interface."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.originalTarget","name":"originalTarget","help":"The original target of the event, before any retargetings (Mozilla-specific)."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.timeStamp","name":"timeStamp","help":"The time that the event was created."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.bubbles","name":"bubbles","help":"A boolean indicating whether the event bubbles up through the DOM or not."},{"name":"webkitInputSource","help":"The type of device that generated the event. This is a Gecko-specific value.","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.defaultPrevented","name":"defaultPrevented","help":"Indicates whether or not <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/event.preventDefault\">event.preventDefault()</a></code>\n has been called on the event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.target","name":"target","help":"A reference to the target to which the event was originally dispatched."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.currentTarget","name":"currentTarget","help":"A reference to the currently registered target for the event."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/event.isTrusted","name":"isTrusted","help":"Indicates whether or not the event was initiated by the browser (after a user click for instance) or by a script (using an event creation method, like <a title=\"event.initEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/event.initEvent\">event.initEvent</a>)"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.eventPhase","name":"eventPhase","help":"Indicates which phase of the event flow is being processed."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.explicitOriginalTarget","name":"explicitOriginalTarget","help":"The explicit original target of the event (Mozilla-specific)."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.cancelBubble","name":"cancelBubble","help":"A boolean indicating whether the bubbling of the event has been canceled or not."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.cancelable","name":"cancelable","help":"A boolean indicating whether the event is cancelable."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.type","name":"type","help":"The name of the event (case-insensitive)."}],"srcUrl":"https://developer.mozilla.org/en/DOM/event"},"SVGTransform":{"title":"SVGTransform","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"<p><code>SVGTransform</code> is the interface for one of the component transformations within an <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGTransformList\">SVGTransformList</a></code>\n; thus, an <code>SVGTransform</code> object corresponds to a single component (e.g., <code>scale(…)</code> or <code>matrix(…)</code>) within a \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/transform\">transform</a></code> attribute.</p>\n<p>An <code>SVGTransform</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>","members":[{"name":"setMatrix","help":"<p>Sets the transform type to <code>SVG_TRANSFORM_MATRIX</code>, with parameter matrix defining the new transformation. Note that the values from the parameter <code>matrix</code> are copied.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"setTranslate","help":"<p>Sets the transform type to <code>SVG_TRANSFORM_TRANSLATE</code>, with parameters <code>tx</code> and <code>ty</code> defining the translation amounts.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"setScale","help":"<p>Sets the transform type to <code>SVG_TRANSFORM_SCALE</code>, with parameters <code>sx</code> and <code>sy</code> defining the scale amounts.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"setRotate","help":"<p>Sets the transform type to <code>SVG_TRANSFORM_ROTATE</code>, with parameter <code>angle</code> defining the rotation angle and parameters <code>cx</code> and <code>cy</code> defining the optional center of rotation.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"setSkewX","help":"<p>Sets the transform type to <code>SVG_TRANSFORM_SKEWX</code>, with parameter <code>angle</code> defining the amount of skew.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"setSkewY","help":"<p>Sets the transform type to <code>SVG_TRANSFORM_SKEWY</code>, with parameter <code>angle</code> defining the amount of skew.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"SVG_TRANSFORM_UNKNOWN","help":"The unit type is not one of predefined unit types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.","obsolete":false},{"name":"SVG_TRANSFORM_MATRIX","help":"A <code>matrix(…)</code> transformation","obsolete":false},{"name":"SVG_TRANSFORM_TRANSLATE","help":"A <code>translate(…)</code> transformation","obsolete":false},{"name":"SVG_TRANSFORM_SCALE","help":"A <code>scale(…)</code> transformation","obsolete":false},{"name":"SVG_ANGLETYPE_ROTATE","help":"A <code>rotate(…)</code> transformation","obsolete":false},{"name":"SVG_ANGLETYPE_SKEWX","help":"A <code>skewx(…)</code> transformation","obsolete":false},{"name":"SVG_ANGLETYPE_SKEWY","help":"A <code>skewy(…)</code> transformation","obsolete":false},{"name":"type","help":"The type of the value as specified by one of the SVG_TRANSFORM_* constants defined on this interface.","obsolete":false},{"name":"angle","help":"A convenience attribute for <code>SVG_TRANSFORM_ROTATE</code>, <code>SVG_TRANSFORM_SKEWX</code> and <code>SVG_TRANSFORM_SKEWY</code>. It holds the angle that was specified.<br> <br> For <code>SVG_TRANSFORM_MATRIX</code>, <code>SVG_TRANSFORM_TRANSLATE</code> and <code>SVG_TRANSFORM_SCALE</code>, <code>angle</code> will be zero.","obsolete":false},{"name":"matrix","help":"<p>The matrix that represents this transformation. The matrix object is live, meaning that any changes made to the <code>SVGTransform</code> object are immediately reflected in the matrix object and vice versa. In case the matrix object is changed directly (i.e., without using the methods on the <code>SVGTransform</code> interface itself) then the type of the <code>SVGTransform</code> changes to <code>SVG_TRANSFORM_MATRIX</code>.</p> <ul> <li>For <code>SVG_TRANSFORM_MATRIX</code>, the matrix contains the a, b, c, d, e, f values supplied by the user.</li> <li>For <code>SVG_TRANSFORM_TRANSLATE</code>, e and f represent the translation amounts (a=1, b=0, c=0 and d=1).</li> <li>For <code>SVG_TRANSFORM_SCALE</code>, a and d represent the scale amounts (b=0, c=0, e=0 and f=0).</li> <li>For <code>SVG_TRANSFORM_SKEWX</code> and <code>SVG_TRANSFORM_SKEWY</code>, a, b, c and d represent the matrix which will result in the given skew (e=0 and f=0).</li> <li>For <code>SVG_TRANSFORM_ROTATE</code>, a, b, c, d, e and f together represent the matrix which will result in the given rotation. When the rotation is around the center point (0, 0), e and f will be zero.</li> </ul>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGTransform"},"SVGFEConvolveMatrixElement":{"title":"feConvolveMatrix","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The filter modifies a pixel by means of a convolution matrix, that also takes neighboring pixels into account.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/targetY","name":"targetY","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/edgeMode","name":"edgeMode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/kernelUnitLength","name":"kernelUnitLength","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in","name":"in","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/preserveAlpha","name":"preserveAlpha","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/divisor","name":"divisor","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/targetX","name":"targetX","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/kernelMatrix","name":"kernelMatrix","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/bias","name":"bias","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/order","name":"order","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix"},"HTMLFormElement":{"title":"HTMLFormElement","examples":["<p>The following example shows how to create a new form element, modify its attributes and submit it.</p>\n<pre class=\"deki-transform\">// Create a form\nvar f = document.createElement(\"form\");\n\n// Add it to the document body\ndocument.body.appendChild(f);\n\n// Add action and method attributes\nf.action = \"/cgi-bin/some.cgi\";\nf.method = \"POST\"\n\n// Call the form's submit method\nf.submit();\n</pre>\n<p>In addition, the following complete HTML document shows how to extract information from a form element and to set some of its attributes.</p>\n<pre class=\"deki-transform\">&lt;title&gt;Form example&lt;/title&gt;\n&lt;script type=\"text/javascript\"&gt;\n  function getFormInfo() {\n    var info;\n\n    // Get a reference using the forms collection\n    var f = document.forms[\"formA\"];\n    info = \"f.elements: \" + f.elements + \"\\n\"\n         + \"f.length: \" + f.length + \"\\n\"\n         + \"f.name: \" + f.name + \"\\n\"\n         + \"f.acceptCharset: \" + f.acceptCharset + \"\\n\"\n         + \"f.action: \" + f.action + \"\\n\"\n         + \"f.enctype: \" + f.enctype + \"\\n\"\n         + \"f.encoding: \" + f.encoding + \"\\n\"\n         + \"f.method: \" + f.method + \"\\n\"\n         + \"f.target: \" + f.target;\n    document.forms[\"formA\"].elements['tex'].value = info;\n  }\n\n  // A reference to the form is passed from the\n  // button's onclick attribute using 'this.form'\n  function setFormInfo(f) {\n    f.method = \"GET\";\n    f.action = \"/cgi-bin/evil_executable.cgi\";\n    f.name   = \"totally_new\";\n  }\n&lt;/script&gt;\n\n&lt;h1&gt;Form  example&lt;/h1&gt;\n\n&lt;form name=\"formA\" id=\"formA\"\n action=\"/cgi-bin/test\" method=\"POST\"&gt;\n &lt;p&gt;Click \"Info\" to see information about the form.\n    Click set to change settings, then info again\n    to see their effect&lt;/p&gt;\n &lt;p&gt;\n  &lt;input type=\"button\" value=\"info\"\n   onclick=\"getFormInfo();\"&gt;\n  &lt;input type=\"button\" value=\"set\"\n   onclick=\"setFormInfo(this.form);\"&gt;\n  &lt;input type=\"reset\" value=\"reset\"&gt;\n  &lt;br&gt;\n  &lt;textarea id=\"tex\" style=\"height:15em; width:20em\"&gt;\n  &lt;/textarea&gt;\n &lt;/p&gt;\n&lt;/form&gt;\n</pre>"],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLFormElement","specification":"<p><a class=\" external\" title=\"http://www.w3.org/TR/html5/forms.html#the-form-element\" rel=\"external\" href=\"http://www.w3.org/TR/html5/forms.html#the-form-element\" target=\"_blank\">HTML 5, Section 4.10.3, The form Element</a></p>\n<p><a class=\" external\" title=\"http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-40002357\" rel=\"external\" href=\"http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-40002357\" target=\"_blank\">DOM&nbsp;Level 2 HTML, Section 1.6.5, Object definitions</a></p>","summary":"<p><code>FORM</code> elements share all of the properties and methods of other HTML elements described in the <a title=\"en/DOM/element\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> section.</p>\n<p>This interface provides methods to create and modify <code>FORM</code> elements using the DOM.</p>","members":[{"name":"dispatchFormChange","help":"Broadcasts form change events. That is, for each item in the <strong>elements</strong> collection, fire an event named formchange at the item.","obsolete":false},{"name":"dispatchFormInput","help":"Broadcasts form input events. That is, for each item in the <strong>elements</strong> collection, fire an event named <code>forminput</code> at the item.","obsolete":false},{"name":"item","help":"Gets the item in the <strong>elements</strong> collection at the specified index, or null if there is no item at that index. You can also specify the index in array-style brackets or parentheses after the form object name, without calling this method explicitly.","obsolete":false},{"name":"namedItem","help":"Gets the item or list of items in <strong>elements</strong> collection whose <strong>name</strong> or <strong>id</strong> match the specified name, or null if no items match. You can also specify the name in array-style brackets or parentheses after the form object name, without calling this method explicitly.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.submit","name":"submit","help":"Submits the form to the server.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.reset","name":"reset","help":"Resets the forms to its initial state.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.acceptCharset","name":"acceptCharset","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-accept-charset\">accept-charset</a></code>\n&nbsp;HTML&nbsp;attribute, containing a list of character encodings that the server accepts.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.action","name":"action","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-action\">action</a></code>\n&nbsp;HTML&nbsp;attribute, containing the URI&nbsp;of a program that processes the information submitted by the form.","obsolete":false},{"name":"autocomplete","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-autocomplete\">autocomplete</a></code>\n HTML&nbsp;attribute, containing a string that indicates whether the controls in this form can have their values automatically populated by the browser.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.elements","name":"elements","help":"All the form controls belonging to this form element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.encoding","name":"encoding","help":"Synonym for <strong>enctype</strong>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.enctype","name":"enctype","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-enctype\">enctype</a></code>\n&nbsp;HTML&nbsp;attribute, indicating the type of content that is used to transmit the form to the server. Only specified values can be set.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.length","name":"length","help":"The number of controls in the form.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.method","name":"method","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-method\">method</a></code>\n&nbsp;HTML&nbsp;attribute, indicating the HTTP&nbsp;method used to submit the form. Only specified values can be set.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.name","name":"name","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-name\">name</a></code>\n&nbsp;HTML&nbsp;attribute, containing the name of the form.","obsolete":false},{"name":"noValidate","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-novalidate\">novalidate</a></code>\n HTML attribute, indicating that the form should not be validated.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/form.target","name":"target","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-target\">target</a></code>\n HTML attribute, indicating where to display the results received from submitting the form.","obsolete":false}]},"SVGPathSegLinetoHorizontalRel":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"Range":{"title":"range","summary":"<p>The <code>Range</code> object represents a fragment of a document that can contain nodes and parts of text nodes in a given document.</p>\n<p>A range can be created using the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Document.createRange\">Document.createRange</a></code>\n&nbsp;method of the&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Document\">Document</a></code>\n&nbsp;object. Range objects can also be retrieved by using the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Selection.getRangeAt\" class=\"new\">Selection.getRangeAt</a></code>\n&nbsp;method of the&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Selection\">Selection</a></code>\n&nbsp;object.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.comparePoint","name":"comparePoint","help":"Returns -1, 0, or 1 indicating whether the point occurs before, inside, or after the range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.intersectsNode","name":"intersectsNode","help":"Returns a <code>boolean</code> indicating whether the given node intersects the range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.selectNode","name":"selectNode","help":"Sets the Range to contain the&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n&nbsp;and its contents."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.compareNode","name":"compareNode","help":"Returns a constant representing whether the&nbsp;<a title=\"en/DOM/Node\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a>&nbsp;is before, after, inside, or surrounding the range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.setEndAfter","name":"setEndAfter","help":"Sets the end position of a Range relative to another&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.setEndBefore","name":"setEndBefore","help":"Sets the end position of a Range relative to another&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.extractContents","name":"extractContents","help":"Moves contents of a Range from the document tree into a&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DocumentFragment\">DocumentFragment</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.insertNode","name":"insertNode","help":"Insert a&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n&nbsp;at the start of a Range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.getClientRects","name":"getClientRects","help":"Returns a list of <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/ClientRect\" class=\"new\">ClientRect</a></code>\n objects that aggregates the results of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Element.getClientRects\">Element.getClientRects()</a></code>\n for all the elements in the range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.cloneContents","name":"cloneContents","help":"Returns a&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DocumentFragment\">DocumentFragment</a></code>\n&nbsp;copying the nodes of a Range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.deleteContents","name":"deleteContents","help":"Removes the contents of a Range from the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Document\">Document</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.compareBoundaryPoints","name":"compareBoundaryPoints","help":"Compares the boundary points of two Ranges."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.setStartBefore","name":"setStartBefore","help":"Sets the start position of a Range relative to another&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.detach","name":"detach","help":"Releases Range from use to improve performance."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.getBoundingClientRect","name":"getBoundingClientRect","help":"Returns a <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/ClientRect\" class=\"new\">ClientRect</a></code>\n object which bounds the entire contents of the range; this would be the union of all the rectangles returned by <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/range.getClientRects\">range.getClientRects()</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.isPointInRange","name":"isPointInRange","help":"Returns a <code>boolean</code> indicating whether the given point is in the range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.selectNodeContents","name":"selectNodeContents","help":"Sets the Range to contain the contents of a&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.cloneRange","name":"cloneRange","help":"Returns a Range object with boundary points identical to the cloned Range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.toString","name":"toString","help":"Returns the text of the Range"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.setStart","name":"setStart","help":"Sets the start position of a Range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.setStartAfter","name":"setStartAfter","help":"Sets the start position of a Range relative to another&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.createContextualFragment","name":"createContextualFragment","help":"Returns a&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DocumentFragment\">DocumentFragment</a></code>\n&nbsp;created from a given string of code."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.setEnd","name":"setEnd","help":"Sets the end position of a Range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.collapse","name":"collapse","help":"Collapses the Range to one of its boundary points."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.surroundContents","name":"surroundContents","help":"Moves content of a Range into a new&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.startOffset","name":"startOffset","help":"Returns a number representing where in the startContainer the Range starts."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.startContainer","name":"startContainer","help":"Returns the&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n&nbsp;within which the Range starts."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.endOffset","name":"endOffset","help":"Returns a number representing where in the endContainer the Range ends."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.collapsed","name":"collapsed","help":"Returns a&nbsp;<code>boolean</code>&nbsp;indicating whether the range's start and end points are at the same position."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.endContainer","name":"endContainer","help":"Returns the&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n&nbsp;within which the Range ends."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/range.commonAncestorContainer","name":"commonAncestorContainer","help":"Returns the deepest&nbsp;<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n&nbsp;that contains the startContainer and endContainer Nodes."}],"srcUrl":"https://developer.mozilla.org/en/DOM/range"},"HTMLIFrameElement":{"title":"HTMLIFrameElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/iframe\">&lt;iframe&gt;</a></code>\n&nbsp;HTML&nbsp;Element","summary":"DOM iframe objects expose the <a class=\"external\" href=\"http://www.w3.org/TR/html5/the-iframe-element.html#htmliframeelement\" rel=\"external nofollow\" target=\"_blank\" title=\"http://www.w3.org/TR/html5/the-iframe-element.html#htmliframeelement\">HTMLIFrameElement</a> (or <span><a href=\"https://developer.mozilla.org/en/HTML\" rel=\"custom nofollow\">HTML 4</a></span> <a class=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-50708718\" rel=\"external nofollow\" target=\"_blank\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-50708718\"><code>HTMLIFrameElement</code></a>) interface, which provides special properties and methods (beyond the regular <a href=\"https://developer.mozilla.org/en/DOM/element\" rel=\"internal\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of inline frame elements.","members":[{"name":"align","help":"Specifies the alignment of the frame with respect to the surrounding context.","obsolete":true},{"name":"contentDocument","help":"The active document in the inline frame's nested browsing context.","obsolete":false},{"name":"contentWindow","help":"The window proxy for the nested browsing context.","obsolete":false},{"name":"frameborder","help":"Indicates whether to create borders between frames.","obsolete":false},{"name":"height","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/iframe#attr-height\">height</a></code>\n HTML&nbsp;attribute, indicating the height of the frame.","obsolete":false},{"name":"longDesc","help":"URI of a long description of the frame.","obsolete":false},{"name":"marginHeight","help":"Height of the frame margin.","obsolete":false},{"name":"marginWidth","help":"Width of the frame margin.","obsolete":false},{"name":"webkitallowfullscreen","help":"Indicates whether or not the inline frame is willing to be placed into full screen mode. See <a title=\"https://developer.mozilla.org/en/DOM/Using_full-screen_mode\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Using_full-screen_mode\">Using full-screen mode</a> for details.","obsolete":false},{"name":"name","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/iframe#attr-name\">name</a></code>\n HTML&nbsp;attribute, containing a name by which to refer to the frame.","obsolete":false},{"name":"sandbox","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/iframe#attr-sandbox\">sandbox</a></code>\n HTML&nbsp;attribute, indicating extra restrictions on the behavior of the nested content.","obsolete":false},{"name":"scrolling","help":"Indicates whether the browser should provide scrollbars for the frame.","obsolete":false},{"name":"seamless","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/iframe#attr-seamless\">seamless</a></code>\n HTML&nbsp;attribute, indicating that the inline frame should be rendered seamlessly with the parent document.","obsolete":false},{"name":"src","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/iframe#attr-src\">src</a></code>\n HTML&nbsp;attribute, containing the address of the content to be embedded.","obsolete":false},{"name":"srcdoc","help":"The content to display in the frame.","obsolete":false},{"name":"width","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/iframe#attr-width\">width</a></code>\n&nbsp;HTML&nbsp;attribute, indicating the width of the frame.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLIFrameElement"},"IDBDatabaseException":{"title":"IDBDatabaseException","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>12 \n<span title=\"prefix\">-webkit</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>VER_ERR</code></td> <td><span title=\"Not supported.\">--</span></td> <td>10.0 (10.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>VER_ERR</code></td> <td><span title=\"Not supported.\">--</span></td> <td>10.0 (10.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"In the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB API</a>, an <code>IDBDatabaseException</code> object represents exception conditions that can be encountered while performing database operations.","members":[{"url":"","name":"ABORT_ERR","help":"A request was aborted, for example, through a call to<a title=\"en/IndexedDB/IDBTransaction#abort\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#abort\"> <code>IDBTransaction.abort</code></a>.","obsolete":false},{"url":"","name":"CONSTRAINT_ERR","help":"A mutation operation in the transaction failed because a constraint was not satisfied. For example, an object, such as an object store or index, already exists and a request attempted to create a new one.","obsolete":false},{"url":"","name":"DATA_ERR","help":"Data provided to an operation does not meet requirements.","obsolete":false},{"url":"","name":"NON_TRANSIENT_ERR","help":"An operation was not allowed on an object. Unless the cause of the error is corrected, retrying the same operation would result in failure.","obsolete":false},{"url":"","name":"NOT_ALLOWED_ERR","help":"<p>An operation was called on an object where it is not allowed or at a time when it is not allowed. It also occurs if a request is made on a source object that has been deleted or removed.</p> <p>More specific variants of this error includes: <code> TRANSACTION_INACTIVE_ERR</code> and <code>READ_ONLY_ERR</code>.</p>","obsolete":false},{"url":"","name":"NOT_FOUND_ERR","help":"The operation failed, because the requested database object could not be found; for example, an object store did not exist but was being opened.","obsolete":false},{"url":"","name":"QUOTA_ERR","help":"Either there's not enough remaining storage space or the storage quota was reached and the user declined to give more space to the database.","obsolete":false},{"url":"","name":"READ_ONLY_ERR","help":"A mutation operation was attempted in a <code>READ_ONLY</code>&nbsp;transaction.","obsolete":false},{"url":"","name":"TIMEOUT_ERR","help":"A lock for the transaction could not be obtained in a reasonable time.","obsolete":false},{"url":"","name":"TRANSACTION_INACTIVE_ERR","help":"A request was made against a transaction that is either not currently active or is already finished.","obsolete":false},{"url":"","name":"UNKNOWN_ERR","help":"The operation failed for reasons unrelated to the database itself, and it is not covered by any other error code; for example, a failure due to disk IO errors.","obsolete":false},{"url":"","name":"VER_ERR","help":"A request to open a database with a version lower than the one it already has. This can only happen with <a title=\"en/IndexedDB/IDBOpenDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBOpenDBRequest\"><code>IDBOpenDBRequest</code></a>.","obsolete":false},{"url":"","name":"code","help":"The most appropriate error code for the condition.","obsolete":false},{"url":"","name":"message","help":"Error message describing the exception raised.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException"},"DirectoryEntry":{"title":"DirectoryEntry","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>13\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<div><strong>DRAFT</strong> <div>This page is not complete.</div>\n</div>\n<p>The <code>DirectoryEntry</code> interface of the <a title=\"en/DOM/File_API/File_System_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File_API/File_System_API\">FileSystem API</a> represents a directory in a file system.</p>","members":[{"name":"getFile","help":"<p>Creates or looks up a file.</p>\n<pre>void moveTo (\n  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_9\"><span id=\"Parameter\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>\n</dl>\n<ul> <li>If create and exclusive are both true, and the path already exists, getFile must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getFile must create it as a zero-length file and return a corresponding FileEntry. </li> <li>If create is not true and the path doesn't exist, getFile must fail. </li> <li>If create is not true and the path exists, but is a directory, getFile must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a FileEntry corresponding to path.</li>\n</ul>\n<dl> <dt>successCallback</dt> <dd>A callback that is called to return the file selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id=\"section_10\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl> </div>","obsolete":false},{"name":"getDirectory","help":"<p>Creates or looks up a directory.</p>\n<pre>void vopyTo (\n  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_12\"><span id=\"Parameter_2\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>\n</dl>\n<ul> <li>If create and exclusive are both true, and the path already exists, getDirectory must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getDirectory must create it as a zero-length file and return a corresponding getDirectory. </li> <li>If create is not true and the path doesn't exist, getDirectory must fail. </li> <li>If create is not true and the path exists, but is a directory, getDirectory must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a getDirectory corresponding to path.</li>\n</ul> <dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n </div><div id=\"section_13\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl> </div>","obsolete":false},{"name":"removeRecursively","help":"<p>Deletes a directory and all of its contents, if any. If you are deleting a directory that contains a file that cannot be removed, some of the contents of the directory might be deleted. You cannot delete the root directory of a file system.</p>\n<pre>DOMString toURL (\n  <em>(in </em>VoidCallback successCallback, optional ErrorCallback errorCallback<em>);</em>\n);</pre>\n<div id=\"section_15\"><span id=\"Parameter_3\"></span><h5 class=\"editable\">Parameter</h5>\n<dl>\n<dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl> </div><div id=\"section_16\"><span id=\"Returns_5\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"createReader","help":"<p>Creates a new DirectoryReader to read entries from this Directory.</p>\n<pre>void getMetada ();</pre> <div id=\"section_7\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>DirectoryReader</code></dt>\n</dl> </div>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/DirectoryEntry"},"HTMLOptGroupElement":{"title":"optgroup","examples":["<pre name=\"code\" class=\"xml\">&lt;select&gt;\n  &lt;optgroup label=\"Group 1\"&gt;\n    &lt;option&gt;Option 1.1&lt;/option&gt;\n  &lt;/optgroup&gt; \n  &lt;optgroup label=\"Group 2\"&gt;\n    &lt;option&gt;Option 2.1&lt;/option&gt;\n    &lt;option&gt;Option 2.2&lt;/option&gt;\n  &lt;/optgroup&gt;\n  &lt;optgroup label=\"Group 3\" disabled&gt;\n    &lt;option&gt;Option 3.1&lt;/option&gt;\n    &lt;option&gt;Option 3.2&lt;/option&gt;\n    &lt;option&gt;Option 3.3&lt;/option&gt;\n  &lt;/optgroup&gt;\n&lt;/select&gt;</pre>\n        \n<p>&lt;form&gt; <select> <optgroup label=\"Group 1\">\n<option>Option 1.1</option>\n</optgroup> <optgroup label=\"Group 2\">\n<option>Option 2.1</option>\n<option>Option 2.2</option>\n</optgroup> <optgroup disabled=\"\" label=\"Group 3\">\n<option>Option 3.1</option>\n<option>Option 3.2</option>\n<option>Option 3.3</option>\n</optgroup> </select> &lt;/form&gt;</p>"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/optgroup","seeAlso":"Other form-related elements: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/legend\">&lt;legend&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/label\">&lt;label&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/button\">&lt;button&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/select\">&lt;select&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/datalist\">&lt;datalist&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/option\">&lt;option&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/fieldset\">&lt;fieldset&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea\">&lt;textarea&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/keygen\">&lt;keygen&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input\">&lt;input&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/output\">&lt;output&gt;</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/progress\">&lt;progress&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/meter\">&lt;meter&gt;</a></code>\n.","summary":"In a web form, the HTML <em>optgroup</em> element (&lt;optgroup&gt;) creates a grouping of options within a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/select\">&lt;select&gt;</a></code>\n element.","members":[{"obsolete":false,"url":"","name":"label","help":"The name of the group of options, which the browser can use when labeling the options in the user interface. This attribute is mandatory if this element is used."},{"obsolete":false,"url":"","name":"disabled","help":"If this Boolean attribute is set, none of the items in this option group is selectable. Often browsers grey out such control and it won't received any browsing events, like mouse clicks or focus-related ones."}]},"SVGZoomAndPan":{"title":"SVGViewElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGViewElement","skipped":true,"cause":"Suspect title"},"Console":{"title":"Using the Web Console","examples":["<p>Let's say you have a DOM&nbsp;node with the ID&nbsp;\"title\". In fact, this page you're reading right now has one, so you can open up the Web Console and try this right now.</p>\n<p>Let's take a look at the contents of that node by using the <code>$()</code>&nbsp;and <code>inspect()</code>&nbsp;functions:</p>\n<p><code>inspect($(\"title\"))</code></p>\n<p>This automatically opens up the object inspector, showing you the contents of the DOM&nbsp;node with the ID \"title\".</p>","<p>Let's say you have a DOM&nbsp;node with the ID&nbsp;\"title\". In fact, this page you're reading right now has one, so you can open up the Web Console and try this right now.</p>\n<p>Let's take a look at the contents of that node by using the <code>$()</code>&nbsp;and <code>inspect()</code>&nbsp;functions:</p>\n<p><code>inspect($(\"title\"))</code></p>\n<p>This automatically opens up the object inspector, showing you the contents of the DOM&nbsp;node with the ID \"title\".</p>","<p>That's well and good if you happen to be sitting at the browser exhibiting some problem, but let's say you're debugging remotely for a user, and need a look at the contents of a node. You can have your user open up the Web Console and dump the contents of the node into the log, then copy and paste it into an email to you, using the <code>pprint()</code>&nbsp;function:</p>\n<pre>pprint($(\"title\"))\n</pre>\n<p>This spews out the contents of the node so you can take a look. Of course, this may be more useful with other objects than a DOM&nbsp;node, but you get the idea.</p>","<p>That's well and good if you happen to be sitting at the browser exhibiting some problem, but let's say you're debugging remotely for a user, and need a look at the contents of a node. You can have your user open up the Web Console and dump the contents of the node into the log, then copy and paste it into an email to you, using the <code>pprint()</code>&nbsp;function:</p>\n<pre>pprint($(\"title\"))\n</pre>\n<p>This spews out the contents of the node so you can take a look. Of course, this may be more useful with other objects than a DOM&nbsp;node, but you get the idea.</p>"],"srcUrl":"https://developer.mozilla.org/en/Using_the_Web_Console","seeAlso":"Web Console Helpers","summary":"<p>Beginning with Firefox 4, the old <a title=\"en/Error Console\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Error_Console\">Error Console</a> has been deprecated in favor of the new, improved Web&nbsp;Console. The Web Console is something of a heads-up display for the web, letting you view error messages and other logged information. In addition, there are methods you can call to output information to the console, making it a useful debugging aid, and you can evaluate JavaScript on the fly.</p>\n<p><a title=\"webconsole.png\" rel=\"internal\" href=\"https://developer.mozilla.org/@api/deki/files/4748/=webconsole.png\"><img alt=\"webconsole.png\" class=\"internal default\" src=\"https://developer.mozilla.org/@api/deki/files/4748/=webconsole.png\"></a></p>\n<p>The Web Console won't replace more advanced debugging tools like <a class=\"external\" title=\"http://getfirebug.com/\" rel=\"external\" href=\"http://getfirebug.com/\" target=\"_blank\">Firebug</a>; what it does give you, however, is a way to let remote users of your site or web application gather and report console logs and other information to you. It also provides a lightweight way to debug content if you don't happen to have Firebug installed when something goes wrong.</p>\n<div class=\"note\"><strong>Note:</strong> The Error Console is still available; you can re-enable it by changing the <code>devtools.errorconsole.enabled</code> preference to <code>true</code> and restarting the browser.</div>","members":[]},"EntrySync":{"title":"EntrySync","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>13\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<div><strong>DRAFT</strong> <div>This page is not complete.</div>\n</div>\n<p>The <code>EntrySync</code> interface of the <a title=\"en/DOM/File_API/File_System_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File_API/File_System_API\">FileSystem API</a> represents entries in a file system. The entries can be a file&nbsp;or a <a href=\"https://developer.mozilla.org/en/DOM/File_API/File_system_API/DirectoryEntry\" rel=\"internal\" title=\"en/DOM/File_API/File_system_API/DirectoryEntry\">DirectoryEntry</a>.</p>","members":[{"name":"getMetadata","help":"<p>Look up metadata about this entry.</p>\n<pre>void getMetada (\n  in MetadataCallback ErrorCallback\n);</pre>\n<div id=\"section_4\"><span id=\"Parameter\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>successCallback</dt> <dd>A callback that is called with the time of the last modification.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_5\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"getParent","help":"<p>Look up the parent <code>DirectoryEntry</code> containing this entry. If this entry is the root of its filesystem, its parent is itself.</p>\n<pre>void getParent (\n  <em>(in EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_19\"><span id=\"Parameter_6\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCellback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_20\"><span id=\"Returns_6\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl> </div>","obsolete":false},{"name":"remove","help":"<p>Deletes a file or directory. You cannot delete an empty directory or the root directory of a filesystem.</p>\n<pre>void remove (\n  <em>(in VoidCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_16\"><span id=\"Parameter_5\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_17\"><span id=\"Returns_5\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"copyTo","help":"<p>Copy an entry to a different location on the file system. You cannot copy an entry inside itself if it is a directory nor can you copy it into its parent if a name different from its current one isn't provided. Directory copies are always recursive—that is, they copy all contents of the directory.</p>\n<pre>void vopyTo (\n  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_10\"><span id=\"Parameter_3\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_11\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"moveTo","help":"<p>Move an entry to a different location on the file system. You cannot do the following:</p>\n<ul> <li>move a directory inside itself or to any child at any depth;</li> <li>move an entry into its parent if a name different from its current one isn't provided;</li> <li>move a file to a path occupied by a directory;</li> <li>move a directory to a path occupied by a file;</li> <li>move any element to a path occupied by a directory which is not empty.</li>\n</ul>\n<p>Moving a file over an existing file&nbsp;replaces that existing file. A move of a directory on top of an existing empty directory&nbsp;replaces that directory.</p>\n<pre>void moveTo (\n  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_7\"><span id=\"Parameter_2\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"toURL","help":"<p>Returns a URL that can be used to identify this entry. It has no specific expiration. Bcause it describes a location on disk, it is valid for as long as that location exists. Users can supply&nbsp;<code>mimeType</code>&nbsp;to simulate the optional mime-type header associated with HTTP downloads.</p>\n<pre>DOMString toURL (\n  <em>(in </em>optional DOMString mimeType<em>);</em>\n);</pre>\n<div id=\"section_13\"><span id=\"Parameter_4\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>mimeType</dt> <dd>For a FileEntry, the mime type to be used to interpret the file, when loaded through this URL.</dd>\n</dl>\n</div><div id=\"section_14\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>DOMString</code></dt>\n</dl>\n</div>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/EntrySync"},"SVGException":{"title":"User talk:Jeff Schiller","members":[],"srcUrl":"https://developer.mozilla.org/User_talk:Jeff_Schiller","skipped":true,"cause":"Suspect title"},"XPathEvaluator":{"title":"nsIDOMXPathEvaluator","seeAlso":"<li><a title=\"en/Introduction to using XPath in JavaScript\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript\">Introduction to using XPath in JavaScript</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document.evaluate\">document.evaluate</a></code>\n</li> <li>\n<a rel=\"custom\" href=\"http://www.w3.org/TR/DOM-Level-3-XPath\">DOM Level 3 XPath Specification</a></li> <li>\n<a rel=\"custom\" href=\"http://www.w3.org/TR/xpath\">XML Path Language (XPath)</a><span title=\"Recommendation\">REC</span></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathResult\">nsIDOMXPathResult</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathException\">nsIDOMXPathException</a></code>\n</li>","summary":"<div><div>\n\n<a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/xpath/nsIDOMXPathEvaluator.idl\"><code>dom/interfaces/xpath/nsIDOMXPathEvaluator.idl</code></a><span><a rel=\"internal\" href=\"https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces\" title=\"en/Interfaces/About_Scriptable_Interfaces\">Scriptable</a></span></div><span>This interface is used to evaluate XPath expressions against a DOM node.</span><div>Inherits from: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsISupports\">nsISupports</a></code>\n<span>Last changed in Gecko 1.7 \n</span></div></div>\n<p></p>\n<p>Implemented by: <code>@mozilla.org/dom/xpath-evaluator;1</code>. To create an instance, use:</p>\n<pre class=\"eval\">var domXPathEvaluator = Components.classes[\"@mozilla.org/dom/xpath-evaluator;1\"]\n                        .createInstance(Components.interfaces.nsIDOMXPathEvaluator);\n</pre>","members":[{"name":"createExpression","help":"<p>Creates an <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathExpression\">nsIDOMXPathExpression</a></code>\n which can then be used for (repeated) evaluations.</p>\n<div class=\"geckoVersionNote\">\n<p>\n</p><div class=\"geckoVersionHeading\">Gecko 1.9 note<div>(Firefox 3)\n</div></div>\n<p></p>\n<p>Prior to Gecko 1.9, you could call this method on documents other than the one you planned to run the XPath against; starting with Gecko 1.9, however, you must call it on the same document.</p>\n</div>\n\n<div id=\"section_4\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>expression</code></dt> <dd>A string representing the XPath to be created.</dd> <dt><code>resolver</code></dt> <dd>A name space resolver created by , or a user defined name space resolver. Read more on <a title=\"en/Introduction to using XPath in JavaScript#Implementing a User Defined Namespace Resolver\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript#Implementing_a_User_Defined_Namespace_Resolver\">Implementing a User Defined Namespace Resolver</a> if you wish to take the latter approach.</dd>\n</dl>\n</div><div id=\"section_5\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>An XPath expression, as an <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathExpression\">nsIDOMXPathExpression</a></code>\n object.</p>\n</div>","idl":"<pre class=\"eval\"> nsIDOMXPathExpression createExpression(\n   in DOMString expression,\n   in nsIDOMXPathNSResolver resolver\n );\n</pre>","obsolete":false},{"name":"createNSResolver","help":"<p>Creates an <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathExpression\">nsIDOMXPathExpression</a></code>\n which resolves name spaces with respect to the definitions in scope for a specified node. It is used to resolve prefixes within the XPath itself, so that they can be matched with the document. <code>null</code> is common for HTML documents or when no name space prefixes are used.</p>\n\n<div id=\"section_7\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>nodeResolver</code></dt> <dd>The node to be used as a context for name space resolution.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Return_value_2\"></span><h6 class=\"editable\">Return value</h6>\n<p>A name space resolver.</p>\n</div>","idl":"<pre class=\"eval\">nsIDOMXPathNSResolver createNSResolver(\n  in nsIDOMNode nodeResolver\n);\n</pre>","obsolete":false},{"name":"evaluate","help":"<p>Evaluate the specified XPath expression.</p>\n\n<div id=\"section_10\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>expression</code></dt> <dd>A string representing the XPath to be evaluated.</dd> <dt><code>contextNode</code></dt> <dd>A DOM Node to evaluate the XPath expression against. To evaluate against a whole document, use the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document.documentElement\">document.documentElement</a></code>\n.</dd> <dt><code>resolver</code></dt> <dd>A name space resolver created by , or a user defined name space resolver. Read more on <a title=\"en/Introduction to using XPath in JavaScript#Implementing a User Defined Namespace Resolver\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript#Implementing_a_User_Defined_Namespace_Resolver\">Implementing a User Defined Namespace Resolver</a> if you wish to take the latter approach.</dd> <dt><code>type</code></dt> <dd>A number that corresponds to one of the type constants of <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIXPathResult&amp;ident=nsIXPathResult\" class=\"new\">nsIXPathResult</a></code>\n.</dd> <dt><code>result</code></dt> <dd>An existing <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIXPathResult&amp;ident=nsIXPathResult\" class=\"new\">nsIXPathResult</a></code>\n to use for the result. Using <code>null</code> will create a new <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIXPathResult&amp;ident=nsIXPathResult\" class=\"new\">nsIXPathResult</a></code>\n.</dd>\n</dl>\n</div><div id=\"section_11\"><span id=\"Return_value_3\"></span><h6 class=\"editable\">Return value</h6>\n<p>An XPath result.</p>\n</div>","idl":"<pre class=\"eval\">nsISupports evaluate(\n  in DOMString expression,\n  in nsIDOMNode contextNode,\n  in nsIDOMXPathNSResolver resolver,\n  in unsigned short type,\n  in nsISupports result\n);\n</pre>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathEvaluator"},"SharedWorker":{"title":"SharedWorker","seeAlso":"<li><a title=\"En/DOM/Worker\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Worker\"><code>Worker</code></a></li> <li><a title=\"en/Using DOM workers\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Using_DOM_workers\">Using DOM&nbsp;workers</a></li>","summary":"Not yet implemented by Firefox.","members":[],"srcUrl":"https://developer.mozilla.org/En/DOM/SharedWorker"},"WebKitCSSKeyframesRule":{"title":"CSSRuleList","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/CSSRuleList","skipped":true,"cause":"Suspect title"},"HTMLSourceElement":{"title":"HTMLSourceElement","members":[{"name":"media","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/source#attr-media\">media</a></code>\n HTML&nbsp;attribute, containing the intended type of the media resource.","obsolete":false},{"name":"src","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/source#attr-src\">src</a></code>\n HTML&nbsp;attribute, containing the URL&nbsp;for the media resource.","obsolete":false},{"name":"type","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/source#attr-type\">type</a></code>\n HTML&nbsp;attribute, containing the type of the media resource.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLSourceElement"},"HTMLMetaElement":{"title":"HTMLMetaElement","summary":"The meta objects expose the <a class=\" external\" target=\"_blank\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-37041454\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-37041454\">HTMLMetaElement</a> interface which contains descriptive metadata about a document.&nbsp; This object inherits all of the properties and methods described in the <a class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> section.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/meta.scheme","name":"scheme","help":"Gets or sets the name of a scheme used to interpret the value of a meta-data property."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/meta.content","name":"content","help":"Gets or sets the value of meta-data property."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/meta.httpEquiv","name":"httpEquiv","help":"Gets or sets the name of an HTTP&nbsp;response header to define for a document."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/meta.name","name":"name","help":"Gets or sets the name of a meta-data property to define for a document."}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLMetaElement"},"ElementTimeControl":{"title":"SVGAnimationElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimationElement","skipped":true,"cause":"Suspect title"},"SVGMPathElement":{"title":"SVGMPathElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGMPathElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/mpath\">&lt;mpath&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGMPathElement"},"SVGPathSegLinetoVerticalAbs":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"SVGRectElement":{"title":"SVGRectElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/SVGRectElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/rect\">&lt;rect&gt;</a></code>\n SVG Element","summary":"The <code>SVGRectElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/rect\">&lt;rect&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"width","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/width\">width</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/rect\">&lt;rect&gt;</a></code>\n element.","obsolete":false},{"name":"height","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/height\">height</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/rect\">&lt;rect&gt;</a></code>\n element.","obsolete":false},{"name":"rx","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/rx\">rx</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/rect\">&lt;rect&gt;</a></code>\n element.","obsolete":false},{"name":"ry","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/ry\">ry</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/rect\">&lt;rect&gt;</a></code>\n element.","obsolete":false}]},"TreeWalker":{"title":"treeWalker","summary":"<p>The <code>TreeWalker</code> object represents the nodes of a document subtree and a position within them.</p>\n<p>A TreeWalker can be created using the <code><a title=\"en/DOM/document.createTreeWalker\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.createTreeWalker\">createTreeWalker()</a></code> method of the <code><a title=\"en/DOM/document\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document\">document</a></code> object.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.previousSibling","name":"previousSibling","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.nextNode","name":"nextNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.lastChild","name":"lastChild","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.previousNode","name":"previousNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.firstChild","name":"firstChild","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.parentNode","name":"parentNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.nextSibling","name":"nextSibling","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.filter","name":"filter","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.ExpandEntityReferences","name":"expandEntityReferences","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.whatToShow","name":"whatToShow","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.root","name":"root","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/treeWalker.currentNode","name":"currentNode","help":""}],"srcUrl":"https://developer.mozilla.org/en/DOM/Treewalker","specification":"DOM Level 2 Traversal: TreeWalker"},"HTMLVideoElement":{"title":"HTMLVideoElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/HTMLVideoElement","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLAudioElement\">HTMLAudioElement</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLMediaELement\">HTMLMediaELement</a></code>\n</li> <li><a class=\" external\" rel=\"external\" href=\"http://people.mozilla.org/~cpearce/paint-stats-demo.html\" title=\"http://people.mozilla.org/~cpearce/paint-stats-demo.html\" target=\"_blank\">Demo of video paint statistics</a></li>","summary":"DOM <code>video</code> objects expose the <a class=\"external\" title=\"http://www.w3.org/TR/html5/video.html#htmlvideoelement\" rel=\"external\" href=\"http://www.w3.org/TR/html5/video.html#htmlvideoelement\" target=\"_blank\">HTMLVideoElement</a> interface, which provides special properties (beyond the regular <a href=\"https://developer.mozilla.org/en/DOM/element\" rel=\"internal\">element</a> object and <a title=\"en/DOM/HTMLMediaElement\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/HTMLMediaElement\">HTMLMediaElement</a> interfaces they also have available to them by inheritance) for manipulating video objects.","members":[{"name":"height","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video#attr-height\">height</a></code>\n HTML attribute, which specifies the height of the display area, in CSS pixels.","obsolete":false},{"name":"poster","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video#attr-poster\">poster</a></code>\n HTML&nbsp;attribute, which specifies an image to show while no video data is available.","obsolete":false},{"name":"videoHeight","help":"The intrinsic height of the resource in CSS pixels, taking into account the dimensions, aspect ratio, clean aperture, resolution, and so forth, as defined for the format used by the resource. If the element's ready state is HAVE_NOTHING, the value is 0.","obsolete":false},{"name":"videoWidth","help":"The intrinsic width of the resource in CSS pixels, taking into account the dimensions, aspect ratio, clean aperture, resolution, and so forth, as defined for the format used by the resource. If the element's ready state is HAVE_NOTHING, the value is 0.","obsolete":false},{"name":"width","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video#attr-width\">width</a></code>\n&nbsp;HTML&nbsp;attribute, which specifies the width of the display area, in CSS pixels.","obsolete":false}]},"FileReaderSync":{"title":"FileReaderSync","seeAlso":"<li>\n<a rel=\"custom\" href=\"http://dev.w3.org/2006/webapi/FileAPI/#FileReader-interface\">File API Specification: FileReaderSync</a><span title=\"Working Draft\">WD</span></li> <li>Related interfaces: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/FileReader\">FileReader</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/BlobBuilder\">BlobBuilder</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n</li>","summary":"<p>The <code>FileReaderSync</code> interface allows to read <code>File</code> or <code>Blob</code> objects in a synchronous way.</p>\n<p>This interface is <a title=\"https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers\">only available</a> in <a title=\"Worker\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Worker\">workers</a> as it enables synchronous I/O that could potentially block.</p>","members":[{"name":"readAsDataURL","help":"<p>This method reads the contents of the specified <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code>. When the read operation is finished, it returns a data URL representing the file's data. If an error happened during the read, the adequate exception is sent.</p>\n\n<div id=\"section_5\"> <div id=\"section_17\"><span id=\"Parameters_4\"></span><h4 class=\"editable\"><span>Parameters</span></h4> <dl> <dt><code>blob</code></dt> <dd>The DOM <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code> to read.</dd> </dl>\n</div></div>\n<div id=\"section_6\"> <div id=\"section_18\"><span id=\"Return_value_4\"></span><h4 class=\"editable\"><span>Return value</span></h4> <p>An <a title=\"DOMString\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMString\"><code>DOMString</code></a> representing the file's data as a data URL.</p>\n</div></div>\n<div id=\"section_19\"><span id=\"Exceptions_4\"></span><h4 class=\"editable\"><span>Exceptions</span></h4>\n<p>The following exceptions can be raised by this method:</p>\n<dl> <dt><code>NotFoundError</code></dt> <dd>is raised when the resource represented by the DOM <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code> cannot be found, e. g. because it has been erased.</dd> <dt><code>SecurityError</code></dt> <dd>is raised when one of the following problematic situation is detected: <ul> <li>the resource has been modified by a third party;</li> <li>too many read are performed simultaneously;</li> <li>the file pointed by the resource is unsafe for a use from the Web (like it is a system file).</li> </ul> </dd> <dt><code>NotReadableError</code></dt> <dd>is raised when the resource cannot be read due to a permission problem, like a concurrent lock.</dd> <dt><code>EncodingError</code></dt> <dd>is raised when the resource is a data URL and exceed the limit length defined by each browser.</dd>\n</dl>\n<dl> <dt></dt>\n</dl></div>","idl":"<pre class=\"eval\">void readAsDataURL(\n  in Blob file\n);\n</pre>","obsolete":false},{"name":"readAsText","help":"<p>This methods reads the specified blob's contents. When the read operation is finished, it returns a <a title=\"DOMString\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMString\"><code>DOMString</code></a> containing the file represented as a text string. The optional <strong><code>encoding</code></strong> parameter indicates the encoding to be used. If not present, the method will apply a detection algorithm for it. If an error happened during the read, the adequate exception is sent.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_3\"></span><h4 class=\"editable\">Parameters</h4>\n<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code> to read into the <a title=\"DOMString\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMString\"><code>DOMString</code></a>.</dd> <dt><code>encoding</code></dt> <dd>Optional. A string representing the encoding to be used, like <strong>iso-8859-1</strong> or <strong>UTF-8</strong>.</dd>\n</dl>\n</div><div id=\"section_14\"><span id=\"Return_value_3\"></span><h4 class=\"editable\">Return value</h4>\n<p>A <a href=\"https://developer.mozilla.org/en/DOM/DOMString\" rel=\"internal\" title=\"DOMString\"><code>DOMString</code></a> containing the raw binary data from the resource</p>\n</div><div id=\"section_15\"><span id=\"Exceptions_3\"></span><h4 class=\"editable\">Exceptions</h4>\n<p>The following exceptions can be raised by this method:</p>\n<dl> <dt><code>NotFoundError</code></dt> <dd>is raised when the resource represented by the DOM <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code> cannot be found, e. g. because it has been erased.</dd> <dt><code>SecurityError</code></dt> <dd>is raised when one of the following problematic situation is detected: <ul> <li>the resource has been modified by a third party;</li> <li>two many read are performed simultaneously;</li> <li>the file pointed by the resource is unsafe for a use from the Web (like it is a system file).</li> </ul> </dd> <dt><code>NotReadableError</code></dt> <dd>is raised when the resource cannot be read due to a permission problem, like a concurrent lock.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void readAsText(\n  in Blob blob,\n  in DOMString encoding \n<span style=\"border: 1px solid #9ED2A4; background-color: #C0FFC7; font-size: x-small; white-space: nowrap; padding: 2px;\" title=\"\">Optional</span>\n\n);\n</pre>","obsolete":false},{"name":"readAsBinaryString","help":"<p>This method reads the contents of the specified <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code>, which may be a <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code>. When the read operation is finished, it returns a <a title=\"DOMString\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMString\"><code>DOMString</code></a> containing the raw binary data from the file. If an error happened during the read, the adequate exception is sent.</p>\n<div class=\"note\"><strong>Note</strong> <strong>: </strong>This method is deprecated and <code>readAsArrayBuffer()</code> should be used instead.</div>\n\n<div id=\"section_9\"><span id=\"Parameters_2\"></span><h4 class=\"editable\">Parameters</h4>\n<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code> to read into the <a title=\"DOMString\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMString\"><code>DOMString</code></a>.</dd>\n</dl>\n</div><div id=\"section_10\"><span id=\"Return_value_2\"></span><h4 class=\"editable\">Return value</h4>\n<p><code>A </code><a title=\"DOMString\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMString\"><code>DOMString</code></a> containing the raw binary data from the resource</p>\n</div><div id=\"section_11\"><span id=\"Exceptions_2\"></span><h4 class=\"editable\">Exceptions</h4>\n<p>The following exceptions can be raised by this method:</p>\n<dl> <dt><code>NotFoundError</code></dt> <dd>is raised when the resource represented by the DOM <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code> cannot be found, e. g. because it has been erased.</dd> <dt><code>SecurityError</code></dt> <dd>is raised when one of the following problematic situation is detected: <ul> <li>the resource has been modified by a third party;</li> <li>two many read are performed simultaneously;</li> <li>the file pointed by the resource is unsafe for a use from the Web (like it is a system file).</li> </ul> </dd> <dt><code>NotReadableError</code></dt> <dd>is raised when the resource cannot be read due to a permission problem, like a concurrent lock.</dd> <dt><code>EncodingError</code></dt> <dd>is raised when the resource is a data URL and exceed the limit length defined by each browser.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void readAsBinaryString(\n  in Blob blob\n);\n</pre>","obsolete":false},{"name":"readAsArrayBuffer","help":"<p>This method reads the contents of the specified <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code>. When the read operation is finished, it returns an <code><a href=\"../JavaScript_typed_arrays/ArrayBuffer\" rel=\"internal\" title=\"/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code> representing the file's data. If an error happened during the read, the adequate exception is sent.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h4 class=\"editable\">Parameters</h4>\n<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code> to read into the <code><a href=\"../JavaScript_typed_arrays/ArrayBuffer\" rel=\"internal\" title=\"/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>.</dd>\n</dl>\n</div><div id=\"section_6\"><span id=\"Return_value\"></span><h4 class=\"editable\">Return value</h4>\n<p>An <code><a href=\"../JavaScript_typed_arrays/ArrayBuffer\" rel=\"internal\" title=\"/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code> representing the file's data.</p>\n</div><div id=\"section_7\"><span id=\"Exceptions\"></span><h4 class=\"editable\">Exceptions</h4>\n<p>The following exceptions can be raised by this method:</p>\n<dl> <dt><code>NotFoundError</code></dt> <dd>is raised when the resource represented by the DOM <code><a href=\"https://developer.mozilla.org/en/DOM/Blob\" rel=\"custom\">Blob</a></code> or <code><a href=\"https://developer.mozilla.org/en/DOM/File\" rel=\"custom\">File</a></code> cannot be found, e. g. because it has been erased.</dd> <dt><code>SecurityError</code></dt> <dd>is raised when one of the following problematic situation is detected: <ul> <li>the resource has been modified by a third party;</li> <li>two many read are performed simultaneously;</li> <li>the file pointed by the resource is unsafe for a use from the Web (like it is a system file).</li> </ul> </dd> <dt><code>NotReadableError</code></dt> <dd>is raised when the resource cannot be read due to a permission problem, like a concurrent lock.</dd> <dt><code>EncodingError</code></dt> <dd>is raised when the resource is a data URL and exceed the limit length defined by each browser.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void readAsArrayBuffer(\n  in Blob blob\n);\n</pre>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/FileReaderSync"},"MediaList":{"title":"XPCOM array guide","members":[],"srcUrl":"https://developer.mozilla.org/en/XPCOM_array_guide","skipped":true,"cause":"Suspect title"},"ValidityState":{"title":"ValidityState","summary":"The DOM&nbsp;<code>ValidityState</code> interface represents the <em>validity states</em> that an element can be in, with respect to constraint validation.","members":[{"name":"customError","help":"The element's custom validity message has been set to a non-empty string by calling the element's setCustomValidity() method.","obsolete":false},{"name":"patternMismatch","help":"The value does not match the specified \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-pattern\">pattern</a></code>\n.","obsolete":false},{"name":"rangeOverflow","help":"The value is greater than the specified \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-max\">max</a></code>\n.","obsolete":false},{"name":"rangeUnderflow","help":"The value is less than the specified \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-min\">min</a></code>\n.","obsolete":false},{"name":"stepMismatch","help":"The value does not fit the rules determined by \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-step\">step</a></code>\n.","obsolete":false},{"name":"tooLong","help":"<p>The value exceeds the specified <strong>maxlength</strong> for <a title=\"en/DOM/HTMLInputElement\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/HTMLInputElement\">HTMLInputElement</a> or <a title=\"en/DOM/textarea\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/HTMLTextAreaElement\">HTMLTextAreaElement</a> objects.</p> <div class=\"note\"><strong>Note:</strong> This will never be <code>true</code> in Gecko, because elements' values are prevented from being longer than <strong>maxlength</strong>.</div>","obsolete":false},{"name":"typeMismatch","help":"The value is not in the required syntax (when \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-type\">type</a></code>\n is <code>email</code> or <code>url</code>).","obsolete":false},{"name":"valid","help":"No other constraint validation conditions are true.","obsolete":false},{"name":"valueMissing","help":"The element has a \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-required\">required</a></code>\n attribute, but no value.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/ValidityState","specification":"W3C HTML5 Specification: Constraints: The Constraint Validation API"},"CSSStyleDeclaration":{"title":"CSSStyleDeclaration","examples":["var styleObj= document.styleSheets[0].cssRules[0].style;\nalert(styleObj.cssText);\nfor (var i = styleObj.length-1; i &gt;= 0; i--) {\n   var nameString = styleObj[i];\n   styleObj.removeProperty(nameString);\n}\nalert(styleObj.cssText);"],"srcUrl":"https://developer.mozilla.org/en/DOM/CSSStyleDeclaration","specification":"DOM Level 2 CSS: CSSStyleDeclaration","summary":"<p>A CSSStyleDeclaration is an interface to the <a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/1998/REC-CSS2-19980512/syndata.html#block\" title=\"http://www.w3.org/TR/1998/REC-CSS2-19980512/syndata.html#block\" target=\"_blank\">declaration block</a> returned by the <code><a href=\"https://developer.mozilla.org/en/DOM/cssRule.style\" rel=\"internal\" title=\"en/DOM/cssRule.style\">style</a></code> property of a <code><a href=\"https://developer.mozilla.org/en/DOM/cssRule\" rel=\"internal\" title=\"en/DOM/cssRule\">cssRule</a></code> in a <a href=\"https://developer.mozilla.org/en/DOM/stylesheet\" rel=\"internal\" title=\"en/DOM/stylesheet\">stylesheet</a>, when the&nbsp;rule is a <a title=\"en/DOM/cssRule#CSSStyleRule\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/cssRule#CSSStyleRule\">CSSStyleRule</a>.</p>\n<p>CSSStyleDeclaration is also a <strong>read-only </strong>interface to the result of <a title=\"en/DOM/window.getComputedStyle\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window.getComputedStyle\">getComputedStyle</a>.</p>","members":[{"name":"removeProperty","help":" Returns the value deleted.<br> Example: <em>valString</em>= <em>styleObj</em>.removeProperty('color')","obsolete":false},{"name":"setProperty","help":" No return.<br> Example: <em>styleObj</em>.setProperty('color', 'red', 'important')","obsolete":false},{"name":"item","help":" Returns a property name.<br> Example: <em>nameString</em>= <em>styleObj</em>.item(0)<br> Alternative: <em>nameString</em>= <em>styleObj</em>[0]","obsolete":false},{"name":"getPropertyValue","help":" Returns the property value.<br> Example: <em>valString</em>= <em>styleObj</em>.getPropertyValue('color')","obsolete":false},{"name":"getPropertyCSSValue","help":"<span>Only supported via getComputedStyle.<br> </span>Returns a <a class=\"external\" title=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue\" target=\"_blank\">CSSValue</a>, or <code>null</code> for <a title=\"en/Guide to Shorthand CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Guide_to_Shorthand_CSS\">Shorthand properties</a>.<br> Example: <em>cssString</em>= window.getComputedStyle(<em>elem</em>, <code>null</code>).getPropertyCSSValue('color').cssText;<br> Note: Gecko 1.9 returns null unless using <a title=\"en/DOM/window.getComputedStyle\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window.getComputedStyle\">getComputedStyle()</a>.<br> Note: this method may be <a class=\"external\" title=\"http://lists.w3.org/Archives/Public/www-style/2003Oct/0347.html\" rel=\"external\" href=\"http://lists.w3.org/Archives/Public/www-style/2003Oct/0347.html\" target=\"_blank\">deprecated by the W3C</a>.","obsolete":false},{"name":"getPropertyPriority","help":" Returns the optional priority, \"important\".<br> Example: <em>priString</em>= <em>styleObj</em>.getPropertyPriority('color')","obsolete":false},{"name":"parentRule","help":" The containing <code><a href=\"https://developer.mozilla.org/en/DOM/cssRule\" rel=\"internal\" title=\"en/DOM/cssRule\">cssRule</a>.</code>","obsolete":false},{"name":"cssText","help":" Textual representation of the declaration block. Setting this attribute changes the style.","obsolete":false},{"name":"length","help":" The number of properties. See the <strong>item</strong> method below.","obsolete":false}]},"HTMLBaseFontElement":{"title":"basefont","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","examples":["&lt;basefont color=\"#FF0000\" face=\"Helvetica\" size=\"+2\" /&gt;\n"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/basefont","summary":"Obsolete","members":[{"obsolete":false,"url":"","name":"face","help":"This attribute contains a list of one or more font names. The document text in the default style is rendered in the first font face that the client's browser supports. If no font listed is installed on the local system, the browser typically defaults to the proportional or fixed-width font for that system."},{"obsolete":false,"url":"","name":"color","help":"This attribute sets the text color using either a named color or a color specified in the hexadecimal #RRGGBB format."},{"obsolete":false,"url":"","name":"size","help":"This attribute specifies the font size as either a numeric or relative value. Numeric values range from 1 to 7 with 1 being the smallest and 3 the default."}]},"SVGAElement":{"title":"SVGAElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/SVGAElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/a\">&lt;a&gt;</a></code>\n SVG Element","summary":"The <code>SVGAElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/a\">&lt;a&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"target","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/target\" class=\"new\">target</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/a\">&lt;a&gt;</a></code>\n element.","obsolete":false}]},"DeviceMotionEvent":{"title":"DeviceMotionEvent","examples":["&lt;coming soon&gt;"],"srcUrl":"https://developer.mozilla.org/en/DOM/DeviceMotionEvent","specification":"DeviceOrientation specification","summary":"A <code>DeviceMotionEvent</code> object describes an event that indicates the amount of physical motion of the device that has occurred, and is fired at a set interval (rather than in response to motion). It provides information about the rate of rotation, as well as acceleration along all three axes.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/DeviceMotionEvent.accelerationIncludingGravity","name":"accelerationIncludingGravity","help":"The acceleration of the device. This value includes the effect of gravity, and may be the only value available on devices that don't have a gyroscope to allow them to properly remove gravity from the data. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/DeviceMotionEvent.interval","name":"interval","help":"The interval, in milliseconds, at which the <code>DeviceMotionEvent</code> is fired. The next event will be fired in approximately this amount of time."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/DeviceMotionEvent.acceleration","name":"acceleration","help":"The acceleration of the device. This value has taken into account the effect of gravity and removed it from the figures. This value may not exist if the hardware doesn't know how to remove gravity from the acceleration data. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/DeviceMotionEvent.rotationRate","name":"rotationRate","help":"The rates of rotation of the device about all three axes. <strong>Read only.</strong>"}]},"ErrorEvent":{"title":"error","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/DOM_event_reference/error","skipped":true,"cause":"Suspect title"},"SVGFEGaussianBlurElement":{"title":"feGaussianBlur","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The filter blurs the input image by the amount specified in \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/stdDeviation\" class=\"new\">stdDeviation</a></code>, which defines the bell-curve.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur"},"MouseEvent":{"title":"MouseEvent","srcUrl":"https://developer.mozilla.org/en/DOM/MouseEvent","specification":"DOM&nbsp;Level 2:&nbsp;MouseEvent","seeAlso":"<li><a title=\"UIEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Event/UIEvent\">UIEvent</a></li> <li><a title=\"Event\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/event\">Event</a></li>","summary":"The DOM&nbsp;<code>MouseEvent</code> represents events that occur due to the user interacting with a pointing device (such as a mouse). It's represented by the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsINSDOMMouseEvent&amp;ident=nsINSDOMMouseEvent\" class=\"new\">nsINSDOMMouseEvent</a></code>\n&nbsp;interface, which extends the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIDOMMouseEvent&amp;ident=nsIDOMMouseEvent\" class=\"new\">nsIDOMMouseEvent</a></code>\n interface.","members":[{"name":"screenX","help":"The X coordinate of the mouse pointer in global (screen)&nbsp;coordinates. <strong>Read only.</strong>","obsolete":false},{"name":"screenY","help":"The Y coordinate of the mouse pointer in global (screen)&nbsp;coordinates. <strong>Read only.</strong>","obsolete":false},{"name":"clientX","help":"The X coordinate of the mouse pointer in local (DOM content)&nbsp;coordinates. <strong>Read only.</strong>","obsolete":false},{"name":"clientY","help":"The Y coordinate of the mouse pointer in local (DOM content)&nbsp;coordinates. <strong>Read only.</strong>","obsolete":false},{"name":"ctrlKey","help":"<code>true</code> if the control key was down when the mouse event was fired. <strong>Read only.</strong>","obsolete":false},{"name":"shiftKey","help":"<code>true</code> if the shift key was down when the mouse event was fired. <strong>Read only.</strong>","obsolete":false},{"name":"altKey","help":"<code>true</code> if the alt key was down when the mouse event was fired. <strong>Read only.</strong>","obsolete":false},{"name":"metaKey","help":"<code>true</code> if the meta key was down when the mouse event was fired. <strong>Read only.</strong>","obsolete":false},{"name":"button","help":"The button number that was pressed when the mouse event was fired:&nbsp;Left button=0, middle button=1 (if present), right button=2. For mice configured for left handed use in which the button actions are reversed the values are instead read from right to left. <strong>Read only.</strong>","obsolete":false},{"name":"relatedTarget","help":"The target to which the event applies. <strong>Read only.</strong>","obsolete":false},{"name":"webkitPressure","help":"The amount of pressure applied to a touch or tablet device when generating the event; this value ranges between 0.0 (minimum pressure)&nbsp;and 1.0 (maximum pressure). <strong>Read only.</strong>","obsolete":false}]},"HTMLUnknownElement":{"title":"Gecko DOM Referenz","summary":"<p>Dies ist die Übersichtsseite der Gecko DOM Referenz.</p>\n<div class=\"warning\">Diese Referenz ist im Moment noch sehr unvollständig. Hilf mit: registriere dich und schreib mit!</div>\n<div class=\"note\">Diese Referenz trennt zwischen Methoden und Eigenschaften die für Webinhalte verfügbar oder nur für Entwickler von Erweiterungen verfügbar sind. Erweiterungsentwickler halten sich bitte an die englische Funktionsreferenz im Mozilla Developer Center.</div>","members":[],"srcUrl":"https://developer.mozilla.org/de/Gecko-DOM-Referenz"},"XMLHttpRequestUpload":{"title":"Using XMLHttpRequest","members":[],"srcUrl":"https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest","skipped":true,"cause":"Suspect title"},"HTMLOptionsCollection":{"title":"HTMLOptionsCollection","srcUrl":"https://developer.mozilla.org/en/DOM/HTMLOptionsCollection","specification":"<li><a class=\" external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#HTMLOptionsCollection\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#HTMLOptionsCollection\" target=\"_blank\">http://www.w3.org/TR/DOM-Level-2-HTM...ionsCollection</a></li> <li><a class=\" external\" rel=\"external\" href=\"http://dev.w3.org/html5/spec/common-dom-interfaces.html#htmloptionscollection\" title=\"http://dev.w3.org/html5/spec/common-dom-interfaces.html#htmloptionscollection\" target=\"_blank\">http://dev.w3.org/html5/spec/common-...ionscollection</a></li>","seeAlso":"HTMLCollection","summary":"HTMLOptionsCollection is an interface representing a collection of HTML option elements (in document order)&nbsp;and offers methods and properties for traversing the list as well as optionally altering its items. This type is returned solely by the \"options\" property of <a title=\"En/DOM/select\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/HTMLSelectElement\">select</a>.","members":[{"name":"length","help":"As optionally allowed by the spec, Mozilla allows this property to be set, either removing options at the end when using a shorter length, or adding blank options at the end when setting a longer length. Other implementations could potentially throw a <a title=\"En/DOM/DOMException\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMException\">DOMException</a>.","obsolete":false}]},"Storage":{"title":"Storage","seeAlso":"<ul> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/mozIStorageConnection\">mozIStorageConnection</a></code>\n Database connection to a specific file or in-memory data storage</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/mozIStorageStatement\">mozIStorageStatement</a></code>\n Create and execute SQL statements on a SQLite database.</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/mozIStorageValueArray\">mozIStorageValueArray</a></code>\n Wraps an array of SQL values, such as a result row.</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/mozIStorageFunction\">mozIStorageFunction</a></code>\n Create a new SQLite function.</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/mozIStorageAggregateFunction\">mozIStorageAggregateFunction</a></code>\n Create a new SQLite aggregate function.</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/mozIStorageProgressHandler\">mozIStorageProgressHandler</a></code>\n Monitor progress during the execution of a statement.</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/mozIStorageStatementWrapper\">mozIStorageStatementWrapper</a></code>\n Storage statement wrapper</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/mozIStorageService\">mozIStorageService</a></code>\n Storage Service</li>\n</ul>\n<ul> <li><a title=\"en/Storage/Performance\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Storage/Performance\">Storage:Performance</a> How to get your database connection performing well.</li> <li><a class=\"link-https\" rel=\"external\" href=\"https://addons.mozilla.org/en-US/firefox/addon/3072\" title=\"https://addons.mozilla.org/en-US/firefox/addon/3072\" target=\"_blank\">Storage Inspector Extension</a> Makes it easy to view any sqlite database files in the current profile.</li> <li><a class=\"external\" rel=\"external\" href=\"http://www.sqlite.org/lang.html\" title=\"http://www.sqlite.org/lang.html\" target=\"_blank\">SQLite Syntax</a> Query language understood by SQLite</li> <li><a class=\"external\" rel=\"external\" href=\"http://sqlitebrowser.sourceforge.net/\" title=\"http://sqlitebrowser.sourceforge.net/\" target=\"_blank\">SQLite Database Browser</a> is a capable free tool available for many platforms. It can be handy for examining existing databases and testing SQL statements.</li> <li><a class=\"link-https\" rel=\"external\" href=\"https://addons.mozilla.org/en-US/firefox/addon/5817\" title=\"https://addons.mozilla.org/en-US/firefox/addon/5817\" target=\"_blank\">SQLite Manager Extension</a> helps manage sqlite database files on your computer.</li>\n</ul>","summary":"<p><strong>Storage</strong> is a <a class=\"external\" rel=\"external\" href=\"http://www.sqlite.org/\" title=\"http://www.sqlite.org/\" target=\"_blank\">SQLite</a> database API. It is available to trusted callers, meaning extensions and Firefox components only.</p>\n<p>The API is currently \"unfrozen\", which means it is subject to change at any time; in fact, it has changed somewhat with each release of Firefox since it was introduced, and will likely continue to do so for a while.</p>\n<div class=\"note\"><strong>Note:</strong> Storage is not the same as the <a title=\"en/DOM/Storage\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Storage\">DOM:Storage</a> feature which can be used by web pages to store persistent data or the <a title=\"en/Session_store_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Session_store_API\">Session store API</a> (an <a title=\"en/XPCOM\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPCOM\">XPCOM</a> storage utility for use by extensions).</div>","members":[],"srcUrl":"https://developer.mozilla.org/en/Storage"},"SVGFontFaceFormatElement":{"title":"SVGFontFaceFormatElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGFontFaceFormatElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-format\">&lt;font-face-format&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGFontFaceFormatElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-format\">&lt;font-face-format&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-format\">&lt;font-face-format&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"SVGUnitTypes":{"title":"SVGPatternElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPatternElement","skipped":true,"cause":"Suspect title"},"Attr":{"title":"Attr","summary":"<p>This type represents a DOM&nbsp;element's attribute as an object. In most DOM methods, you will probably directly retrieve the attribute as a string (e.g., <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Element.getAttribute\">Element.getAttribute()</a></code>\n, but certain functions (e.g., <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Element.getAttributeNode\">Element.getAttributeNode()</a></code>\n)&nbsp;or means of iterating give <code>Attr</code> types.</p>\n<div class=\"warning\"><strong>Warning:</strong> In DOM Core 1, 2 and 3, Attr inherited from Node. This is no longer the case in <a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/dom/\" title=\"http://www.w3.org/TR/dom/\" target=\"_blank\">DOM4</a>. In order to bring the implementation of <code>Attr</code> up to specification, work is underway to change it to no longer inherit from <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n. You should not be using any <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code>\n properties or methods on <code>Attr</code> objects. Starting in Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n, the ones that are going to be removed output warning messages to the console. You should revise your code accordingly. See <a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Attr#Deprecated_properties_and_methods\">Deprecated properties and methods</a> for a complete list.</div>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Attr.schemaTypeInfo","name":"schemaTypeInfo","help":"?"},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Attr.ownerElement","name":"ownerElement","help":"This property has been deprecated and will be removed in the future. Since you can only get Attr objects from elements, you should already know th"},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Attr.isId","name":"isId","help":"Indicates whether the attribute is an \"ID attribute\". An \"ID attribute\" being an attribute which value is expected to be unique across a DOM Document. In HTML DOM, \"id\" is the only ID attribute, but XML documents could define others. Whether or not an attribute is unique is often determined by a DTD or other schema description."},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Attr.name","name":"name","help":"The attribute's name."},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Attr.specified","name":"specified","help":"This property has been deprecated and will be removed in the future; it now always returns <code>true</code>."},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Attr.value","name":"value","help":"The attribute's value."}],"srcUrl":"https://developer.mozilla.org/en/DOM/Attr","specification":"<li><a class=\"external\" title=\"http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-637646024\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-637646024\" target=\"_blank\">Document Object Model Core level 3: Interface Attr</a></li> <li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/dom/#interface-attr\" title=\"http://www.w3.org/TR/dom/#interface-attr\" target=\"_blank\">Document Object Model 4: Interface Attr</a></li>"},"PopStateEvent":{"title":"Manipulating the browser history","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history","skipped":true,"cause":"Suspect title"},"DocumentFragment":{"title":"DocumentFragment","summary":"<p>DocumentFragment has no properties or methods of its own, but inherits from <a title=\"En/DOM/Node\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node\"><code>Node</code></a>. </p>\n<p>A <code><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-B63ED1A3\" title=\"http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-B63ED1A3\" target=\"_blank\">DocumentFragment</a></code> is a minimal document object that has no parent. It is used as a light-weight version of document to store well-formed or potentially non-well-formed fragments of XML.</p>\n<p>See <a title=\"En/DOM/Node\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node\"><code>Node</code></a> for a listing of its properties, constants and methods.</p>\n<p>Various other methods can take a document fragment as an argument (e.g., any <code><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247\" title=\"http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247\" target=\"_blank\">Node</a></code> interface methods such as <code><a title=\"En/DOM/Node.appendChild\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node.appendChild\">appendChild</a></code> and <code><a title=\"En/DOM/Node.insertBefore\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node.insertBefore\">insertBefore</a></code>), in which case the children of the fragment are appended or inserted, not the fragment itself.</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/DocumentFragment","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...ml#ID-B63ED1A3"},"SVGAltGlyphDefElement":{"title":"altGlyphDef","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/glyph\">&lt;glyph&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/glyphRef\">&lt;glyphRef&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/altGlyphDef\">&lt;altGlyphDef&gt;</a></code>\n</li>","summary":"The <code>altGlyphDef</code> element defines a substitution representation for glyphs.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/altGlyphDef"},"SVGFontFaceSrcElement":{"title":"SVGFontFaceSrcElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGFontFaceSrcElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-src\">&lt;font-face-src&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGFontFaceSrcElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-src\">&lt;font-face-src&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-src\">&lt;font-face-src&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"SVGUseElement":{"title":"SVGUseElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGUseElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/use\">&lt;use&gt;</a></code>\n SVG Element","summary":"The <code>SVGUseElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/use\">&lt;use&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"width","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/width\">width</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/use\">&lt;use&gt;</a></code>\n element.","obsolete":false},{"name":"height","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/height\">height</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/use\">&lt;use&gt;</a></code>\n element.","obsolete":false},{"name":"instanceRoot","help":"The root of the instance tree. See description of <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGElementInstance\" class=\"new\">SVGElementInstance</a></code>\n to learn more about the instance tree.","obsolete":false},{"name":"animatedInstanceRoot","help":"If the \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/xlink%3Ahref\">xlink:href</a></code> attribute is being animated, contains the current animated root of the instance tree. If the \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/xlink%3Ahref\">xlink:href</a></code> attribute is not currently being animated, contains the same value as <code>instanceRoot</code>. See description of <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGElementInstance\" class=\"new\">SVGElementInstance</a></code>\n to learn more about the instance tree.","obsolete":false}]},"SVGPathSegCurvetoCubicSmoothRel":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"FileWriter":{"title":"FileEntrySync","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/FileEntrySync","skipped":true,"cause":"Suspect title"},"SVGLength":{"title":"SVGLength","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"<p>The <code>SVGLength</code> interface correspond to the <a title=\"https://developer.mozilla.org/en/SVG/Content_type#Length\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Content_type#Length\">&lt;length&gt;</a> basic data type.</p>\n<p>An <code>SVGLength</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>","members":[{"name":"newValueSpecifiedUnits","help":"<p>Reset the value as a number with an associated unitType, thereby replacing the values for all of the attributes on the object.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NOT_SUPPORTED_ERR</code> is raised if <code>unitType</code> is <code>SVG_LENGTHTYPE_UNKNOWN</code> or not a valid unit type constant (one of the other <code>SVG_LENGTHTYPE_*</code> constants defined on this interface).</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false},{"name":"convertToSpecifiedUnits","help":"Preserve the same underlying stored value, but reset the stored unit identifier to the given <code><em>unitType</em></code>. Object attributes <code>unitType</code>, <code>valueInSpecifiedUnits</code> and <code>valueAsString</code> might be modified as a result of this method. For example, if the original value were \"<em>0.5cm</em>\" and the method was invoked to convert to millimeters, then the <code>unitType</code> would be changed to <code>SVG_LENGTHTYPE_MM</code>, <code>valueInSpecifiedUnits</code> would be changed to the numeric value 5 and <code>valueAsString</code> would be changed to \"<em>5mm</em>\".","obsolete":false},{"name":"SVG_LENGTHTYPE_UNKNOWN","help":"The unit type is not one of predefined unit types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.","obsolete":false},{"name":"SVG_LENGTHTYPE_NUMBER","help":"No unit type was provided (i.e., a unitless value was specified), which indicates a value in user units.","obsolete":false},{"name":"SVG_LENGTHTYPE_PERCENTAGE","help":"A percentage value was specified.","obsolete":false},{"name":"SVG_LENGTHTYPE_EMS","help":"A value was specified using the em units defined in CSS2.","obsolete":false},{"name":"SVG_LENGTHTYPE_EXS","help":"A value was specified using the ex units defined in CSS2.","obsolete":false},{"name":"SVG_LENGTHTYPE_PX","help":"A value was specified using the px units defined in CSS2.","obsolete":false},{"name":"SVG_LENGTHTYPE_CM","help":"A value was specified using the cm units defined in CSS2.","obsolete":false},{"name":"SVG_LENGTHTYPE_MM","help":"A value was specified using the mm units defined in CSS2.","obsolete":false},{"name":"SVG_LENGTHTYPE_IN","help":"A value was specified using the in units defined in CSS2.","obsolete":false},{"name":"SVG_LENGTHTYPE_PT","help":"A value was specified using the pt units defined in CSS2.","obsolete":false},{"name":"SVG_LENGTHTYPE_PC","help":"A value was specified using the pc units defined in CSS2.","obsolete":false},{"name":"unitType","help":"The type of the value as specified by one of the SVG_LENGTHTYPE_* constants defined on this interface.","obsolete":false},{"name":"value","help":"<p>The value as a floating point value, in user units. Setting this attribute will cause <code>valueInSpecifiedUnits</code> and <code>valueAsString</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</p>","obsolete":false},{"name":"valueInSpecifiedUnits","help":"<p>The value as a floating point value, in the units expressed by <code>unitType</code>. Setting this attribute will cause <code>value</code> and <code>valueAsString</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</p>","obsolete":false},{"name":"valueAsString","help":"<p>The value as a string value, in the units expressed by <code>unitType</code>. Setting this attribute will cause <code>value</code>, <code>valueInSpecifiedUnits</code> and <code>unitType</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong></p> <ul> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>SYNTAX_ERR</code> is raised if the assigned string cannot be parsed as a valid <a title=\"https://developer.mozilla.org/en/SVG/Content_type#Length\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Content_type#Length\">&lt;length&gt;</a>.</li> <li>a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</li> </ul>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/SVGLength"},"HTMLMediaElement":{"title":"HTMLMediaElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.5 (1.9.1)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span>`</td> </tr> <tr> <td><code>buffered</code> property</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>loop</code> property</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>11.0 (11.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>defaultMuted</code> property</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>11.0 (11.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>seekable</code> property</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>8.0 (8.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>buffered</code> property</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>defaultMuted</code> property</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>11.0 (11.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>loop</code> property</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>11.0 (11.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>seekable</code> property</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>8.0 (8.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","summary":"HTML media elements (such as <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/audio\">&lt;audio&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video\">&lt;video&gt;</a></code>\n) expose the <code>HTMLMediaElement</code> interface which provides special properties and methods (beyond the regular <a href=\"https://developer.mozilla.org/en/DOM/element\" rel=\"internal\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of media elements.","members":[{"name":"canPlayType","help":"Determines whether the specified media type can be played back.","obsolete":false},{"name":"load","help":"Begins loading the media content from the server.","obsolete":false},{"name":"pause","help":"Pauses the media playback.","obsolete":false},{"name":"play","help":"Begins playback of the media. If you have changed the <strong>src</strong> attribute of the media element since the page was loaded, you must call load() before play(), otherwise the original media plays again.","obsolete":false},{"name":"autoplay","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video#attr-autoplay\">autoplay</a></code>\n HTML&nbsp;attribute, indicating whether to begin playing as soon as enough media is available.","obsolete":false},{"name":"buffered","help":"The ranges of the media source that the browser has buffered, if any.","obsolete":false},{"name":"controls","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video#attr-controls\">controls</a></code>\n HTML attribute, indicating whether user interface items for controlling the resource should be displayed.","obsolete":false},{"name":"currentSrc","help":"The absolute URL of the chosen media resource (if, for example, the server selects a media file based on the resolution of the user's display), or an empty string if the <code>networkState</code> is <code>EMPTY</code>.","obsolete":false},{"name":"currentTime","help":"The current playback time, in seconds.&nbsp; Setting this value seeks the media to the new time.","obsolete":false},{"name":"defaultMuted","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video#attr-muted\">muted</a></code>\n HTML attribute, indicating whether the media element's audio output should be muted by default. Changing the value dynamically will not unmute the audio (it only controls the default state).","obsolete":false},{"name":"defaultPlaybackRate","help":"The default playback rate for the media.&nbsp; The Ogg backend does not support this.&nbsp; 1.0 is \"normal speed,\" values lower than 1.0 make the media play slower than normal, higher values make it play faster.&nbsp; The value 0.0 is invalid and throws a <code>NOT_SUPPORTED_ERR</code>&nbsp;exception.","obsolete":false},{"name":"duration","help":"The length of the media in seconds, or zero if no media data is available.&nbsp; If the media data is available but the length is unknown, this value is <code>NaN</code>.&nbsp; If the media is streamed and has no predefined length, the value is <code>Inf</code>.","obsolete":false},{"name":"ended","help":"Indicates whether the media element has ended playback.","obsolete":false},{"name":"error","help":"The media error object for the most recent error, or null if there has not been an error.","obsolete":false},{"name":"loop","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video#attr-loop\">loop</a></code>\n HTML&nbsp;attribute, indicating whether the media element should start over when it reaches the end.","obsolete":false},{"name":"webkitChannels","help":"The number of channels in the audio resource (e.g., 2 for stereo). ","obsolete":false},{"name":"webkitFrameBufferLength","help":"Indicates the number of samples that will be returned in the framebuffer of each <code>MozAudioAvailable</code> event. This number is a total for all channels, and by default is set to be the number of channels * 1024 (e.g., 2 channels * 1024 samples = 2048 total).","obsolete":false},{"name":"webkitFrameBufferLength","help":"The <code>mozFrameBufferLength</code> property can be set to a new value, for lower latency, or larger amounts of data, etc. The size given <em>must</em> be a number between 512 and 16384. Using any other size results in an exception being thrown. The best time to set a new length is after the <code>loadedmetadata</code> event fires, when the audio info is known, but before the audio has started or <code>MozAudioAvailable</code> events have begun firing.","obsolete":false},{"name":"webkitSampleRate","help":"The number of samples per second that will be played, for example 44100. ","obsolete":false},{"name":"muted","help":"<code>true</code> if the audio is muted, and <code>false</code> otherwise.","obsolete":false},{"name":"networkState","help":"<p>The current state of fetching the media over the network.</p> <table class=\"standard-table\"> <tbody> <tr> <td class=\"header\">Constant</td> <td class=\"header\">Value</td> <td class=\"header\">Description</td> </tr> <tr> <td><code>EMPTY</code></td> <td>0</td> <td>There is no data yet.&nbsp; The <code>readyState</code> is also <code>HAVE_NOTHING</code>.</td> </tr> <tr> <td><code>LOADING</code></td> <td>1</td> <td>The media is loading.</td> </tr> <tr> <td><code>LOADED_METADATA</code></td> <td>2</td> <td>The media's metadata has been loaded.</td> </tr> <tr> <td><code>LOADED_FIRST_FRAME</code></td> <td>3</td> <td>The media's first frame has been loaded.</td> </tr> <tr> <td><code>LOADED</code></td> <td>4</td> <td>The media has been fully loaded.</td> </tr> </tbody> </table>","obsolete":false},{"name":"EMPTY","help":"There is no data yet.&nbsp; The <code>readyState</code> is also <code>HAVE_NOTHING</code>.","obsolete":false},{"name":"LOADING","help":"The media is loading.","obsolete":false},{"name":"LOADED_METADATA","help":"The media's metadata has been loaded.","obsolete":false},{"name":"LOADED_FIRST_FRAME","help":"The media's first frame has been loaded.","obsolete":false},{"name":"LOADED","help":"The media has been fully loaded.","obsolete":false},{"name":"paused","help":"Indicates whether the media element is paused.","obsolete":false},{"name":"playbackRate","help":"The current rate at which the media is being played back. This is used to implement user controls for fast forward, slow motion, and so forth. The normal playback rate is multiplied by this value to obtain the current rate, so a value of 1.0 indicates normal speed.&nbsp; Not supported by the Ogg backend.","obsolete":false},{"name":"played","help":"The ranges of the media source that the browser has played, if any.","obsolete":false},{"name":"preload","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video#attr-preload\">preload</a></code>\n HTML attribute, indicating what data should be preloaded at page-load time, if any.","obsolete":false},{"name":"readyState","help":"<p>The readiness state of the media:</p> <table class=\"standard-table\"> <tbody> <tr> <td class=\"header\">Constant</td> <td class=\"header\">Value</td> <td class=\"header\">Description</td> </tr> <tr> <td><code>HAVE_NOTHING</code></td> <td>0</td> <td>No information is available about the media resource.</td> </tr> <tr> <td><code>HAVE_METADATA</code></td> <td>1</td> <td>Enough of the media resource has been retrieved that the metadata attributes are initialized.&nbsp; Seeking will no longer raise an exception.</td> </tr> <tr> <td><code>HAVE_CURRENT_DATA</code></td> <td>2</td> <td>Data is available for the current playback position, but not enough to actually play more than one frame.</td> </tr> <tr> <td><code>HAVE_FUTURE_DATA</code></td> <td>3</td> <td>Data for the current playback position as well as for at least a little bit of time into the future is available (in other words, at least two frames of video, for example).</td> </tr> <tr> <td><code>HAVE_ENOUGH_DATA</code></td> <td>4</td> <td>Enough data is available—and the download rate is high enough—that the media can be played through to the end without interruption.</td> </tr> </tbody> </table>","obsolete":false},{"name":"HAVE_NOTHING","help":"No information is available about the media resource.","obsolete":false},{"name":"HAVE_METADATA","help":"Enough of the media resource has been retrieved that the metadata attributes are initialized.&nbsp; Seeking will no longer raise an exception.","obsolete":false},{"name":"HAVE_CURRENT_DATA","help":"Data is available for the current playback position, but not enough to actually play more than one frame.","obsolete":false},{"name":"HAVE_FUTURE_DATA","help":"Data for the current playback position as well as for at least a little bit of time into the future is available (in other words, at least two frames of video, for example).","obsolete":false},{"name":"HAVE_ENOUGH_DATA","help":"Enough data is available—and the download rate is high enough—that the media can be played through to the end without interruption.","obsolete":false},{"name":"seekable","help":"The time ranges that the user is able to seek to, if any.","obsolete":false},{"name":"seeking","help":"Indicates whether the media is in the process of seeking to a new position.","obsolete":false},{"name":"src","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video#attr-src\">src</a></code>\n HTML attribute, containing the URL of a media resource to use.","obsolete":false},{"name":"startTime","help":"The earliest possible position in the media, in seconds.","obsolete":false},{"name":"volume","help":"The audio volume, from 0.0 (silent) to 1.0 (loudest).","obsolete":false},{"name":"EMPTY","help":"There is no data yet.&nbsp; The <code>readyState</code> is also <code>HAVE_NOTHING</code>.","obsolete":false},{"name":"LOADING","help":"The media is loading.","obsolete":false},{"name":"LOADED_METADATA","help":"The media's metadata has been loaded.","obsolete":false},{"name":"LOADED_FIRST_FRAME","help":"The media's first frame has been loaded.","obsolete":false},{"name":"LOADED","help":"The media has been fully loaded.","obsolete":false},{"name":"HAVE_NOTHING","help":"No information is available about the media resource.","obsolete":false},{"name":"HAVE_METADATA","help":"Enough of the media resource has been retrieved that the metadata attributes are initialized.&nbsp; Seeking will no longer raise an exception.","obsolete":false},{"name":"HAVE_CURRENT_DATA","help":"Data is available for the current playback position, but not enough to actually play more than one frame.","obsolete":false},{"name":"HAVE_FUTURE_DATA","help":"Data for the current playback position as well as for at least a little bit of time into the future is available (in other words, at least two frames of video, for example).","obsolete":false},{"name":"HAVE_ENOUGH_DATA","help":"Enough data is available—and the download rate is high enough—that the media can be played through to the end without interruption.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLMediaElement"},"SVGPathSegLinetoHorizontalAbs":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"SVGDocument":{"title":"Scripting","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Scripting","skipped":true,"cause":"Suspect title"},"XPathException":{"title":"Interface documentation status","members":[],"srcUrl":"https://developer.mozilla.org/User:trevorh/Interface_documentation_status","skipped":true,"cause":"Suspect title"},"SVGMissingGlyphElement":{"title":"SVGMissingGlyphElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGMissingGlyphElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/missing-glyph\">&lt;missing-glyph&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGMissingGlyphElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/missing-glyph\">&lt;missing-glyph&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/missing-glyph\">&lt;missing-glyph&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"CSSCharsetRule":{"title":"cssRule","members":[],"srcUrl":"https://developer.mozilla.org/pl/DOM/cssRule","skipped":true,"cause":"Suspect title"},"WebGLRenderingContext":{"title":"HTMLCanvasElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLCanvasElement","skipped":true,"cause":"Suspect title"},"SVGAnimateColorElement":{"title":"SVGAnimateColorElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimateColorElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animateColor\">&lt;animateColor&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimateColorElement"},"HTMLMarqueeElement":{"title":"marquee","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.0 (1.7 or earlier)\n</td> <td>2.0</td> <td>7.2</td> <td>1.2</td> </tr> <tr> <td><code>truespeed</code> attribute</td> <td><span title=\"Not supported.\">--</span></td> <td>3.0 (1.9)\n</td> <td>4.0</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>hspace/vspace</code> attribute</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.0 (1.9)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>loop</code> attribute</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>3.0 (1.9)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>truespeed</code> attribute</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>hspace/vspace</code> attribute</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> <tr> <td><code>loop</code> attribute</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>1.0 (1.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","examples":["  &lt;marquee&gt;This text will scroll from right to left&lt;/marquee&gt;\n\n  &lt;marquee direction=\"up\"&gt;This text will scroll from bottom to top&lt;/marquee&gt;\n\n  &lt;marquee direction=\"down\" width=\"250\" height=\"200\" behavior=\"alternate\" style=\"border:solid\"&gt;\n    &lt;marquee behavior=\"alternate\"&gt;\n      This text will bounce\n    &lt;/marquee&gt;\n  &lt;/marquee&gt;\n"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/marquee","summary":"Non-standard","members":[{"name":"stop","help":"Stops scrolling of the marquee.","obsolete":false},{"name":"start","help":"Starts scrolling of the marquee.","obsolete":false},{"obsolete":false,"url":"","name":"truespeed","help":"By default,<code> scrolldelay </code>values lower than 60 are ignored. If<code> truespeed </code>is present, those values are not ignored."},{"obsolete":false,"url":"","name":"vspace","help":"Sets the vertical margin in pixels or percentage value."},{"obsolete":false,"url":"","name":"bgcolor","help":"Sets the background color through color name or hexadecimal value."},{"obsolete":false,"url":"","name":"scrollamount","help":"Sets the amount of scrolling at each interval in pixels. The default value is 6."},{"obsolete":false,"url":"","name":"height","help":"Sets the height in pixels or percentage value."},{"obsolete":false,"url":"","name":"loop","help":"Sets the number of times the marquee will scroll. If no value is specified, the default value is −1, which means the marquee will scroll continuously."},{"obsolete":false,"url":"","name":"width","help":"Sets the width in pixels or percentage value."},{"obsolete":false,"url":"","name":"direction","help":"Sets the direction of the scrolling within the marquee. Possible values are <code>left</code>, <code>right</code>, <code>up</code> and <code>down</code>. If no value is specified, the default value is <code>left</code>."},{"obsolete":false,"url":"","name":"behavior","help":"Sets how the text is scrolled within the marquee. Possible values are <code>scroll</code>, <code>slide</code> and <code>alternate</code>. If no value is specified, the default value is <code>scroll</code>."},{"obsolete":false,"url":"","name":"hspace","help":"Sets the horizontal margin"},{"obsolete":false,"url":"","name":"scrolldelay","help":"Sets the interval between each scroll movement in milliseconds. The default value is 85. Note that any value smaller than 60 is ignored and the value 60 is used instead, unless<code> truespeed </code>is specified."}]},"FileList":{"title":"FileList","examples":["<p>This example iterates over all the files selected by the user using an <code>input</code> element:</p>\n<pre class=\"eval\">// fileInput is an HTML&nbsp;input element: &lt;input type=\"file\" id=\"myfileinput\" multiple&gt;\nvar fileInput = document.getElementById(\"myfileinput\");\n\n// files is a FileList object (similar to NodeList)\nvar files = fileInput.files;\nvar file;\n\n// loop trough files\nfor (var i = 0; i &lt; files.length; i++) {\n\n    // get item\n    file = files.item(i);\n    //or\n    file = files[i];\n\n    alert(file.name);\n}</pre>"],"srcUrl":"https://developer.mozilla.org/en/DOM/FileList","specification":"<a title=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#concept-input-type-file-selected\" class=\" external\" rel=\"external\" href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#concept-input-type-file-selected\" target=\"_blank\">File upload state</a> (HTML&nbsp;5 working draft)","summary":"<p>An object of this type is returned by the <code>files</code> property of the HTML&nbsp;input element; this lets you access the list of files selected with the <code>&lt;input type=\"file\"&gt;</code> element. It's also used for a list of files dropped into web content when using the drag and drop API; see the <a title=\"En/DragDrop/DataTransfer\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DragDrop/DataTransfer\"><code>DataTransfer</code></a> object for details on this usage.</p>\n<p>\n\n</p><div><p>Gecko 1.9.2 note</p><p>Prior to Gecko 1.9.2, the input element only supported a single file being selected at a time, meaning that the FileList would contain only one file. Starting with Gecko 1.9.2, if the input element's multiple attribute is true, the FileList may contain multiple files.</p></div>","members":[{"name":"item","help":"<p>Returns a <a title=\"en/DOM/File\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File\"><code>File</code></a> object representing the file at the specified index in the file list.</p>\n\n<div id=\"section_6\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>index</code></dt> <dd>The zero-based index of the file to retrieve from the list.</dd>\n</dl>\n</div><div id=\"section_7\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>The <a title=\"en/DOM/File\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File\"><code>File</code></a> representing the requested file.</p>\n</div>","idl":"<pre class=\"eval\"> File item(\n   index\n );\n</pre>","obsolete":false},{"name":"length","help":"A read-only value indicating the number of files in the list.","obsolete":false},{"name":"length","help":"A read-only value indicating the number of files in the list.","obsolete":false}]},"SVGVKernElement":{"title":"SVGVKernElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGVKernElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/vkern\">&lt;vkern&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGVKernElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/vkern\">&lt;vkern&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/vkern\">&lt;vkern&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"CSSValueList":{"title":"Interface documentation status","members":[],"srcUrl":"https://developer.mozilla.org/User:trevorh/Interface_documentation_status","skipped":true,"cause":"Suspect title"},"SVGAnimateTransformElement":{"title":"SVGAnimateTransformElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimateTransformElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animateTransform\">&lt;animateTransform&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimateTransformElement"},"Float32Array":{"title":"Float32Array","srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float32Array","seeAlso":"<li><a class=\"link-https\" title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"<p>The <code>Float32Array</code> type represents an array of 32-bit floating point numbers (corresponding to the C <code>float</code> data type).</p>\n<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>","constructor":"<div class=\"note\"><strong>Note:</strong> In these methods, <code><em>TypedArray</em></code> represents any of the <a title=\"en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses\">typed array object types</a>.</div>\n<table class=\"standard-table\"> <tbody> <tr> <td><code>Float32Array <a title=\"en/JavaScript typed arrays/Float32Array#Float32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float32Array#Float32Array()\">Float32Array</a>(unsigned long length);<br> </code></td> </tr> <tr> <td><code>Float32Array </code><code><a title=\"en/JavaScript typed arrays/Float32Array#Float32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float32Array#Float32Array%28%29\">Float32Array</a></code><code>(<em>TypedArray</em> array);<br> </code></td> </tr> <tr> <td><code>Float32Array </code><code><a title=\"en/JavaScript typed arrays/Float32Array#Float32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float32Array#Float32Array%28%29\">Float32Array</a></code><code>(sequence&lt;type&gt; array);<br> </code></td> </tr> <tr> <td><code>Float32Array </code><code><a title=\"en/JavaScript typed arrays/Float32Array#Float32Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float32Array#Float32Array%28%29\">Float32Array</a></code><code>(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length);<br> </code></td> </tr> </tbody>\n</table><p>Returns a new <code>Float32Array</code> object.</p>\n<pre>Float32Array Float32Array(\n&nbsp; unsigned long length\n);\n\nFloat32Array Float32Array(\n&nbsp; <em>TypedArray</em> array\n);\n\nFloat32Array Float32Array(\n&nbsp; sequence&lt;type&gt; array\n);\n\nFloat32Array Float32Array(\n&nbsp; ArrayBuffer buffer,\n&nbsp; optional unsigned long byteOffset,\n&nbsp; optional unsigned long length\n);\n</pre>\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>length</code></dt> <dd>The number of elements in the byte array. If unspecified, length of the array view will match the buffer's length.</dd> <dt><code>array</code></dt> <dd>An object of any of the typed array types (such as <span>Uint8</span><code>Array</code>), or a sequence of objects of a particular type, to copy into a new <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>. Each value in the source array is converted to a 32-bit floating point number before being copied into the new array.</dd> <dt><code>buffer</code></dt> <dd>An existing <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> to use as the storage for the new <code>Float32Array</code> object.</dd> <dt><code>byteOffset<br> </code></dt> <dd>The offset, in bytes, to the first byte in the specified buffer for the new view to reference. If not specified, the <code>Float32Array</code>'s view of the buffer will start with the first byte.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>Float32Array</code> object representing the specified data buffer.</p>\n</div>","members":[{"name":"subarray","help":"<p>Returns a new <code>Float32Array</code> view on the <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> store for this <code>Float32Array</code> object.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Float32Array</code> object.</dd> <dt><code>end</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Float32Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Notes_2\"></span><h6 class=\"editable\">Notes</h6>\n<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>\n<div class=\"note\"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>\n</div>","idl":"<pre>Float32Array subarray(\n&nbsp; long begin,\n&nbsp; optional long end\n);\n</pre>","obsolete":false},{"name":"set","help":"<p>Sets multiple values in the typed array, reading input values from a specified array.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>array</code></dt> <dd>An array from which to copy values. All values from the source array are copied into the target array, unless the length of the source array plus the offset exceeds the length of the target array, in which case an exception is thrown. If the source array is a typed array, the two arrays may share the same underlying <code><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>; the browser will intelligently copy the source range of the buffer to the destination range.</dd> <dt>offset \n<span title=\"\">Optional</span>\n</dt> <dd>The offset into the target array at which to begin writing values from the source <code>array</code>. If you omit this value, 0 is assumed (that is, the source <code>array</code> will overwrite values in the target array starting at index 0).</dd>\n</dl>\n</div>","idl":"<pre>void set(\n&nbsp; <em>TypedArray</em> array,\n&nbsp; optional unsigned long offset\n);\n\nvoid set(\n&nbsp; type[] array,\n&nbsp; optional unsigned long offset\n);\n</pre>","obsolete":false},{"name":"BYTES_PER_ELEMENT","help":"The size, in bytes, of each array element.","obsolete":false},{"name":"length","help":"The number of entries in the array. <strong>Read only.</strong>","obsolete":false}]},"ArrayBufferView":{"title":"ArrayBufferView","seeAlso":"<li><a title=\"en/JavaScript typed arrays/DataView\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/DataView\"><code>DataView</code></a></li> <li><a class=\"link-https\" title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"<p>The <code>ArrayBufferView</code> type describes a particular view on the contents of an <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>'s data.</p>\n<p>Of note is that you may create multiple views into the same buffer, each looking at the buffer's contents starting at a particular offset. This makes it possible to set up views of different data types to read the contents of a buffer based on the types of data at specific offsets into the buffer.</p>\n<div class=\"note\"><strong>Note:</strong> Typically, you'll instantiate one of the <a title=\"en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses\">subclasses</a> of this object instead of this base class. Those provide access to the data formatted using specific data types.</div>","members":[{"name":"buffer","help":"The buffer this view references. <strong>Read only.</strong>","obsolete":false},{"name":"byteLength","help":"The length, in bytes, of the view. <strong>Read only.</strong>","obsolete":false},{"name":"byteOffset","help":"The offset, in bytes, to the first byte of the view within the <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView"},"HTMLTableColElement":{"title":"HTMLTableColElement","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/col\">&lt;col&gt;</a></code>\n HTML&nbsp;element</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/colgroup\">&lt;colgroup&gt;</a></code>\n&nbsp;HTML element</li>","summary":"DOM table column objects (which may correspond to <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/col\">&lt;col&gt;</a></code>\n&nbsp;or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/colgroup\">&lt;colgroup&gt;</a></code>\n HTML elements) expose the <a target=\"_blank\" href=\"http://www.w3.org/TR/html5/tabular-data.html#htmltablecolelement\" rel=\"external nofollow\" class=\" external\" title=\"http://www.w3.org/TR/html5/tabular-data.html#htmltablecolelement\">HTMLTableColElement</a> (or <span><a href=\"https://developer.mozilla.org/en/HTML\" rel=\"custom nofollow\">HTML 4</a></span> <a target=\"_blank\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-84150186\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-84150186\" rel=\"external nofollow\" class=\" external\"><code>HTMLTableColElement</code></a>) interface, which provides special properties (beyond the regular <a href=\"https://developer.mozilla.org/en/DOM/element\" rel=\"internal\">element</a> object interface they also have available to them by inheritance) for manipulating table column elements.","members":[{"name":"align","help":"Indicates the horizontal alignment of the cell data in the column.","obsolete":true},{"name":"ch","help":"Alignment character for cell data.","obsolete":true},{"name":"chOff","help":"Offset for the alignment character.","obsolete":true},{"name":"span","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/col#attr-span\">span</a></code>\n HTML&nbsp;attribute, indicating the number of columns to apply this object's attributes to. Must be a positive integer.","obsolete":false},{"name":"vAlign","help":"Indicates the vertical alignment of the cell data in the column.","obsolete":true},{"name":"width","help":"Default column width.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLTableColElement"},"SVGCursorElement":{"title":"SVGCursorElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGCursorElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/cursor\">&lt;cursor&gt;</a></code>\n SVG Element","summary":"The <code>SVGCursorElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/cursor\">&lt;cursor&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[]},"XPathNSResolver":{"title":"document.createNSResolver","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/document.createNSResolver","skipped":true,"cause":"Suspect title"},"SVGTransformable":{"title":"SVGTransformable","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"Interface <code>SVGTransformable</code> contains properties and methods that apply to all elements which have attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/transform\">transform</a></code>.","members":[{"name":"transform","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/transform\">transform</a></code> on the given element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/SVGTransformable"},"IDBDatabase":{"title":"IDBDatabase","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>12\n<span title=\"prefix\">webkit</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>setVersion</code></td> <td>12\n<span title=\"prefix\">webkit</span></td> <td>From 4.0 (2.0)\n to 9.0 (9.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td>2-parameter <code>open</code></td> <td><span title=\"Not supported.\">--</span></td> <td>10.0 (10.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["<h4 class=\"editable\">Example</h4>\n<p>In the following code snippet, we open a database asynchronously and make a request.&nbsp;&nbsp;Because the specification is still evolving, Chrome and Firefox put prefixes in the methods.&nbsp;Chrome uses the <code>webkit</code>&nbsp;prefix while Firefox uses the <code>moz</code>&nbsp;prefix.&nbsp;Event handlers are registered for responding to various situations.</p>\n\n          <pre name=\"code\" class=\"js\">// Taking care of the browser-specific prefixes.\nif ('webkitIndexedDB' in window) {\n   window.indexedDB = window.webkitIndexedDB;\n   window.IDBTransaction = window.webkitIDBTransaction;\n} else if ('mozIndexedDB' in window) {\n   window.indexedDB = window.mozIndexedDB;\n}\n\n//Open a connection to the database with the name \"creatures\" \n//with the empty string as its version.  \n\nvar creatures = {};\ncreatures.indexedDB = {};\n\ncreatures.indexedDB.open = function() {\n  var request = indexedDB.open(\"creatures\");\n\n  //The open request isn't executed yet, but an IDBRequest object is returned. \n  //Create listeners to the IDBRequest. \n  \n  //If the version of the db changes, the onupgradeneeded callback is executed.\n  request.onupgradeneeded = function(event) {\n    // event.target.trans is a CHANGE_VERSION transaction\n    \n    // create an object store called \"swamp\"\n    // and define an optional parameter object, the \"terrorizedPopulace\" keyPath.        \n    // The keyPath must be what makes an object unique and every object must have it.  \n    // If every creature had a unique identification number, that would also be a good keyPath. \n        \n    var datastore = db.createObjectStore(\"swamp\",\n       {keyPath: \"terrorizedPopulace\"});\n  }\n  \n  //If the open request is successful, the onsuccess callback is executed. \n  request.onsuccess = function(event) {\n    creatures.indexedDB.db = event.target.result;     \n    creatures.indexedDB.getAllSwampCreatures();\n  };\n\n  request.onerror = creatures.indexedDB.onerror;\n}</pre>","<h4 class=\"editable\">Example</h4>\n<p>In the following code snippet, we open a database asynchronously and make a request.&nbsp;&nbsp;Because the specification is still evolving, Chrome and Firefox put prefixes in the methods.&nbsp;Chrome uses the <code>webkit</code>&nbsp;prefix while Firefox uses the <code>moz</code>&nbsp;prefix.&nbsp;Event handlers are registered for responding to various situations.</p>\n\n          <pre name=\"code\" class=\"js\">// Taking care of the browser-specific prefixes.\nif ('webkitIndexedDB' in window) {\n   window.indexedDB = window.webkitIndexedDB;\n   window.IDBTransaction = window.webkitIDBTransaction;\n} else if ('mozIndexedDB' in window) {\n   window.indexedDB = window.mozIndexedDB;\n}\n\n//Open a connection to the database with the name \"creatures\" \n//with the empty string as its version.  \n\nvar creatures = {};\ncreatures.indexedDB = {};\n\ncreatures.indexedDB.open = function() {\n  var request = indexedDB.open(\"creatures\");\n\n  //The open request isn't executed yet, but an IDBRequest object is returned. \n  //Create listeners to the IDBRequest. \n  \n  //If the version of the db changes, the onupgradeneeded callback is executed.\n  request.onupgradeneeded = function(event) {\n    // event.target.trans is a CHANGE_VERSION transaction\n    \n    // create an object store called \"swamp\"\n    // and define an optional parameter object, the \"terrorizedPopulace\" keyPath.        \n    // The keyPath must be what makes an object unique and every object must have it.  \n    // If every creature had a unique identification number, that would also be a good keyPath. \n        \n    var datastore = db.createObjectStore(\"swamp\",\n       {keyPath: \"terrorizedPopulace\"});\n  }\n  \n  //If the open request is successful, the onsuccess callback is executed. \n  request.onsuccess = function(event) {\n    creatures.indexedDB.db = event.target.result;     \n    creatures.indexedDB.getAllSwampCreatures();\n  };\n\n  request.onerror = creatures.indexedDB.onerror;\n}</pre>","<h4 class=\"editable\">Example</h4>\n<p>The following is an example of how to open a read-write transaction.</p>\n\n          <pre name=\"code\" class=\"js\">//Open a transaction with a scope of data stores and a read-write mode.\nvar trans = db.transaction(['list-of-store-names'], IDBTransaction.READ_WRITE);\n\n//\"objectStore()\" is an IDBTransaction method that returns an object store \n//that has already been added to the scope of the transaction.  \nvar store = trans.objectStore('your-store-name');\nvar req = store.put(value, key); \nreq.onsuccess = ...; \nreq.onerror = ...;</pre>","<h4 class=\"editable\">Example</h4>\n<p>The following is an example of how to open a read-write transaction.</p>\n\n          <pre name=\"code\" class=\"js\">//Open a transaction with a scope of data stores and a read-write mode.\nvar trans = db.transaction(['list-of-store-names'], IDBTransaction.READ_WRITE);\n\n//\"objectStore()\" is an IDBTransaction method that returns an object store \n//that has already been added to the scope of the transaction.  \nvar store = trans.objectStore('your-store-name');\nvar req = store.put(value, key); \nreq.onsuccess = ...; \nreq.onerror = ...;</pre>"],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBDatabase","summary":"<p>The <code>IDBDatabase</code> interface of the IndexedDB&nbsp;API provides asynchronous access to a <a title=\"en/IndexedDB#database connection\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#database_connection\">connection to a database</a>. Use it to create, manipulate, and delete objects in that database. The interface also provides the only way to get a <a title=\"en/IndexedDB#gloss transaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_transaction\">transaction</a>&nbsp;and manage versions on that database.</p>\n<p>Inherits from: <a title=\"en/DOM/EventTarget\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/EventTarget\">EventTarget</a></p>","members":[{"name":"keyPath","help":"The <a title=\"en/IndexedDB#gloss key path\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_key_path\">key path</a> to be used by the new object store. If empty or not specified, the object store is created without a key path and uses <a title=\"en/IndexedDB#gloss out-of-line key\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_out-of-line_key\">out-of-line keys</a>.","obsolete":false},{"name":"autoIncrement","help":"If true, the object store has a <a title=\"en/IndexedDB#gloss key generator\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_key_generator\">key generator</a>. Defaults to <code>false</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The method was not called from a <code><a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a></code> transaction callback. You must call <code>setVersion()</code> first.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR","name":"CONSTRAINT_ERR","help":"An object store with the given name (based on case-sensitive comparison) already exists in the connected database.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR","name":"NON_TRANSIENT_ERR","help":"<code>optionalParameters</code> has attributes other than <code>keyPath</code> and <code>autoIncrement</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The method was not called from a <code><a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a></code> transaction callback. You must call <code>setVersion()</code> first.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR","name":"NOT_FOUND_ERR","help":"You are trying to delete an object store that does not exist. Names are case sensitive.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The error is thrown for one of two reasons: <ul> <li>The <code>close()</code> method has been called on this IDBDatabase instance.</li> <li>The object store has been deleted or removed.</li> </ul>","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR","name":"NOT_FOUND_ERR","help":"One of the object stores doesn't exist in the connected database.","obsolete":false},{"name":"deleteObjectStore","help":"<p>Destroys the object store with the given name in the connected database, along with any indexes that reference it.&nbsp;</p>\n<p>As with <code>createObjectStore()</code>, this method can be called <em>only</em> within a <code><a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a></code> transaction. So you must call the <code>setVersion()</code> method first before you can remove any object store or index.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_2\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>name</dt> <dd>The name of the data store to delete.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<p><code>void</code></p>\n</div><div id=\"section_17\"><span id=\"Exceptions_2\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Exception</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title=\"en/IndexedDB/DatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The method was not called from a <code><a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a></code> transaction callback. You must call <code>setVersion()</code> first.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_FOUND_ERR</a></code></td> <td>You are trying to delete an object store that does not exist. Names are case sensitive.</td> </tr> </tbody>\n</table>\n</div>","idl":"<pre>IDBRequest deleteObjectStore(\n&nbsp; in DOMString <em>name</em>\n) raises (IDBDatabaseException);\n</pre>","obsolete":false},{"name":"transaction","help":"<p>Immediately returns an <a title=\"en/IndexedDB/IDBTransaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction\">IDBTransaction</a> object, and starts a transaction in a separate thread. &nbsp;The method returns a transaction object (<a title=\"en/IndexedDB/IDBTransaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction\"><code>IDBTransaction</code></a>) containing the <a title=\"en/IndexedDB/IDBTransaction#objectStore()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#objectStore()\">objectStore()</a> method, which you can use to access your object store.&nbsp;</p>\n\n<div id=\"section_22\"><span id=\"Parameters_4\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>storeNames</dt> <dd>The names of object stores and indexes that are in the scope of the new transaction. Specify only the object stores that you need to access.</dd> <dt>mode</dt> <dd><em>Optional</em>. The types of access that can be performed in the transaction. Transactions are opened in one of three modes: <code>READ_ONLY</code>, <code>READ_WRITE</code>, and <code>VERSION_CHANGE</code>. If you don't provide the parameter, the default access mode is <code>READ_ONLY</code>. To avoid slowing things down, don't open a <code>READ_WRITE</code> transaction, unless you actually need to write into the database.</dd>\n</dl>\n</div><div id=\"section_23\"><span id=\"Sample_code\"></span><h5 class=\"editable\">Sample code</h5>\n<p>To start a transaction with the following scope, you can use the code snippets in the table. As noted earlier:</p>\n<ul> <li>Add prefixes to the methods in WebKit browsers, (that is, instead of <code>IDBTransaction.READ_ONLY</code>, use <code>webkitIDBTransaction.READ_ONLY</code>).</li> <li>The default mode is <code>READ_ONLY</code>, so you don't really have to specify it. Of course, if you need to write into the object store, you can open the transaction in the <code>READ_WRITE</code> mode.</li>\n</ul>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"185\">Scope</th> <th scope=\"col\" width=\"1018\">Code</th> </tr> <tr> <td>Single object store</td> <td> <p><code>var transaction = db.transaction(['my-store-name'], IDBTransaction.READ_ONLY); </code></p> <p>Alternatively:</p> <p><code>var transaction = db.transaction('my-store-name', IDBTransaction.READ_ONLY);</code></p> </td> </tr> <tr> <td>Multiple object stores</td> <td><code>var transaction = db.transaction(['my-store-name', 'my-store-name2'], IDBTransaction.READ_ONLY);</code></td> </tr> <tr> <td>All object stores</td> <td> <p><code>var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);</code></p> <p>You cannot pass an empty array into the storeNames parameter, such as in the following: <code>var transaction = db.transaction([], IDBTransaction.READ_ONLY);.</code></p> <div class=\"warning\"><strong>Warning:</strong>&nbsp; Accessing all obejct stores under the <code>READ_WRITE</code> mode means that you can run only that transaction. You cannot have writing transactions with overlapping scopes.</div> </td> </tr> </thead> <tbody> </tbody>\n</table>\n</div><div id=\"section_24\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBTransaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeRequest\">IDBTransaction</a></code></dt> <dd>The transaction object.</dd>\n</dl>\n</div><div id=\"section_25\"><span id=\"Exceptions_3\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Exception</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title=\"en/IndexedDB/DatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The error is thrown for one of two reasons: <ul> <li>The <code>close()</code> method has been called on this IDBDatabase instance.</li> <li>The object store has been deleted or removed.</li> </ul> </td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_FOUND_ERR</a></code></td> <td>One of the object stores doesn't exist in the connected database.</td> </tr> </tbody>\n</table>\n</div>","idl":"<pre>IDBTransaction transaction(\n&nbsp; in optional any <em>storeNames</em>,\n&nbsp; in optional unsigned short <em>mode</em>&nbsp; \n) raises (IDBDatabaseException);</pre>","obsolete":false},{"name":"setVersion","help":"<div class=\"warning\"><strong>Warning:</strong> The latest draft of the specification dropped this method. Some not up-to-date browsers still implement this method. The new way is to define the version in the <code>IDBDatabase.open()</code> method and to create and delete object stores in the <code>onupdateneeded</code> event handler associated to the returned request.</div>\n<p>Updates the version of the database. Returns immediately and runs a <code><a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a></code> transaction on the connected database in a separate thread.</p>\n<p>Call this method before creating or deleting an object store.</p>\n\n<div id=\"section_19\"><span id=\"Parameters_3\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>version</dt> <dd>The version to store in the database.</dd>\n</dl>\n</div><div id=\"section_20\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBObjectStore\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeRequest\">IDBVersionChangeRequest</a></code></dt> <dd>The request to change the version of a database.</dd>\n</dl>\n</div>","idl":"<pre>IDBVersionChangeRequest setVersion(\n&nbsp; in DOMString <em>version</em>\n) raises (IDBDatabaseException);\n</pre>","obsolete":false},{"name":"createObjectStore","help":"<p>Creates and returns a new object store or index. The method takes the name of the store as well as a parameter object. The parameter object lets you define important optional properties. You can use the property to uniquely identify individual objects in the store. As the property is an identifier, it should be unique to every object, and every object should have that property.</p>\n<p>But before you can create any object store or index,&nbsp;you must first call the <code><a href=\"#setVersion()\">setVersion()</a></code><a href=\"#setVersion()\"> method</a>.</p>\n\n<div id=\"section_11\"><span id=\"Parameters\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>name</dt> <dd>The name of the new object store.</dd> <dt>optionalParameters</dt> <dd> <div class=\"warning\"><strong>Warning:</strong> The latest draft of the specification changed this to <code>IDBDatabaseOptionalParameters</code>, which is not yet recognized by any browser</div> <p><em>Optional</em>. Options object whose attributes are optional parameters to the method. It includes the following properties:</p> <table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Attribute</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code>keyPath</code></td> <td>The <a title=\"en/IndexedDB#gloss key path\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_key_path\">key path</a> to be used by the new object store. If empty or not specified, the object store is created without a key path and uses <a title=\"en/IndexedDB#gloss out-of-line key\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_out-of-line_key\">out-of-line keys</a>.</td> </tr> <tr> <td><code>autoIncrement</code></td> <td>If true, the object store has a <a title=\"en/IndexedDB#gloss key generator\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_key_generator\">key generator</a>. Defaults to <code>false</code>.</td> </tr> </tbody> </table> <p>Unknown parameters are ignored.</p> </dd>\n</dl>\n</div><div id=\"section_12\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBObjectStore\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBObjectStore\">IDBObjectStore</a></code></dt> <dd>The newly created object store.</dd>\n</dl>\n</div><div id=\"section_13\"><span id=\"Exceptions\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Exception</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title=\"en/IndexedDB/DatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The method was not called from a <code><a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a></code> transaction callback. You must call <code>setVersion()</code> first.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/DatabaseException#CONSTRAINT ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR\">CONSTRAINT_ERR</a></code></td> <td>An object store with the given name (based on case-sensitive comparison) already exists in the connected database.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR\">NON_TRANSIENT_ERR</a></code></td> <td><code>optionalParameters</code> has attributes other than <code>keyPath</code> and <code>autoIncrement</code>.</td> </tr> </tbody>\n</table>\n</div>","idl":"<pre>IDBObjectStore createObjectStore(\n&nbsp; in DOMString <em>name</em>,\n&nbsp; in <code>Object <em>optionalParameters</em></code>\n) raises (IDBDatabaseException);\n</pre>","obsolete":false},{"name":"close","help":"<p>Returns immediately and closes the connection in a separate thread. The connection is not actually closed until all transactions created using this connection are complete. No new transactions can be created for this connection once this method is called. Methods that create transactions throw an exception if a closing operation is pending.</p>\n<pre>void close();\n</pre>","obsolete":false},{"url":"","name":"name","help":"Name of the connected database.","obsolete":false},{"url":"","name":"version","help":"The version of the connected database. When a database is first created, this attribute is the empty string.","obsolete":false},{"url":"","name":"objectStoreNames","help":"A list of the names of the <a title=\"en/IndexedDB#gloss object store\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_object_store\">object stores</a> currently in the connected database.","obsolete":false},{"name":"onabort","help":"","obsolete":false},{"name":"onerror","help":"","obsolete":false},{"name":"onversionchange","help":"","obsolete":false}]},"CSSRule":{"title":"CSSRule","srcUrl":"https://developer.mozilla.org/en/DOM/cssRule","specification":"<li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule\" title=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule\" target=\"_blank\">DOM Level 2 CSS: CSSRule</a></li> <li><a class=\" external\" title=\"http://dev.w3.org/csswg/cssom/#css-rules\" rel=\"external\" href=\"http://dev.w3.org/csswg/cssom/#css-rules\" target=\"_blank\">CSS Object Model: CSS Rules</a></li>","seeAlso":"Using dynamic styling information","summary":"<p>An object implementing the <code>CSSRule</code> DOM interface represents a single CSS rule. References to a <code>CSSRule</code>-implementing object may be obtained by looking at a <a title=\"en/DOM/stylesheet\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSSStyleSheet\">CSS style sheet's</a> <code><a title=\"en/DOM/CSSStyleSheet/cssRules\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSSStyleSheet\">cssRules</a></code> list.</p>\n<p>There are several kinds of rules. The <code>CSSRule</code> interface specifies the properties common to all rules, while properties unique to specific rule types are specified in the more specialized interfaces for those rules' respective types.</p>","members":[{"name":"STYLE_RULE","help":"","obsolete":false},{"name":"MEDIA_RULE","help":"","obsolete":false},{"name":"FONT_FACE_RULE","help":"","obsolete":false},{"name":"PAGE_RULE","help":"","obsolete":false},{"name":"IMPORT_RULE","help":"","obsolete":false},{"name":"CHARSET_RULE","help":"","obsolete":false},{"name":"UNKNOWN_RULE","help":"","obsolete":false},{"name":"KEYFRAMES_RULE","help":"","obsolete":false},{"name":"KEYFRAME_RULE","help":"","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/cssRule/parentRule","name":"parentRule","help":"Returns the containing rule, otherwise <code>null</code>. E.g. if this rule is a style rule inside an <code><a title=\"en/CSS/@media\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/@media\">@media</a></code> block, the parent rule would be that <code><a title=\"en/DOM/CSSMediaRule\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSSMediaRule\">CSSMediaRule</a></code>."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/CSSRule/parentStyleSheet","name":"parentStyleSheet","help":"Returns the <code><a title=\"en/DOM/CSSStyleSheet\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSSStyleSheet\">CSSStyleSheet</a></code> object for the style sheet that contains this rule"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/CSSRule/cssText","name":"cssText","help":"Returns the textual representation of the rule, e.g. <code>\"h1,h2 { font-size: 16pt }\"</code>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/cssRule/type","name":"type","help":"One of the <a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/cssRule#Type_constants\">Type constants</a>&nbsp;indicating the type of CSS&nbsp;rule."}]},"DOMSelection":{"title":"Selection","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.getSelection\">window.getSelection</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document.getSelection\">document.getSelection</a></code>\n, <a title=\"en/dom/Range\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/range\">Range</a>","summary":"<p>Selection is the class of the object returned by <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.getSelection\">window.getSelection()</a></code>\n and other methods. It represents the text selection in the greater page, possibly spanning multiple elements, when the user drags over static text and other parts of the page. For information about text selection in an individual text editing element, see <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLInputElement\">Input</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLTextAreaElement\">TextArea</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document.activeElement\">document.activeElement</a></code>\n which typically return the parent object returned from <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.getSelection\">window.getSelection()</a></code>\n.</p>\n<p>A selection object represents the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/range\">ranges</a></code>\n that the user has selected. Typically, it holds only one range, accessed as follows:</p>\n\n          <pre name=\"code\" class=\"js\">var selObj = window.getSelection();\nvar range  = selObj.getRangeAt(0);</pre>\n        \n<ul> <li><code>selObj</code> is a Selection object</li> <li><code>range</code> is a <a title=\"en/DOM/Range\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/range\">Range</a> object</li>\n</ul>\n<p>Calling the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Selection/toString\">Selection/toString()</a></code>\n method returns the text contained in the selection, e.g</p>\n\n          <pre name=\"code\" class=\"js\">var selObj = window.getSelection();\nwindow.alert(selObj);</pre>\n        \n<p>Note that using a selection object as the argument to <code>window.alert</code> will call the object's <code>toString</code> method.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/selectAllChildren","name":"selectAllChildren","help":"Adds all the children of the specified node to the selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/removeRange","name":"removeRange","help":"Removes a range from the selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/extend","name":"extend","help":"Moves the focus of the selection to a specified point."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/modify","name":"modify","help":"Changes the current selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/addRange","name":"addRange","help":"A range object that will be added to the selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/collapseToStart","name":"collapseToStart","help":"Collapses the selection to the start of the first range in the selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/collapseToEnd","name":"collapseToEnd","help":"Collapses the selection to the end of the last range in the selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/toString","name":"toString","help":"Returns a string currently being represented by the selection object, i.e. the currently selected text."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/selectionLanguageChange","name":"selectionLanguageChange","help":"Modifies the cursor Bidi level after a change in keyboard direction."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/getRangeAt","name":"getRangeAt","help":"Returns a range object representing one of the ranges currently selected."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/collapse","name":"collapse","help":"Collapses the current selection to a single point."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/removeAllRanges","name":"removeAllRanges","help":"Removes all ranges from the selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/deleteFromDocument","name":"deleteFromDocument","help":"Deletes the selection's content from the document."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/containsNode","name":"containsNode","help":"Indicates if a certain node is part of the selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/focusOffset","name":"focusOffset","help":"Returns the number of characters that the selection's focus is offset within the focusNode."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/rangeCount","name":"rangeCount","help":"Returns the number of ranges in the selection."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/anchorNode","name":"anchorNode","help":"Returns the node in which the selection begins."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/anchorOffset","name":"anchorOffset","help":"Returns the number of characters that the selection's anchor is offset within the anchorNode."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/isCollapsed","name":"isCollapsed","help":"Returns a Boolean indicating whether the selection's start and end points are at the same position."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Selection/focusNode","name":"focusNode","help":"Returns the node in which the selection ends."}],"srcUrl":"https://developer.mozilla.org/en/DOM/Selection"},"SVGPathSegArcRel":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"CSSStyleRule":{"title":"CSSStyleRule","seeAlso":"CSSRule","summary":"An object representing a single CSS style rule. <code>CSSStyleRule</code> implements the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/CSSRule\">CSSRule</a></code>\n interface.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/CSSStyleRule/selectorText","name":"selectorText","help":"Gets/sets the textual representation of the selector for this rule, e.g. <code>\"h1,h2\"</code>."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/CSSStyleRule/style","name":"style","help":"Returns the <code><a title=\"en/DOM/CSSStyleDeclaration\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSSStyleDeclaration\">CSSStyleDeclaration</a></code> object for the rule. <strong>Read only.</strong>"}],"srcUrl":"https://developer.mozilla.org/en/DOM/CSSStyleRule"},"Blob":{"title":"Blob","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>5 \n<span title=\"prefix\">webkit</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span>\n<span title=\"prefix\">moz</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/Blob","seeAlso":"<li>\n<a rel=\"custom\" href=\"http://www.w3.org/TR/FileAPI/#dfn-Blob\">File API Specification: Blob</a><span title=\"Working Draft\">WD</span></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/BlobBuilder\">BlobBuilder</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData\">FormData</a></code>\n</li>","summary":"<div><p><strong>This is an experimental feature</strong><br>Because this feature is still in development in some browsers, check the <a href=\"#AutoCompatibilityTable\">compatibility table</a> for the proper prefixes to use in various browsers.</p></div>\n<p></p>\n<p>A <code>Blob</code> object represents a file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n interface is based on <code>Blob</code>, inheriting blob functionality and expanding it to support files on the user's system.</p>\n<p>An easy way to construct a <code>Blob</code> is by using the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/BlobBuilder\">BlobBuilder</a></code>\n interface, which lets you iteratively append data to a blob, then retrieve the completed blob when you're ready to use it for something. Another way is to use the <code>slice()</code> method to create a blob that contains a subset of another blob's data.</p>\n<div class=\"note\"><strong>Note:</strong> The <code>slice()</code> method has vendor prefixes: <code>blob.mozSlice()</code> for Firefox and <code>blob.webkitSlice()</code> for Chrome. An old version of the <code>slice()</code> method, without vendor prefixes, had different semantics, as described below.</div>","members":[{"name":"size","help":"The size, in bytes, of the data contained in the <code>Blob</code> object. <strong>Read only.</strong>","obsolete":false},{"name":"type","help":"An ASCII-encoded string, in all lower case, indicating the MIME&nbsp;type of the data contained in the <code>Blob</code>. If the type is unknown, this string is empty. <strong>Read only.</strong>","obsolete":false}]},"HTMLHRElement":{"title":"HTMLHRElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/hr\">&lt;hr&gt;</a></code>\n HTML&nbsp;element","summary":"DOM <code>hr</code> elements expose the <a target=\"_blank\" rel=\"external nofollow\" class=\" external\" title=\"http://www.w3.org/TR/html5/grouping-content.html#htmlhrelement\" href=\"http://www.w3.org/TR/html5/grouping-content.html#htmlhrelement\">HTMLHRElement</a> (or <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a target=\"_blank\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-68228811\" rel=\"external nofollow\" class=\" external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-68228811\"><code>HTMLHRElement</code></a>) interface, which provides special properties (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating <code>hr</code> elements. In <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML 5</a></span>, this interface inherits from HTMLElement, but defines no additional members.","members":[{"name":"align","help":"Enumerated attribute indicating alignment of the rule with respect to the surrounding context.","obsolete":true},{"name":"noshade","help":"Sets the rule to have no shading.","obsolete":true},{"name":"size","help":"The height of the rule.","obsolete":true},{"name":"width","help":"The width of the rule on the page.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLHRElement"},"DirectoryReader":{"title":"DirectoryReader","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>13\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<div><strong>`DRAFT</strong> <div>This page is not complete.</div>\n</div>\n<p>The <code>DirectoryReader</code> interface of the <a title=\"en/DOM/File_API/File_System_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File_API/File_System_API\">FileSystem API</a> lets a user list files and directories in a directory.</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/DirectoryReader"},"WebKitBlobBuilder":{"title":"BlobBuilder","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td> <p>8</p> <p>As <code>WebKitBlobBuilder</code>.</p> </td> <td> <p>6.0 (6.0)\n</p> <p>As <code>MozBlobBuilder</code>.</p> </td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td> <p>\n<em>Nightly build</em></p> <p>As <code>WebKitBlobBuilder</code>.</p> </td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td> <p>6.0 (6.0)\n</p> <p>As <code>MozBlobBuilder</code>.</p> </td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/BlobBuilder","seeAlso":"<li>\n<a rel=\"custom\" href=\"http://dev.w3.org/2009/dap/file-system/file-writer.html#idl-def-BlobBuilder\">File API Specification: BlobBuilder</a><span title=\"Working Draft\">WD</span></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n</li>","summary":"<div><p><strong>This is an experimental feature</strong><br>Because this feature is still in development in some browsers, check the <a href=\"#AutoCompatibilityTable\">compatibility table</a> for the proper prefixes to use in various browsers.</p></div>\n<p></p>\n<p>The <code>BlobBuilder</code> interface provides an easy way to construct <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n objects. Just create a <code>BlobBuilder</code> and append chunks of data to it by calling the  method. When you're done building your blob, call  to retrieve a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n containing the data you sent into the blob builder.</p>","members":[{"name":"getBlob","help":"<p>Returns the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n object that has been constructed using the data passed through calls to .</p>\n\n<div id=\"section_6\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt>contentType \n<span title=\"\">Optional</span>\n</dt> <dd>The MIME type of the data to be returned in the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n. This will be the value of the <code>Blob</code> object's type property.</dd>\n</dl>\n</div><div id=\"section_7\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n object containing all of the data passed to any calls to &nbsp;made since the <code>BlobBuilder</code> was created. This also resets the BlobBuilder so that the next call to &nbsp;is starting a new, empty blob.</p>\n</div>","idl":"<pre class=\"eval\">Blob getBlob(\n&nbsp; in DOMString contentType \n<span style=\"border: 1px solid #9ED2A4; background-color: #C0FFC7; font-size: x-small; white-space: nowrap; padding: 2px;\" title=\"\">Optional</span>\n\n); \n</pre>","obsolete":false},{"name":"append","help":"<p>Appends the contents of the specified JavaScript object to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n being built. If the value you specify isn't a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n, <a title=\"en/JavaScript typed arrays/Arraybuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>, or <a title=\"en/JavaScript/Reference/Global Objects/String\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String\"><code>String</code></a>, the value is coerced to a string before being appended to the blob.</p>\n<pre>void append(\n&nbsp; in ArrayBuffer data\n};\n\nvoid append(\n&nbsp; in Blob data\n};\n\n\nvoid append(\n&nbsp; in String data,\n  [optional] in String endings\n};\n</pre>\n<div id=\"section_4\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>data</code></dt> <dd>The data to append to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n being constructed.</dd> <dt><code>endings</code></dt> <dd>Specifies how strings containing <code>\\n</code> are to be written out. This can be <code>\"transparent\"</code> (endings unchanged) or <code>\"native\"</code> (endings changed to match host OS filesystem convention). The default value is <code>\"transparent\"</code>.</dd>\n</dl>\n</div>","obsolete":false}]},"HTMLParamElement":{"title":"param","examples":["Please see the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object\">&lt;object&gt;</a></code>\n page for examples on &lt;param&gt;."],"summary":"<strong>Parameter </strong>element which defines parameters for <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object\">&lt;object&gt;</a></code>\n.","members":[{"obsolete":false,"url":"","name":"valuetype","help":"<p>Specifies the type of the <code>value</code> attribute. Possible values are:</p> <ul> <li>data: Default value. The value is passed to the object's implementation as a string.</li> <li>ref: The value is a URI to a resource where run-time values are stored.</li> <li>object: An ID of another <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/object\">&lt;object&gt;</a></code>\n in the same document.</li> </ul>"},{"obsolete":false,"url":"","name":"name","help":"Name of the parameter."},{"obsolete":false,"url":"","name":"type","help":"Only used if the <code>valuetype</code> is set to \"ref\". Specifies the type of values found at the URI specified by value."},{"obsolete":false,"url":"","name":"value","help":"Value of the parameter."}],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/param"},"SVGMetadataElement":{"title":"metadata","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> \n<tr><th scope=\"col\">Feature</th><th scope=\"col\">Chrome</th><th scope=\"col\">Firefox (Gecko)</th><th scope=\"col\">Internet Explorer</th><th scope=\"col\">Opera</th><th scope=\"col\">Safari</th></tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.5 (1.8)\n</td> <td>\n9.0</td> <td>\n8.0</td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>\n3.0</td> <td>1.0 (1.8)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<p>The chart is based on <a title=\"en/SVG/Compatibility sources\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Compatibility_sources\">these sources</a>.</p>","summary":"Metadata is structured data about data. Metadata which is included with SVG content should be specified within <code>metadata</code> elements. The contents of the <code>metadata</code> should be elements from other XML namespaces such as RDF, FOAF, etc.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/metadata"},"Notification":{"title":"notification","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/navigator.mozNotification\">navigator.mozNotification</a></code>\n</li> <li><a title=\"en/DOM/Displaying notifications\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Displaying_notifications\">Displaying notifications</a></li>","summary":"<div class=\"geckoMinversionHeaderTemplate\"><p>Mobile Only in Gecko 2.0</p><p>Available only in Firefox Mobile as of Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n</p></div>\n\n<div><p>Non-standard</p></div><p></p>\n<p>The notification object, which you create using the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/navigator.mozNotification\">navigator.mozNotification</a></code>\n&nbsp;object's <code>createNotification()</code>&nbsp;method, is used to configure and display desktop notifications to the user.</p>","members":[{"name":"show","help":"Displays the notification.","idl":"<pre class=\"eval\">void show();\n</pre>","obsolete":false},{"name":"onclick","help":"&nbsp;A function to call when the notification is clicked.","obsolete":false},{"name":"onclose","help":"&nbsp;A function to call when the notification is dismissed.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/notification"},"HTMLTitleElement":{"title":"HTMLTitleElement","summary":"The <code>title</code> object exposes the <a target=\"_blank\" class=\" external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-79243169\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-79243169\">HTMLTitleElement</a> interface which contains the title for a document.&nbsp; This element inherits all of the properties and methods described in the <a title=\"en/DOM/element\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> section.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/title.text","name":"text","help":"Gets or sets the text content of the document's title."}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLTitleElement"},"Performance":{"title":"Performance","summary":"The articles linked to from here will help you improve performance, whether you're developing core Mozilla code or an add-on.","members":[],"srcUrl":"https://developer.mozilla.org/en/Performance"},"MessagePort":{"title":"nsIWorkerMessagePort","seeAlso":"<li><a class=\"internal\" title=\"En/Using DOM workers\" rel=\"internal\" href=\"https://developer.mozilla.org/En/Using_web_workers\">Using web workers</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIWorkerMessageEvent\">nsIWorkerMessageEvent</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIWorkerGlobalScope\">nsIWorkerGlobalScope</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIWorkerScope\">nsIWorkerScope</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIAbstractWorker\">nsIAbstractWorker</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIWorker\">nsIWorker</a></code>\n</li>","summary":"<div>\n\n<a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/threads/nsIDOMWorkers.idl\"><code>dom/interfaces/threads/nsIDOMWorkers.idl</code></a><span><a rel=\"internal\" href=\"https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces\" title=\"en/Interfaces/About_Scriptable_Interfaces\">Scriptable</a></span></div><span>This interface represents a worker thread's message port, which is used to allow the worker to post messages back to its creator.</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 1.9.1</div><div title=\"Introduced in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n\"></div><div title=\"Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n\"></div></div>\n<div>Inherits from: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsISupports\">nsISupports</a></code>\n<span>Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n</span></div>","members":[{"name":"postMessage","help":"<p>Posts a message into the event queue.</p>\n\n<div id=\"section_4\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>aMessage</code></dt> <dd>The message to post.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\"> void postMessage(\n   in DOMString aMessage\n );\n</pre>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIWorkerMessagePort"},"HTMLHeadingElement":{"title":"HTMLHeadingElement","seeAlso":"HTML&nbsp;Heading elements","summary":"DOM heading elements expose the <a title=\"http://www.w3.org/TR/html5/sections.html#htmlheadingelement\" class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/html5/sections.html#htmlheadingelement\" target=\"_blank\">HTMLHeadingElement</a> (or <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" rel=\"external nofollow\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-43345119\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-43345119\" target=\"_blank\"><code>HTMLHeadingElement</code></a>) interface. In <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML 5</a></span>, this interface inherits from HTMLElement, but defines no additional members, though in <span><a rel=\"custom nofollow\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> it introduces the deprecated <code>align</code> property.","members":[{"name":"align","help":"Enumerated attribute indicating alignment of the heading with respect to the surrounding context.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLHeadingElement"},"SVGFontFaceElement":{"title":"SVGFontFaceElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGFontFaceElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face\">&lt;font-face&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGFontFaceElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face\">&lt;font-face&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face\">&lt;font-face&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"SVGExternalResourcesRequired":{"title":"SVGImageElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGImageElement","skipped":true,"cause":"Suspect title"},"WebKitAnimationEvent":{"title":"AnimationEvent","srcUrl":"https://developer.mozilla.org/en/DOM/event/AnimationEvent","specification":"<a rel=\"custom\" href=\"http://www.w3.org/TR/css3-animations/#animation-events-\">CSS Animations Module Level 3: Animation Events</a><span title=\"Working Draft\">WD</span>","seeAlso":"<li><a rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/CSS_animations\" title=\"en/CSS/CSS_animations\">CSS animations</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation\">animation</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-delay\">animation-delay</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-direction\">animation-direction</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-duration\">animation-duration</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-fill-mode\">animation-fill-mode</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-iteration-count\">animation-iteration-count</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-name\">animation-name</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-play-state\">animation-play-state</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/animation-timing-function\">animation-timing-function</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/@keyframes\">@keyframes</a></code>\n</li>","summary":"<code>AnimationEvent</code> objects provide information about events that occur related to <a rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/CSS_animations\" title=\"en/CSS/CSS_animations\">CSS animations</a>.","members":[{"name":"animationName","help":"The name of the animation on which the animation event occurred.","obsolete":false},{"name":"elapsedTime","help":"The amount of time, in seconds, the animation had been running at the time the event occurred.","obsolete":false}]},"HTMLBodyElement":{"title":"HTMLBodyElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body\">&lt;body&gt;</a></code>\n HTML&nbsp;element","summary":"DOM body elements expose the <a href=\"http://www.w3.org/TR/html5/sections.html#the-body-element\" target=\"_blank\" rel=\"external nofollow\" class=\" external\" title=\"http://www.w3.org/TR/html5/sections.html#the-body-element\">HTMLBodyElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-48250443\" target=\"_blank\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-48250443\" rel=\"external nofollow\" class=\" external\"><code>HTMLBodyElement</code></a>) interface, which provides special properties (beyond the regular <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a></code>\n object interface they also have available to them by inheritance) for manipulating body elements.","members":[{"name":"aLink","help":"Color of active hyperlinks.","obsolete":true},{"name":"background","help":"<p>URI for a background image resource.</p> <div class=\"note\"><strong>Note:</strong> Starting in Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n, this value is no longer resolved as a URI; instead, it's treated as a simple string.</div>","obsolete":true},{"name":"bgColor","help":"Background color for the document.","obsolete":true},{"name":"link","help":"Color of unvisited links.","obsolete":true},{"name":"onafterprint","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onafterprint\">onafterprint</a></code>\n HTML&nbsp;attribute value for a function to call after the user has printed the document.","obsolete":false},{"name":"onbeforeprint","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onbeforeprint\">onbeforeprint</a></code>\n HTML&nbsp;attribute value for a function to call when the user has requested printing the document.","obsolete":false},{"name":"onbeforeunload","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onbeforeunload\">onbeforeunload</a></code>\n HTML&nbsp;attribute value for a function to call when the document is about to be unloaded.","obsolete":false},{"name":"onblur","help":"<p>Exposes the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.onblur\">window.onblur</a></code>\n event handler to call when the window loses focus.</p> <div class=\"note\"><strong>Note:</strong> This handler is triggered when the event reaches the window, not the body element. Use <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element.addEventListener\">addEventListener()</a></code>\n to attach an event listener to the body element.</div>","obsolete":false},{"name":"onerror","help":"<p>Exposes the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.onerror\">window.onerror</a></code>\n event handler to call when the document fails to load properly.</p> <div class=\"note\"><strong>Note:</strong> This handler is triggered when the event reaches the window, not the body element. Use <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element.addEventListener\">addEventListener()</a></code>\n to attach an event listener to the body element.</div>","obsolete":false},{"name":"onfocus","help":"<p>Exposes the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.onfocus\">window.onfocus</a></code>\n event handler to call when the window gains focus.</p> <div class=\"note\"><strong>Note:</strong> This handler is triggered when the event reaches the window, not the body element. Use <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element.addEventListener\">addEventListener()</a></code>\n to attach an event listener to the body element.</div>","obsolete":false},{"name":"onhashchange","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onhashchange\">onhashchange</a></code>\n HTML&nbsp;attribute value for a function to call when the fragment identifier in the address of the document changes.","obsolete":false},{"name":"onload","help":"<p>Exposes the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/window.onload\">window.onload</a></code>\n event handler to call when the window gains focus.</p> <div class=\"note\"><strong>Note:</strong> This handler is triggered when the event reaches the window, not the body element. Use <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element.addEventListener\">addEventListener()</a></code>\n to attach an event listener to the body element.</div>","obsolete":false},{"name":"onmessage","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onmessage\">onmessage</a></code>\n HTML&nbsp;attribute value for a function to call when the document receives a message.","obsolete":false},{"name":"onoffline","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onoffline\">onoffline</a></code>\n HTML&nbsp;attribute value for a function to call when network communication fails.","obsolete":false},{"name":"ononline","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-ononline\">ononline</a></code>\n HTML&nbsp;attribute value for a function to call when network communication is restored.","obsolete":false},{"name":"onpopstate","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onpopstate\">onpopstate</a></code>\n HTML&nbsp;attribute value for a function to call when the user has navigated session history.","obsolete":false},{"name":"onredo","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onredo\">onredo</a></code>\n HTML&nbsp;attribute value for a function to call when the user has moved forward in undo transaction history.","obsolete":false},{"name":"onresize","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onresize\">onresize</a></code>\n HTML&nbsp;attribute value for a function to call when the document has been resized.","obsolete":false},{"name":"onstorage","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onpopstate\">onpopstate</a></code>\n HTML&nbsp;attribute value for a function to call when the storage area has changed.","obsolete":false},{"name":"onundo","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onundo\">onundo</a></code>\n HTML&nbsp;attribute value for a function to call when the user has moved backward in undo transaction history.","obsolete":false},{"name":"onunload","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body#attr-onunload\">onunload</a></code>\n HTML&nbsp;attribute value for a function to call when when the document is going away.","obsolete":false},{"name":"text","help":"Foreground color of text.","obsolete":true},{"name":"vLink","help":"Color of visited links.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLBodyElement"},"Uint8Array":{"title":"Uint8Array","srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint8Array","seeAlso":"<li><a title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" class=\" link-https\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"<p>The <code>UInt8Array</code> type represents an array of 8-bit unsigned integers.</p>\n<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>","constructor":"<div class=\"note\"><strong>Note:</strong> In these methods, <code><em>TypedArray</em></code> represents any of the <a title=\"en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses\">typed array object types</a>.</div>\n<table class=\"standard-table\"> <tbody> <tr> <td><code>Uint8Array <a title=\"en/JavaScript typed arrays/Uint8Array#Int8Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint8Array#Int8Array%28%29\">Uint8Array</a>(unsigned long length);<br> </code></td> </tr> <tr> <td><code>Uint8Array </code><code><a title=\"en/JavaScript typed arrays/Uint8Array#Int8Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint8Array#Int8Array%28%29\">Uint8Array</a></code><code>(<em>TypedArray</em> array);<br> </code></td> </tr> <tr> <td><code>Uint8Array </code><code><a title=\"en/JavaScript typed arrays/Uint8Array#Int8Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint8Array#Int8Array%28%29\">Uint8Array</a></code><code>(sequence&lt;type&gt; array);<br> </code></td> </tr> <tr> <td><code>Uint8Array </code><code><a title=\"en/JavaScript typed arrays/Uint8Array#Int8Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint8Array#Int8Array%28%29\">Uint8Array</a></code><code>(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length);<br> </code></td> </tr> </tbody>\n</table><p>Returns a new Uint8Array object.</p>\n<pre>Uint8Array Uint8Array(\n&nbsp; unsigned long length\n);\n\nUint8Array Uint8Array(\n&nbsp; <em>TypedArray</em> array\n);\n\nUint8Array Uint8Array(\n&nbsp; sequence&lt;type&gt; array\n);\n\nUint8Array Uint8Array(\n&nbsp; ArrayBuffer buffer,\n&nbsp; optional unsigned long byteOffset,\n&nbsp; optional unsigned long length\n);\n</pre>\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>length</code></dt> <dd>The number of elements in the byte array. If unspecified, length of the array view will match the buffer's length.</dd> <dt><code>array</code></dt> <dd>An object of any of the typed array types (such as <code>Int32Array</code>), or a sequence of objects of a particular type, to copy into a new <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>. Each value in the source array is converted to an 8-bit unsigned integer before being copied into the new array.</dd> <dt><code>buffer</code></dt> <dd>An existing <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> to use as the storage for the new <code>Uint8Array</code> object.</dd> <dt><code>byteOffset<br> </code></dt> <dd>The offset, in bytes, to the first byte in the specified buffer for the new view to reference. If not specified, the <code>Uint8Array</code>'s view of the buffer will start with the first byte.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>Uint8Array</code> object representing the specified data buffer.</p>\n</div>","members":[{"name":"subarray","help":"<p>Returns a new <code>Uint8Array</code> view on the <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> store for this <code>Uint8Array</code> object.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Uint8Array</code> object.</dd> <dt><code>end</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The offset to the element after last element in the array to be referenced by the new <code>Uint8Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Notes_2\"></span><h6 class=\"editable\">Notes</h6>\n<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either begin or end is negative, it refers to an index from the end of the array instead of from the beginning.</p>\n<div class=\"note\"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div></div>","idl":"<pre>Uint8Array subarray(\n&nbsp; long begin,\n&nbsp; optional long end\n);\n</pre>","obsolete":false},{"name":"set","help":"<p>Sets multiple values in the typed array, reading input values from a specified array.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>array</code></dt> <dd>An array from which to copy values. All values from the source array are copied into the target array, unless the length of the source array plus the offset exceeds the length of the target array, in which case an exception is thrown. If the source array is a typed array, the two arrays may share the same underlying <code><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>; the browser will intelligently copy the source range of the buffer to the destination range.</dd> <dt>offset \n<span title=\"\">Optional</span>\n</dt> <dd>The offset into the target array at which to begin writing values from the source <code>array</code>. If you omit this value, 0 is assumed (that is, the source <code>array</code> will overwrite values in the target array starting at index 0).</dd>\n</dl>\n</div>","idl":"<pre>void set(\n&nbsp; <em>TypedArray</em> array,\n&nbsp; optional unsigned long offset\n);\n\nvoid set(\n&nbsp; type[] array,\n&nbsp; optional unsigned long offset\n);\n</pre>","obsolete":false},{"name":"BYTES_PER_ELEMENT","help":"The size, in bytes, of each array element.","obsolete":false},{"name":"length","help":"The number of entries in the array; for these 8-bit values, this is the same as the size of the array in bytes. <strong>Read only.</strong>","obsolete":false}]},"NodeList":{"title":"NodeList","examples":["<p>It's possible to loop over the items in a <code>NodeList</code> using:</p>\n\n          <pre name=\"code\" class=\"js\">for (var i = 0; i &lt; myNodeList.length; ++i) {\n  var item = myNodeList[i];  // Calling myNodeList.item(i) isn't necessary in JavaScript\n}</pre>\n        \n<p>Don't be tempted to use <code><a title=\"en/Core JavaScript 1.5 Reference/Statements/for...in\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in\">for...in</a></code> or <code><a title=\"en/Core JavaScript 1.5 Reference/Statements/for each...in\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript/Reference/Statements/for_each...in\">for each...in</a></code> to enumerate the items in the list, since that will also enumerate the length and item properties of the <code>NodeList</code> and cause errors if your script assumes it only has to deal with <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a></code>\n objects.</p>"],"srcUrl":"https://developer.mozilla.org/En/DOM/NodeList","specification":"DOM Level 3","summary":"NodeList objects are collections of nodes returned by <a title=\"document.getElementsByTagName\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.getElementsByTagName\"><code>getElementsByTagName</code></a>, <a title=\"document.getElementsByTagNameNS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.getElementsByTagNameNS\"><code>getElementsByTagNameNS</code></a>, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.childNodes\">Node.childNodes</a></code>\n, <a title=\"document.querySelectorAll\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Document.querySelectorAll\">querySelectorAll</a>, <a title=\"document.getElementsByClassName\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.getElementsByClassName\"><code>getElementsByClassName</code></a>, etc.NodeList objects are collections of nodes returned by <a title=\"document.getElementsByTagName\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.getElementsByTagName\"><code>getElementsByTagName</code></a>, <a title=\"document.getElementsByTagNameNS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.getElementsByTagNameNS\"><code>getElementsByTagNameNS</code></a>, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.childNodes\">Node.childNodes</a></code>\n, <a title=\"document.querySelectorAll\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Document.querySelectorAll\">querySelectorAll</a>, <a title=\"document.getElementsByClassName\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.getElementsByClassName\"><code>getElementsByClassName</code></a>, etc.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/NodeList.item","name":"item","help":"Returns an item in the list by its index, or <code>null</code> if out-of-bounds. Equivalent to nodeList[idx]"},{"name":"length","help":"Reflects the number of elements in the NodeList.&nbsp;","obsolete":false}]},"DOMURL":{"title":"Drawing DOM objects into a canvas","members":[],"srcUrl":"https://developer.mozilla.org/en/HTML/Canvas/Drawing_DOM_objects_into_a_canvas","skipped":true,"cause":"Suspect title"},"FileError":{"title":"FileError","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/FileReader\">FileReader</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n</li> <li>\n<a rel=\"custom\" href=\"http://www.w3.org/TR/FileAPI/#FileErrorInterface\">Specification: FileAPI FileError</a><span title=\"Working Draft\">WD</span></li>","summary":"Represents an error that occurs while using the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/FileReader\">FileReader</a></code>\n interface.","members":[{"name":"ABORT_ERR","help":"The file operation was aborted, probably due to a call to the <code>FileReader</code> <code>abort()</code>&nbsp;method.","obsolete":false},{"name":"ENCODING_ERR","help":"The file data cannot be accurately represented in a data URL.","obsolete":false},{"name":"NOT_FOUND_ERR","help":"File not found.","obsolete":false},{"name":"NOT_READABLE_ERR","help":"File could not be read.","obsolete":false},{"name":"SECURITY_ERR","help":"The file could not be accessed for security reasons.","obsolete":false},{"name":"code","help":"The <a title=\"en/nsIDOMFileError#Error codes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/nsIDOMFileError#Error_codes\">error code</a>.","obsolete":false},{"name":"code","help":"The <a title=\"en/nsIDOMFileError#Error codes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/nsIDOMFileError#Error_codes\">error code</a>.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/FileError"},"CSSMediaRule":{"title":"cssMediaRule","srcUrl":"https://developer.mozilla.org/en/DOM/cssMediaRule","specification":"<li><a class=\"external\" title=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule\" target=\"_blank\">DOM Level 2 CSS: CSSRule</a></li> <li><a class=\"external\" title=\"http://dev.w3.org/csswg/cssom/#cssmediarule\" rel=\"external\" href=\"http://dev.w3.org/csswg/cssom/#cssmediarule\" target=\"_blank\">CSS Object Model: CSS Media Rule</a></li>","seeAlso":"CSSRule","summary":"An object representing a single CSS media rule.&nbsp;<code>CSSMediaRule</code>&nbsp;implements the&nbsp;<code><a href=\"https://developer.mozilla.org/en/DOM/CSSRule\" rel=\"custom\">CSSRule</a></code>&nbsp;interface.","members":[{"name":"insertRule","help":"Inserts a new style rule into the current style sheet.","obsolete":false},{"name":"deleteRule","help":"Deletes a rule from the style sheet.","obsolete":false},{"name":"media","help":"Specifies the intended destination medium for style information.","obsolete":false},{"name":"cssRules","help":"Returns a <code><a title=\"en/DOM/CSSRuleList\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSSRuleList\">CSSRuleList</a></code> of the CSS rules in the media rule.","obsolete":false}]},"HTMLElement":{"title":"element","summary":"<p>This chapter provides a brief reference for the general methods, properties, and events available to most HTML and XML elements in the Gecko DOM.</p>\n<p>Various W3C specifications apply to elements:</p>\n<ul> <li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Core/\" title=\"http://www.w3.org/TR/DOM-Level-2-Core/\" target=\"_blank\">DOM Core Specification</a>—describes the core interfaces shared by most DOM objects in HTML and XML documents</li> <li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/\" target=\"_blank\">DOM HTML Specification</a>—describes interfaces for objects in HTML and XHTML documents that build on the core specification</li> <li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Events/\" title=\"http://www.w3.org/TR/DOM-Level-2-Events/\" target=\"_blank\">DOM Events Specification</a>—describes events shared by most DOM objects, building on the DOM Core and <a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Views/\" title=\"http://www.w3.org/TR/DOM-Level-2-Views/\" target=\"_blank\">Views</a> specifications</li> <li><a class=\"external\" title=\"http://www.w3.org/TR/ElementTraversal/\" rel=\"external\" href=\"http://www.w3.org/TR/ElementTraversal/\" target=\"_blank\">Element Traversal Specification</a>—describes the new attributes that allow traversal of elements in the DOM&nbsp;tree \n<span>New in <a rel=\"custom\" href=\"https://developer.mozilla.org/en/Firefox_3.5_for_developers\">Firefox 3.5</a></span>\n</li>\n</ul>\n<p>The articles listed here span the above and include links to the appropriate W3C DOM specification.</p>\n<p>While these interfaces are generally shared by most HTML and XML elements, there are more specialized interfaces for particular objects listed in the DOM HTML Specification. Note, however, that these HTML&nbsp;interfaces are \"only for [HTML 4.01] and [XHTML 1.0] documents and are not guaranteed to work with any future version of XHTML.\" The HTML 5 draft does state it aims for backwards compatibility with these HTML&nbsp;interfaces but says of them that \"some features that were formerly deprecated, poorly supported, rarely used or considered unnecessary have been removed.\" One can avoid the potential conflict by moving entirely to DOM&nbsp;XML attribute methods such as <code>getAttribute()</code>.</p>\n<p><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLHtmlElement\">Html</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLHeadElement\">Head</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLLinkElement\">Link</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLTitleElement\">Title</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLMetaElement\">Meta</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLBaseElement\">Base</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/HTMLIsIndexElement\" class=\"new\">IsIndex</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLStyleElement\">Style</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLBodyElement\">Body</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLFormElement\">Form</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLSelectElement\">Select</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/HTMLOptGroupElement\" class=\"new\">OptGroup</a></code>\n, <a title=\"en/HTML/Element/HTMLOptionElement\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Element/HTMLOptionElement\" class=\"new \">Option</a>, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLInputElement\">Input</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLTextAreaElement\">TextArea</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLButtonElement\">Button</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLLabelElement\">Label</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLFieldSetElement\">FieldSet</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLLegendElement\">Legend</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/HTMLUListElement\" class=\"new\">UList</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/OList\" class=\"new\">OList</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/DList\" class=\"new\">DList</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Directory\" class=\"new\">Directory</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Menu\" class=\"new\">Menu</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/LI\" class=\"new\">LI</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Div\" class=\"new\">Div</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Paragraph\" class=\"new\">Paragraph</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Heading\" class=\"new\">Heading</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Quote\" class=\"new\">Quote</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Pre\" class=\"new\">Pre</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/BR\" class=\"new\">BR</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/BaseFont\" class=\"new\">BaseFont</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Font\" class=\"new\">Font</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/HR\" class=\"new\">HR</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Mod\" class=\"new\">Mod</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLAnchorElement\">Anchor</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Image\" class=\"new\">Image</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLObjectElement\">Object</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Param\" class=\"new\">Param</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Applet\" class=\"new\">Applet</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Map\" class=\"new\">Map</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Area\" class=\"new\">Area</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Script\" class=\"new\">Script</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLTableElement\">Table</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableCaption\" class=\"new\">TableCaption</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableCol\" class=\"new\">TableCol</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableSection\" class=\"new\">TableSection</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLTableRowElement\">TableRow</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableCell\" class=\"new\">TableCell</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/FrameSet\" class=\"new\">FrameSet</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Frame\" class=\"new\">Frame</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLIFrameElement\">IFrame</a></code>\n</p>","members":[{"url":"https://developer.mozilla.org/en/DOM/element.addEventListener","name":"addEventListener","help":" Register an event handler to a specific event type on the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.appendChild","name":"appendChild","help":" Insert a node as the last child node of this element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.blur","name":"blur","help":" Removes keyboard focus from the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.click","name":"click","help":" Simulates a click on the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.cloneNode","name":"cloneNode","help":" Clone a node, and optionally, all of its contents.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.compareDocumentPosition","name":"compareDocumentPosition","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.dispatchEvent","name":"dispatchEvent","help":" Dispatch an event to this node in the DOM.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.focus","name":"focus","help":" Gives keyboard focus to the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getAttribute","name":"getAttribute","help":" Retrieve the value of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getAttributeNS","name":"getAttributeNS","help":" Retrieve the value of the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getAttributeNode","name":"getAttributeNode","help":" Retrieve the node representation of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getAttributeNodeNS","name":"getAttributeNodeNS","help":" Retrieve the node representation of the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getBoundingClientRect","name":"getBoundingClientRect","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.getElementsByClassName","name":"getElementsByClassName","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getElementsByTagName","name":"getElementsByTagName","help":" Retrieve a set of all descendant elements, of a particular tag name, from the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getElementsByTagNameNS","name":"getElementsByTagNameNS","help":" Retrieve a set of all descendant elements, of a particular tag name and namespace, from the current element.","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Node.getFeature","name":"getFeature","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.getUserData","name":"getUserData","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.hasAttribute","name":"hasAttribute","help":" Check if the element has the specified attribute, or not.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.hasAttributeNS","name":"hasAttributeNS","help":" Check if the element has the specified attribute, in the specified namespace, or not.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.hasAttributes","name":"hasAttributes","help":" Check if the element has any attributes, or not.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.hasChildNodes","name":"hasChildNodes","help":" Check if the element has any child nodes, or not.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.insertBefore","name":"insertBefore","help":" Inserts the first node before the second, child, Node in the DOM.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.isDefaultNamespace","name":"isDefaultNamespace","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.isEqualNode","name":"isEqualNode","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.isSameNode","name":"isSameNode","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.isSupported","name":"isSupported","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.lookupNamespaceURI","name":"lookupNamespaceURI","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.lookupPrefix","name":"lookupPrefix","help":"","obsolete":false},{"name":"webkitMatchesSelector","help":" Returns whether or not the element would be selected by the specified selector string.","obsolete":false},{"name":"webkitRequestFullScreen","help":" Asynchronously asks the browser to make the element full-screen.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.normalize","name":"normalize","help":" Clean up all the text nodes under this element (merge adjacent, remove empty).","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.querySelector","name":"querySelector","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.querySelectorAll","name":"querySelectorAll","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeAttribute","name":"removeAttribute","help":" Remove the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeAttributeNS","name":"removeAttributeNS","help":" Remove the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeAttributeNode","name":"removeAttributeNode","help":" Remove the node representation of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.removeChild","name":"removeChild","help":" Removes a child node from the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeEventListener","name":"removeEventListener","help":" Removes an event listener from the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.replaceChild","name":"replaceChild","help":" Replaces one child node in the current element with another.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollIntoView","name":"scrollIntoView","help":" Scrolls the page until the element gets into the view.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setAttribute","name":"setAttribute","help":" Set the value of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setAttributeNS","name":"setAttributeNS","help":" Set the value of the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setAttributeNode","name":"setAttributeNode","help":" Set the node representation of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setAttributeNodeNS","name":"setAttributeNodeNS","help":" Set the node representation of the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setCapture","name":"setCapture","help":" Sets up mouse event capture, redirecting all mouse events to this element.","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/element.setIdAttributeNS","name":"setIdAttributeNS","help":" Sets the attribute to be treated as an ID type attribute.","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/element.setIdAttributeNode","name":"setIdAttributeNode","help":" Sets the attribute to be treated as an ID type attribute.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.setUserData","name":"setUserData","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.insertAdjacentHTML","name":"insertAdjacentHTML","help":" Parses the text as HTML or XML and inserts the resulting nodes into the tree in the position given.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.attributes","name":"attributes","help":"All attributes associated with an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.baseURI","name":"baseURI","help":"Base URI as a string","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.baseURIObject","name":"baseURIObject","help":"The read-only <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIURI\">nsIURI</a></code>\n object representing the base URI for the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.childElementCount","name":"childElementCount","help":"The number of child nodes that are elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.childNodes","name":"childNodes","help":"All child nodes of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.children","name":"children","help":"A live <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIDOMNodeList&amp;ident=nsIDOMNodeList\" class=\"new\">nsIDOMNodeList</a></code>\n of the current child elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.classList","name":"classList","help":"Token list of class attribute","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.className","name":"className","help":"Gets/sets the class of the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.clientHeight","name":"clientHeight","help":"The inner height of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.clientLeft","name":"clientLeft","help":"The width of the left border of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.clientTop","name":"clientTop","help":"The width of the top border of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.clientWidth","name":"clientWidth","help":"The inner width of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.contentEditable","name":"contentEditable","help":"Gets/sets whether or not the element is editable.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.dataset","name":"dataset","help":"Allows access to read and write custom data attributes on the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.dir","name":"dir","help":"Gets/sets the directionality of the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.firstChild","name":"firstChild","help":"The first direct child node of an element, or <code>null</code> if this element has no child nodes.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.firstElementChild","name":"firstElementChild","help":"The first direct child element of an element, or <code>null</code> if the element has no child elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.id","name":"id","help":"Gets/sets the id of the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.innerHTML","name":"innerHTML","help":"Gets/sets the markup of the element's content.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.isContentEditable","name":"isContentEditable","help":"Indicates whether or not the content of the element can be edited. Read only.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.lang","name":"lang","help":"Gets/sets the language of an element's attributes, text, and element contents.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.lastChild","name":"lastChild","help":"The last direct child node of an element, or <code>null</code> if this element has no child nodes.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.lastElementChild","name":"lastElementChild","help":"The last direct child element of an element, or <code>null</code> if the element has no child elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.localName","name":"localName","help":"The local part of the qualified name of an element. In Firefox 3.5 and earlier, the property upper-cases the local name for HTML&nbsp;elements (but not XHTML&nbsp;elements). In later versions, this does not happen, so the property is in lower case for both HTML&nbsp;and XHTML. \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.name","name":"name","help":"Gets/sets the name attribute of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.namespaceURI","name":"namespaceURI","help":"The namespace URI of this node, or <code>null</code> if it is no namespace. In Firefox 3.5 and earlier, HTML&nbsp;elements are in no namespace. In later versions, HTML&nbsp;elements are in the <code><a class=\"linkification-ext external\" title=\"Linkification: http://www.w3.org/1999/xhtml\" rel=\"external\" href=\"http://www.w3.org/1999/xhtml\" target=\"_blank\">http://www.w3.org/1999/xhtml</a></code> namespace in both HTML&nbsp;and XML&nbsp;trees. \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nextSibling","name":"nextSibling","help":"The node immediately following the given one in the tree, or <code>null</code> if there is no sibling node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.nextElementSibling","name":"nextElementSibling","help":"The element immediately following the given one in the tree, or <code>null</code> if there's no sibling node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nodeName","name":"nodeName","help":"The name of the node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nodePrincipal","name":"nodePrincipal","help":"The node's principal.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nodeType","name":"nodeType","help":"A number representing the type of the node. Is always equal to <code>1</code> for DOM elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nodeValue","name":"nodeValue","help":"The value of the node. Is always equal to <code>null</code> for DOM elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetHeight","name":"offsetHeight","help":"The height of an element, relative to the layout.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetLeft","name":"offsetLeft","help":"The distance from this element's left border to its <code>offsetParent</code>'s left border.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetParent","name":"offsetParent","help":"The element from which all offset calculations are currently computed.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetTop","name":"offsetTop","help":"The distance from this element's top border to its <code>offsetParent</code>'s top border.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetWidth","name":"offsetWidth","help":"The width of an element, relative to the layout.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.outerHTML","name":"outerHTML","help":"Gets the markup of the element including its content. When used as a setter, replaces the element with nodes parsed from the given string.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.ownerDocument","name":"ownerDocument","help":"The document that this node is in, or <code>null</code> if the node is not inside of one.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.parentNode","name":"parentNode","help":"The parent element of this node, or <code>null</code> if the node is not inside of a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document\">DOM Document</a></code>\n.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.prefix","name":"prefix","help":"The namespace prefix of the node, or <code>null</code> if no prefix is specified.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.previousSibling","name":"previousSibling","help":"The node immediately preceding the given one in the tree, or <code>null</code> if there is no sibling node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.previousElementSibling","name":"previousElementSibling","help":"The element immediately preceding the given one in the tree, or <code>null</code> if there is no sibling element.","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/element.schemaTypeInfo","name":"schemaTypeInfo","help":"Returns TypeInfo regarding schema information for the element (also available on <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Attr\">Attr</a></code>\n).","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollHeight","name":"scrollHeight","help":"The scroll view height of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollLeft","name":"scrollLeft","help":"Gets/sets the left scroll offset of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollTop","name":"scrollTop","help":"Gets/sets the top scroll offset of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollWidth","name":"scrollWidth","help":"The scroll view width of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/XUL/Attribute/spellcheck","name":"spellcheck","help":"Controls <a title=\"en/Controlling_spell_checking_in_HTML_forms\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Controlling_spell_checking_in_HTML_forms\">spell-checking</a> (present on all HTML&nbsp;elements)","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.style","name":"style","help":"An object representing the declarations of an element's style attributes.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.tabIndex","name":"tabIndex","help":"Gets/sets the position of the element in the tabbing order.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.tagName","name":"tagName","help":"The name of the tag for the given element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.textContent","name":"textContent","help":"Gets/sets the textual contents of an element and all its descendants.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.title","name":"title","help":"A string that appears in a popup box when mouse is over the element.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/element"},"SVGZoomEvent":{"title":"document.createEvent","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/document.createEvent","skipped":true,"cause":"Suspect title"},"Document":{"title":"document","summary":"<p>Each web page loaded in the browser has its own <strong>document</strong> object. This object serves as an entry point to the web page's content (the <a title=\"en/Using_the_W3C_DOM_Level_1_Core\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Using_the_W3C_DOM_Level_1_Core\">DOM tree</a>, including elements such as <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/body\">&lt;body&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/table\">&lt;table&gt;</a></code>\n) and provides functionality global to the document (such as obtaining the page's URL and creating new elements in the document).</p>\n<p>A document object can be obtained from various APIs:</p>\n<ul> <li>Most commonly, you work with the document the script is running in by using <code>document</code> in document's <a title=\"en/HTML/Element/Script\" rel=\"internal\" href=\"https://developer.mozilla.org/En/HTML/Element/Script\">scripts</a>. (The same document can also be referred to as <a title=\"window.document\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window.document\"><code>window.document</code></a>.)</li> <li>The document of an iframe via the iframe's <code><a title=\"en/DOM/HTMLIFrameElement#Properties\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/HTMLIFrameElement#Properties\">contentDocument</a></code> property.</li> <li>The <a title=\"en/XMLHttpRequest#Attributes\" rel=\"internal\" href=\"https://developer.mozilla.org/en/nsIXMLHttpRequest#Attributes\"><code>responseXML</code> of an <code>XMLHttpRequest</code> object</a>.</li> <li>The document, that given node or element belongs to, can be retrieved using the node's <code><a title=\"en/DOM/Node.ownerDocument\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node.ownerDocument\">ownerDocument</a></code> property.</li> <li>...and more.</li>\n</ul>\n<p>Depending on the kind of the document (e.g. <a title=\"en/HTML\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML\">HTML</a> or <a title=\"en/XML\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XML\">XML</a>) different APIs may be available on the document object. This theoretical availability of APIs is usually described in terms of <em>implementing interfaces</em> defined in the relevant W3C DOM specifications:</p>\n<ul> <li>All document objects implement the DOM Core <a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Core/core.html#i-Document\" title=\"http://www.w3.org/TR/DOM-Level-2-Core/core.html#i-Document\" target=\"_blank\"><code>Document</code></a> and <code><a title=\"en/DOM/Node\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Node\">Node</a></code> interfaces, meaning that the \"core\" properties and methods are available for all kinds of documents.</li> <li>In addition to the generalized DOM Core document interface, HTML documents also implement the <code><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268\" target=\"_blank\">HTMLDocument</a></code> interface, which is a more specialized interface for dealing with HTML documents (e.g., <a title=\"en/DOM/document.cookie\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.cookie\">document.cookie</a>, <a title=\"en/DOM/document.alinkColor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.alinkColor\">document.alinkColor</a>).</li> <li><a title=\"en/XUL\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XUL\">XUL</a> documents (available to Mozilla add-on and application developers) implement their own additions to the core Document functionality.</li>\n</ul>\n<p>Methods or properties listed here that are part of a more specialized interface have an asterisk (*) next to them and have additional information in the&nbsp; Availability column.</p>\n<p>Note that some APIs listed below are not available in all browsers for various reasons:</p>\n<ul> <li><strong>Obsolete</strong>: on its way of being removed from supporting browsers.</li> <li><strong>Non-standard</strong>: either an experimental feature not (yet?) agreed upon by all vendors, or a feature targeted specifically at the code running in a specific browser (e.g. Mozilla has a few DOM APIs created for its add-ons and application development).</li> <li>Part of a completed or an emerging standard, but not (yet?) implemented in all browsers or implemented in the newest versions of the browsers.</li>\n</ul>\n<p>Detailed browser compatibility tables are located at the pages describing each property or method.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.getElementById","name":"getElementById","help":"Returns an object reference to the identified element."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.captureEvents","name":"captureEvents","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.routeEvent","name":"routeEvent","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.queryCommandIndeterm","name":"queryCommandIndeterm","help":"Returns true if the <a title=\"en/Midas\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Midas\">Midas</a> command is in a indeterminate state on the current range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createEvent","name":"createEvent","help":"Creates an event."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.execCommandShowHelp","name":"execCommandShowHelp","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createDocumentFragment","name":"createDocumentFragment","help":"Creates a new document fragment."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.elementFromPoint","name":"elementFromPoint","help":"Returns the element visible at the specified coordinates."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.load","name":"load","help":"Load an XML document"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.getElementsByTagName","name":"getElementsByTagName","help":"Returns a list of elements with the given tag name."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.getBoxObjectFor","name":"getBoxObjectFor","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.createAttributeNS","name":"createAttributeNS","help":"Creates a new attribute node in a given namespace and returns it."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.getElementsByClassName","name":"getElementsByClassName","help":"Returns a list of elements with the given class name."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.normalizeDocument","name":"normalizeDocument","help":"Replaces entities, normalizes text nodes, etc."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.queryCommandState","name":"queryCommandState","help":"Returns true if the <a title=\"en/Midas\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Midas\">Midas</a> command has been executed on the current range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.queryCommandSupported","name":"queryCommandSupported","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.hasFocus","name":"hasFocus","help":"Returns <code>true</code> if the focus is currently located anywhere inside the specified document."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.queryCommandText","name":"queryCommandText","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.releaseEvents","name":"releaseEvents","help":"<dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.removeChild\">Node.removeChild</a></code>\n</dt> <dd>Removes a child node from the DOM</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.importNode","name":"importNode","help":"<dd>Returns a clone of a node from an external document</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.insertBefore\">Node.insertBefore</a></code>\n</dt> <dd>Inserts the specified node before a reference node as a child of the current node.</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.isDefaultNamespace\">Node.isDefaultNamespace</a></code>\n</dt> <dd>Returns true if the namespace is the default namespace on the given node</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.isEqualNode\">Node.isEqualNode</a></code>\n</dt> <dd>Indicates whether the node is equal to the given node</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.isSameNode\">Node.isSameNode</a></code>\n</dt> <dd>Indicates whether the node is the same as the given node</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.isSupported\">Node.isSupported</a></code>\n</dt> <dd>Tests whether the DOM implementation implements a specific feature and that feature is supported by this node or document</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.write","name":"write","help":"Writes text to a document."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.releaseCapture","name":"releaseCapture","help":"Releases the current mouse capture if it's on an element in this document."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.evaluate","name":"evaluate","help":"Evaluates an XPath expression."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createTextNode","name":"createTextNode","help":"Creates a text node."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.querySelector","name":"querySelector","help":"Returns the first Element node within the document, in document order, that matches the specified selectors."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createExpression","name":"createExpression","help":"Compiles an <code><a title=\"en/XPathExpression\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XPathExpression\">XPathExpression</a></code> which can then be used for (repeated) evaluations."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createElement","name":"createElement","help":"Creates a new element with the given tag name."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createCDATASection","name":"createCDATASection","help":"Creates a new CDATA node and returns it."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createComment","name":"createComment","help":"Creates a new comment node and returns it."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.adoptNode","name":"adoptNode","help":"<dd>Adopt node from an external document</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.appendChild\">Node.appendChild</a></code>\n</dt> <dd>Adds a node to the end of the list of children of a specified parent node.</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createAttribute","name":"createAttribute","help":"Creates a new attribute node and returns it."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.querySelectorAll","name":"querySelectorAll","help":"Returns a list of all the Element nodes within the document that match the specified selectors."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createElementNS","name":"createElementNS","help":"Creates a new element with the given tag name and namespace URI."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createEntityReference","name":"createEntityReference","help":"Creates a new entity reference object and returns it."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.open","name":"open","help":"Opens a document stream for writing."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createProcessingInstruction","name":"createProcessingInstruction","help":"Creates a new processing instruction element and returns it."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createTreeWalker","name":"createTreeWalker","help":"Creates a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/treeWalker\">treeWalker</a></code>\n object."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.getElementsByName","name":"getElementsByName","help":"Returns a list of elements with the given name."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.close","name":"close","help":"<dd>Closes a document stream for writing.</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.compareDocumentPosition\">Node.compareDocumentPosition</a></code>\n</dt> <dd>Compares the position of the current node against another node in any other document.</dd>"},{"name":"webkitSetImageElement","help":"<dd>Allows you to change the element being used as the background image for a specified element ID.</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.setUserData\">Node.setUserData</a></code>\n</dt> <dd>Attaches arbitrary data to a node, along with a user-defined key and an optional handler to be triggered upon events such as cloning of the node upon which the data was attached</dd>","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.writeln","name":"writeln","help":"Write a line of text to a document."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createNSResolver","name":"createNSResolver","help":"Creates an XPathNSResolver."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.enableStyleSheetsForSet","name":"enableStyleSheetsForSet","help":"Enables the style sheets for the specified style sheet set."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.removeEventListener","name":"removeEventListener","help":"<dd>Removes an event listener from the document</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.replaceChild\">Node.replaceChild</a></code>\n</dt> <dd>Replaces one child node of the specified node with another</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.loadOverlay","name":"loadOverlay","help":"<dd>Loads a <a title=\"en/XUL_Overlays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XUL_Overlays\">XUL overlay</a> dynamically. This only works in XUL documents.</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.lookupNamespaceURI\">Node.lookupNamespaceURI</a></code>\n</dt> <dd>Returns the namespaceURI associated with a given prefix on the given node object</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.lookupPrefix\">Node.lookupPrefix</a></code>\n</dt> <dd>Returns the prefix for a given namespaceURI on the given node if present</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.normalize\">Node.normalize</a></code>\n</dt> <dd>Normalizes the node or document</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/Rich-Text_Editing_in_Mozilla#Executing_Commands","name":"execCommand","help":"Executes a <a title=\"en/Midas\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Midas\">Midas</a> command."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.clear","name":"clear","help":"<dd>In majority of modern browsers, including recent versions of Firefox and Internet Explorer, this method does nothing.</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.cloneNode\">Node.cloneNode</a></code>\n</dt> <dd>Makes a copy of a node or document</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.queryCommandValue","name":"queryCommandValue","help":"Returns the current value of the current range for <a title=\"en/Midas\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Midas\">Midas</a> command. As of Firefox 2.0.0.2, queryCommandValue will return an empty string when a command value has not been explicitly set."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.getSelection","name":"getSelection","help":"<dd>Returns a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Selection\">Selection</a></code>\n object related to text selected in the document.</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.getUserData\">Node.getUserData</a></code>\n</dt> <dd>Returns any data previously set on the node via setUserData() by key</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.hasAttributes\">Node.hasAttributes</a></code>\n</dt> <dd>Indicates whether the node possesses attributes</dd> <dt><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Node.hasChildNodes\">Node.hasChildNodes</a></code>\n</dt> <dd>Returns a Boolean value indicating whether the current element has child nodes or not.</dd>"},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.queryCommandEnabled","name":"queryCommandEnabled","help":"Returns true if the <a title=\"en/Midas\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Midas\">Midas</a> command can be executed on the current range."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.getElementsByTagNameNS","name":"getElementsByTagNameNS","help":"<dd>Returns a list of elements with the given tag name and namespace.</dd> <dt><code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Node.getFeature\" class=\"new\">Node.getFeature</a></code>\n</dt>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.createRange","name":"createRange","help":"Creates a Range object."},{"url":"https://developer.mozilla.org/en/DOM/document.activeElement","name":"activeElement","help":"Returns the currently focused element","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.alinkColor","name":"alinkColor","help":"Returns or sets the color of active links in the document body.","obsolete":true},{"url":"https://developer.mozilla.org/En/DOM/document.all","name":"all","help":"","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/document.anchors","name":"anchors","help":"Returns a list of all of the anchors in the document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.applets","name":"applets","help":"Returns an ordered list of the applets within a document.","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/document.async","name":"async","help":"Used with <a title=\"en/DOM/document.load\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.load\">document.load</a> to indicate an asynchronous request.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.baseURIObject","name":"baseURIObject","help":"(<span>Mozilla</span><strong> add-ons only!</strong>) Returns an <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIURI\">nsIURI</a></code>\n object representing the base URI for the document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.bgColor","name":"bgColor","help":"Gets/sets the background color of the current document.","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/document.body","name":"body","help":"Returns the BODY node of the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.characterSet","name":"characterSet","help":"Returns the character set being used by the document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.compatMode","name":"compatMode","help":"Indicates whether the document is rendered in Quirks or Strict mode.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.contentType","name":"contentType","help":"Returns the Content-Type from the MIME Header of the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.cookie","name":"cookie","help":"Returns a semicolon-separated list of the cookies for that document or sets a single cookie.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.currentScript","name":"currentScript","help":"Returns the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/script\">&lt;script&gt;</a></code>\n element that is currently executing.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.defaultView","name":"defaultView","help":"Returns a reference to the window object.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.designMode","name":"designMode","help":"Gets/sets WYSYWIG editing capability of <a title=\"en/Midas\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Midas\">Midas</a>. It can only be used for HTML documents.","obsolete":false},{"url":"https://developer.mozilla.org/En/DOM/Document.dir","name":"dir","help":"Gets/sets directionality (rtl/ltr) of the document","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.doctype","name":"doctype","help":"Returns the Document Type Definition (DTD) of the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.documentElement","name":"documentElement","help":"Returns the Element that is a direct child of document. For HTML documents, this is normally the HTML element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.documentURI","name":"documentURI","help":"Returns the document location.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.documentURIObject","name":"documentURIObject","help":"(<strong>Mozilla add-ons only!</strong>) Returns the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIURI\">nsIURI</a></code>\n object representing the URI of the document. This property only has special meaning in privileged JavaScript code (with UniversalXPConnect privileges).","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.domain","name":"domain","help":"Returns the domain of the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.embeds","name":"embeds","help":"Returns a list of the embedded OBJECTS within the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.fgColor","name":"fgColor","help":"Gets/sets the foreground color, or text color, of the current document.","obsolete":true},{"name":"fileSize","help":"(<strong>IE-only!</strong>) Returns size in bytes of the document. See <a class=\"external\" title=\"http://msdn.microsoft.com/en-us/library/ms533752%28v=VS.85%29.aspx\" rel=\"external\" href=\"http://msdn.microsoft.com/en-us/library/ms533752%28v=VS.85%29.aspx\" target=\"_blank\">MSDN</a>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.forms","name":"forms","help":"Returns a list of the FORM elements within the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.head","name":"head","help":"Returns the HEAD node of the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.height","name":"height","help":"Gets/sets the height of the current document.","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/document.images","name":"images","help":"Returns a list of the images in the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.implementation","name":"implementation","help":"Returns the DOM implementation associated with the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.inputEncoding","name":"inputEncoding","help":"Returns the encoding used when the document was parsed.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.lastModified","name":"lastModified","help":"Returns the date on which the document was last modified.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.lastStyleSheetSet","name":"lastStyleSheetSet","help":"Returns the name of the style sheet set that was last enabled. Has the value <code>null</code> until the style sheet is changed by setting the value of <code>selectedStyleSheetSet</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.linkColor","name":"linkColor","help":"Gets/sets the color of hyperlinks in the document.","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/document.links","name":"links","help":"Returns a list of all the hyperlinks in the document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.location","name":"location","help":"Returns the URI of the current document.","obsolete":false},{"name":"webkitSyntheticDocument","help":"<code>true</code> if this document is synthetic, such as a standalone image, video, audio file, or the like.","obsolete":false},{"name":"webkitFullScreen","help":"<code>true</code> when the document is in <a title=\"en/DOM/Using full-screen mode\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Using_full-screen_mode\">full-screen mode</a>.","obsolete":false},{"name":"webkitFullScreenElement","help":"The element that's currently in full screen mode for this document.","obsolete":false},{"name":"webkitFullScreenEnabled","help":"<code>true</code> if calling <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element.mozRequestFullscreen\">element.mozRequestFullscreen()</a></code>\n would succeed in the curent document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.plugins","name":"plugins","help":"Returns a list of the available plugins.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.popupNode","name":"popupNode","help":"Returns the node upon which a popup was invoked (XUL documents only).","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.preferredStyleSheetSet","name":"preferredStyleSheetSet","help":"Returns the preferred style sheet set as specified by the page author.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.readyState","name":"readyState","help":"Returns loading status of the document","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.referrer","name":"referrer","help":"Returns the URI of the page that linked to this page.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.scripts","name":"scripts","help":"Returns all the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/script\">&lt;script&gt;</a></code>\n elements on the document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.selectedStyleSheetSet","name":"selectedStyleSheetSet","help":"Returns which style sheet set is currently in use.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.styleSheets","name":"styleSheets","help":"Returns a list of the stylesheet objects on the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.styleSheetSets","name":"styleSheetSets","help":"Returns a list of the style sheet sets available on the document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.title","name":"title","help":"Returns the title of the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.tooltipNode","name":"tooltipNode","help":"Returns the node which is the target of the current tooltip.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.URL","name":"URL","help":"Returns a string containing the URL of the current document.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/document.vlinkColor","name":"vlinkColor","help":"Gets/sets the color of visited hyperlinks.","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/document.width","name":"width","help":"Returns the width of the current document.","obsolete":true},{"url":"https://developer.mozilla.org/En/DOM/Document.xmlEncoding","name":"xmlEncoding","help":"Returns the encoding as determined by the XML declaration.<br> <div class=\"note\">Firefox 10 and later don't implement it anymore.</div>","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/document.xmlStandalone","name":"xmlStandalone","help":"Returns <code>true</code> if the XML declaration specifies the document is standalone (<em>e.g.,</em> An external part of the DTD affects the document's content), else <code>false</code>.","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/document.xmlVersion","name":"xmlVersion","help":"Returns the version number as specified in the XML declaration or <code>\"1.0\"</code> if the declaration is absent.","obsolete":true},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.ononline","name":"ononline","help":"Returns the event handling code for the <code>online</code> event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/document.onreadystatechange","name":"onreadystatechange","help":"<dl><dd>Returns the event handling code for the <code>readystatechange</code> event.</dd>\n</dl>\n<div class=\"geckoVersionNote\"> <p>\n</p><div class=\"geckoVersionHeading\">Gecko 9.0 note<div>(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n</div></div>\n<p></p> <p>Starting in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n, you can now use the syntax <code>if (\"onabort\" in document)</code> to determine whether or not a given event handler property exists. This is because event handler interfaces have been updated to be proper web IDL interfaces. See <a title=\"en/DOM/DOM event handlers\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/DOM_event_handlers\">DOM event handlers</a> for details.</p>\n</div>"},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/document.onoffline","name":"onoffline","help":"Returns the event handling code for the <code>offline</code> event."}],"srcUrl":"https://developer.mozilla.org/en/DOM/document","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...tml#i-Document"},"SVGPathSeg":{"title":"User talk:Jeff Schiller","members":[],"srcUrl":"https://developer.mozilla.org/User_talk:Jeff_Schiller","skipped":true,"cause":"Suspect title"},"HTMLHtmlElement":{"title":"HTMLHtmlElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/html\">&lt;html&gt;</a></code>\n HTML&nbsp;element","summary":"<p>The <code>html</code> object exposes the <a class=\" external\" title=\"http://www.w3.org/TR/html5/semantics.html#htmlhtmlelement\" rel=\"external\" href=\"http://www.w3.org/TR/html5/semantics.html#htmlhtmlelement\" target=\"_blank\">HTMLHtmlElement</a> (\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a target=\"_blank\" class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-33759296\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-33759296\">HTMLHtmlElement</a>) interface and serves as the root node for a given HTML&nbsp;document.&nbsp; This object inherits the properties and methods described in the <a title=\"en/DOM/element\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> section.&nbsp; In \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>, this interface inherits from HTMLElement, but provides no other members.</p>\n<p>You can retrieve the <code>html</code> object for a document by obtaining the value of the <a class=\"internal\" title=\"en/DOM/document.documentElement\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.documentElement\"><code>document.documentElement</code></a> property.</p>","members":[{"name":"version","help":"Version of the HTML&nbsp;Document Type Definition that governs this document.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/En/DOM/Html"},"HTMLStyleElement":{"title":"HTMLStyleElement","seeAlso":"<li><a title=\"en/DOM/element.style\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element.style\">DOM element.style Object</a></li> <li><a title=\"en/DOM/stylesheet\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/stylesheet\">DOM stylesheet Object</a></li> <li><a title=\"en/DOM/cssRule\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/cssRule\">DOM cssRule Object</a></li> <li><a title=\"en/DOM/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSS\">DOM CSS Properties List</a></li> <li><a title=\"http://www.whatwg.org/html/#the-style-element\" class=\" external\" rel=\"external\" href=\"http://www.whatwg.org/html/#the-style-element\" target=\"_blank\">The <code>style</code> element in the HTML specification</a></li>","summary":"See <a title=\"en/DOM/Using_dynamic_styling_information\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Using_dynamic_styling_information\">Using dynamic styling information</a> for an overview of the objects used to manipulate specified CSS properties using the DOM.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/style.media","name":"media","help":"Specifies the intended destination medium for style information."},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/style.disabled","name":"disabled","help":"Returns true if the stylesheet is disabled, and false if not"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/style.type","name":"type","help":"Returns the type of style being applied by this statement."}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLStyleElement"},"ClientRect":{"title":"nsIDOMClientRect","seeAlso":"<a rel=\"custom\" href=\"http://www.w3.org/TR/cssom-view/#the-clientrect-interface\">CSSOM View Module : The ClientRect Interface</a><span title=\"Working Draft\">WD</span>","summary":"<div>\n\n<a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/base/nsIDOMClientRect.idl\"><code>dom/interfaces/base/nsIDOMClientRect.idl</code></a><span><a rel=\"internal\" href=\"https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces\" title=\"en/Interfaces/About_Scriptable_Interfaces\">Scriptable</a></span></div><span>Represents a rectangular box. The type of box is specified by the method that returns such an object. It is returned by functions like <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element.getBoundingClientRect\">element.getBoundingClientRect</a></code>\n.</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 1.9</div><div title=\"Introduced in Gecko 1.9 (Firefox 3)\n\"></div><div title=\"Last changed in Gecko 1.9.1 (Firefox 3)\n\"></div></div>\n<div>Inherits from: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsISupports\">nsISupports</a></code>\n<span>Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n</span></div>","members":[{"name":"bottom","help":"Y-coordinate, relative to the viewport origin, of the bottom of the rectangle box. <strong>Read only.</strong>","obsolete":false},{"name":"height","help":"Height of the rectangle box (This is identical to <code>bottom</code> minus <code>top</code>). <strong>Read only.</strong>","obsolete":false},{"name":"left","help":"X-coordinate, relative to the viewport origin, of the left of the rectangle box. <strong>Read only.</strong>","obsolete":false},{"name":"right","help":"X-coordinate, relative to the viewport origin, of the right of the rectangle box. <strong>Read only.</strong>","obsolete":false},{"name":"top","help":"Y-coordinate, relative to the viewport origin, of the top of the rectangle box. <strong>Read only.</strong>","obsolete":false},{"name":"width","help":"Width of the rectangle box (This is identical to <code>right</code> minus <code>left</code>). <strong>Read only.</strong> \n<span title=\"(Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)\n\">Requires Gecko 1.9.1</span>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMClientRect"},"SVGPathSegLinetoAbs":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"XMLSerializer":{"title":"XMLSerializer","seeAlso":"<li><a title=\"en/Parsing_and_serializing_XML\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Parsing_and_serializing_XML\">Parsing and serializing XML</a></li> <li><a title=\"en/XMLHttpRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XMLHttpRequest\">XMLHttpRequest</a></li> <li><a title=\"en/DOMParser\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOMParser\">DOMParser</a></li>","summary":"<div dir=\"ltr\" id=\"result_box\">XMLSerializer can be used to convert DOM subtree or DOM document into text. XMLSerializer is available to unprivileged scripts.</div>\n<p><code> </code></p>\n<div class=\"note\">\n<div dir=\"ltr\">XMLSerializer is mainly useful for applications and extensions based on the Mozilla platform. While it is available for web pages, it's not part of any standard and level of support in other browsers unknown.</div>\n<div id=\"result_box\" dir=\"ltr\">&nbsp;</div>\n</div>","members":[{"name":"serializeToString","help":"<div dir=\"ltr\" id=\"serializeToString\" class=\"\">\n&nbsp;&nbsp;&nbsp;&nbsp; Returns the serialized subtree of a string.\n<dt></dt>\n</div>\n<div dir=\"ltr\" id=\"serializeToStream\"><strong>serializeToStream </strong></div>\n<div dir=\"ltr\">&nbsp;&nbsp;&nbsp;&nbsp; The subtree rooted by the specified element is serialized to a byte stream using the character set specified.&nbsp;&nbsp;&nbsp;&nbsp;</div>\n<div dir=\"ltr\" id=\"Example\"><span>Example</span></div>\n\n          <pre name=\"code\" class=\"js\">var s = new XMLSerializer();\n var d = document;\n var str = s.serializeToString(d);\n alert(str);</pre>\n        \n\n          <pre name=\"code\" class=\"js\">var s = new XMLSerializer();\n var stream = {\n   close : function()\n   {\n     alert(\"Stream closed\");\n   },\n   flush : function()\n   {\n   },\n   write : function(string, count)\n   {\n     alert(\"'\" + string + \"'\\n bytes count: \" + count + \"\");\n   }\n };\n s.serializeToStream(document, stream, \"UTF-8\");</pre>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/XMLSerializer"},"Element":{"title":"element","summary":"<p>This chapter provides a brief reference for the general methods, properties, and events available to most HTML and XML elements in the Gecko DOM.</p>\n<p>Various W3C specifications apply to elements:</p>\n<ul> <li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Core/\" title=\"http://www.w3.org/TR/DOM-Level-2-Core/\" target=\"_blank\">DOM Core Specification</a>—describes the core interfaces shared by most DOM objects in HTML and XML documents</li> <li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/\" target=\"_blank\">DOM HTML Specification</a>—describes interfaces for objects in HTML and XHTML documents that build on the core specification</li> <li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Events/\" title=\"http://www.w3.org/TR/DOM-Level-2-Events/\" target=\"_blank\">DOM Events Specification</a>—describes events shared by most DOM objects, building on the DOM Core and <a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Views/\" title=\"http://www.w3.org/TR/DOM-Level-2-Views/\" target=\"_blank\">Views</a> specifications</li> <li><a class=\"external\" title=\"http://www.w3.org/TR/ElementTraversal/\" rel=\"external\" href=\"http://www.w3.org/TR/ElementTraversal/\" target=\"_blank\">Element Traversal Specification</a>—describes the new attributes that allow traversal of elements in the DOM&nbsp;tree \n<span>New in <a rel=\"custom\" href=\"https://developer.mozilla.org/en/Firefox_3.5_for_developers\">Firefox 3.5</a></span>\n</li>\n</ul>\n<p>The articles listed here span the above and include links to the appropriate W3C DOM specification.</p>\n<p>While these interfaces are generally shared by most HTML and XML elements, there are more specialized interfaces for particular objects listed in the DOM HTML Specification. Note, however, that these HTML&nbsp;interfaces are \"only for [HTML 4.01] and [XHTML 1.0] documents and are not guaranteed to work with any future version of XHTML.\" The HTML 5 draft does state it aims for backwards compatibility with these HTML&nbsp;interfaces but says of them that \"some features that were formerly deprecated, poorly supported, rarely used or considered unnecessary have been removed.\" One can avoid the potential conflict by moving entirely to DOM&nbsp;XML attribute methods such as <code>getAttribute()</code>.</p>\n<p><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLHtmlElement\">Html</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLHeadElement\">Head</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLLinkElement\">Link</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLTitleElement\">Title</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLMetaElement\">Meta</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLBaseElement\">Base</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/HTMLIsIndexElement\" class=\"new\">IsIndex</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLStyleElement\">Style</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLBodyElement\">Body</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLFormElement\">Form</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLSelectElement\">Select</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/HTMLOptGroupElement\" class=\"new\">OptGroup</a></code>\n, <a title=\"en/HTML/Element/HTMLOptionElement\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Element/HTMLOptionElement\" class=\"new \">Option</a>, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLInputElement\">Input</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLTextAreaElement\">TextArea</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLButtonElement\">Button</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLLabelElement\">Label</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLFieldSetElement\">FieldSet</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLLegendElement\">Legend</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/HTMLUListElement\" class=\"new\">UList</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/OList\" class=\"new\">OList</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/DList\" class=\"new\">DList</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Directory\" class=\"new\">Directory</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Menu\" class=\"new\">Menu</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/LI\" class=\"new\">LI</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Div\" class=\"new\">Div</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Paragraph\" class=\"new\">Paragraph</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Heading\" class=\"new\">Heading</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Quote\" class=\"new\">Quote</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Pre\" class=\"new\">Pre</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/BR\" class=\"new\">BR</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/BaseFont\" class=\"new\">BaseFont</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Font\" class=\"new\">Font</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/HR\" class=\"new\">HR</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Mod\" class=\"new\">Mod</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLAnchorElement\">Anchor</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Image\" class=\"new\">Image</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLObjectElement\">Object</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Param\" class=\"new\">Param</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Applet\" class=\"new\">Applet</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Map\" class=\"new\">Map</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Area\" class=\"new\">Area</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Script\" class=\"new\">Script</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLTableElement\">Table</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableCaption\" class=\"new\">TableCaption</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableCol\" class=\"new\">TableCol</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableSection\" class=\"new\">TableSection</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLTableRowElement\">TableRow</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableCell\" class=\"new\">TableCell</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/FrameSet\" class=\"new\">FrameSet</a></code>\n, <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Frame\" class=\"new\">Frame</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLIFrameElement\">IFrame</a></code>\n</p>","members":[{"url":"https://developer.mozilla.org/en/DOM/element.addEventListener","name":"addEventListener","help":" Register an event handler to a specific event type on the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.appendChild","name":"appendChild","help":" Insert a node as the last child node of this element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.blur","name":"blur","help":" Removes keyboard focus from the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.click","name":"click","help":" Simulates a click on the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.cloneNode","name":"cloneNode","help":" Clone a node, and optionally, all of its contents.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.compareDocumentPosition","name":"compareDocumentPosition","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.dispatchEvent","name":"dispatchEvent","help":" Dispatch an event to this node in the DOM.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.focus","name":"focus","help":" Gives keyboard focus to the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getAttribute","name":"getAttribute","help":" Retrieve the value of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getAttributeNS","name":"getAttributeNS","help":" Retrieve the value of the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getAttributeNode","name":"getAttributeNode","help":" Retrieve the node representation of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getAttributeNodeNS","name":"getAttributeNodeNS","help":" Retrieve the node representation of the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getBoundingClientRect","name":"getBoundingClientRect","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.getElementsByClassName","name":"getElementsByClassName","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getElementsByTagName","name":"getElementsByTagName","help":" Retrieve a set of all descendant elements, of a particular tag name, from the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.getElementsByTagNameNS","name":"getElementsByTagNameNS","help":" Retrieve a set of all descendant elements, of a particular tag name and namespace, from the current element.","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Node.getFeature","name":"getFeature","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.getUserData","name":"getUserData","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.hasAttribute","name":"hasAttribute","help":" Check if the element has the specified attribute, or not.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.hasAttributeNS","name":"hasAttributeNS","help":" Check if the element has the specified attribute, in the specified namespace, or not.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.hasAttributes","name":"hasAttributes","help":" Check if the element has any attributes, or not.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.hasChildNodes","name":"hasChildNodes","help":" Check if the element has any child nodes, or not.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.insertBefore","name":"insertBefore","help":" Inserts the first node before the second, child, Node in the DOM.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.isDefaultNamespace","name":"isDefaultNamespace","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.isEqualNode","name":"isEqualNode","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.isSameNode","name":"isSameNode","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.isSupported","name":"isSupported","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.lookupNamespaceURI","name":"lookupNamespaceURI","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.lookupPrefix","name":"lookupPrefix","help":"","obsolete":false},{"name":"webkitMatchesSelector","help":" Returns whether or not the element would be selected by the specified selector string.","obsolete":false},{"name":"webkitRequestFullScreen","help":" Asynchronously asks the browser to make the element full-screen.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.normalize","name":"normalize","help":" Clean up all the text nodes under this element (merge adjacent, remove empty).","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.querySelector","name":"querySelector","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.querySelectorAll","name":"querySelectorAll","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeAttribute","name":"removeAttribute","help":" Remove the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeAttributeNS","name":"removeAttributeNS","help":" Remove the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeAttributeNode","name":"removeAttributeNode","help":" Remove the node representation of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.removeChild","name":"removeChild","help":" Removes a child node from the current element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeEventListener","name":"removeEventListener","help":" Removes an event listener from the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.replaceChild","name":"replaceChild","help":" Replaces one child node in the current element with another.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollIntoView","name":"scrollIntoView","help":" Scrolls the page until the element gets into the view.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setAttribute","name":"setAttribute","help":" Set the value of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setAttributeNS","name":"setAttributeNS","help":" Set the value of the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setAttributeNode","name":"setAttributeNode","help":" Set the node representation of the named attribute from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setAttributeNodeNS","name":"setAttributeNodeNS","help":" Set the node representation of the attribute with the specified name and namespace, from the current node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.setCapture","name":"setCapture","help":" Sets up mouse event capture, redirecting all mouse events to this element.","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/element.setIdAttributeNS","name":"setIdAttributeNS","help":" Sets the attribute to be treated as an ID type attribute.","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/element.setIdAttributeNode","name":"setIdAttributeNode","help":" Sets the attribute to be treated as an ID type attribute.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.setUserData","name":"setUserData","help":"","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.insertAdjacentHTML","name":"insertAdjacentHTML","help":" Parses the text as HTML or XML and inserts the resulting nodes into the tree in the position given.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.attributes","name":"attributes","help":"All attributes associated with an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.baseURI","name":"baseURI","help":"Base URI as a string","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.baseURIObject","name":"baseURIObject","help":"The read-only <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIURI\">nsIURI</a></code>\n object representing the base URI for the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.childElementCount","name":"childElementCount","help":"The number of child nodes that are elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.childNodes","name":"childNodes","help":"All child nodes of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.children","name":"children","help":"A live <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIDOMNodeList&amp;ident=nsIDOMNodeList\" class=\"new\">nsIDOMNodeList</a></code>\n of the current child elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.classList","name":"classList","help":"Token list of class attribute","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.className","name":"className","help":"Gets/sets the class of the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.clientHeight","name":"clientHeight","help":"The inner height of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.clientLeft","name":"clientLeft","help":"The width of the left border of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.clientTop","name":"clientTop","help":"The width of the top border of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.clientWidth","name":"clientWidth","help":"The inner width of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.contentEditable","name":"contentEditable","help":"Gets/sets whether or not the element is editable.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.dataset","name":"dataset","help":"Allows access to read and write custom data attributes on the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.dir","name":"dir","help":"Gets/sets the directionality of the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.firstChild","name":"firstChild","help":"The first direct child node of an element, or <code>null</code> if this element has no child nodes.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.firstElementChild","name":"firstElementChild","help":"The first direct child element of an element, or <code>null</code> if the element has no child elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.id","name":"id","help":"Gets/sets the id of the element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.innerHTML","name":"innerHTML","help":"Gets/sets the markup of the element's content.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.isContentEditable","name":"isContentEditable","help":"Indicates whether or not the content of the element can be edited. Read only.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.lang","name":"lang","help":"Gets/sets the language of an element's attributes, text, and element contents.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.lastChild","name":"lastChild","help":"The last direct child node of an element, or <code>null</code> if this element has no child nodes.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.lastElementChild","name":"lastElementChild","help":"The last direct child element of an element, or <code>null</code> if the element has no child elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.localName","name":"localName","help":"The local part of the qualified name of an element. In Firefox 3.5 and earlier, the property upper-cases the local name for HTML&nbsp;elements (but not XHTML&nbsp;elements). In later versions, this does not happen, so the property is in lower case for both HTML&nbsp;and XHTML. \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.name","name":"name","help":"Gets/sets the name attribute of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.namespaceURI","name":"namespaceURI","help":"The namespace URI of this node, or <code>null</code> if it is no namespace. In Firefox 3.5 and earlier, HTML&nbsp;elements are in no namespace. In later versions, HTML&nbsp;elements are in the <code><a class=\"linkification-ext external\" title=\"Linkification: http://www.w3.org/1999/xhtml\" rel=\"external\" href=\"http://www.w3.org/1999/xhtml\" target=\"_blank\">http://www.w3.org/1999/xhtml</a></code> namespace in both HTML&nbsp;and XML&nbsp;trees. \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nextSibling","name":"nextSibling","help":"The node immediately following the given one in the tree, or <code>null</code> if there is no sibling node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.nextElementSibling","name":"nextElementSibling","help":"The element immediately following the given one in the tree, or <code>null</code> if there's no sibling node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nodeName","name":"nodeName","help":"The name of the node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nodePrincipal","name":"nodePrincipal","help":"The node's principal.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nodeType","name":"nodeType","help":"A number representing the type of the node. Is always equal to <code>1</code> for DOM elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.nodeValue","name":"nodeValue","help":"The value of the node. Is always equal to <code>null</code> for DOM elements.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetHeight","name":"offsetHeight","help":"The height of an element, relative to the layout.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetLeft","name":"offsetLeft","help":"The distance from this element's left border to its <code>offsetParent</code>'s left border.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetParent","name":"offsetParent","help":"The element from which all offset calculations are currently computed.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetTop","name":"offsetTop","help":"The distance from this element's top border to its <code>offsetParent</code>'s top border.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.offsetWidth","name":"offsetWidth","help":"The width of an element, relative to the layout.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.outerHTML","name":"outerHTML","help":"Gets the markup of the element including its content. When used as a setter, replaces the element with nodes parsed from the given string.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.ownerDocument","name":"ownerDocument","help":"The document that this node is in, or <code>null</code> if the node is not inside of one.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.parentNode","name":"parentNode","help":"The parent element of this node, or <code>null</code> if the node is not inside of a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/document\">DOM Document</a></code>\n.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.prefix","name":"prefix","help":"The namespace prefix of the node, or <code>null</code> if no prefix is specified.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.previousSibling","name":"previousSibling","help":"The node immediately preceding the given one in the tree, or <code>null</code> if there is no sibling node.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Element.previousElementSibling","name":"previousElementSibling","help":"The element immediately preceding the given one in the tree, or <code>null</code> if there is no sibling element.","obsolete":false},{"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/element.schemaTypeInfo","name":"schemaTypeInfo","help":"Returns TypeInfo regarding schema information for the element (also available on <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Attr\">Attr</a></code>\n).","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollHeight","name":"scrollHeight","help":"The scroll view height of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollLeft","name":"scrollLeft","help":"Gets/sets the left scroll offset of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollTop","name":"scrollTop","help":"Gets/sets the top scroll offset of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.scrollWidth","name":"scrollWidth","help":"The scroll view width of an element.","obsolete":false},{"url":"https://developer.mozilla.org/en/XUL/Attribute/spellcheck","name":"spellcheck","help":"Controls <a title=\"en/Controlling_spell_checking_in_HTML_forms\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Controlling_spell_checking_in_HTML_forms\">spell-checking</a> (present on all HTML&nbsp;elements)","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.style","name":"style","help":"An object representing the declarations of an element's style attributes.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.tabIndex","name":"tabIndex","help":"Gets/sets the position of the element in the tabbing order.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.tagName","name":"tagName","help":"The name of the tag for the given element.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Node.textContent","name":"textContent","help":"Gets/sets the textual contents of an element and all its descendants.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.title","name":"title","help":"A string that appears in a popup box when mouse is over the element.","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onkeyup","name":"onkeyup","help":"Returns the event handling code for the keyup event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.oncut","name":"oncut","help":"Returns the event handling code for the cut event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onbeforescriptexecute","name":"onbeforescriptexecute","help":"The event handling code for the <code>beforescriptexecute</code> event; this is used only for <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/script\">&lt;script&gt;</a></code>\n elements."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onkeydown","name":"onkeydown","help":"Returns the event handling code for the keydown event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onpaste","name":"onpaste","help":"Returns the event handling code for the paste event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onkeypress","name":"onkeypress","help":"Returns the event handling code for the keypress event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onscroll","name":"onscroll","help":"Returns the event handling code for the scroll event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmouseout","name":"onmouseout","help":"Returns the event handling code for the mouseout event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmousemove","name":"onmousemove","help":"Returns the event handling code for the mousemove event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onclick","name":"onclick","help":"Returns the event handling code for the click event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.oncopy","name":"oncopy","help":"Returns the event handling code for the copy event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onresize","name":"onresize","help":"Returns the event handling code for the resize event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onblur","name":"onblur","help":"Returns the event handling code for the blur event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmouseover","name":"onmouseover","help":"Returns the event handling code for the mouseover event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onafterscriptexecute","name":"onafterscriptexecute","help":"The event handling code for the <code>afterscriptexecute</code> event; this is used only for <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/script\">&lt;script&gt;</a></code>\n elements."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.ondblclick","name":"ondblclick","help":"Returns the event handling code for the dblclick event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onfocus","name":"onfocus","help":"Returns the event handling code for the focus event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmousedown","name":"onmousedown","help":"Returns the event handling code for the mousedown event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmouseup","name":"onmouseup","help":"Returns the event handling code for the mouseup event."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/element.oncontextmenu","name":"oncontextmenu","help":"Returns the event handling code for the contextmenu event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onchange","name":"onchange","help":"Returns the event handling code for the change event."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/element.onbeforeunload","name":"onbeforeunload","help":"Returns the event handling code for the beforeunload event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onkeyup","name":"onkeyup","help":"Returns the event handling code for the keyup event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.oncut","name":"oncut","help":"Returns the event handling code for the cut event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onkeydown","name":"onkeydown","help":"Returns the event handling code for the keydown event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onpaste","name":"onpaste","help":"Returns the event handling code for the paste event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onkeypress","name":"onkeypress","help":"Returns the event handling code for the keypress event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onscroll","name":"onscroll","help":"Returns the event handling code for the scroll event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmouseout","name":"onmouseout","help":"Returns the event handling code for the mouseout event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmousemove","name":"onmousemove","help":"Returns the event handling code for the mousemove event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onclick","name":"onclick","help":"Returns the event handling code for the click event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.oncopy","name":"oncopy","help":"Returns the event handling code for the copy event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onblur","name":"onblur","help":"Returns the event handling code for the blur event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmouseover","name":"onmouseover","help":"Returns the event handling code for the mouseover event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.ondblclick","name":"ondblclick","help":"Returns the event handling code for the dblclick event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onfocus","name":"onfocus","help":"Returns the event handling code for the focus event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmousedown","name":"onmousedown","help":"Returns the event handling code for the mousedown event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onmouseup","name":"onmouseup","help":"Returns the event handling code for the mouseup event."},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/element.oncontextmenu","name":"oncontextmenu","help":"Returns the event handling code for the contextmenu event."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/element.onchange","name":"onchange","help":"Returns the event handling code for the change event."}],"srcUrl":"https://developer.mozilla.org/en/DOM/element"},"SVGLineElement":{"title":"SVGLineElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGLineElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/line\">&lt;line&gt;</a></code>\n SVG Element","summary":"The <code>SVGLineElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/line\">&lt;line&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"x1","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/x1\">x1</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/line\">&lt;line&gt;</a></code>\n element.","obsolete":false},{"name":"y1","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/y1\">y1</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/line\">&lt;line&gt;</a></code>\n element.","obsolete":false},{"name":"x2","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/x2\">x2</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/line\">&lt;line&gt;</a></code>\n element.","obsolete":false},{"name":"y2","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/y2\">y2</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/line\">&lt;line&gt;</a></code>\n element.","obsolete":false}]},"SVGFETurbulenceElement":{"title":"feTurbulence","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The filter primitive creates a perturbation image, like cloud or marble textures.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/stitchTiles","name":"stitchTiles","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/numOctaves","name":"numOctaves","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/seed","name":"seed","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/baseFrequency","name":"baseFrequency","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/type","name":"type","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feTurbulence"},"CSSFontFaceRule":{"title":"CSSRule","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/cssRule","skipped":true,"cause":"Suspect title"},"DOMImplementation":{"title":"DOMImplementation","summary":"Provides methods which are not dependent on any particular DOM instances. Returned by <code><a title=\"En/DOM/Document.implementation\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.implementation\">document.implementation</a></code>.","members":[{"url":"https://developer.mozilla.org/En/DOM/DOMImplementation.createDocument","name":"createDocument","help":"","obsolete":false},{"url":"https://developer.mozilla.org/En/DOM/DOMImplementation.createDocumentType","name":"createDocumentType","help":"","obsolete":false},{"url":"https://developer.mozilla.org/En/DOM/DOMImplementation.createHTMLDocument","name":"createHTMLDocument","help":"","obsolete":false},{"url":"https://developer.mozilla.org/En/DOM/DOMImplementation.getFeature","name":"getFeature","help":"","obsolete":false},{"url":"https://developer.mozilla.org/En/DOM/DOMImplementation.hasFeature","name":"hasFeature","help":"","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/DOMImplementation","specification":"DOM&nbsp;Level 3"},"HTMLAudioElement":{"title":"HTMLAudioElement","seeAlso":"<li><a title=\"en/Introducing the Audio API Extension\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Introducing_the_Audio_API_Extension\">Introducing the Audio API Extension</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/audio\">&lt;audio&gt;</a></code>\n</li>","summary":"<p>The <code>HTMLAudioElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/audio\">&lt;audio&gt;</a></code>\n&nbsp;elements, as well as methods to manipulate them. It's derived from the <a title=\"en/DOM/HTMLMediaElement\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/HTMLMediaElement\" class=\" new\"><code>HTMLMediaElement</code></a> interface; it's implemented by <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMHTMLMediaElement\">nsIDOMHTMLMediaElement</a></code>\n.</p>\n<p>For details on how to use the audio streaming features exposed by this interface, please see <a title=\"en/Introducing the Audio API Extension\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Introducing_the_Audio_API_Extension\">Introducing the Audio API Extension</a>.</p>","members":[{"name":"webkitWriteAudio","help":"Writes audio into the stream at the current offset. Returns the number of bytes actually written to the stream.","obsolete":false},{"name":"webkitCurrentSampleOffset","help":"Indicates the current offset of the audio stream that was created by a call to <code>mozWriteAudio()</code>. This offset is specified as the number of samples since the beginning of the stream.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/HTMLAudioElement"},"SVGSetElement":{"title":"SVGSetElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGSetElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGSetElement"},"SVGFEImageElement":{"title":"feImage","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animateTransform\">&lt;animateTransform&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The feImage filter fetches image data from an external source and provides the pixel data as output.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/externalResourcesRequired","name":"externalResourcesRequired","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio","name":"preserveAspectRatio","help":""}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feImage"},"IDBIndex":{"title":"IDBIndex","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>12\n<span title=\"prefix\">-webkit</span>&nbsp;</td> <td>4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>count()</code></td> <td><span title=\"Not supported.\">--</span></td> <td>10.0 (10.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>count()</code></td> <td><span title=\"Not supported.\">--</span></td> <td>10.0 (10.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["<p>The following is an example based on the HTML5Rocks article on <a class=\"external\" rel=\"external\" href=\"http://www.html5rocks.com/en/tutorials/indexeddb/todo/#toc-step4\" title=\"http://www.html5rocks.com/en/tutorials/indexeddb/todo/#toc-step4\" target=\"_blank\">IndexedDB</a>. For Chrome, use the <code>webkit</code> prefix. For example, <code>IDBKeyRange</code> would be <code>webkitIDBKeyRange</code>.</p>\n\n          <pre name=\"code\" class=\"js\">// Taking care of the browser-specific prefixes.\nif ('webkitIndexedDB' in window) {\n   window.indexedDB = window.webkitIndexedDB;\n   window.IDBTransaction = window.webkitIDBTransaction;\n   window.IDBKeyRange = window.webkitIDBKeyRange;\n} else if ('mozIndexedDB' in window) {\n   window.indexedDB = window.mozIndexedDB;\n}\n\n...\n  \nhtml5rocks.indexedDB.getAllTodoItems = function() {\n  var todos = document.getElementById(\"todoItems\");\n  todos.innerHTML = \"\";\n  \n  // Start a transaction.\n  var db = html5rocks.indexedDB.db;\n  // Open an object store called \"todo\" \n  // in \"READ_WRITE\" mode. \n  var trans = db.transaction([\"todo\"], IDBTransaction.READ_WRITE, 0);\n  var store = trans.objectStore(\"todo\");\n\n  // We select the range of data we want to make queries over \n  // In this case, we get everything. \n  // To see how you set ranges, see IDBKeyRange.\n  var keyRange = IDBKeyRange.lowerBound(0);\n  // We open a cursor and attach events.\n  var cursorRequest = store.openCursor(keyRange);\n\n  cursorRequest.onsuccess = function(e) {\n    var result = e.target.result;\n    if(!!result == false)\n      return;\n\n    renderTodo(result.value);\n    // The success event handler is fired once for each entry.\n    // So call \"continue\" on your result object.\n    // This lets you iterate across the data\n\n    result.continue();\n  };\n\n  cursorRequest.onerror = html5rocks.indexedDB.onerror;\n};</pre>"],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBIndex","summary":"<p>The <code>IDBIndex</code> interface of the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB API</a> provides asynchronous access to an <a title=\"en/IndexedDB#gloss index\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_index\">index</a> in a database. An index is a kind of object store for looking up records in another object store, called the <em>referenced object store</em>. You use this interface to retrieve data.</p>\n<p>Inherits from: <a title=\"en/DOM/EventTarget\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/EventTarget\">EventTarget</a></p>","members":[{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR","name":"TRANSACTION_INACTIVE_ERR","help":"The index's transaction is not active.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR","name":"DATA_ERR","help":"The <code>key</code> parameter was not a valid value.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The request was made on a source object that has been deleted or removed.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR","name":"TRANSACTION_INACTIVE_ERR","help":"The index's transaction is not active.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR","name":"DATA_ERR","help":"The <code>key</code> parameter was not a valid value.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The request was made on a source object that has been deleted or removed.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR","name":"DATA_ERR","help":"The <code>key</code> parameter was not a valid value.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The request was made on a source object that has been deleted or removed.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR","name":"TRANSACTION_INACTIVE_ERR","help":"The index's transaction is not active.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR","name":"DATA_ERR","help":"The <code>key</code> parameter was not a valid value.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The request was made on a source object that has been deleted or removed.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR","name":"TRANSACTION_INACTIVE_ERR","help":"The index's transaction is not active.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR","name":"DATA_ERR","help":"The <code>key</code> parameter was not a valid value.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The request was made on a source object that has been deleted or removed.","obsolete":false},{"name":"openKeyCursor","help":"<p>Returns an <a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and, in a separate thread, creates a cursor over the specified key range, as arranged by this index. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>\n<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title=\"en/IndexedDB/IDBSuccessEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent\">success event</a> is fired on the result object, with its <a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a> set to the new <a title=\"en/IndexedDB/IDBCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBCursor\">IDBCursor</a> object; the <code><a title=\"en/IndexedDB/IDBCursor#attr value\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value\">value</a></code> of the cursor object is set to the value of the found record.</li> <li>If no records match the key range, then then an <a title=\"en/IndexedDB/IDBErrorEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent\">error event</a> is fired on the request object, with its <code><a title=\"en/IndexedDB/IDBErrorEvent#attr code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code\">code</a></code> set to <code><a href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\" rel=\"internal\">NOT_FOUND_ERR</a></code> and a suitable <code><a title=\"en/IndexedDB/IDBErrorEvent#attr message\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message\">message</a></code>.</li>\n</ul>\n<pre>IDBRequest openKeyCursor (\n  in optional any? range, \n  in optional unsigned short direction\n) raises (IDBDatabaseException);\n</pre>\n<div id=\"section_23\"><span id=\"Parameters_5\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required direction. See <a title=\"en/IndexedDB/IDBCursor#Constants\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants\">IDBCursor Constants</a> for possible values.</dd>\n</dl>\n</div><div id=\"section_24\"><span id=\"Returns_5\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\" rel=\"internal\">IDBRequest</a></code></dt>\n</dl>\n<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_25\"><span id=\"Exceptions_5\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Attribute</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#DATA ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>\n</table>\n</div>","obsolete":false},{"name":"openCursor","help":"<p>Returns an <a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and, in a separate thread, creates a <a title=\"en/IndexedDB#gloss cursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_cursor\">cursor</a> over the specified key range. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>\n<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title=\"en/IndexedDB/IDBSuccessEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent\">success event</a> is fired on the result object, with its <a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a> set to the new <a title=\"en/IndexedDB/IDBCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBCursor\">IDBCursor</a> object; the <code><a title=\"en/IndexedDB/IDBCursor#attr value\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value\">value</a></code> of the cursor object is set to a structured clone of the referenced value.</li> <li>If no records match the key range, then then an <a title=\"en/IndexedDB/IDBErrorEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent\">error event</a> is fired on the request object, with its <code><a title=\"en/IndexedDB/IDBErrorEvent#attr code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code\">code</a></code> set to <code><a href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\" rel=\"internal\">NOT_FOUND_ERR</a></code> and a suitable <code><a title=\"en/IndexedDB/IDBErrorEvent#attr message\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message\">message</a></code>.</li>\n</ul>\n<pre>IDBRequest openCursor (\n  in optional any? range, \n  in optional unsigned short direction\n) raises (IDBDatabaseException);\n</pre>\n<div id=\"section_19\"><span id=\"Parameters_4\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required <a title=\"en/indexedDB#gloss direction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_direction\">direction</a>. See <a title=\"en/IndexedDB/IDBCursor#Constants\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants\">IDBCursor Constants</a> for possible values.</dd>\n</dl>\n</div><div id=\"section_20\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\" rel=\"internal\">IDBRequest</a></code></dt>\n</dl>\n<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_21\"><span id=\"Exceptions_4\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Attribute</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#DATA ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>\n</table>\n</div>","obsolete":false},{"name":"get","help":"<p>Returns an <a title=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and, in a separate thread, finds either:</p>\n<ul> <li>The value in the referenced object store that corresponds to the given key.</li> <li>The first corresponding value, if <code>key</code> is a key range.</li>\n</ul>\n<p>If a value is successfully found, then a structured clone of it is created and set as the <code><a title=\"en/IndexedDB/IDBRequest#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest#attr_result\">result</a></code> of the request object.</p>\n<p></p><div class=\"note\"><strong>Note:</strong>&nbsp;This method produces the same result for: a) a record that doesn't exist in the database and b) a record that has an undefined value. To tell these situations apart, call the openCursor() method with the same key. That method provides a cursor if the record exists, and not if it does not.</div>\n<p></p>\n<pre>IDBRequest get (\n  in any key\n) raises (IDBDatabaseException);\n</pre>\n<div id=\"section_7\"><span id=\"Parameters\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>key</dt> <dd>The key or key range that identifies the record to be retrieved.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\" rel=\"internal\">IDBRequest</a></code></dt>\n</dl>\n<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_9\"><span id=\"Exceptions\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Attribute</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#DATA ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>\n</table>\n</div>","obsolete":false},{"name":"getKey","help":"<p>Returns an <a title=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and, in a separate thread, finds either:</p>\n<ul> <li>The value in the index that corresponds to the given key</li> <li>The first corresponding value, if <code>key</code> is a key range.</li>\n</ul>\n<p>If a value is successfully found, then a structured clone of it is created and set as the <code><a title=\"en/IndexedDB/IDBRequest#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest#attr_result\">result</a></code> of the request object.</p>\n<p></p><div class=\"note\"><strong>Note:</strong>&nbsp;This method produces the same result for: a) a record that doesn't exist in the database and b) a record that has an undefined value. To tell these situations apart, call the openCursor() method with the same key. That method provides a cursor if the record exists, and not if it does not.</div>\n<p></p>\n<pre>IDBRequest getKey (\n  in any key\n) raises (IDBDatabaseException);\n</pre>\n<div id=\"section_11\"><span id=\"Parameters_2\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>key</dt> <dd>The key or key range that identifies the record to be retrieved.</dd>\n</dl>\n</div><div id=\"section_12\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\" rel=\"internal\">IDBRequest</a></code></dt>\n</dl>\n<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_13\"><span id=\"Exceptions_2\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise a <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Attribute</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#DATA ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>\n</table>\n</div>","obsolete":false},{"name":"count","help":"<p>Returns an <a title=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and in a separate thread, returns the number of records within a key range. For example, if you want to see how many records are between keys 1000 and 2000 in an object store, you can write the following: <code> var req = store.count(<a title=\"en/IndexedDB/IDBKeyRange\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBKeyRange\">IDBKeyRange</a>.bound(1000, 2000));</code></p>\n<pre>IDBRequest count (\n  in optional any key\n) raises (IDBDatabaseException);\n</pre>\n<div id=\"section_15\"><span id=\"Parameters_3\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>key</dt> <dd>The key or key range that identifies the record to be counted.</dd>\n</dl></div><div id=\"section_16\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\" rel=\"internal\">IDBRequest</a></code></dt>\n</dl>\n<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_17\"><span id=\"Exceptions_3\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise a <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Attribute</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#DATA ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>\n</table>\n</div>","obsolete":false}]},"DatabaseSync":{"title":"IDBDatabaseSync","summary":"<div><strong>DRAFT</strong>\n<div>This page is not complete.</div>\n</div>\n\n<p></p>\n<p>The <code>DatabaseSync</code> interface in the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB API</a> represents a synchronous <a title=\"en/IndexedDB#gloss database connection\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_database_connection\">connection to a database</a>.</p>","members":[{"name":"setVersion","help":"<p>Sets the version of the connected database.</p>\n<pre>void setVersion (\n  in DOMString version\n);\n</pre>\n<div id=\"section_17\"><span id=\"Parameters_4\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>version</dt> <dd>The version to store in the database.</dd> <div id=\"section_18\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5> <p><code>void</code></p>\n</div></dl>\n</div>","obsolete":false},{"name":"transaction","help":"<p>Creates and returns a transaction, acquiring locks on the given database objects, within the specified timeout duration, if possible.</p>\n<pre>IDBTransactionSync transaction (\n  in optional DOMStringList storeNames,\n  in optional unsigned int timeout\n) raises (IDBDatabaseException);\n</pre>\n<div id=\"section_20\"><span id=\"Parameters_5\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>storeNames</dt> <dd>The names of object stores and indexes in the scope of the new transaction.</dd> <dt>timeout</dt> <dd>The interval that this operation is allowed to take to acquire locks on all the objects stores and indexes identified in <code>storeNames</code>.</dd>\n</dl>\n</div><div id=\"section_21\"><span id=\"Returns_5\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/TransactionSync\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransactionSync\">IDBTransactionSync</a></code></dt> <dd>An object to access the newly created transaction.</dd>\n</dl>\n</div><div id=\"section_22\"><span id=\"Exceptions_4\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an IDBDatabaseException with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#TIMEOUT ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TIMEOUT_ERR\">TIMEOUT_ERR</a></code></dt> <dd>If reserving all the database objects identified in <code>storeNames</code> takes longer than the <code>timeout</code> interval.</dd>\n</dl></div>","obsolete":false},{"name":"removeObjectStore","help":"<p>Destroys an object store with the given name, as well as all indexes that reference that object store.</p>\n<pre>void removeObjectStore (\n  in DOMString storeName\n) raises (IDBDatabaseException);\n</pre>\n<div id=\"section_13\"><span id=\"Parameters_3\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>storeName</dt> <dd>The name of an existing object store to remove.</dd>\n</dl>\n</div><div id=\"section_14\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<p><code>void</code></p>\n</div><div id=\"section_15\"><span id=\"Exceptions_3\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an IDBDatabaseException with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_FOUND_ERR</a></code></dt>\n</dl>\n<dl> <dd>If the object store with the given name (based on case-sensitive comparison) does not exist in the connected database.</dd>\n</dl>\n</div>","obsolete":false},{"name":"createObjectStore","help":"<p>Creates and returns a new object store with the given name in the connected database.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>name</dt> <dd>The name of a new object store.</dd> <dt>keypath</dt> <dd>The <a title=\"en/IndexedDB#gloss key path\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_key_path\">key path</a> used by the new object store. If a null path is specified, then the object store does not have a key path, and uses out-of-line keys.</dd> <dt>autoIncrement</dt> <dd>If true, the object store uses a <a title=\"en/IndexedDB#gloss key generator\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_key_generator\">key generator</a>; if false, it does not use one.</dd>\n</dl>\n</div><div id=\"section_6\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><a title=\"en/IndexedDB/ObjectStoreSync\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBObjectStoreSync\"><code>IDBObjectStoreSync</code></a></dt> <dd>An object to access the newly created object store.</dd>\n</dl>\n</div><div id=\"section_7\"><span id=\"Exceptions\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an IDBDatabaseException with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#CONSTRAINT ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR\">CONSTRAINT_ERR</a></code></dt> <dd>If an object store with the same name (based on case-sensitive comparison) already exists in the connected database.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\"> IDBObjectStoreSync createObjectStore(   \n  in DOMString name,   \n  in DOMString keypath,   \n  in optional boolean autoIncrement \n) raises  (IDBDatabaseException);\n</pre>","obsolete":false},{"name":"openObjectStore","help":"<p>Opens the object store with the given name in the connected database using the specified mode.</p>\n<pre>IDBObjectStoreSync openObjectStore (\n  in DOMString name, \n  in optional unsigned short mode\n) raises (IDBDatabaseException);\n</pre>\n<div id=\"section_9\"><span id=\"Parameters_2\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>name</dt> <dd>The name of the object store to open.</dd> <dt>mode</dt> <dd>The mode that is used to access the object store.</dd>\n</dl>\n</div><div id=\"section_10\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><a title=\"en/IndexedDB/ObjectStoreSync\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBObjectStoreSync\"><code>IDBObjectStoreSync</code></a></dt> <dd>An object to access the opened object store.</dd>\n</dl>\n</div><div id=\"section_11\"><span id=\"Exceptions_2\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an IDBDatabaseException with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_FOUND_ERR</a></code></dt> <dd>If an object store with the given name (based on case-sensitive comparison) already exists in the connected database.</dd>\n</dl>\n</div>","obsolete":false},{"url":"","name":"name","help":"The name of the connected database.","obsolete":false},{"url":"","name":"objectStores","help":"The names of the object stores that exist in the connected database.","obsolete":false},{"url":"","name":"version","help":"The version of the connected database. Has the null value when the database is first created.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseSync"},"DOMTokenList":{"title":"DOMTokenList","summary":"This type represents a set of space-separated tokens. Commonly returned by <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element.classList\">HTMLElement.classList</a></code>\n, HTMLLinkElement.relList, HTMLAnchorElement.relList or HTMLAreaElement.relList. It is indexed beginning with 0 as with JavaScript arrays. DOMTokenList is always case-sensitive.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/DOMTokenList.remove","name":"remove","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/DOMTokenList.contains","name":"contains","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/DOMTokenList.add","name":"add","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/DOMTokenList.item","name":"item","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/DOMTokenList.toggle","name":"toggle","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/DOMTokenList.length","name":"length","help":""}],"srcUrl":"https://developer.mozilla.org/en/DOM/DOMTokenList","specification":"http://www.whatwg.org/specs/web-apps/current-work/#domtokenlist"},"HTMLHeadElement":{"title":"HTMLHeadElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/head\">&lt;head&gt;</a></code>\n HTML&nbsp;element","summary":"The DOM <code>head</code> element exposes the <a title=\"http://www.w3.org/TR/html5/semantics.html#htmlheadelement\" class=\" external\" rel=\"external\" href=\"http://www.w3.org/TR/html5/semantics.html#htmlheadelement\" target=\"_blank\">HTMLHeadElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span>&nbsp; <a class=\" external\" target=\"_blank\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-77253168\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-77253168\">HTMLHeadElement</a>) interface, which contains the descriptive information, or metadata, for a document. This object inherits all of the properties and methods described in the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a></code>\n section. In \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>, this interface inherits from HTMLElement, but defines no additional members.","members":[{"name":"profile","help":"The URIs of one or more metadata profiles (white space separated). \n\n<span class=\"deprecatedInlineTemplate\" title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Deprecated since Gecko 2.0</span>\n\n \n\n<span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Obsolete since Gecko 7.0</span>","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLHeadElement"},"SVGFEPointLightElement":{"title":"fePointLight","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDistantLight\">&lt;feDistantLight&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpotLight\">&lt;feSpotLight&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/fePointLight"},"SVGPolylineElement":{"title":"polyline","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> \n<tr><th scope=\"col\">Feature</th><th scope=\"col\">Chrome</th><th scope=\"col\">Firefox (Gecko)</th><th scope=\"col\">Internet Explorer</th><th scope=\"col\">Opera</th><th scope=\"col\">Safari</th></tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.5 (1.8)\n</td> <td>\n9.0</td> <td>\n8.0</td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>\n3.0</td> <td>1.0 (1.8)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<p>The chart is based on <a title=\"en/SVG/Compatibility sources\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Compatibility_sources\">these sources</a>.</p>","examples":["<tr> <th scope=\"col\">Source code</th> <th scope=\"col\">Output result</th> </tr> <tr> <td>\n          <pre name=\"code\" class=\"xml\">&lt;?xml version=\"1.0\"?&gt;\n&lt;svg width=\"120\" height=\"120\" \n     viewPort=\"0 0 120 120\" version=\"1.1\"\n     xmlns=\"http://www.w3.org/2000/svg\"&gt;\n\n    &lt;polyline fill=\"none\" stroke=\"black\" \n              points=\"20,100 40,60 70,80 100,20\"/&gt;\n\n&lt;/svg&gt;</pre>\n        </td> <td>\n<iframe src=\"https://developer.mozilla.org/@api/deki/services/developer.mozilla.org/39/images/00770706-ef3b-c098-02e7-ff059dc17fa0.svg\" width=\"120px\" height=\"120px\" marginwidth=\"0\" marginheight=\"0\" hspace=\"0\" vspace=\"0\" frameborder=\"0\" scrolling=\"no\"></iframe>\n</td> </tr>"],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/polyline","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/line\">&lt;line&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/polygon\">&lt;polygon&gt;</a></code>\n</li>","summary":"The <code>polyline</code> element is an SVG basic shape, used to create a series of straight lines connecting several points. Typically a <code>polyline</code> is used to create open shapes","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/points","name":"points","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/transform","name":"transform","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/externalResourcesRequired","name":"externalResourcesRequired","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""}]},"FileEntrySync":{"title":"FileEntrySync","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>13\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<div><strong>DRAFT</strong> <div>This page is not complete.</div>\n</div>\n<p>The <code>FileEntrySync</code>&nbsp;interface of the <a title=\"en/DOM/File_API/File_System_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File_API/File_System_API\">FileSystem API</a> represents a file in a file system.</p>","members":[{"name":"createWriter","help":"<p>Creates a new <code>FileWriter</code> associated with the file that the <code>FileEntry</code> represents.</p>\n<pre>void createWriter (\n in FileWriterCallback successCallback, optional ErrorCallback errorCallback\n);</pre>\n<div id=\"section_4\"><span id=\"Parameter\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_5\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"file","help":"<p>Returns a File that represents the current state of the file that this <code>FileEntry</code> represents.</p>\n<pre>void file (\n  <em>FileCallback successCallback, optional ErrorCallback errorCallback</em>\n);</pre>\n<div id=\"section_7\"><span id=\"Parameter_2\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/FileEntrySync"},"SVGFilterElement":{"title":"filter","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<p></p><div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th scope=\"col\">Feature</th> <th scope=\"col\">Chrome</th> <th scope=\"col\">Firefox (Gecko)</th> <th scope=\"col\">Internet Explorer</th> <th scope=\"col\">Opera</th> <th scope=\"col\">Safari</th> </tr><tr><td>Basic Support</td><td>1.0 [1]</td><td>4.0 (2.0)\n</td><td>\n10.0</td><td>9.0\n</td><td>\n3.0 [1]</td></tr></tbody></table></div>\n <div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th scope=\"col\">Feature</th> <th scope=\"col\">Android</th> <th scope=\"col\">Firefox Mobile (Gecko)</th> <th scope=\"col\">IE Phone</th> <th scope=\"col\">Opera Mobile</th> <th scope=\"col\">Safari Mobile</th> </tr><tr><td>Basic Support</td><td><span title=\"Compatibility unknown; please update this.\">?</span></td><td>4.0 (2.0)\n</td><td><span title=\"Not supported.\">--</span></td><td>9.5\n</td><td>\n3.0 [1]</td></tr></tbody></table></div><p></p>\n<p id=\"compatWebkit\">[1] There remain <a class=\"link-https\" rel=\"external\" href=\"https://bugs.webkit.org/show_bug.cgi?id=26389\" title=\"https://bugs.webkit.org/show_bug.cgi?id=26389\" target=\"_blank\">some issues</a> in Webkit browsers.</p>\n<p>The chart is based on <a title=\"en/SVG/Compatibility sources\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Compatibility_sources\">these sources</a>.</p>","srcUrl":"https://developer.mozilla.org/en/SVG/Element/filter","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The <code>filter</code> element serves as container for atomic filter operations. It is never rendered directly. A filter is referenced by using the \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/filter\" class=\"new\">filter</a></code> attribute on the target SVG element.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/filterRes","name":"filterRes","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/height","name":"height","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/primitiveUnits","name":"primitiveUnits","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/width","name":"width","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/filterUnits","name":"filterUnits","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/externalResourcesRequired","name":"externalResourcesRequired","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":""}]},"EntryCallback":{"title":"DirectoryEntrySync","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/DirectoryEntrySync","skipped":true,"cause":"Suspect title"},"AudioBuffer":{"title":"Introducing the Audio API extension","members":[],"srcUrl":"https://developer.mozilla.org/en/Introducing_the_Audio_API_Extension","skipped":true,"cause":"Suspect title"},"SVGAnimatedString":{"title":"SVGAnimatedString","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedString</code> interface is used for attributes of type <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMString\">DOMString</a></code>\n which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedString"},"RangeException":{"title":"window.btoa","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/window.btoa","skipped":true,"cause":"Suspect title"},"ProcessingInstruction":{"title":"ProcessingInstruction","srcUrl":"https://developer.mozilla.org/en/DOM/ProcessingInstruction","specification":"DOM Level 1 Core: ProcessingInstruction interface","seeAlso":"document.createProcessingInstruction","summary":"<p>A processing instruction provides an opportunity for application-specific instructions to be embedded within XML and which can be ignored by XML processors which do not support processing their instructions (outside of their having a place in the DOM).</p>\n<p>A Processing instruction is distinct from a <a title=\"en/XML/XML_Declaration\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XML/XML_Declaration\" class=\"new \">XML Declaration</a> which is used for other information about the document such as encoding and which appear (if it does) as the first item in the document.</p>\n<p>User-defined processing instructions cannot begin with 'xml', as these are reserved (e.g., as used in &lt;?<a title=\"en/XML/xml-stylesheet\" rel=\"internal\" href=\"https://developer.mozilla.org/en/XML/xml-stylesheet\" class=\"new \">xml-stylesheet</a>&nbsp;?&gt;).</p>\n<p>Also inherits methods and properties from <a class=\"internal\" title=\"En/DOM/Node\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Node\"><code>Node</code></a>.</p>","members":[{"name":"target","help":"","obsolete":false},{"name":"data","help":"","obsolete":false}]},"Uint16Array":{"title":"Uint16Array","srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint16Array","seeAlso":"<li><a class=\"link-https\" title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"<p>The <code>Uint16Array</code> type represents an array of unsigned 16-bit integers..</p>\n<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>","constructor":"<div class=\"note\"><strong>Note:</strong> In these methods, <code><em>TypedArray</em></code> represents any of the <a title=\"en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses\">typed array object types</a>.</div>\n<table class=\"standard-table\"> <tbody> <tr> <td><code>Uint16Array <a title=\"en/JavaScript typed arrays/Uint16Array#Uint16Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint16Array#Uint16Array()\">Uint16Array</a>(unsigned long length);<br> </code></td> </tr> <tr> <td><code>Uint16Array </code><code><a title=\"en/JavaScript typed arrays/Uint16Array#Uint16Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint16Array#Uint16Array%28%29\">Uint16Array</a></code><code>(<em>TypedArray</em> array);<br> </code></td> </tr> <tr> <td><code>Uint16Array </code><code><a title=\"en/JavaScript typed arrays/Uint16Array#Uint16Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint16Array#Uint16Array%28%29\">Uint16Array</a></code><code>(sequence&lt;type&gt; array);<br> </code></td> </tr> <tr> <td><code>Uint16Array </code><code><a title=\"en/JavaScript typed arrays/Uint16Array#Uint16Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint16Array#Uint16Array%28%29\">Uint16Array</a></code><code>(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length);<br> </code></td> </tr> </tbody>\n</table><p>Returns a new <code>Uint16Array</code> object.</p>\n<pre>Uint16Array Uint16Array(\n&nbsp; unsigned long length\n);\n\nUint16Array Uint16Array(\n&nbsp; <em>TypedArray</em> array\n);\n\nUint16Array Uint16Array(\n&nbsp; sequence&lt;type&gt; array\n);\n\nUint16Array Uint16Array(\n&nbsp; ArrayBuffer buffer,\n&nbsp; optional unsigned long byteOffset,\n&nbsp; optional unsigned long length\n);\n</pre>\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>length</code></dt> <dd>The number of elements in the byte array. If unspecified, length of the array view will match the buffer's length.</dd> <dt><code>array</code></dt> <dd>An object of any of the typed array types (such as <code>Int32Array</code>), or a sequence of objects of a particular type, to copy into a new <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>. Each value in the source array is converted to a 16-bit unsigned integer before being copied into the new array.</dd> <dt><code>buffer</code></dt> <dd>An existing <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> to use as the storage for the new <code>Uint16Array</code> object.</dd> <dt><code>byteOffset<br> </code></dt> <dd>The offset, in bytes, to the first byte in the specified buffer for the new view to reference. If not specified, the <code>Uint16Array</code>'s view of the buffer will start with the first byte.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>Uint16Array</code> object representing the specified data buffer.</p>\n</div>","members":[{"name":"subarray","help":"<p>Returns a new <code>Uint16Array</code> view on the <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> store for this <code>Uint16Array</code> object.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Uint16Array</code> object.</dd> <dt><code>end</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Uint16Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Notes_2\"></span><h6 class=\"editable\">Notes</h6>\n<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>\n<div class=\"note\"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>\n</div>","idl":"<pre>Uint16Array subarray(\n&nbsp; long begin,\n&nbsp; optional long end\n);\n</pre>","obsolete":false},{"name":"set","help":"<p>Sets multiple values in the typed array, reading input values from a specified array.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>array</code></dt> <dd>An array from which to copy values. All values from the source array are copied into the target array, unless the length of the source array plus the offset exceeds the length of the target array, in which case an exception is thrown. If the source array is a typed array, the two arrays may share the same underlying <code><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>; the browser will intelligently copy the source range of the buffer to the destination range.</dd> <dt>offset \n<span title=\"\">Optional</span>\n</dt> <dd>The offset into the target array at which to begin writing values from the source <code>array</code>. If you omit this value, 0 is assumed (that is, the source <code>array</code> will overwrite values in the target array starting at index 0).</dd>\n</dl>\n</div>","idl":"<pre>void set(\n&nbsp; <em>TypedArray</em> array,\n&nbsp; optional unsigned long offset\n);\n\nvoid set(\n&nbsp; type[] array,\n&nbsp; optional unsigned long offset\n);\n</pre>","obsolete":false},{"name":"BYTES_PER_ELEMENT","help":"The size, in bytes, of each array element.","obsolete":false},{"name":"length","help":"The number of entries in the array. <strong>Read only.</strong>","obsolete":false}]},"HTMLTextAreaElement":{"title":"HTMLTextAreaElement","examples":["<p>Insert HTML tags or <em>smiles</em> or any custom text in a textarea:</p>\n\n          <pre name=\"code\" class=\"xml\">&lt;!doctype html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /&gt;\n&lt;title&gt;MDC Example&lt;/title&gt;\n&lt;script type=\"text/javascript\"&gt;\n\tfunction insertMetachars(sStartTag, sEndTag) {\n\t\tvar bDouble = arguments.length &gt; 1, oMsgInput = document.myForm.myTxtArea, nSelStart = oMsgInput.selectionStart, nSelEnd = oMsgInput.selectionEnd, sOldText = oMsgInput.value;\n\t\toMsgInput.value = sOldText.substring(0, nSelStart) + (bDouble ? sStartTag + sOldText.substring(nSelStart, nSelEnd) + sEndTag : sStartTag) + sOldText.substring(nSelEnd);\n\t\toMsgInput.setSelectionRange(bDouble || nSelStart === nSelEnd ? nSelStart + sStartTag.length : nSelStart, (bDouble ? nSelEnd : nSelStart) + sStartTag.length);\n\t\toMsgInput.focus();\n\t}\n&lt;/script&gt;\n&lt;style type=\"text/css\"&gt;\n\t.intLink {\n\t\tcursor: pointer;\n\t\ttext-decoration: underline;\n\t\tcolor: #0000ff;\n\t}\n&lt;/style&gt;\n&lt;/head&gt;\n\n&lt;body&gt;\n\n&lt;form name=\"myForm\"&gt;\n&lt;p&gt;[&amp;nbsp;&lt;span class=\"intLink\" onclick=\"insertMetachars('&amp;lt;strong&amp;gt;','&amp;lt;\\/strong&amp;gt;');\"&gt;&lt;strong&gt;Bold&lt;/strong&gt;&lt;/span&gt; | &lt;span class=\"intLink\" onclick=\"insertMetachars('&amp;lt;em&amp;gt;','&amp;lt;\\/em&amp;gt;');\"&gt;&lt;em&gt;Italic&lt;/em&gt;&lt;/span&gt; | &lt;span class=\"intLink\" onclick=\"var newURL=prompt('Enter the full URL for the link');if(newURL){insertMetachars('&amp;lt;a href=\\u0022'+newURL+'\\u0022&amp;gt;','&amp;lt;\\/a&amp;gt;');}else{document.myForm.myTxtArea.focus();}\"&gt;URL&lt;/span&gt; | &lt;span class=\"intLink\" onclick=\"insertMetachars('\\n&amp;lt;code&amp;gt;\\n','\\n&amp;lt;\\/code&amp;gt;\\n');\"&gt;code&lt;/span&gt; | &lt;span class=\"intLink\" onclick=\"insertMetachars(' :-)');\"&gt;smile&lt;/span&gt; | etc. etc.&amp;nbsp;]&lt;/p&gt;\n&lt;p&gt;&lt;textarea rows=\"10\" cols=\"50\" name=\"myTxtArea\"&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut facilisis, arcu vitae adipiscing placerat, nisl lectus accumsan nisi, vitae iaculis sem neque vel lectus. Praesent tristique commodo lorem quis fringilla. Sed ac tellus eros. Sed consectetur eleifend felis vitae luctus. Praesent sagittis, est eget bibendum tincidunt, ligula diam tincidunt augue, a fermentum odio velit eget mi. Phasellus mattis, elit id fringilla semper, orci magna cursus ligula, non venenatis lacus augue sit amet dui. Pellentesque lacinia odio id nisi pulvinar commodo tempus at odio. Ut consectetur eros porttitor nunc mollis ultrices. Aenean porttitor, purus sollicitudin viverra auctor, neque erat blandit sapien, sit amet tincidunt massa mi ac nibh. Proin nibh sem, bibendum ut placerat nec, cursus et lacus. Phasellus vel augue turpis. Nunc eu mauris eu leo blandit mollis interdum eget lorem. &lt;/textarea&gt;&lt;/p&gt;\n&lt;/form&gt;\n\n&lt;/body&gt;\n&lt;/html&gt;</pre>\n        \n<p>Create a textarea with a maximum number of characters per line and a maximum number of lines:</p>\n\n          <pre name=\"code\" class=\"xml\">&lt;!doctype html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /&gt;\n&lt;title&gt;MDC Example&lt;/title&gt;\n&lt;script type=\"text/javascript\"&gt;\nfunction checkRows(oField, oKeyEvent) {\n\tvar\tnKey = (oKeyEvent || /* old IE */ window.event || /* check is not supported! */ { keyCode: 38 }).keyCode,\n\n\t\t// put here the maximum number of characters per line:\n\t\tnCols = 30,\n\t\t// put here the maximum number of lines:\n\t\tnRows = 5,\n\n\t\tnSelS = oField.selectionStart, nSelE = oField.selectionEnd,\n\t\tsVal = oField.value, nLen = sVal.length,\n\n\t\tnBackward = nSelS &gt;= nCols ? nSelS - nCols : 0,\n\t\tnDeltaForw = sVal.substring(nBackward, nSelS).search(new RegExp(\"\\\\n(?!.{0,\" + String(nCols - 2) + \"}\\\\n)\")) + 1,\n\t\tnRowStart = nBackward + nDeltaForw,\n\t\taReturns = (sVal.substring(0, nSelS) + sVal.substring(nSelE, sVal.length)).match(/\\n/g),\n\t\tnRowEnd = nSelE + nRowStart + nCols - nSelS,\n\t\tsRow = sVal.substring(nRowStart, nSelS) + sVal.substring(nSelE, nRowEnd &gt; nLen ? nLen : nRowEnd),\n\t\tbKeepCols = nKey === 13 || nLen + 1 &lt; nCols || /\\n/.test(sRow) || ((nRowStart === 0 || nDeltaForw &gt; 0 || nKey &gt; 0) &amp;&amp; (sRow.length &lt; nCols || (nKey &gt; 0 &amp;&amp; (nLen === nRowEnd || sVal.charAt(nRowEnd) === \"\\n\"))));\n\n\treturn (nKey !== 13 || (aReturns ? aReturns.length + 1 : 1) &lt; nRows) &amp;&amp; ((nKey &gt; 32 &amp;&amp; nKey &lt; 41) || bKeepCols);\n}\n&lt;/script&gt;\n&lt;/head&gt;\n\n&lt;body&gt;\n&lt;p&gt;Textarea with fixed number of characters per line:&lt;br /&gt;\n&lt;textarea cols=\"50\" rows=\"10\" name=\"myInput\" onkeypress=\"return checkRows(this, event);\" onpaste=\"return false;\" /&gt;&lt;/textarea&gt;&lt;/p&gt;\n&lt;/form&gt;\n&lt;/body&gt;\n&lt;/html&gt;</pre>"],"summary":"DOM <code>TextArea</code> objects expose the <a title=\"http://dev.w3.org/html5/spec/the-button-element.html#the-textarea-element\" class=\" external\" rel=\"external\" href=\"http://dev.w3.org/html5/spec/the-button-element.html#the-textarea-element\" target=\"_blank\">HTMLTextAreaElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <code><a title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-24874179\" class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-24874179\" target=\"_blank\">HTMLTextAreaElement</a></code>) interface, which provides special properties and methods (beyond the regular <a title=\"en/DOM/element\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea\">&lt;textarea&gt;</a></code>\n elements.","members":[{"name":"blur","help":"Removes input focus from this control. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"checkValidity","help":"Returns false if the button is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an <code>invalid</code> event at the control. It returns true if the control is not a candidate for constraint validation, or if it satisfies its constraints.","obsolete":false},{"name":"focus","help":"Gives input focus to this control. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"select","help":"Selects the contents of the control.","obsolete":false},{"name":"setCustomValidity","help":"Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Input.setSelectionRange","name":"setSelectionRange","help":"Selects a range of text, and sets <code>selectionStart</code> and <code>selectionEnd</code>. If either argument is greater than the length of the value, it is treated as pointing to the end of the value. If <code>end</code> is less than <code>start</code>, then both are treated as the value of <code>end</code>.","obsolete":false},{"name":"accessKey","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-accesskey\">accesskey</a></code>\n HTML attribute. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"autofocus","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-autofocus\">autofocus</a></code>\n HTML&nbsp;attribute, indicating that the control should have input focus when the page loads","obsolete":false},{"name":"cols","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-cols\">cols</a></code>\n HTML attribute, indicating the visible width of the text area.","obsolete":false},{"name":"defaultValue","help":"The control's default value, which behaves like the <strong><a title=\"en/DOM/element.textContent\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node.textContent\">textContent</a></strong> property.","obsolete":false},{"name":"disabled","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-disabled\">disabled</a></code>\n HTML attribute, indicating that the control is not available for interaction.","obsolete":false},{"name":"form","help":"<p>The containing form element, if this element is in a form. If this element is not contained in a form element:</p> <ul> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> this can be the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-id\">id</a></code>\n attribute of any <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element in the same document.</li> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> this must be <code>null</code>.</li> </ul>","obsolete":false},{"name":"labels","help":"A list of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/label\">&lt;label&gt;</a></code>\n elements that are labels for this element.","obsolete":false},{"name":"maxLength","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-maxlength\">maxlength</a></code>\n HTML&nbsp;attribute, indicating the maximum number of characters the user can enter. This constraint is evaluated only when the value changes.","obsolete":false},{"name":"name","help":"Reflects \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-name\">name</a></code>\n HTML attribute, containing the name of the control.","obsolete":false},{"name":"placeholder","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-placeholder\">placeholder</a></code>\n HTML attribute, containing a hint to the user about what to enter in the control.","obsolete":false},{"name":"readOnly","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-readonly\">readonly</a></code>\n HTML attribute, indicating that the user cannot modify the value of the control.","obsolete":false},{"name":"required","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-required\">required</a></code>\n HTML attribute, indicating that the user must specify a value before submitting the form.","obsolete":false},{"name":"rows","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-rows\">rows</a></code>\n HTML attribute, indicating the number of visible text lines for the control.","obsolete":false},{"name":"selectionDirection","help":"The direction in which selection occurred. This is \"forward\" if selection was performed in the start-to-end direction of the current locale, or \"backward\" for the opposite direction. This can also be \"none\"&nbsp;if the direction is unknown.\"","obsolete":false},{"name":"selectionEnd","help":"The index of the end of selected text. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if <strong>setSelectionRange</strong>() had been called with this as the second argument, and <strong>selectionStart</strong> as the first argument.","obsolete":false},{"name":"selectionStart","help":"The index of the beginning of selected text. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if <strong>setSelectionRange</strong>() had been called with this as the first argument, and <strong>selectionEnd</strong> as the second argument.","obsolete":false},{"name":"tabIndex","help":"The position of the element in the tabbing navigation order for the current document. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"textLength","help":"The codepoint length of the control's value.","obsolete":false},{"name":"type","help":"The string <code>textarea</code>.","obsolete":false},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.","obsolete":false},{"name":"validity","help":"The validity states that this element is in.","obsolete":false},{"name":"value","help":"The raw value contained in the control.","obsolete":false},{"name":"willValidate","help":"Indicates whether the element is a candidate for constraint validation. It is false if any conditions bar it from constraint validation.","obsolete":false},{"name":"wrap","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-wrap\">wrap</a></code>\n HTML attribute, indicating how the control wraps text.","obsolete":false},{"name":"blur","help":"Removes input focus from this control. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"checkValidity","help":"Returns false if the button is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an <code>invalid</code> event at the control. It returns true if the control is not a candidate for constraint validation, or if it satisfies its constraints.","obsolete":false},{"name":"focus","help":"Gives input focus to this control. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"select","help":"Selects the contents of the control.","obsolete":false},{"name":"setCustomValidity","help":"Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Input.setSelectionRange","name":"setSelectionRange","help":"Selects a range of text, and sets <code>selectionStart</code> and <code>selectionEnd</code>. If either argument is greater than the length of the value, it is treated as pointing to the end of the value. If <code>end</code> is less than <code>start</code>, then both are treated as the value of <code>end</code>.","obsolete":false},{"name":"accessKey","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-accesskey\">accesskey</a></code>\n HTML attribute. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"autofocus","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-autofocus\">autofocus</a></code>\n HTML&nbsp;attribute, indicating that the control should have input focus when the page loads","obsolete":false},{"name":"cols","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-cols\">cols</a></code>\n HTML attribute, indicating the visible width of the text area.","obsolete":false},{"name":"defaultValue","help":"The control's default value, which behaves like the <strong><a title=\"en/DOM/element.textContent\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node.textContent\">textContent</a></strong> property.","obsolete":false},{"name":"disabled","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-disabled\">disabled</a></code>\n HTML attribute, indicating that the control is not available for interaction.","obsolete":false},{"name":"form","help":"<p>The containing form element, if this element is in a form. If this element is not contained in a form element:</p> <ul> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> this can be the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-id\">id</a></code>\n attribute of any <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element in the same document.</li> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> this must be <code>null</code>.</li> </ul>","obsolete":false},{"name":"labels","help":"A list of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/label\">&lt;label&gt;</a></code>\n elements that are labels for this element.","obsolete":false},{"name":"maxLength","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-maxlength\">maxlength</a></code>\n HTML&nbsp;attribute, indicating the maximum number of characters the user can enter. This constraint is evaluated only when the value changes.","obsolete":false},{"name":"name","help":"Reflects \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-name\">name</a></code>\n HTML attribute, containing the name of the control.","obsolete":false},{"name":"placeholder","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-placeholder\">placeholder</a></code>\n HTML attribute, containing a hint to the user about what to enter in the control.","obsolete":false},{"name":"readOnly","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-readonly\">readonly</a></code>\n HTML attribute, indicating that the user cannot modify the value of the control.","obsolete":false},{"name":"required","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-required\">required</a></code>\n HTML attribute, indicating that the user must specify a value before submitting the form.","obsolete":false},{"name":"rows","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-rows\">rows</a></code>\n HTML attribute, indicating the number of visible text lines for the control.","obsolete":false},{"name":"selectionDirection","help":"The direction in which selection occurred. This is \"forward\" if selection was performed in the start-to-end direction of the current locale, or \"backward\" for the opposite direction. This can also be \"none\"&nbsp;if the direction is unknown.\"","obsolete":false},{"name":"selectionEnd","help":"The index of the end of selected text. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if <strong>setSelectionRange</strong>() had been called with this as the second argument, and <strong>selectionStart</strong> as the first argument.","obsolete":false},{"name":"selectionStart","help":"The index of the beginning of selected text. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if <strong>setSelectionRange</strong>() had been called with this as the first argument, and <strong>selectionEnd</strong> as the second argument.","obsolete":false},{"name":"tabIndex","help":"The position of the element in the tabbing navigation order for the current document. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"textLength","help":"The codepoint length of the control's value.","obsolete":false},{"name":"type","help":"The string <code>textarea</code>.","obsolete":false},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.","obsolete":false},{"name":"validity","help":"The validity states that this element is in.","obsolete":false},{"name":"value","help":"The raw value contained in the control.","obsolete":false},{"name":"willValidate","help":"Indicates whether the element is a candidate for constraint validation. It is false if any conditions bar it from constraint validation.","obsolete":false},{"name":"wrap","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/textarea#attr-wrap\">wrap</a></code>\n HTML attribute, indicating how the control wraps text.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLTextAreaElement"},"HTMLProgressElement":{"title":"progress","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>6.0</td> <td>6.0 (6.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td>11.0</td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td>11.0</td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["&lt;progress value=\"70\" max=\"100\"&gt;70 %&lt;/progress&gt;"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/progress","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/orient\">orient</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/%3Aindeterminate\">:indeterminate</a></code>\n</li>","summary":"The HTML <em>progress</em> (<code>&lt;progress&gt;</code>) element is used to view the completion progress of a task. While the specifics of how it's displayed is left up to the browser developer, it's typically displayed as a progress bar.","members":[{"obsolete":false,"url":"","name":"max","help":"This attribute describes how much work the task indicated by the <code>progress</code> element requires."},{"obsolete":false,"url":"","name":"form","help":"This attribute specifies the form which the <code>progress</code> element belongs to."},{"obsolete":false,"url":"","name":"value","help":"<dl><dd>This attribute specifies how much of the task that has been completed. If there is no <code>value</code> attribute, the progress bar is indeterminate; this indicates that an activity is ongoing with no indication of how long it is expected to take.</dd>\n</dl>\n<p>You can use the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/orient\">orient</a></code>\n property to specify whether the progress bar should be rendered horizontally (the default) or vertically. The <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/CSS/%3Aindeterminate\">:indeterminate</a></code>\n pseudo-class can be used to match against indeterminate progress bars.</p>"}]},"Float64Array":{"title":"Float64Array","srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float64Array","seeAlso":"<li><a class=\"link-https\" title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"<p>The <code>Float64Array</code> type represents an array of 64-bit floating point numbers (corresponding to the C <code>double</code> data type).</p>\n<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>","constructor":"<div class=\"note\"><strong>Note:</strong> In these methods, <code><em>TypedArray</em></code> represents any of the <a title=\"en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses\">typed array object types</a>.</div>\n<table class=\"standard-table\"> <tbody> <tr> <td><code>Float64Array <a title=\"en/JavaScript typed arrays/Float64Array#Float64Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float64Array#Float64Array%28%29\">Float64Array</a>(unsigned long length);<br> </code></td> </tr> <tr> <td><code>Float64Array </code><code><a title=\"en/JavaScript typed arrays/Float64Array#Float64Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float64Array#Float64Array%28%29\">Float64Array</a></code><code>(<em>TypedArray</em> array);<br> </code></td> </tr> <tr> <td><code>Float64Array </code><code><a title=\"en/JavaScript typed arrays/Float64Array#Float64Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float64Array#Float64Array%28%29\">Float64Array</a></code><code>(sequence&lt;type&gt; array);<br> </code></td> </tr> <tr> <td><code>Float64Array </code><code><a title=\"en/JavaScript typed arrays/Float64Array#Float64Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Float64Array#Float64Array%28%29\">Float64Array</a></code><code>(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length);<br> </code></td> </tr> </tbody>\n</table><p>Returns a new <code>Float64Array</code> object.</p>\n<pre>Float64Array Float64Array(\n&nbsp; unsigned long length\n);\n\nFloat64Array Float64Array(\n&nbsp; <em>TypedArray</em> array\n);\n\nFloat64Array Float64Array(\n&nbsp; sequence&lt;type&gt; array\n);\n\nFloat64Array Float64Array(\n&nbsp; ArrayBuffer buffer,\n&nbsp; optional unsigned long byteOffset,\n&nbsp; optional unsigned long length\n);\n</pre>\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>length</code></dt> <dd>The number of elements in the byte array. If unspecified, length of the array view will match the buffer's length.</dd> <dt><code>array</code></dt> <dd>An object of any of the typed array types (such as <span>Uint8</span><code>Array</code>), or a sequence of objects of a particular type, to copy into a new <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>. Each value in the source array is converted to a 64-bit floating point number before being copied into the new array.</dd> <dt><code>buffer</code></dt> <dd>An existing <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> to use as the storage for the new <code>Float64Array</code> object.</dd> <dt><code>byteOffset<br> </code></dt> <dd>The offset, in bytes, to the first byte in the specified buffer for the new view to reference. If not specified, the <code>Float64Array</code>'s view of the buffer will start with the first byte.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>Float64Array</code> object representing the specified data buffer.</p>\n</div>","members":[{"name":"subarray","help":"<p>Returns a new <code>Float64Array</code> view on the <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> store for this <code>Float64Array</code> object.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Float64Array</code> object.</dd> <dt><code>end</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Float64Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Notes_2\"></span><h6 class=\"editable\">Notes</h6>\n<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>\n<div class=\"note\"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>\n</div>","idl":"<pre>Float64Array subarray(\n&nbsp; long begin,\n&nbsp; optional long end\n);\n</pre>","obsolete":false},{"name":"set","help":"<p>Sets multiple values in the typed array, reading input values from a specified array.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>array</code></dt> <dd>An array from which to copy values. All values from the source array are copied into the target array, unless the length of the source array plus the offset exceeds the length of the target array, in which case an exception is thrown. If the source array is a typed array, the two arrays may share the same underlying <code><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>; the browser will intelligently copy the source range of the buffer to the destination range.</dd> <dt>offset \n<span title=\"\">Optional</span>\n</dt> <dd>The offset into the target array at which to begin writing values from the source <code>array</code>. If you omit this value, 0 is assumed (that is, the source <code>array</code> will overwrite values in the target array starting at index 0).</dd>\n</dl>\n</div>","idl":"<pre>void set(\n&nbsp; <em>TypedArray</em> array,\n&nbsp; optional unsigned long offset\n);\n\nvoid set(\n&nbsp; type[] array,\n&nbsp; optional unsigned long offset\n);\n</pre>","obsolete":false},{"name":"BYTES_PER_ELEMENT","help":"The size, in bytes, of each array element.","obsolete":false},{"name":"length","help":"The number of entries in the array. <strong>Read only.</strong>","obsolete":false}]},"XMLHttpRequest":{"title":"XMLHttpRequest","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>1</td> <td>1.0</td> <td> <p>5 (via ActiveXObject)</p> <p>7 (XMLHttpRequest)</p> </td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>1.2</td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/XMLHttpRequest","seeAlso":"<li>MDN articles about XMLHttpRequest: <ul> <li><a title=\"en/AJAX/Getting_Started\" rel=\"internal\" href=\"https://developer.mozilla.org/en/AJAX/Getting_Started\">AJAX - Getting Started</a></li> <li><a class=\"internal\" title=\"En/Using XMLHttpRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/XMLHttpRequest/Using_XMLHttpRequest\">Using XMLHttpRequest</a></li> <li><a title=\"en/HTML_in_XMLHttpRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML_in_XMLHttpRequest\">HTML in XMLHttpRequest</a></li> <li><a title=\"en/XMLHttpRequest/FormData\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData\"><code>FormData</code></a></li> </ul> </li> <li>XMLHttpRequest references from W3C and browser vendors: <ul> <li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/XMLHttpRequest/\" title=\"http://www.w3.org/TR/XMLHttpRequest/\" target=\"_blank\">W3C: XMLHttpRequest</a> (base features)</li> <li><a class=\"external\" title=\"http://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html\" rel=\"external\" href=\"http://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html\" target=\"_blank\">W3C: XMLHttpRequest</a> (latest editor's draft with extensions to the base functionality, formerly <a class=\"external\" title=\"http://www.w3.org/TR/XMLHttpRequest2/\" rel=\"external\" href=\"http://www.w3.org/TR/XMLHttpRequest2/\" target=\"_blank\">XMLHttpRequest Level 2</a>)</li> <li><a class=\"external\" rel=\"external\" href=\"http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/xmobjxmlhttprequest.asp\" title=\"http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/xmobjxmlhttprequest.asp\" target=\"_blank\">Microsoft documentation</a></li> <li><a class=\"external\" rel=\"external\" href=\"http://developer.apple.com/internet/webcontent/xmlhttpreq.html\" title=\"http://developer.apple.com/internet/webcontent/xmlhttpreq.html\" target=\"_blank\">Apple developers' reference</a></li> </ul> </li> <li><a class=\"external\" rel=\"external\" href=\"http://jibbering.com/2002/4/httprequest.html\" title=\"http://jibbering.com/2002/4/httprequest.html\" target=\"_blank\">\"Using the XMLHttpRequest Object\" (jibbering.com)</a></li> <li><a class=\"external\" rel=\"external\" href=\"http://www.peej.co.uk/articles/rich-user-experience.html\" title=\"http://www.peej.co.uk/articles/rich-user-experience.html\" target=\"_blank\">XMLHttpRequest - REST and the Rich User Experience</a></li>","summary":"<p><code>XMLHttpRequest</code> is a <a class=\"internal\" title=\"En/JavaScript\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript\">JavaScript</a> object that was designed by Microsoft and adopted by Mozilla, Apple, and Google. It's now being <a class=\"external\" title=\"http://www.w3.org/TR/XMLHttpRequest/\" rel=\"external\" href=\"http://www.w3.org/TR/XMLHttpRequest/\" target=\"_blank\">standardized in the W3C</a>. It provides an easy way to retrieve data at a URL. Despite its name, <code>XMLHttpRequest</code> can be used to retrieve any type of data, not just XML, and it supports protocols other than <a title=\"en/HTTP\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTTP\">HTTP</a> (including <code>file</code> and <code>ftp</code>).</p>\n<p>To create an instance of <code>XMLHttpRequest</code>, simply do this:</p>\n<pre>var req = new XMLHttpRequest();\n</pre>\n<p>For details about how to use <code>XMLHttpRequest</code>, see <a class=\"internal\" title=\"En/Using XMLHttpRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/XMLHttpRequest/Using_XMLHttpRequest\">Using XMLHttpRequest</a>.</p>","members":[{"name":"sendAsBinary","help":"<div id=\"section_12\"><p><span title=\"(Firefox 3)\n\">Requires Gecko 1.9</span>\n</p>\n<p>A variant of the <code>send()</code>method that sends binary data.</p>\n\n</div><div id=\"section_13\"><span id=\"Parameters_4\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>body</code></dt> <dd>The request body as a DOMstring. This data is converted to a string of single-byte characters by truncation (removing the high-order byte of each character).</dd>\n</dl>\n</div>","idl":"<pre>void sendAsBinary(\n in DOMString body\n);\n</pre>","obsolete":false},{"name":"send","help":"<p>Sends the request. If the request is asynchronous (which is the default), this method returns as soon as the request is sent. If the request is synchronous, this method doesn't return until the response has arrived.</p>\n<div class=\"note\"><strong>Note:</strong> Any event listeners you wish to set must be set before calling <code>send()</code>.</div>\n\n<div id=\"section_11\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>body</code></dt> <dd>This may be an <code>nsIDocument</code>, <code>nsIInputStream</code>, or a string (an <code>nsISupportsString</code> if called from native code) that is used to populate the body of a POST request. Starting with Gecko 1.9.2, you may also specify an DOM<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n , and starting with Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n you may also specify a <a title=\"en/XMLHttpRequest/FormData\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData\"><code>FormData</code></a> object.</dd>\n</dl>\n</div>","idl":"<pre>void send(\n [optional] in nsIVariant body\n);\n</pre>","obsolete":false},{"name":"getResponseHeader","help":"Returns the string containing the text of the specified header, or <code>null</code> if either the response has not yet been received or the header doesn't exist in the response.","idl":"<pre>ACString getResponseHeader(\n in AUTF8String header\n);\n</pre>","obsolete":false},{"name":"setRequestHeader","help":"<p>Sets the value of an HTTP request header.You must call <a class=\"internal\" title=\"/en/XMLHttpRequest#open()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/nsIXMLHttpRequest#open()\"><code>open()</code></a>before using this method.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_5\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>header</code></dt> <dd>The name of the header whose value is to be set.</dd> <dt><code>value</code></dt> <dd>The value to set as the body of the header.</dd>\n</dl>\n</div>","idl":"<pre>void setRequestHeader(\n in AUTF8String header,\n in AUTF8String value\n);\n</pre>","obsolete":false},{"name":"init","help":"<p>Initializes the object for use from C++code.</p>\n<div class=\"warning\"><strong>Warning:</strong> This method must <em>not</em> be called from JavaScript.</div>\n\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>principal</code></dt> <dd>The principal to use for the request; must not be <code>null</code>.</dd> <dt><code>scriptContext</code></dt> <dd>The script context to use for the request; must not be <code>null</code>.</dd> <dt><code>ownerWindow</code></dt> <dd>The window associated with the request; may be <code>null</code>.</dd>\n</dl>\n</div>","idl":"<pre>[noscript] void init(\n in nsIPrincipal principal,\n in nsIScriptContext scriptContext,\n in nsPIDOMWindow ownerWindow\n);\n</pre>","obsolete":false},{"name":"open","help":"<p>Initializes a request. This method is to be used from JavaScript code; to initialize a request from native code, use <a class=\"internal\" title=\"/en/XMLHttpRequest#openRequest()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/nsIXMLHttpRequest#openRequest()\"><code>openRequest()</code></a>instead.</p>\n<div class=\"note\"><strong>Note:</strong> Calling this method an already active request (one for which <code>open()</code>or <code>openRequest()</code>has already been called) is the equivalent of calling <code>abort()</code>.</div>\n\n<div id=\"section_9\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>method</code></dt> <dd>The HTTP method to use; either \"POST\" or \"GET\". Ignored for non-HTTP(S) URLs.</dd> <dt><code>url</code></dt> <dd>The URL to which to send the request.</dd> <dt><code>async</code></dt> <dd>An optional boolean parameter, defaulting to <code>true</code>, indicating whether or not to perform the operation asynchronously. If this value is <code>false</code>, the <code>send()</code>method does not return until the response is received. If <code>true</code>, notification of a completed transaction is provided using event listeners. This <em>must</em> be true if the <code>multipart</code> attribute is <code>true</code>, or an exception will be thrown.</dd> <dt><code>user</code></dt> <dd>The optional user name to use for authentication purposes; by default, this is an empty string.</dd> <dt><code>password</code></dt> <dd>The optional password to use for authentication purposes; by default, this is an empty string.</dd>\n</dl>\n<p></p></div>","idl":"<pre>void open(\n in AUTF8String method,\n in AUTF8String url,\n [optional] in boolean async,\n [optional] in AString user,\n [optional] in AString password\n);\n</pre>","obsolete":false},{"name":"openRequest","help":"Initializes a request. This method is to be used from native code; to initialize a request from JavaScript code, use <a class=\"internal\" title=\"/en/XMLHttpRequest#open()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/nsIXMLHttpRequest#open()\"><code>open()</code></a>instead. See the documentation for <code>open()</code>.","obsolete":false},{"name":"abort","help":"Aborts the request if it has already been sent.","obsolete":false},{"name":"overrideMimeType","help":"Overrides the MIME type returned by the server. This may be used, for example, to force a stream to be treated and parsed as text/xml, even if the server does not report it as such.This method must be called before <code>send()</code>.","idl":"<pre>void overrideMimeType(\n in AUTF8String mimetype\n);\n</pre>","obsolete":false},{"name":"getAllResponseHeaders","help":"<pre>string getAllResponseHeaders();\n</pre>\n<p>Returns all the response headers as a string, or <code>null</code> if no response has been received.<strong> Note:</strong> For multipart requests, this returns the headers from the <em>current</em> part of the request, not from the original channel.</p>","obsolete":false},{"name":"channel","help":"The channel used by the object when performing the request. This is <code>null</code> if the channel hasn't been created yet. In the case of a multi-part request, this is the initial channel, not the different parts in the multi-part request. <strong>Requires elevated privileges to access; read-only.</strong>","obsolete":false},{"name":"webkitBackgroundRequest","help":"<p>Indicates whether or not the object represents a background service request. If <code>true</code>, no load group is associated with the request, and security dialogs are prevented from being shown to the user. <strong>Requires elevated privileges to access.</strong></p> <p>In cases in which a security dialog (such as authentication or a bad certificate notification) would normally be shown, the request simply fails instead.</p>","obsolete":false},{"name":"webkitResponseArrayBuffer","help":"The response to the request, as a JavaScript typed array. This is NULL&nbsp;if the request was not successful, or if it hasn't been sent yet. <strong>Read only.</strong>","obsolete":true},{"name":"multipart","help":"<p>Indicates whether or not the response is expected to be a stream of possibly multiple XML documents. If set to <code>true</code>, the content type of the initial response must be <code>multipart/x-mixed-replace</code> or an error will occur. All requests must be asynchronous.</p> <p>This enables support for server push; for each XML document that's written to this request, a new XML DOM document is created and the <code>onload</code> handler is called between documents.</p> <div class=\"note\"><strong>Note:</strong> When this is set, the <code>onload</code> handler and other event handlers are not reset after the first XMLdocument is loaded, and the <code>onload</code> handler is called after each part of the response is received.</div>","obsolete":false},{"name":"readyState","help":"<p>The state of the request:</p> <table class=\"standard-table\"> <tbody> <tr> <td class=\"header\">Value</td> <td class=\"header\">State</td> <td class=\"header\">Description</td> </tr> <tr> <td><code>0</code></td> <td><code>UNSENT</code></td> <td><code>open()</code>has not been called yet.</td> </tr> <tr> <td><code>1</code></td> <td><code>OPENED</code></td> <td><code>send()</code>has not been called yet.</td> </tr> <tr> <td><code>2</code></td> <td><code>HEADERS_RECEIVED</code></td> <td><code>send()</code> has been called, and headers and status are available.</td> </tr> <tr> <td><code>3</code></td> <td><code>LOADING</code></td> <td>Downloading; <code>responseText</code> holds partial data.</td> </tr> <tr> <td><code>4</code></td> <td><code>DONE</code></td> <td>The operation is complete.</td> </tr> </tbody> </table>","obsolete":false},{"name":"response","help":"The response entity body according to <code><a href=\"#responseType\">responseType</a></code>, as an <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>, <a title=\"en/DOM/Blob\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Blob\"><code>Blob</code></a>, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Document\">Document</a></code>\n, JavaScript object (for \"moz-json\"), or string. This is <code>NULL</code>&nbsp;if the request is not complete or was not successful.","obsolete":false},{"name":"responseText","help":"The response to the request as text, or <code>null</code> if the request was unsuccessful or has not yet been sent. <strong>Read-only.</strong>","obsolete":false},{"name":"responseType","help":"<p>Can be set to change the response type. This tells the server what format you want the response to be in.</p> <table class=\"standard-table\"> <tbody> <tr> <td class=\"header\">Value</td> <td class=\"header\">Data type of <code>response</code> property</td> </tr> <tr> <td><em>empty string</em></td> <td>String (this is the default)</td> </tr> <tr> <td>\"arraybuffer\"</td> <td><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a></td> </tr> <tr> <td>\"blob\"</td> <td><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n</td> </tr> <tr> <td>\"document\"</td> <td><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Document\">Document</a></code>\n</td> </tr> <tr> <td>\"text\"</td> <td>String</td> </tr> <tr> <td>\"moz-json\"</td> <td>JavaScript object, parsed from a JSON string returned by the server \n<span title=\"(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)\n\">Requires Gecko 9.0</span>\n</td> </tr> </tbody> </table>","obsolete":false},{"name":"responseXML","help":"<p>The response to the request as a DOM <code><a class=\"internal\" title=\"En/DOM/Document\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document\">Document</a></code> object, or <code>null</code> if the request was unsuccessful, has not yet been sent, or cannot be parsed as XML. The response is parsed as if it were a <code>text/xml</code> stream. <strong>Read-only.</strong></p> <div class=\"note\"><strong>Note:</strong> If the server doesn't apply the <code>text/xml</code> Content-Type header, you can use <code>overrideMimeType()</code>to force <code>XMLHttpRequest</code> to parse it as XML anyway.</div>","obsolete":false},{"name":"status","help":"The status of the response to the request. This is the HTTP result code (for example, <code>status</code> is 200 for a successful request). <strong>Read-only.</strong>","obsolete":false},{"name":"statusText","help":"The response string returned by the HTTP server. Unlike <code>status</code>, this includes the entire text of the response message (\"<code>200 OK</code>\", for example). <strong>Read-only.</strong>","obsolete":false},{"name":"upload","help":"The upload process can be tracked by adding an event listener to <code>upload</code>. \n<span>New in <a rel=\"custom\" href=\"https://developer.mozilla.org/en/Firefox_3.5_for_developers\">Firefox 3.5</a></span>","obsolete":false},{"name":"withCredentials","help":"<p>Indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies or authorization headers. \n<span>New in <a rel=\"custom\" href=\"https://developer.mozilla.org/en/Firefox_3.5_for_developers\">Firefox 3.5</a></span>\n</p> <div class=\"note\"><strong>Note:</strong> This never affects same-site requests.</div> <p>The default is <code>false</code>.</p>","obsolete":false},{"name":"UNSENT","help":"<code>open()</code>has not been called yet.","obsolete":false},{"name":"OPENED","help":"<code>send()</code>has not been called yet.","obsolete":false},{"name":"HEADERS_RECEIVED","help":"<code>send()</code> has been called, and headers and status are available.","obsolete":false},{"name":"LOADING","help":"Downloading; <code>responseText</code> holds partial data.","obsolete":false},{"name":"DONE","help":"The operation is complete.","obsolete":false},{"name":"empty","help":"","obsolete":false}]},"SVGCircleElement":{"title":"SVGCircleElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/SVGCircleElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/circle\">&lt;circle&gt;</a></code>\n SVG Element","summary":"The <code>SVGCircleElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/circle\">&lt;circle&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"cx","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/cx\">cx</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/circle\">&lt;circle&gt;</a></code>\n element.","obsolete":false},{"name":"cy","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/cy\">cy</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/circle\">&lt;circle&gt;</a></code>\n element.","obsolete":false}]},"IDBObjectStore":{"title":"IDBObjectStore","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>12</td> <td>4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>count()</code></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>10.0 (10.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>count()</code></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"The <code>IDBObjectStore</code> interface of the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB API</a> represents an <a title=\"en/IndexedDB#gloss object store\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_object_store\">object store</a> in a database.&nbsp;Records within an object store are sorted according to their keys. This sorting enable fast insertion, look-up, and &nbsp;ordered retrieval.&nbsp;","members":[{"name":"unique","help":"If true, the index will not allow duplicate values for a single key.","obsolete":false},{"name":"multientry","help":"If true, the index will add an entry in the index for each array element when the <em>keypath</em> resolves to an Array. If false, it will add one single entry containing the Array.","obsolete":false},{"name":"add","help":"<p>Returns an <a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and, in a separate thread, creates a <a class=\"external\" title=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone\" rel=\"external\" href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone\" target=\"_blank\">structured clone</a> of the <code>value</code>, and stores the cloned value in the object store. If the record is successfully stored, then a success event is fired on the returned request object, using the <a title=\"en/IndexedDB/IDBTransactionEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent\">IDBTransactionEvent</a> interface, with the <code><a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a></code> set to the key for the stored record, and <code><a title=\"en/IndexedDB/IDBTransactionEvent#attr transaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction\">transaction</a></code> set to the transaction in which this object store is opened. If a record already exists in the object store with the <code>key</code> parameter as its key, then an error event is fired on the returned request object, with <a title=\"en/IndexedDB/IDBErrorEvent#attr code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code\">code</a> set to <code><a title=\"en/IndexedDB/DatabaseException#CONSTRAINT ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR\">CONSTRAINT_ERR</a></code>.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>value</dt> <dd>The value to be stored.</dd> <dt>key</dt> <dd>The key to use to identify the record. If unspecified, it results to null.</dd>\n</dl>\n</div><div id=\"section_6\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_7\"><span id=\"Exceptions\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#DATA ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></dt> <dd>If the object store uses in-line keys or has a key generator, and a key parameter was provided.<br> If the object store uses out-of-line keys and has no key generator, and no key parameter was provided.<br> If the object store uses in-line keys but no key generator, and the object store's key path does not yield a valid key.<br> If the key parameter was provided but does not contain a valid key.<br> If there are indexed on this object store, and using their key path on the value parameter yields a value that is not a valid key.</dd> <dt><code><a title=\"en/IndexedDB/IDBDatabaseException#READ ONLY ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR\">READ_ONLY_ERR</a></code></dt> <dd>If the mode of the associated transaction is <code><a title=\"en/IndexedDB/IDBTransaction#READ ONLY\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY\">READ_ONLY</a></code>.</dd> <dt><code><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\">TRANSACTION_INACTIVE_ERR</a></code></dt> <dd>If the associated transaction is not active.</dd>\n</dl>\n<p>This method can raise a <a title=\"en/DOM/DOMException\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMException\">DOMException</a> with the following code:</p>\n<dl> <dt><code>DATA_CLONE_ERR</code></dt> <dd>If the data being stored could not be cloned by the internal structured cloning algorithm.</dd>\n</dl>\n<dl>\n</dl>\n</div>","idl":"<pre>IDBRequest add(\n&nbsp; in any value,\n&nbsp; in optional any key\n) raises (IDBDatabaseException, DOMException);\n</pre>","obsolete":false},{"name":"put","help":"<p>Returns an <a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and, in a separate thread, creates a <a class=\"external\" title=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone\" rel=\"external\" href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone\" target=\"_blank\">structured clone</a> of the <code>value</code>, and stores the cloned value in the object store. If the record is successfully stored, then a success event is fired on the returned request object, using the <a title=\"en/IndexedDB/IDBTransactionEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent\">IDBTransactionEvent</a> interface, with the <code><a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a></code> set to the key for the stored record, and <code><a title=\"en/IndexedDB/IDBTransactionEvent#attr transaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction\">transaction</a></code> set to the transaction in which this object store is opened.</p>\n\n<div id=\"section_39\"><span id=\"Parameters_9\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>value</dt> <dd>The value to be stored.</dd> <dt>key</dt> <dd>The key to use to identify the record. If unspecified, it results to null.</dd>\n</dl>\n</div><div id=\"section_40\"><span id=\"Returns_9\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt>IDBRequest</dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_41\"><span id=\"Exceptions_10\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<dl> <li> <ul> <li>If this object store uses <a title=\"en/IndexedDB#gloss out-of-line key\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_out-of-line_key\">out-of-line keys</a> and does not use a <a title=\"en/IndexedDB#gloss key generator\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_key_generator\">key generator</a>, but the <code>key</code> parameter was not passed</li> <li>If the object store uses <a title=\"en/IndexedDB#gloss in-line key\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_in-line_key\">in-line keys</a>, but the <code>value</code> object does not have a property identified by the object store's key path.</li> </ul> </li> <dt><code><a title=\"en/IndexedDB/DatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></dt> <dd>If the object store is not in the <a title=\"en/IndexedDB#gloss scope\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_scope\">scope</a> of any existing <a title=\"en/IndexedDB#gloss transaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_transaction\">transaction</a>, or if the associated transaction's mode is <a title=\"en/IndexedDB/IDBTransaction#const read only\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_read_only\"><code>READ_ONLY</code></a>&nbsp;or <a title=\"en/IndexedDB/IDBTransaction#const snapshot read\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_snapshot_read\"><code>SNAPSHOT_READ</code></a>.</dd> <dt><code><a title=\"en/IndexedDB/IDBDatabaseException#SERIAL ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#SERIAL_ERR\">SERIAL_ERR</a></code></dt> <dd>If the data being stored could not be serialized by the internal structured cloning algorithm.</dd>\n</dl>\n<p>This method can raise a <a title=\"en/DOM/DOMException\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMException\">DOMException</a> with the following code:</p>\n<dl> <dt><code>DATA_CLONE_ERR</code></dt> <dd>If the data being stored could not be cloned by the internal structured cloning algorithm.</dd>\n</dl>\n</div>","idl":"<pre>IDBRequest put(\n&nbsp; in any value,\n&nbsp; in optional any key\n) raises (IDBDatabaseException, DOMException);\n</pre>","obsolete":false},{"name":"createIndex","help":"<p>Creates and returns a new index in the connected database. Note that this method must be called only from a <a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\"><code>VERSION_CHANGE</code></a> transaction callback.</p>\n<pre>IDBIndex createIndex (\n&nbsp; in DOMString name, \n&nbsp; in DOMString keyPath, \n&nbsp; in Object optionalParameters\n) raises (IDBDatabaseException);\n\n</pre>\n<div id=\"section_16\"><span id=\"Parameters_3\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>name</dt> <dd>The name of the index to create.</dd> <dt>keyPath</dt> <dd>The key path for the index to use.</dd> <dt>optionalParameters</dt> <dd> <div class=\"warning\"><strong>Warning:</strong> The latest draft of the specification changed this to <code>IDBIndexParameters</code>, which is not yet recognized by any browser</div> <p>Options object whose attributes are optional parameters to the method. It includes the following properties:</p> <table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Attribute</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code>unique</code></td> <td>If true, the index will not allow duplicate values for a single key.</td> </tr> <tr> <td><code>multientry</code></td> <td>If true, the index will add an entry in the index for each array element when the <em>keypath</em> resolves to an Array. If false, it will add one single entry containing the Array.</td> </tr> </tbody> </table> <p>Unknown parameters are ignored.</p> </dd> <dd></dd>\n</dl>\n</div><div id=\"section_17\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><a title=\"en/IndexedDB/IDBIndex\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex\">IDBIndex</a></dt> <dd>The newly created index.</dd>\n</dl>\n</div><div id=\"section_18\"><span id=\"Exceptions_4\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#CONSTRAINT ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR\">CONSTRAINT_ERR</a></code></dt> <dd>If an index with the same name (based on case-sensitive comparison) already exists in the connected database.</dd> <dt><code><a title=\"en/IndexedDB/DatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></dt> <dd>If this method was not called from a <a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\"><code>VERSION_CHANGE</code></a> transaction callback.</dd>\n</dl></div>","obsolete":false},{"name":"index","help":"<p>Opens the named index in this object store.</p>\n\n<div id=\"section_31\"><span id=\"Parameters_7\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>name</dt> <dd>The name of the index to open.</dd>\n</dl>\n</div><div id=\"section_32\"><span id=\"Returns_7\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBIndex\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex\">IDBIndex</a></code></dt> <dd>An object for accessing the index.</dd>\n</dl>\n</div><div id=\"section_33\"><span id=\"Exceptions_8\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_FOUND_ERR</a></code></dt> <dd>If no index exists with the specified name (based on case-sensitive comparison) in the connected database.</dd>\n</dl>\n</div>","idl":"<pre>IDBIndex index(\n&nbsp; in DOMString name\n) raises (IDBDatabaseException);\n</pre>","obsolete":false},{"name":"clear","help":"<p>If the mode of the transaction that this object store belongs to is <code><a title=\"en/IndexedDB/IDBTransaction#READ ONLY\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY\">READ_ONLY</a></code>, this method raises an&nbsp;<a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with its code set to <code><a title=\"en/IndexedDB/IDBDatabaseException#READ ONLY ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR\">READ_ONLY_ERR</a></code>. Otherwise, this method creates and immediately returns an <a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and clears this object store in a separate thread. Clearing an object store consists of removing all records from the object store and removing all records in indexes that reference the object store.</p>\n\n<div id=\"section_9\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_10\"><span id=\"Exceptions_2\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<dl> <dt><a title=\"en/IndexedDB/IDBDatabaseException#READ ONLY ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR\"><code>READ_ONLY_ERR</code></a></dt> <dd>If the mode of the transaction that this object store belongs to is READ_ONLY.</dd> <dt><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\"><code>TRANSACTION_INACTIVE_ERR</code></a></dt> <dd>If the transaction that this object store belongs to is not active.</dd>\n</dl></div>","idl":"<pre>IDBRequest clear(\n) raises (IDBDatabaseException); \n</pre>","obsolete":false},{"name":"openCursor","help":"<p>Immediately returns an <a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and creates a <a title=\"en/IndexedDB#gloss cursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_cursor\">cursor</a> over the records in this object store, in a separate thread. If there is even a single record that matches the <a title=\"en/IndexedDB#gloss key range\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_key_range\">key range</a>, then a success event is fired on the returned object, with its <code><a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a></code> set to the <a title=\"en/IndexedDB/IDBCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBCursor\">IDBCursor</a> object for the new cursor. If no records match the key range, then a success event is fired on the returned object, with its <code><a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a></code> set to null.</p>\n<pre>IDBRequest openCursor (\n&nbsp; in optional IDBKeyRange range, \n&nbsp; in optional unsigned short direction\n) raises (IDBDatabaseException);\n</pre>\n<div id=\"section_35\"><span id=\"Parameters_8\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>range</dt> <dd>The key range to use as the cursor's range. If this parameter is unspecified or null, then the range includes all the records in the object store.</dd> <dt>direction</dt> <dd>The cursor's <a title=\"en/IndexedDB#gloss direction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_direction\">direction</a>.</dd>\n</dl>\n</div><div id=\"section_36\"><span id=\"Returns_8\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_37\"><span id=\"Exceptions_9\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an IDBDatabaseException with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></dt> <dd>If this object store is not in the scope of any existing transaction on the connected database.</dd>\n</dl>\n</div>","obsolete":false},{"name":"get","help":"<p>Immediately returns an <a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object, and retrieves the requested record from the object store in a separate thread. If the operation is successful, then a success event is fired on the returned object, using the <a title=\"en/IndexedDB/IDBTransactionEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent\">IDBTransactionEvent</a> interface, with its <code><a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a></code> set to the retrieved value, and <code><a title=\"en/IndexedDB/IDBTransactionEvent#attr transaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction\">transaction</a></code> set to the transaction in which this object store is opened. If a record does not exist in the object store for the key parameter, then an error event is fired on the returned object, with its <code><a title=\"en/IndexedDB/IDBErrorEvent#attr code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code\">code</a></code> set to <code><a title=\"en/IndexedDB/IDBDatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_FOUND_ERR</a></code> and an appropriate <code><a title=\"en/IndexedDB/IDBErrorEvent#attr message\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message\">message</a></code>.</p>\n<p></p><div class=\"note\"><strong>Note:</strong>&nbsp;This function produces the same result if no record with the given key exists in the database as when a record exists, but with an undefined value. To tell these situations apart, call the openCursor() method with the same key. That method provides a cursor if the record exists, and not if it does not.</div>\n<p></p>\n\n<div id=\"section_27\"><span id=\"Parameters_6\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>key</dt> <dd>The key identifying the record to retrieve.</dd>\n</dl>\n</div><div id=\"section_28\"><span id=\"Returns_6\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_29\"><span id=\"Exceptions_7\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBDatabaseException#DATA ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></dt> <dd>If the <code>key</code> parameter was not a valid value.</dd> <dt><code><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\">TRANSACTION_INACTIVE_ERR</a></code></dt> <dd>If the associated transaction is not active.</dd>\n</dl>\n</div>","idl":"<pre>IDBRequest get(\n&nbsp; in any key\n) raises (IDBDatabaseException);\n</pre>","obsolete":false},{"name":"delete","help":"<p>Immediately returns an <code><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></code> object, and removes the record specified by the given key from this object store, and any indexes that reference it, in a separate thread. If no record exists in this object store corresponding to the key, an error event is fired on the returned request object, with its <code><a title=\"en/IndexedDB/IDBErrorEvent#attr code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code\">code</a></code> set to <code><a title=\"en/IndexedDB/IDBDatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_FOUND_ERR</a></code> and an appropriate <code><a title=\"en/IndexedDB/IDBErrorEvent#attr message\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message\">message</a></code>. If the record is successfully removed, then a success event is fired on the returned request object, using the <code><a title=\"en/IndexedDB/IDBTransactionEvent\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent\">IDBTransactionEvent</a></code> interface, with the <code><a title=\"en/IndexedDB/IDBSuccessEvent#attr result\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result\">result</a></code> set to <code>undefined</code>, and <a title=\"en/IndexedDB/IDBTransactionEvent#attr transaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction\">transaction</a> set to the transaction in which this object store is opened.</p>\n<pre>IDBRequest delete (\n  in any key\n) raises (IDBDatabaseException); \n</pre>\n<div id=\"section_20\"><span id=\"Parameters_4\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>key</dt> <dd>The key to use to identify the record.</dd>\n</dl>\n</div><div id=\"section_21\"><span id=\"Returns_5\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_22\"><span id=\"Exceptions_5\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p></div>","obsolete":false},{"name":"deleteIndex","help":"<p>Destroys the index with the specified name in the connected database. Note that this method must be called only from a <code><a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a></code> transaction callback.</p>\n<pre>void removeIndex(\n  in DOMString indexName\n) raises (IDBDatabaseException); \n</pre>\n<div id=\"section_24\"><span id=\"Parameters_5\"></span><h5 class=\"editable\">Parameters</h5>\n<p>&nbsp;</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></dt> <dd>If the object store is not in the <a title=\"en/IndexedDB#gloss scope\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_scope\">scope</a> of any existing <a title=\"en/IndexedDB#gloss transaction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_transaction\">transaction</a>, or if the associated transaction's mode is <a title=\"en/IndexedDB/IDBTransaction#const read only\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_read_only\"><code>READ_ONLY</code></a>&nbsp;or <a title=\"en/IndexedDB/IDBTransaction#const snapshot read\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_snapshot_read\"><code>SNAPSHOT_READ</code></a>.</dd> <dt><code><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\">TRANSACTION_INACTIVE_ERR</a></code></dt> <dd>If the associated transaction is not active.</dd> <dt>indexName</dt> <dd>The name of the existing index to remove.</dd>\n</dl>\n</div><div id=\"section_25\"><span id=\"Exceptions_6\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<dl> <dt><code><a title=\"en/IndexedDB/DatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></dt> <dd>If this method was not called from a <a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a> transaction callback.</dd> <dt><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT FOUND ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR\">NOT_FOUND_ERR</a></code></dt> <dd>If no index exists with the specified name (based on case-sensitive comparison) in the connected database.</dd>\n</dl>\n</div>","obsolete":false},{"name":"count","help":"<p>Immediately returns an <a title=\"IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a> object and asynchronously count the amount of objects in the object store that match the parameter, a key or a key range. If the parameter is not valid returns an exception.</p>\n\n<div id=\"section_12\"><span id=\"Parameters_2\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>key</dt> <dd>The key or key range that identifies the records to be counted.</dd>\n</dl>\n</div><div id=\"section_13\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_14\"><span id=\"Exceptions_3\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<dl> <dt><code><a href=\"IDBDatabaseException#DATA_ERR\" rel=\"internal\" title=\"en/IndexedDB/DatabaseException#DATA ERR\">DATA_ERR</a></code></dt> <dd>If the object store uses in-line keys or has a key generator, and a key parameter was provided.<br> If the object store uses out-of-line keys and has no key generator, and no key parameter was provided.<br> If the object store uses in-line keys but no key generator, and the object store's key path does not yield a valid key.<br> If the key parameter was provided but does not contain a valid key.<br> If there are indexed on this object store, and using their key path on the value parameter yields a value that is not a valid key.</dd> <dt><code><a href=\"IDBDatabaseException#NOT_ALLOWED_ERR\" rel=\"internal\" title=\"en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></dt> <dd>The request was made on a source object that has been deleted or removed.</dd>\n</dl></div>","idl":"<pre>IDBRequest count(\n  in option any key\n) raises (IDBDatabaseException);\n</pre>","obsolete":false},{"url":"","name":"indexNames","help":"A list of the names of <a title=\"en/IndexedDB#gloss index\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_index\">indexes</a> on objects in this object store.","obsolete":false},{"url":"","name":"keyPath","help":"The <a title=\"en/IndexedDB#gloss key path\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB#gloss_key_path\">key path</a> of this object store. If this attribute is null, the application must provide a key for each modification operation.","obsolete":false},{"url":"","name":"name","help":"The name of this object store.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBObjectStore"},"SVGFEMergeElement":{"title":"feMerge","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMergeNode\">&lt;feMergeNode&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The feMerge filter allows filter effects to be applied concurrently instead of sequentially. This is achieved by other filters storing their output via the \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/result\" class=\"new\">result</a></code> attribute and then accessing it in a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMergeNode\">&lt;feMergeNode&gt;</a></code>\n child.","members":[],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feMerge"},"CDATASection":{"title":"CDATASection","summary":"<p>A CDATA Section can be used within XML to include extended portions of unescaped text, such that the symbols &lt; and &amp; do not need escaping as they normally do within XML when used as text.</p>\n<p>It takes the form:</p>\n<pre class=\"eval\">&lt;![CDATA[  ... ]]&gt;\n</pre>\n<p>For example:</p>\n<pre class=\"eval\">&lt;foo&gt;Here is a CDATA section: &lt;![CDATA[  &lt; &gt; &amp; ]]&gt; with all kinds of unescaped text. &lt;/foo&gt;\n</pre>\n<p>The only sequence which is not allowed within a CDATA section is the closing sequence of a CDATA section itself:</p>\n<pre class=\"eval\">&lt;![CDATA[  ]]&gt; will cause an error   ]]&gt;\n</pre>\n<p>Note that CDATA sections should not be used (without hiding) within HTML.</p>\n<p>As a CDATASection has no properties or methods unique to itself and only directly implements the Text interface, one can refer to <a title=\"En/DOM/Text\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Text\">Text</a> to find its properties and methods.</p>","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/CDATASection","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...l#ID-667469212"},"Node":{"title":"Node","summary":"A <code>Node</code> is an interface from which a number of DOM types inherit, and allows these various types to be treated (or tested) similarly.<br> The following all inherit this interface and its methods and properties (though they may return null in particular cases where not relevant; or throw an exception when adding children to a node type for which no children can exist): <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Document\">Document</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Element\">Element</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Attr\">Attr</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/CharacterData\">CharacterData</a></code>\n (which <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Text\">Text</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Comment\">Comment</a></code>\n, and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/CDATASection\">CDATASection</a></code>\n inherit), <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/ProcessingInstruction\">ProcessingInstruction</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DocumentFragment\">DocumentFragment</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DocumentType\">DocumentType</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Notation\">Notation</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Entity\">Entity</a></code>\n, <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/EntityReference\">EntityReference</a></code>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.isDefaultNamespace","name":"isDefaultNamespace","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.appendChild","name":"appendChild","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.isSupported","name":"isSupported","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.contains","name":"contains","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.compareDocumentPosition","name":"compareDocumentPosition","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.isEqualNode","name":"isEqualNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.removeChild","name":"removeChild","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.setUserData","name":"setUserData","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.hasChildNodes","name":"hasChildNodes","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.hasAttributes","name":"hasAttributes","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.isSameNode","name":"isSameNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.cloneNode","name":"cloneNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.lookupNamespaceURI","name":"lookupNamespaceURI","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/Article_not_found?uri=en/DOM/Node.getFeature","name":"getFeature","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.normalize","name":"normalize","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.getUserData","name":"getUserData","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.replaceChild","name":"replaceChild","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.insertBefore","name":"insertBefore","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.lookupPrefix","name":"lookupPrefix","help":""},{"name":"ELEMENT_NODE","help":"","obsolete":false},{"name":"ATTRIBUTE_NODE","help":"","obsolete":false},{"name":"TEXT_NODE","help":"","obsolete":false},{"name":"DATA_SECTION_NODE","help":"","obsolete":false},{"name":"ENTITY_REFERENCE_NODE","help":"","obsolete":false},{"name":"ENTITY_NODE","help":"","obsolete":false},{"name":"PROCESSING_INSTRUCTION_NODE","help":"","obsolete":false},{"name":"COMMENT_NODE","help":"","obsolete":false},{"name":"DOCUMENT_NODE","help":"","obsolete":false},{"name":"DOCUMENT_TYPE_NODE","help":"","obsolete":false},{"name":"DOCUMENT_FRAGMENT_NODE","help":"","obsolete":false},{"name":"NOTATION_NODE","help":"","obsolete":false},{"name":"DOCUMENT_POSITION_DISCONNECTED","help":"","obsolete":false},{"name":"DOCUMENT_POSITION_PRECEDING","help":"","obsolete":false},{"name":"DOCUMENT_POSITION_FOLLOWING","help":"","obsolete":false},{"name":"DOCUMENT_POSITION_CONTAINS","help":"","obsolete":false},{"name":"DOCUMENT_POSITION_CONTAINED_BY","help":"","obsolete":false},{"name":"DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC","help":"","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.previousSibling","name":"previousSibling","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.textContent","name":"textContent","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.firstChild","name":"firstChild","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.nodeType","name":"nodeType","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.prefix","name":"prefix","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.parentNode","name":"parentNode","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.nextSibling","name":"nextSibling","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.baseURI","name":"baseURI","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.childNodes","name":"childNodes","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.namespaceURI","name":"namespaceURI","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.lastChild","name":"lastChild","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.parentElement","name":"parentElement","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.nodePrincipal","name":"nodePrincipal","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.attributes","name":"attributes","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.nodeValue","name":"nodeValue","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.nodeName","name":"nodeName","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.ownerDocument","name":"ownerDocument","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/Node.localName","name":"localName","help":""}],"srcUrl":"https://developer.mozilla.org/en/DOM/Node","specification":"<li><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-1950641247\" title=\"http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-1950641247\" target=\"_blank\">DOM Level 1 Core: Node interface</a></li> <li><a class=\"external\" title=\"http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247\" target=\"_blank\">DOM&nbsp;Level 2 Core: Node interface</a></li> <li><a class=\"external\" title=\"http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247\" target=\"_blank\">DOM&nbsp;Level 3 Core: Node interface</a></li>"},"File":{"title":"File","srcUrl":"https://developer.mozilla.org/en/DOM/File","specification":"<a title=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#concept-input-type-file-selected\" class=\" external\" rel=\"external\" href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#concept-input-type-file-selected\" target=\"_blank\">File upload state</a> (HTML&nbsp;5 working draft)","seeAlso":"<li><a title=\"en/Using files from web applications\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Using_files_from_web_applications\">Using files from web applications</a></li> <li><a title=\"en/Extensions/Using the DOM File API in chrome code\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Extensions/Using_the_DOM_File_API_in_chrome_code\">Using the DOM&nbsp;File API&nbsp;in chrome code</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/FileReader\">FileReader</a></code>\n</li> <li><a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=523771\" class=\"external\" title=\"\">\nbug 523771</a>\n - Support &lt;input type=file multiple&gt;</li>","summary":"<p>The <code>File</code> object provides information about -- and access to the contents of -- files. These are generally retrieved from a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/FileList\">FileList</a></code>\n object returned as a result of a user selecting files using the <code>input</code> element, or from a drag and drop operation's <a title=\"En/DragDrop/DataTransfer\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DragDrop/DataTransfer\"><code>DataTransfer</code></a> object.</p>\n<div class=\"geckoVersionNote\">\n<p>\n</p><div class=\"geckoVersionHeading\">Gecko 2.0 note<div>(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n</div></div>\n<p></p>\n<p>Starting in Gecko 2.0&nbsp;(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n, the File object inherits from the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n&nbsp;interface, which provides methods and properties providing further information about the file.</p>\n</div>\n<p>The file reference can be saved when the form is submitted while the user is offline, so that the data can be retrieved and uploaded when the Internet connection is restored.</p>\n<div class=\"note\"><strong>Note:</strong> The <code>File</code> object as implemented by Gecko offers several non-standard methods for reading the contents of the file. These should <em>not</em> be used, as they will prevent your web application from being used in other browsers, as well as in future versions of Gecko, which will likely remove these methods.</div>","members":[{"url":"https://developer.mozilla.org/en/DOM/File.fileName","name":"fileName","help":"The name of the file referenced by the <code>File</code> object. <strong>Read only.</strong> \n\n<span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Obsolete since Gecko 7.0</span>","obsolete":true},{"url":"https://developer.mozilla.org/en/DOM/File.fileSize","name":"fileSize","help":"The size of the referenced file in bytes. <strong>Read only.</strong> \n\n<span title=\"(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)\n\">Obsolete since Gecko 7.0</span>","obsolete":true},{"name":"webkitFullPath","help":"The full path of the referenced file; available only to code with UniversalFileRead privileges in chrome. <strong>Read only.</strong>       \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false},{"name":"webkitFullPathInternal","help":"This is an internal-use-only property that does not do security checks. It can only be used from native code, and is used to optimize performance in special cases in which security is not a concern. <strong>Read only.</strong>        \n<span title=\"(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)\n\">Requires Gecko 2.0</span>","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/File.name","name":"name","help":"The name of the file referenced by the <code>File</code> object. <strong>Read only.</strong> \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/File.size","name":"size","help":"The size (in bytes) of the file referenced by the File object. <strong>Read only.</strong> \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/File.type","name":"type","help":"The type (MIME type) of the file referenced by the File object. <strong>Read only.</strong> \n<span title=\"(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)\n\">Requires Gecko 1.9.2</span>","obsolete":false}]},"SVGAnimateMotionElement":{"title":"SVGAnimateMotionElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimateMotionElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animateMotion\">&lt;animateMotion&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimateMotionElement"},"CSSImportRule":{"title":"cssRule","members":[],"srcUrl":"https://developer.mozilla.org/pl/DOM/cssRule","skipped":true,"cause":"Suspect title"},"IDBCursor":{"title":"IDBCursor","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>12\n<span title=\"prefix\">webkit</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","examples":["<h4 class=\"editable\">Example</h4>\n<p>In the following code snippet, we open a transaction and manipulate an entire data set using a cursor. Because the specification is still evolving, Chrome uses prefixes in the methods. Chrome uses the <code>webkit</code> prefix. For example, instead of just <code>IDBCursor.NEXT</code>, use <code>webkitIDBCursor.NEXT</code>. Firefox does not use prefixes, except in the opening method (<code>mozIndexedDB</code>). Event handlers are registered for responding to various situations.</p>\n\n          <pre name=\"code\" class=\"js\">// Taking care of the browser-specific prefixes.\nwindow.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB;\nwindow.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;\nwindow.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;\nwindow.IDBCursor = window.IDBCursor || window.webkitIDBCursor;\nvar db;\n\n...\n\nfunction cursorTest() {\n  // Start a transaction on an object store called \"my-store-name\"\n  // By default, transactions are opened with read-only access.\n  // If you want to have write access, see IDBDatabase.\n  var trans = db.transaction('my-store-name');\n  // Get a reference to the object store.\n  var store = trans.objectStore('my-store-name');\n  // Create a cursor with two optional parameters.  \n  // The first parameter sets the cursor over a specified key range;\n  // while the second one sets the direction of the cursor.  \n  // In this case, the direction is set to IDBCursor.PREV,  \n  // which lets you start at the upper bound of the key range\n  // and then moves downwards. \n  // If you don't want duplicates included, use PREV_NO_DUPLICATE instead.\n  var curreq = store.openCursor(IDBKeyRange.bound(1, 4), IDBCursor.PREV); \n  // The \"onsuccess\" event fires when the cursor is created and \n  // every time the cursor iterates over data. \n  // The following block of code runs multiple times,\n  // until the cursor runs out of data to iterate over.\n  // At that point, the result's request becomes null.\n  curreq.onsuccess = function (e) {\n    var cursor = curreq.result;\n    // If the cursor is pointing at something, ask for the data.    \n    if (cursor) {\n      var getreq = store.get(cursor.key);\n      // After the data has been retrieved, show it.\n      getreq.onsuccess = function (e) {\n        console.log('key:', cursor.key, 'value:', getreq.result);\n        // OK, now move the cursor to the next item. \n        cursor.continue();\n      };\n    }\n  };\n};</pre>\n        \n<p>To learn more about various topics, see the following</p>\n<ul> <li>Starting transactions - <span class=\"eval deki-transform\"><a title=\"en/IndexedDB/IDBDatabase#transaction()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabase#transaction()\">IDBDatabase</a></span></li> <li>Setting transaction modes - <a title=\"en/IndexedDB/IDBTransaction#Mode_constants\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#Mode_constants\">IDBTransaction</a></li> <li>Setting a range of keys - <a title=\"en/IndexedDB/IDBKeyRange\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBKeyRange\">IDBKeyRange</a></li> <li>Creating cursors - <a title=\"en/IndexedDB/IDBIndex#openCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openCursor\">IDBIndex</a></li>\n</ul>","<h4 class=\"editable\">Example</h4>\n<p>In the following code snippet, we open a transaction and manipulate an entire data set using a cursor. Because the specification is still evolving, Chrome uses prefixes in the methods. Chrome uses the <code>webkit</code> prefix. For example, instead of just <code>IDBCursor.NEXT</code>, use <code>webkitIDBCursor.NEXT</code>. Firefox does not use prefixes, except in the opening method (<code>mozIndexedDB</code>). Event handlers are registered for responding to various situations.</p>\n\n          <pre name=\"code\" class=\"js\">// Taking care of the browser-specific prefixes.\nwindow.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB;\nwindow.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;\nwindow.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;\nwindow.IDBCursor = window.IDBCursor || window.webkitIDBCursor;\nvar db;\n\n...\n\nfunction cursorTest() {\n  // Start a transaction on an object store called \"my-store-name\"\n  // By default, transactions are opened with read-only access.\n  // If you want to have write access, see IDBDatabase.\n  var trans = db.transaction('my-store-name');\n  // Get a reference to the object store.\n  var store = trans.objectStore('my-store-name');\n  // Create a cursor with two optional parameters.  \n  // The first parameter sets the cursor over a specified key range;\n  // while the second one sets the direction of the cursor.  \n  // In this case, the direction is set to IDBCursor.PREV,  \n  // which lets you start at the upper bound of the key range\n  // and then moves downwards. \n  // If you don't want duplicates included, use PREV_NO_DUPLICATE instead.\n  var curreq = store.openCursor(IDBKeyRange.bound(1, 4), IDBCursor.PREV); \n  // The \"onsuccess\" event fires when the cursor is created and \n  // every time the cursor iterates over data. \n  // The following block of code runs multiple times,\n  // until the cursor runs out of data to iterate over.\n  // At that point, the result's request becomes null.\n  curreq.onsuccess = function (e) {\n    var cursor = curreq.result;\n    // If the cursor is pointing at something, ask for the data.    \n    if (cursor) {\n      var getreq = store.get(cursor.key);\n      // After the data has been retrieved, show it.\n      getreq.onsuccess = function (e) {\n        console.log('key:', cursor.key, 'value:', getreq.result);\n        // OK, now move the cursor to the next item. \n        cursor.continue();\n      };\n    }\n  };\n};</pre>\n        \n<p>To learn more about various topics, see the following</p>\n<ul> <li>Starting transactions - <span class=\"eval deki-transform\"><a title=\"en/IndexedDB/IDBDatabase#transaction()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabase#transaction()\">IDBDatabase</a></span></li> <li>Setting transaction modes - <a title=\"en/IndexedDB/IDBTransaction#Mode_constants\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#Mode_constants\">IDBTransaction</a></li> <li>Setting a range of keys - <a title=\"en/IndexedDB/IDBKeyRange\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBKeyRange\">IDBKeyRange</a></li> <li>Creating cursors - <a title=\"en/IndexedDB/IDBIndex#openCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openCursor\">IDBIndex</a></li>\n</ul>"],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBCursor","summary":"The <code>IDBCursor</code> interface of the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB API</a> represents a <a title=\"en/IndexedDB#gloss_cursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss_cursor\">cursor</a> for traversing or iterating over multiple records in a database.","members":[{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR","name":"DATA_ERR","help":"The underlying object store uses <a title=\"en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss in-line keys\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss_in-line_keys\">in-line keys</a>, and the key for the cursor's position does not match the <code>value</code> property at the object store's&nbsp;<a class=\"external\" title=\"object store key path\" rel=\"external\" href=\"http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#dfn-object-store-key-path\" target=\"_blank\">key path</a>.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The cursor was created using <a title=\"en/IndexedDB/IDBIndex#openKeyCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor\">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR","name":"READ_ONLY_ERR","help":"The cursor is in a transaction whose mode is <code><a title=\"en/IndexedDB/IDBTransaction#READ ONLY\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY\">READ_ONLY</a></code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR","name":"TRANSACTION_INACTIVE_ERR","help":"The transaction that this cursor belongs to is inactive.","obsolete":false},{"name":"DATA_CLONE_ERR","help":"If the value could not be cloned.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NON_TRANSIET_ERR","name":"NON_TRANSIENT_ERR","help":"The value passed into the <code>count</code> parameter was zero or a negative number.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The cursor was created using <a title=\"en/IndexedDB/IDBIndex#openKeyCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor\">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR","name":"TRANSACTION_INACTIVE_ERR","help":"The transaction that this cursor belongs to is inactive.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR","name":"DATA_ERR","help":"If the <code>key</code> parameter was specified, but did not contain a valid key.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The cursor was created using <a title=\"en/IndexedDB/IDBIndex#openKeyCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor\">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR","name":"TRANSACTION_INACTIVE_ERR","help":"The transaction that this cursor belongs to is inactive.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR","name":"NOT_ALLOWED_ERR","help":"The cursor was created using <a title=\"en/IndexedDB/IDBIndex#openKeyCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor\">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR","name":"READ_ONLY_ERR","help":"The cursor is in a transaction whose mode is <code><a title=\"en/IndexedDB/IDBTransaction#READ ONLY\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY\">READ_ONLY</a></code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR","name":"TRANSACTION_INACTIVE_ERR","help":"The transaction that this cursor belongs to is inactive.","obsolete":false},{"name":"advance","help":"<p>Sets the number times a cursor should move its position forward.</p>\n<pre>IDBRequest advance (\n  in long <em>count</em>\n) raises (IDBDatabaseException);</pre>\n<div id=\"section_13\"><span id=\"Parameter_2\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>count</dt> <dd>The number of advances forward the cursor should make.</dd>\n</dl>\n</div><div id=\"section_14\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div><div id=\"section_15\"><span id=\"Exceptions_2\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Exception</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><a title=\"en/IndexedDB/IDBDatabaseException#NON_TRANSIET_ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NON_TRANSIET_ERR\"><code>NON_TRANSIENT_ERR</code></a></td> <td> <p>The value passed into the <code>count</code> parameter was zero or a negative number.</p> </td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The cursor was created using <a title=\"en/IndexedDB/IDBIndex#openKeyCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor\">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\">TRANSACTION_INACTIVE_ERR</a></code></td> <td>The transaction that this cursor belongs to is inactive.</td> </tr> </tbody>\n</table>\n</div>","obsolete":false},{"name":"delete","help":"<p>Returns an <code><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></code> object, and, in a separate thread, deletes the record at the cursor's position, without changing the cursor's position. Once the record is deleted, the cursor's <code>value</code> is set to <code>null</code>.</p>\n<pre>IDBRequest delete (\n) raises (IDBDatabaseException);</pre>\n<div id=\"section_21\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired. The <code>result</code> attribute is set to <code>undefined</code>.</dd>\n</dl>\n</div><div id=\"section_22\"><span id=\"Exceptions_4\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following code:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Exception</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The cursor was created using <a title=\"en/IndexedDB/IDBIndex#openKeyCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor\">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#READ ONLY ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR\">READ_ONLY_ERR</a></code></td> <td>The cursor is in a transaction whose mode is <code><a title=\"en/IndexedDB/IDBTransaction#READ ONLY\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY\">READ_ONLY</a></code>.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\">TRANSACTION_INACTIVE_ERR</a></code></td> <td>The transaction that this cursor belongs to is inactive.</td> </tr> </tbody>\n</table>\n</div>","obsolete":false},{"name":"continue","help":"<p>Advances the cursor to the next position along its direction, to the item whose key matches the optional <code>key</code> parameter. If no key is specified, advance to the immediate next position, based on the cursor's direction.</p>\n<pre>void continue (\n  in optional any <em>key</em>\n) raises (IDBDatabaseException);</pre>\n<div id=\"section_17\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div><div id=\"section_18\"><span id=\"Parameters\"></span><h5 class=\"editable\">Parameters</h5>\n<dl> <dt>key</dt> <dd>The key to position the cursor at.</dd>\n</dl>\n</div><div id=\"section_19\"><span id=\"Exceptions_3\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a>, with the following codes:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Exception</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#DATA ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></td> <td>If the <code>key</code> parameter was specified, but did not contain a valid key.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The cursor was created using <a title=\"en/IndexedDB/IDBIndex#openKeyCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor\">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\">TRANSACTION_INACTIVE_ERR</a></code></td> <td>The transaction that this cursor belongs to is inactive.</td> </tr> </tbody>\n</table>\n</div>","obsolete":false},{"name":"update","help":"<p>Returns an IDBRequest object, and, in a separate thread, updates the value at the current position of the cursor in the object store. If the cursor points to a record that has just been deleted, a new record is created.</p>\n<pre>IDBRequest update (\n  in any <em>value</em>\n) raises (IDBDatabaseException, DOMException);\n</pre>\n<div id=\"section_9\"><span id=\"Parameter\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>value</dt> <dd>The value to be stored.</dd>\n</dl>\n</div><div id=\"section_10\"><span id=\"Returns\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>\n</dl>\n</div><div id=\"section_11\"><span id=\"Exceptions\"></span><h5 class=\"editable\">Exceptions</h5>\n<p>This method can raise an <a title=\"en/IndexedDB/IDBDatabaseException\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException\">IDBDatabaseException</a> with the following codes:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Exception</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#DATA ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR\">DATA_ERR</a></code></td> <td> <p>The underlying object store uses <a title=\"en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss in-line keys\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss_in-line_keys\">in-line keys</a>, and the key for the cursor's position does not match the <code>value</code> property at the object store's&nbsp;<a class=\"external\" title=\"object store key path\" rel=\"external\" href=\"http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#dfn-object-store-key-path\" target=\"_blank\">key path</a>.</p> </td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#NOT ALLOWED ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR\">NOT_ALLOWED_ERR</a></code></td> <td>The cursor was created using <a title=\"en/IndexedDB/IDBIndex#openKeyCursor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor\">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#READ ONLY ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR\">READ_ONLY_ERR</a></code></td> <td>The cursor is in a transaction whose mode is <code><a title=\"en/IndexedDB/IDBTransaction#READ ONLY\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY\">READ_ONLY</a></code>.</td> </tr> <tr> <td><code><a title=\"en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR\">TRANSACTION_INACTIVE_ERR</a></code></td> <td>The transaction that this cursor belongs to is inactive.</td> </tr> </tbody>\n</table>\n<p>It can also raise a <a title=\"En/DOM/DOMException\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/DOMException\">DOMException</a> with the following code:</p>\n<table class=\"standard-table\"> <thead> <tr> <th scope=\"col\" width=\"131\">Attribute</th> <th scope=\"col\" width=\"698\">Description</th> </tr> </thead> <tbody> <tr> <td><code>DATA_CLONE_ERR</code></td> <td>If the value could not be cloned.</td> </tr> </tbody>\n</table>\n</div>","obsolete":false},{"url":"","name":"NEXT","help":"The cursor shows all records, including duplicates. It starts at the lower bound of the key range and moves upwards (monotonically increasing in the order of keys).","obsolete":false},{"url":"","name":"NEXT_NO_DUPLICATE","help":"The cursor shows all records, excluding duplicates. If multiple records exist with the same key, only the first one iterated is retrieved. It starts at the lower bound of the key range and moves upwards.","obsolete":false},{"url":"","name":"PREV","help":"The cursor shows all records, including duplicates. It starts at the upper bound of the key range and moves downwards (monotonically decreasing in the order of keys).","obsolete":false},{"url":"","name":"PREV_NO_DUPLICATE","help":"The cursor shows all records, excluding duplicates. If multiple records exist with the same key, only the first one iterated is retrieved. It starts at the upper bound of the key range and moves downwards.","obsolete":false},{"url":"","name":"source","help":"On getting, returns the <code>IDBObjectStore</code> or <code>IDBIndex</code> that the cursor is iterating. This function never returns null or throws an exception, even if the cursor is currently being iterated, has iterated past its end, or its transaction is not active.","obsolete":false},{"url":"","name":"direction","help":"On getting, returns the <a title=\"en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss direction\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss_direction\">direction</a> of traversal of the cursor. See Constants for possible values.","obsolete":false},{"url":"","name":"key","help":"Returns the key for the record at the cursor's position. If the cursor is outside its range, this is <code>undefined</code>.","obsolete":false},{"url":"","name":"primaryKey","help":"Returns the cursor's current effective key. If the cursor is currently being iterated or has iterated outside its range, this is <code>undefined</code>.","obsolete":false}]},"CSSPrimitiveValue":{"title":"Interface documentation status","members":[],"srcUrl":"https://developer.mozilla.org/User:trevorh/Interface_documentation_status","skipped":true,"cause":"Suspect title"},"SVGPoint":{"title":"SVGSVGElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGSVGElement","skipped":true,"cause":"Suspect title"},"VoidCallback":{"title":"Mouse Lock API","members":[],"srcUrl":"https://developer.mozilla.org/en/API/Mouse_Lock_API","skipped":true,"cause":"Suspect title"},"EventTarget":{"title":"EventTarget","summary":"An <code>EventTarget</code> is a DOM interface implemented by objects that can receive DOM events and have listeners for them. The most common <code>EventTarget</code>s are <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\" title=\"en/DOM/element\">DOM elements</a>, although other objects can be <code>EventTarget</code>s too, for example <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document\" title=\"en/DOM/document\">document</a>, <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/window\" title=\"en/DOM/window\">window</a>, <a rel=\"internal\" href=\"https://developer.mozilla.org/en/XMLHttpRequest\" title=\"en/XMLHttpRequest\">XMLHttpRequest</a>, and others.\n","members":[{"url":"https://developer.mozilla.org/en/DOM/element.addEventListener","name":"addEventListener","help":"\nRegister an event handler of a specific event type on the <code>EventTarget</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeEventListener","name":"removeEventListener","help":"\nRemoves an event listener from the <code>EventTarget</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.dispatchEvent","name":"dispatchEvent","help":"\nDispatch an event to this <code>EventTarget</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.addEventListener","name":"addEventListener","help":"\nRegister an event handler of a specific event type on the <code>EventTarget</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeEventListener","name":"removeEventListener","help":"\nRemoves an event listener from the <code>EventTarget</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.dispatchEvent","name":"dispatchEvent","help":"\nDispatch an event to this <code>EventTarget</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.addEventListener","name":"addEventListener","help":"\nRegister an event handler of a specific event type on the <code>EventTarget</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.removeEventListener","name":"removeEventListener","help":"\nRemoves an event listener from the <code>EventTarget</code>.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/element.dispatchEvent","name":"dispatchEvent","help":"\nDispatch an event to this <code>EventTarget</code>.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/EventTarget","specification":"DOM Level 2 Events: EventTarget"},"SVGAnimatedNumberList":{"title":"SVGAnimatedNumberList","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedNumber</code> interface is used for attributes which take a list of numbers and which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"A read only <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGNumberList\">SVGNumberList</a></code>\n representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/SVGNumberList\">SVGNumberList</a></code>\n will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedNumberList"},"ImageData":{"title":"ImageData","srcUrl":"https://developer.mozilla.org/en/DOM/ImageData","specification":"http://www.whatwg.org/specs/web-apps...html#imagedata","seeAlso":"Pixel manipulation with canvas","summary":"Used with the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/canvas\">&lt;canvas&gt;</a></code>\n element. Returned by <a title=\"en/DOM/CanvasRenderingContext2D\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D\">CanvasRenderingContext2D</a>'s <a title=\"en/DOM/CanvasRenderingContext2D.createImageData\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D.createImageData\" class=\"new \">createImageData</a> and <a title=\"en/DOM/CanvasRenderingContext2D.getImageData\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D.getImageData\" class=\"new \">getImageData</a> (and accepted as first argument in <a title=\"en/DOM/CanvasRenderingContext2D.putImageData\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D.putImageData\" class=\"new \">putImageData</a>)","members":[]},"HTMLTrackElement":{"title":"track","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>16*</td> <td><span title=\"Not supported.\">--</span><br> \n<span class=\"unimplementedInlineTemplate\">Unimplemented (see<a rel=\"external\" href=\"https://bugzilla.mozilla.org/show_bug.cgi?id=629350\" class=\"external\" title=\"\">\nbug 629350</a>\n)</span>\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<p>* Partially implemented in Chrome 16 and currently behind the --enable-video-track flag or enabling the feature in about:flags.</p>","examples":["&lt;video src=\"sample.ogv\"&gt;\n   &lt;track kind=\"captions\" src=\"sampleCaptions.srt\" srclang=\"en\"&gt;&lt;/track&gt;\n   &lt;track kind=\"descriptions\" src=\"sampleDesciptions.srt\" srclang=\"en\"&gt;&lt;/track&gt;\n   &lt;track kind=\"chapters\" src=\"sampleChapters.srt\" srclang=\"en\"&gt;&lt;/track&gt;\n   &lt;track kind=\"subtitles\" src=\"sampleSubtitles_de.srt\" srclang=\"de\"&gt;&lt;/track&gt;\n   &lt;track kind=\"subtitles\" src=\"sampleSubtitles_en.srt\" srclang=\"en\"&gt;&lt;/track&gt;\n   &lt;track kind=\"subtitles\" src=\"sampleSubtitles_ja.srt\" srclang=\"ja\"&gt;&lt;/track&gt;\n   &lt;track kind=\"subtitles\" src=\"sampleSubtitles_oz.srt\" srclang=\"oz\"&gt;&lt;/track&gt;\n   &lt;track kind=\"metadata\" src=\"keyStage1.srt\" srclang=\"en\" label=\"Key Stage 1\"&gt;&lt;/track&gt;\n   &lt;track kind=\"metadata\" src=\"keyStage2.srt\" srclang=\"en\" label=\"Key Stage 2\"&gt;&lt;/track&gt;\n   &lt;track kind=\"metadata\" src=\"keyStage3.srt\" srclang=\"en\" label=\"Key Stage 3\"&gt;&lt;/track&gt; \n&lt;/video&gt;"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/track","specification":"http://www.w3.org/TR/html5/video.html#the-track-element","summary":"<p>The <code>track</code>&nbsp;element is used as a child of the media elements—<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/audio\">&lt;audio&gt;</a></code>\n and <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/video\">&lt;video&gt;</a></code>\n—and does not represent anything on its own. It lets you specify timed text tracks (or time-based data).</p>\n<p>The type of data that <code> track</code> adds to the media is set in the <code>kind</code> attribute, which can take values of <code>subtitles</code>, <code>captions</code>, <code>descriptions</code>, <code>chapters</code> or <code>metadata</code>. The element points to a source file containing timed text that the browser exposes when the user requests additional data. </p>","members":[{"obsolete":false,"url":"","name":"label","help":"A user-readable title of the text track Used by the browser when listing available text tracks."},{"obsolete":false,"url":"","name":"kind","help":"Kind of text track. The following keywords are allowed: <ul> <li>subtitles: A transcription or translation of the dialogue.</li> <li>captions: A transcription or translation of the dialogue or other sound effects. Suitable for users who are deaf or when the sound is muted.</li> <li>descriptions: Textual descriptions of the video content. Suitable for users who are blind.</li> <li>chapters: Chapter titles, intended to be used when the user is navigating the media resource.</li> <li>metadata: Tracks used by script. Not visible to the user.</li> </ul>"},{"obsolete":false,"url":"","name":"default","help":"This attribute indicates that the track should be enabled unless the user's preferences indicate that another track is more appropriate. This may only be used on one <code>track</code> element per media element."},{"obsolete":false,"url":"","name":"src","help":"Address of the track. Must be a valid URL. This attribute must be defined."},{"obsolete":false,"url":"","name":"srclang","help":"Language of the track text data."}]},"StyleSheetList":{"title":"document.styleSheets","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/document.styleSheets","skipped":true,"cause":"Suspect title"},"SVGColor":{"title":"Colori","summary":"<p>This page explains more about how you can specify color in CSS.\n</p><p>In your sample stylesheet, you introduce background colors.\n</p>","members":[],"srcUrl":"https://developer.mozilla.org/it/Conoscere_i_CSS/Colori"},"SVGPathSegArcAbs":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"SVGFEColorMatrixElement":{"title":"feColorMatrix","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"This filter changes colors based on a transformation matrix. Every pixel's color value (represented by an [R,G,B,A] vector) is <a title=\"http://en.wikipedia.org/wiki/Matrix_multiplication\" class=\" external\" rel=\"external\" href=\"http://en.wikipedia.org/wiki/Matrix_multiplication\" target=\"_blank\">matrix multiplated</a> to create a new color.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in","name":"in","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/type","name":"type","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/values","name":"values","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feColorMatrix"},"SVGPathSegCurvetoQuadraticAbs":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"SVGPathSegCurvetoCubicAbs":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"SVGGElement":{"title":"SVGGElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGGElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/g\">&lt;g&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGGElement"},"EventException":{"title":"DekiScript Code Snippets","members":[],"srcUrl":"https://developer.mozilla.org/User:IgorKitsa/Some_Algorithms","skipped":true,"cause":"Suspect title"},"SVGPolygonElement":{"title":"polygon","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> \n<tr><th scope=\"col\">Feature</th><th scope=\"col\">Chrome</th><th scope=\"col\">Firefox (Gecko)</th><th scope=\"col\">Internet Explorer</th><th scope=\"col\">Opera</th><th scope=\"col\">Safari</th></tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.5 (1.8)\n</td> <td>\n9.0</td> <td>\n8.0</td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>\n3.0</td> <td>1.0 (1.8)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>\n3.0.4</td> </tr> </tbody>\n</table>\n</div>\n<p>The chart is based on <a title=\"en/SVG/Compatibility sources\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Compatibility_sources\">these sources</a>.</p>","examples":["<tr> <th scope=\"col\">Source code</th> <th scope=\"col\">Output result</th> </tr> <tr> <td>\n          <pre name=\"code\" class=\"xml\">&lt;?xml version=\"1.0\"?&gt;\n&lt;svg width=\"120\" height=\"120\" \n     viewPort=\"0 0 120 120\" version=\"1.1\"\n     xmlns=\"http://www.w3.org/2000/svg\"&gt;\n\n    &lt;polygon points=\"60,20 100,40 100,80 60,100 20,80 20,40\"/&gt;\n\n&lt;/svg&gt;</pre>\n        </td> <td>\n<iframe src=\"https://developer.mozilla.org/@api/deki/services/developer.mozilla.org/39/images/3a819e42-12f2-6fab-61fa-69d9f937e686.svg\" width=\"120px\" height=\"120px\" marginwidth=\"0\" marginheight=\"0\" hspace=\"0\" vspace=\"0\" frameborder=\"0\" scrolling=\"no\"></iframe>\n</td> </tr>"],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/polygon","summary":"The <code>polygon</code> element defines a closed shape consisting of a set of connected straight line segments.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/points","name":"points","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/transform","name":"transform","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/externalResourcesRequired","name":"externalResourcesRequired","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""}]},"SVGFEOffsetElement":{"title":"feOffset","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The input image as a whole is offset by the values specified in the \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/dx\" class=\"new\">dx</a></code> and \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/dy\" class=\"new\">dy</a></code> attributes. It's used in creating drop-shadows.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/dy","name":"dy","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in","name":"in","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/dx","name":"dx","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feOffset"},"TouchEvent":{"title":"TouchEvent","examples":["See the <a title=\"en/DOM/Touch events#Example\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Touch_events#Example\">example on the main Touch events article</a>."],"srcUrl":"https://developer.mozilla.org/en/DOM/TouchEvent","seeAlso":"<li><a title=\"en/DOM/Touch events\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/Touch_events\">Touch events</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TouchList\">TouchList</a></code>\n</li>","summary":"<p>A <code>TouchEvent</code> represents an event sent when the state of contacts with a touch-sensitive surface changes. This surface can be a touch screen or trackpad, for example. The event can describe one or more points of contact with the screen and includes support for detecting movement, addition and removal of contact points, and so forth.</p>\n<p>Touches are represented by the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n&nbsp;object; each touch is described by a position, size and shape, amount of pressure, and target element. Lists of touches are represented by <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TouchList\">TouchList</a></code>\n objects.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/TouchEvent.targetTouches","name":"targetTouches","help":"A <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TouchList\">TouchList</a></code>\n of all the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n&nbsp;objects that are both currently in contact with the touch surface <strong>and</strong> were also started on the same element that is the target of the event. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.metaKey","name":"metaKey","help":"A Boolean value indicating whether or not the meta key was down when the touch event was fired. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.ctrlKey","name":"ctrlKey","help":"A Boolean value indicating whether or not the control key was down when the touch event was fired. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.altKey","name":"altKey","help":"A Boolean value indicating whether or not the alt key was down when the touch event was fired. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.shiftKey","name":"shiftKey","help":"A Boolean value indicating whether or not the shift key was down when the touch event was fired. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/TouchEvent.touches","name":"touches","help":"A <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TouchList\">TouchList</a></code>\n of all the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n&nbsp;objects representing all current points of contact with the surface, regardless of target or changed status. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/TouchEvent.changedTouches","name":"changedTouches","help":"A <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TouchList\">TouchList</a></code>\n of all the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Touch\">Touch</a></code>\n objects representing individual points of contact whose states changed between the previous touch event and this one. <strong>Read only.</strong>"},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/event.type","name":"type","help":"The type of touch event that occurred. See <a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/TouchEvent#Touch_event_types\">Touch event types</a>&nbsp;for possible values and details."}]},"HTMLMapElement":{"title":"map","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>1.0</td> <td> <p>1.0 (1.7 or earlier)\n</p> <p>Starting in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)\n, empty maps are no longer skipped over in favor of non-empty ones when matching when in quirks mode. See the section <a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/map#Gecko_notes\">Gecko notes</a> below.</p> </td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>1.0</td> <td>1.0</td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td>1.0</td> <td>1.0 (1)\n</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>1.0</td> <td>1.0</td> </tr> </tbody>\n</table>\n</div>","examples":["&lt;map&gt;\n  &lt;area shape=\"circle\" coords=\"200,250,25\" href=\"another.htm\" /&gt; \n  &lt;area shape=\"default\" /&gt;\n&lt;/map&gt;"],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/map","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/a\">&lt;a&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area\">&lt;area&gt;</a></code>\n</li>","summary":"The HTML <em>Map</em> element (<code>&lt;map&gt;</code>) is used with <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/area\">&lt;area&gt;</a></code>\n elements to define a image map.","members":[]},"SVGClipPathElement":{"title":"SVGClipPathElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGClipPathElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/clipPath\">&lt;clipPath&gt;</a></code>\n SVG Element","summary":"The <code>SVGClipPathElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/clipPath\">&lt;clipPath&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"clipPathUnits","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/clipPathUnits\">clipPathUnits</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/clipPath\">&lt;clipPath&gt;</a></code>\n element. Takes one of the constants defined in <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes\" class=\"new\">SVGUnitTypes</a></code>","obsolete":false}]},"EventSource":{"title":"EventSource","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari</th> </tr> <tr> <td>EventSource support</td> <td>9</td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>11</td> <td>5</td> </tr> <tr> <td><a title=\"HTTP access control\" rel=\"internal\" href=\"https://developer.mozilla.org/En/HTTP_access_control\">Cross-Origin Resource Sharing</a><br> support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td>11.0 (11.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>EventSource support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/Server-sent_events/EventSource","seeAlso":"<li>\n<a rel=\"custom\" href=\"http://www.w3.org/TR/eventsource/#the-eventsource-interface\">Server-Sent Events: The EventSource Interface</a><span title=\"Working Draft\">WD</span></li> <li><a title=\"en/Server-sent events/Using server-sent events\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Server-sent_events/Using_server-sent_events\">Using server-sent events</a></li>","summary":"<p>The <code>EventSource</code> interface is used to manage server-sent events. You can set the onmessage attribute to a JavaScript function to receive non-typed messages (that is, messages with no <code>event</code> field). You can also call <code>addEventListener()</code> to listen for events just like any other event source.</p>\n<p>See <a title=\"en/Server-sent events/Using server-sent events\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Server-sent_events/Using_server-sent_events\">Using server-sent events</a> for further details.</p>","members":[{"name":"init","help":"<div id=\"section_6\"><p>Initializes the object for use from C++ code with the principal, script context, and owner window that should be used.</p>\n\n</div><div id=\"section_7\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>principal</code></dt> <dd>The principal to use for the request. This must not be <code>null</code>.</dd> <dt><code>scriptContext</code></dt> <dd>The script context to use for the request. May be <code>null</code>.</dd> <dt><code>ownerWindow</code></dt> <dd>The associated window for the request. May be <code>null</code>.</dd> <dt><code>url</code></dt> <dd>The <code>EventSource</code>'s URL. This must not be empty.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void init(\n  in nsIPrincipal principal,\n  in nsIScriptContext scriptContext,\n  in nsPIDOMWindow ownerWindow,\n  in DOMString url\n);\n</pre>","obsolete":false},{"name":"close","help":"Closes the connection, if any, and sets the <code>readyState</code> attribute to <code>CLOSED</code>. If the connection is already closed, the method does nothing.","idl":"<pre class=\"eval\">void close();\n</pre>","obsolete":false},{"name":"CONNECTING","help":"The connection is being established.","obsolete":false},{"name":"OPEN","help":"The connection is open and dispatching events.","obsolete":false},{"name":"CLOSED","help":"The connection is not being established, has been closed or there was a fatal error.","obsolete":false},{"name":"onerror","help":"A JavaScript function to call when an error occurs.","obsolete":false},{"name":"onmessage","help":"A JavaScript function to call when an a message without an <code>event</code> field arrives.","obsolete":false},{"name":"onopen","help":"A JavaScript function to call when the connection has opened.","obsolete":false},{"name":"readyState","help":"The state of the connection, must be one of <code>CONNECTING</code>, <code>OPEN</code>, or <code>CLOSED</code>. <strong>Read only.</strong>","obsolete":false},{"name":"url","help":"Read only.","obsolete":false}]},"CSSStyleSheet":{"title":"CSSStyleSheet","srcUrl":"https://developer.mozilla.org/en/DOM/CSSStyleSheet","specification":"DOM Level 2 CSS: <code>CSSStyleSheet</code> interface","seeAlso":"StyleSheet","summary":"<p>An object implementing the <code>CSSStyleSheet</code> interface represents a single <a title=\"en/CSS\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS\">CSS</a> style sheet.</p>\n<p>A CSS style sheet consists of CSS rules, each of which can be manipulated through an object that corresponds to that rule and that implements the <code><a title=\"en/DOM/cssRule\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/cssRule\">CSSRule</a></code> interface. The <code>CSSStyleSheet</code> itself lets you examine and modify its corresponding style sheet, including its list of rules.</p>\n<p>In practice, every <code>CSSStyleSheet</code> also implements the more generic <code><a title=\"en/DOM/StyleSheet\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/stylesheet\">StyleSheet</a></code> interface. A list of <code>CSSStyleSheet</code>-implementing objects corresponding to the style sheets for a given document can be reached by the <code><a title=\"en/DOM/document.styleSheets\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/document.styleSheets\">document.styleSheets</a></code> property, if the document is styled by an external CSS style sheet or an inline <code><a title=\"en/HTML/element/style\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Element/style\">style</a></code> element.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/CSSStyleSheet/insertRule","name":"insertRule","help":"Inserts a new style rule into the current style sheet."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/CSSStyleSheet/deleteRule","name":"deleteRule","help":"Deletes a rule from the style sheet."},{"name":"ownerRule","help":"If this style sheet is imported into the document using an <code><a title=\"en/CSS/@import\" rel=\"internal\" href=\"https://developer.mozilla.org/en/CSS/@import\">@import</a></code> rule, the <code>ownerRule</code> property will return that <code><a title=\"en/DOM/CSSImportRule\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSSImportRule\" class=\"new \">CSSImportRule</a></code>, otherwise it returns <code>null</code>.","obsolete":false},{"name":"cssRules","help":"Returns a <code><a title=\"en/DOM/CSSRuleList\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSSRuleList\">CSSRuleList</a></code> of the CSS rules in the style sheet.","obsolete":false}]},"SVGStyleElement":{"title":"SVGStyleElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGStyleElement</code> interface corresponds to the SVG <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/style\">&lt;style&gt;</a></code>\n element.","members":[{"name":"type","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/type\" class=\"new\">type</a></code> on the given element. A <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n is raised with code <code>NO_MODIFICATION_ALLOWED_ERR</code> on an attempt to change the value of a read only attribut.","obsolete":false},{"name":"media","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/media\" class=\"new\">media</a></code> on the given element. A <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n is raised with code <code>NO_MODIFICATION_ALLOWED_ERR</code> on an attempt to change the value of a read only attribut.","obsolete":false},{"name":"title","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/title\" class=\"new\">title</a></code> on the given element. A <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n is raised with code <code>NO_MODIFICATION_ALLOWED_ERR</code> on an attempt to change the value of a read only attribut.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGStyleElement"},"StyleSheet":{"title":"stylesheet","srcUrl":"https://developer.mozilla.org/en/DOM/stylesheet","specification":"DOM Level 2 Style Sheets: <code>StyleSheet</code> interface","seeAlso":"CSSStyleSheet","summary":"An object implementing the <code>StyleSheet</code> interface represents a single style sheet.&nbsp; CSS style sheets will further implement the more specialized <code><a title=\"en/DOM/CSSStyleSheet\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/CSSStyleSheet\">CSSStyleSheet</a></code> interface.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/StyleSheet/title","name":"title","help":"Returns the advisory title of the current style sheet."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/StyleSheet/parentStyleSheet","name":"parentStyleSheet","help":"Returns the stylesheet that is including this one, if any."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/StyleSheet/media","name":"media","help":"Specifies the intended destination medium for style information."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/StyleSheet/ownerNode","name":"ownerNode","help":"Returns the node that associates this style sheet with the document."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/StyleSheet/href","name":"href","help":"Returns the location of the stylesheet."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/StyleSheet/disabled","name":"disabled","help":"This property indicates whether the current stylesheet has been applied or not."},{"obsolete":false,"url":"https://developer.mozilla.org/en/DOM/StyleSheet/type","name":"type","help":"Specifies the style sheet language for this style sheet."}]},"SVGMaskElement":{"title":"SVGMaskElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGMaskElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/mask\">&lt;mask&gt;</a></code>\n SVG Element","summary":"The <code>SVGMaskElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/mask\">&lt;mask&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"maskUnits","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/maskUnits\" class=\"new\">maskUnits</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/mask\">&lt;mask&gt;</a></code>\n element. Takes one of the constants defined in <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes\" class=\"new\">SVGUnitTypes</a></code>","obsolete":false},{"name":"maskContentUnits","help":"Corresponds to attribute \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/maskContentUnits\" class=\"new\">maskContentUnits</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/mask\">&lt;mask&gt;</a></code>\n element. Takes one of the constants defined in <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes\" class=\"new\">SVGUnitTypes</a></code>","obsolete":false},{"name":"width","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/width\">width</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/mask\">&lt;mask&gt;</a></code>\n element.","obsolete":false},{"name":"height","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/height\">height</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/mask\">&lt;mask&gt;</a></code>\n element.","obsolete":false}]},"HTMLInputElement":{"title":"HTMLInputElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input\">&lt;input&gt;</a></code>\n&nbsp;HTML&nbsp;element","summary":"DOM <code>Input</code> objects expose the <a title=\"http://dev.w3.org/html5/spec/the-input-element.html#htmlinputelement\" class=\" external\" rel=\"external\" href=\"http://dev.w3.org/html5/spec/the-input-element.html#htmlinputelement\" target=\"_blank\">HTMLInputElement</a> (or \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> <a class=\" external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-6043025\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-6043025\" target=\"_blank\"><code>HTMLInputElement</code></a>) interface, which provides special properties and methods (beyond the regular <a rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of input elements.","members":[{"name":"blur","help":"Removes focus from input; keystrokes will subsequently go nowhere.","obsolete":false},{"name":"checkValidity","help":"Returns false if the element is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an <code>invalid</code> event at the element. It returns true if the element is not a candidate for constraint validation, or if it satisfies its constraints.","obsolete":false},{"name":"click","help":"Simulates a click on the element.","obsolete":false},{"name":"focus","help":"Focus on input; keystrokes will subsequently go to this element.","obsolete":false},{"name":"webkitGetFileNameArray","help":"Returns an array of all the file names from the input.","obsolete":false},{"name":"webkitSetFileNameArray","help":"Sets the filenames for the files selected on the input.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Input.select","name":"select","help":"Selects the input text in the element, and focuses it so the user can subsequently replace the whole entry.","obsolete":false},{"name":"setCustomValidity","help":"Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Input.setSelectionRange","name":"setSelectionRange","help":"Selects a range of text in the element (but does not focus it). The optional <code>selectionDirection</code> parameter may be \"forward\" or \"backward\" to establish the direction in which selection was set, or \"none\"if the direction is unknown or not relevant. The default is \"none\". Specifying <code>selectionDirection</code> sets the value of the <code>selectionDirection</code> property.","obsolete":false},{"name":"stepDown","help":"<p>Decrements the <strong>value</strong> by (<strong>step</strong> * <code>n</code>), where <code>n</code> defaults to 1 if not specified. Throws an INVALID_STATE_ERR exception:</p> <ul> <li>if the method is not applicable to for the current <strong>type</strong> value.</li> <li>if the element has no step value.</li> <li>if the <strong>value</strong> cannot be converted to a number.</li> <li>if the resulting value is above the <strong>max</strong> or below the <strong>min</strong>.&nbsp;</li> </ul>","obsolete":false},{"name":"stepUp","help":"<p>Increments the <strong>value</strong> by (<strong>step</strong> * <code>n</code>), where <code>n</code> defaults to 1 if not specified. Throws an INVALID_STATE_ERR exception:</p> <ul> <li>if the method is not applicable to for the current <strong>type</strong> value.</li> <li>if the element has no step value.</li> <li>if the <strong>value</strong> cannot be converted to a number.</li> <li>if the resulting value is above the <strong>max</strong> or below the <strong>min</strong>.</li> </ul>","obsolete":false},{"name":"accept","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-accept\">accept</a></code>\n HTML&nbsp;attribute, containing comma-separated list of file types accepted by the server when <strong>type</strong> is <code>file</code>.","obsolete":false},{"name":"accessKey","help":"A single character that switches input focus to the control. \n\n<span title=\"\">Obsolete</span>&nbsp;in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"align","help":"Alignment of the element.\n\n<span title=\"\">Obsolete</span>&nbsp;in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"alt","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-alt\">alt</a></code>\n&nbsp;HTML attribute, containing alternative text to use when <strong>type</strong> is <code>image.</code>","obsolete":false},{"name":"autocomplete","help":"Reflects the {{htmlattrxref(\"autocomplete\", \"input)}} HTML attribute, indicating whether the value of the control can be automatically completed by the browser. Ignored if the value of the <strong>type</strong> attribute is <span>hidden</span>, <span>checkbox</span>, <span>radio</span>, <span>file</span>, or a button type (<span>button</span>, <span>submit</span>, <span>reset</span>, <span>image</span>). Possible values are: <ul> <li><span>off</span>: The user must explicitly enter a value into this field for every use, or the document provides its own auto-completion method; the browser does not automatically complete the entry.</li> <li><span>on</span>: The browser can automatically complete the value based on values that the user has entered during previous uses.</li> </ul>","obsolete":false},{"name":"autofocus","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-autofocus\">autofocus</a></code>\n HTML&nbsp;attribute, which specifies that a form control should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form element in a document can have the <strong>autofocus</strong> attribute. It cannot be applied if the <strong>type</strong> attribute is set to <code>hidden</code> (that is, you cannot automatically set focus to a hidden control).","obsolete":false},{"name":"checked","help":"The current state of the element when <strong>type</strong> is <code>checkbox</code> or <code>radio</code>.","obsolete":false},{"name":"defaultChecked","help":"The default state of a radio button or checkbox as originally specified in HTML that created this object.","obsolete":false},{"name":"defaultValue","help":"The default value as originally specified in HTML that created this object.","obsolete":false},{"name":"disabled","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-disabled\">disabled</a></code>\n HTML attribute, indicating that the control is not available for interaction.","obsolete":false},{"name":"files","help":"A list of selected files.","obsolete":false},{"name":"form","help":"<p>The containing form element, if this element is in a form. If this element is not contained in a form element:</p> <ul> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> this can be the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-id\">id</a></code>\n attribute of any <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element in the same document. Even if the attribute is set on <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input\">&lt;input&gt;</a></code>\n, this property will be <code>null</code>, if it isn't the id of a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element.</li> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> this must be <code>null</code>.</li> </ul>","obsolete":false},{"name":"formAction","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formaction\">formaction</a></code>\n HTML attribute, containing the URI&nbsp;of a program that processes information submitted by the element. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-action\">action</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formEncType","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formenctype\">formenctype</a></code>\n HTML&nbsp;attribute, containing the type of content that is used to submit the form to the server. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-enctype\">enctype</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formMethod","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formmethod\">formmethod</a></code>\n&nbsp;HTML&nbsp;attribute, containing the HTTP&nbsp;method that the browser uses to submit the form. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-method\">method</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formNoValidate","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formnovalidate\">formnovalidate</a></code>\n&nbsp;HTML&nbsp;attribute, indicating that the form is not to be validated when it is submitted. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-novalidate\">novalidate</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formTarget","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formtarget\">formtarget</a></code>\n HTML&nbsp;attribute, containing a name or keyword indicating where to display the response that is received after submitting the form. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-target\">target</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"height","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-height\">height</a></code>\n HTML attribute, which defines the height of the image displayed for the button, if the value of <strong>type</strong> is <span>image</span>.","obsolete":false},{"name":"indeterminate","help":"Indicates that a checkbox is neither on nor off.","obsolete":false},{"name":"labels","help":"A list of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/label\">&lt;label&gt;</a></code>\n elements that are labels for this element.","obsolete":false},{"name":"list","help":"Identifies a list of pre-defined options to suggest to the user. The value must be the <strong>id</strong> of a <code><a class=\"new\" href=\"https://developer.mozilla.org/en/HTML/Element/datalist\" rel=\"internal\">&lt;datalist&gt;</a></code> element in the same document. The browser displays only options that are valid values for this input element. This attribute is ignored when the <strong>type</strong> attribute's value is <span>hidden</span>, <span>checkbox</span>, <span>radio</span>, <span>file</span>, or a button type.","obsolete":false},{"name":"max","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-max\">max</a></code>\n HTML&nbsp;attribute, containing the maximum (numeric or date-time) value for this item, which must not be less than its minimum (<strong>min</strong> attribute) value.","obsolete":false},{"name":"maxLength","help":"<p>Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-maxlength\">maxlength</a></code>\n&nbsp;HTML attribute, containing the maximum length of text (in Unicode code points) that the value can be changed to. The constraint is evaluated only when the value is changed</p> <div class=\"note\"><strong>Note:</strong> If you set <code>maxlength</code> to a negative value programmatically, an exception will be thrown.</div>","obsolete":false},{"name":"min","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-min\">min</a></code>\n HTML&nbsp;attribute, containing the minimum (numeric or date-time) value for this item, which must not be greater than its maximum (<strong>max</strong> attribute) value.","obsolete":false},{"name":"multiple","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-multiple\">multiple</a></code>\n HTML&nbsp;attribute, indicating whether more than one value is possible (e.g., multiple files).","obsolete":false},{"name":"name","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-name\">name</a></code>\n HTML&nbsp;attribute, containing a name that identifies the element when submitting the form.","obsolete":false},{"name":"pattern","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-pattern\">pattern</a></code>\n HTML&nbsp;attribute, containing a regular expression that the control's value is checked against. The pattern must match the entire value, not just some subset. Use the <strong>title</strong> attribute to describe the pattern to help the user. This attribute applies when the value of the <strong>type</strong> attribute is <span>text</span>, <span>search</span>, <span>tel</span>, <span>url</span> or <span>email</span>; otherwise it is ignored.","obsolete":false},{"name":"placeholder","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-placeholder\">placeholder</a></code>\n HTML&nbsp;attribute, containing a hint to the user of what can be entered in the control. The placeholder text must not contain carriage returns or line-feeds. This attribute applies when the value of the <strong>type</strong> attribute is <span>text</span>, <span>search</span>, <span>tel</span>, <span>url</span> or <span>email</span>; otherwise it is ignored.","obsolete":false},{"name":"readOnly","help":"<p>Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-readonly\">readonly</a></code>\n HTML&nbsp;attribute, indicating that the user cannot modify the value of the control.</p> <p><span><a href=\"https://developer.mozilla.org/en/HTML/HTML5\" rel=\"custom nofollow\">HTML 5</a></span> This is ignored if the value of the <strong>type</strong> attribute is <span>hidden</span>, <span>range</span>, <span>color</span>, <span>checkbox</span>, <span>radio</span>, <span>file</span>, or a button type.</p>","obsolete":false},{"name":"required","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-required\">required</a></code>\n HTML&nbsp;attribute, indicating that the user must fill in a value before submitting a form.","obsolete":false},{"name":"selectionDirection","help":"The direction in which selection occurred. This is \"forward\" if selection was performed in the start-to-end direction of the current locale, or \"backward\" for the opposite direction. This can also be \"none\"&nbsp;if the direction is unknown.\"","obsolete":false},{"name":"selectionEnd","help":"The index of the end of selected text.","obsolete":false},{"name":"selectionStart","help":"The index of the beginning of selected text.","obsolete":false},{"name":"size","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-size\">size</a></code>\n HTML&nbsp;attribute, containing size of the control. This value is in pixels unless the value of <strong>type</strong> is <span>text</span> or <span>password</span>, in which case, it is an integer number of characters. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> Applies only when <strong>type</strong> is set to <span>text</span>, <span>search</span>, <span>tel</span>, <span>url</span>, <span>email</span>, or <span>password</span>; otherwise it is ignored.","obsolete":false},{"name":"src","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-src\">src</a></code>\n HTML&nbsp;attribute, which specifies a URI for the location of an image to display on the graphical submit button, if the value of <strong>type</strong> is <span>image</span>; otherwise it is ignored.","obsolete":false},{"name":"step","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-step\">step</a></code>\n HTML&nbsp;attribute, which works with<strong> min</strong> and <strong>max</strong> to limit the increments at which a numeric or date-time value can be set. It can be the string <span>any</span> or a positive floating point number. If this is not set to <span>any</span>, the control accepts only values at multiples of the step value greater than the minimum.","obsolete":false},{"name":"tabIndex","help":"The position of the element in the tabbing navigation order for the current document. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"type","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-type\">type</a></code>\n HTML&nbsp;attribute, indicating the type of control to display. See \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-type\">type</a></code>\n attribute of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input\">&lt;input&gt;</a></code>\n for possible values.","obsolete":false},{"name":"useMap","help":"A client-side image map. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.","obsolete":false},{"name":"validity","help":"The validity states that this element is in.&nbsp;","obsolete":false},{"name":"value","help":"Current value in the control.","obsolete":false},{"name":"valueAsDate","help":"The value of the element, interpreted as a date, or <code>null</code> if conversion is not possible.","obsolete":false},{"name":"valueAsNumber","help":"<p>The value of the element, interpreted as one of the following in order:</p> <ol> <li>a time value</li> <li>a number</li> <li><code>null</code> if conversion is not possible</li> </ol>","obsolete":false},{"name":"width","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-width\">width</a></code>\n HTML&nbsp;attribute, which defines the width of the image displayed for the button, if the value of <strong>type</strong> is <span>image</span>.","obsolete":false},{"name":"willValidate","help":"Indicates whether the element is a candidate for constraint validation. It is false if any conditions bar it from constraint validation.","obsolete":false},{"name":"blur","help":"Removes focus from input; keystrokes will subsequently go nowhere.","obsolete":false},{"name":"checkValidity","help":"Returns false if the element is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an <code>invalid</code> event at the element. It returns true if the element is not a candidate for constraint validation, or if it satisfies its constraints.","obsolete":false},{"name":"click","help":"Simulates a click on the element.","obsolete":false},{"name":"focus","help":"Focus on input; keystrokes will subsequently go to this element.","obsolete":false},{"name":"webkitGetFileNameArray","help":"Returns an array of all the file names from the input.","obsolete":false},{"name":"webkitSetFileNameArray","help":"Sets the filenames for the files selected on the input.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Input.select","name":"select","help":"Selects the input text in the element, and focuses it so the user can subsequently replace the whole entry.","obsolete":false},{"name":"setCustomValidity","help":"Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.","obsolete":false},{"url":"https://developer.mozilla.org/en/DOM/Input.setSelectionRange","name":"setSelectionRange","help":"Selects a range of text in the element (but does not focus it). The optional <code>selectionDirection</code> parameter may be \"forward\" or \"backward\" to establish the direction in which selection was set, or \"none\"if the direction is unknown or not relevant. The default is \"none\". Specifying <code>selectionDirection</code> sets the value of the <code>selectionDirection</code> property.","obsolete":false},{"name":"stepDown","help":"<p>Decrements the <strong>value</strong> by (<strong>step</strong> * <code>n</code>), where <code>n</code> defaults to 1 if not specified. Throws an INVALID_STATE_ERR exception:</p> <ul> <li>if the method is not applicable to for the current <strong>type</strong> value.</li> <li>if the element has no step value.</li> <li>if the <strong>value</strong> cannot be converted to a number.</li> <li>if the resulting value is above the <strong>max</strong> or below the <strong>min</strong>.&nbsp;</li> </ul>","obsolete":false},{"name":"stepUp","help":"<p>Increments the <strong>value</strong> by (<strong>step</strong> * <code>n</code>), where <code>n</code> defaults to 1 if not specified. Throws an INVALID_STATE_ERR exception:</p> <ul> <li>if the method is not applicable to for the current <strong>type</strong> value.</li> <li>if the element has no step value.</li> <li>if the <strong>value</strong> cannot be converted to a number.</li> <li>if the resulting value is above the <strong>max</strong> or below the <strong>min</strong>.</li> </ul>","obsolete":false},{"name":"accept","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-accept\">accept</a></code>\n HTML&nbsp;attribute, containing comma-separated list of file types accepted by the server when <strong>type</strong> is <code>file</code>.","obsolete":false},{"name":"accessKey","help":"A single character that switches input focus to the control. \n\n<span title=\"\">Obsolete</span>&nbsp;in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"align","help":"Alignment of the element.\n\n<span title=\"\">Obsolete</span>&nbsp;in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"alt","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-alt\">alt</a></code>\n&nbsp;HTML attribute, containing alternative text to use when <strong>type</strong> is <code>image.</code>","obsolete":false},{"name":"autocomplete","help":"Reflects the {{htmlattrxref(\"autocomplete\", \"input)}} HTML attribute, indicating whether the value of the control can be automatically completed by the browser. Ignored if the value of the <strong>type</strong> attribute is <span>hidden</span>, <span>checkbox</span>, <span>radio</span>, <span>file</span>, or a button type (<span>button</span>, <span>submit</span>, <span>reset</span>, <span>image</span>). Possible values are: <ul> <li><span>off</span>: The user must explicitly enter a value into this field for every use, or the document provides its own auto-completion method; the browser does not automatically complete the entry.</li> <li><span>on</span>: The browser can automatically complete the value based on values that the user has entered during previous uses.</li> </ul>","obsolete":false},{"name":"autofocus","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-autofocus\">autofocus</a></code>\n HTML&nbsp;attribute, which specifies that a form control should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form element in a document can have the <strong>autofocus</strong> attribute. It cannot be applied if the <strong>type</strong> attribute is set to <code>hidden</code> (that is, you cannot automatically set focus to a hidden control).","obsolete":false},{"name":"checked","help":"The current state of the element when <strong>type</strong> is <code>checkbox</code> or <code>radio</code>.","obsolete":false},{"name":"defaultChecked","help":"The default state of a radio button or checkbox as originally specified in HTML that created this object.","obsolete":false},{"name":"defaultValue","help":"The default value as originally specified in HTML that created this object.","obsolete":false},{"name":"disabled","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-disabled\">disabled</a></code>\n HTML attribute, indicating that the control is not available for interaction.","obsolete":false},{"name":"files","help":"A list of selected files.","obsolete":false},{"name":"form","help":"<p>The containing form element, if this element is in a form. If this element is not contained in a form element:</p> <ul> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> this can be the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-id\">id</a></code>\n attribute of any <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element in the same document. Even if the attribute is set on <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input\">&lt;input&gt;</a></code>\n, this property will be <code>null</code>, if it isn't the id of a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element.</li> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> this must be <code>null</code>.</li> </ul>","obsolete":false},{"name":"formAction","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formaction\">formaction</a></code>\n HTML attribute, containing the URI&nbsp;of a program that processes information submitted by the element. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-action\">action</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formEncType","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formenctype\">formenctype</a></code>\n HTML&nbsp;attribute, containing the type of content that is used to submit the form to the server. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-enctype\">enctype</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formMethod","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formmethod\">formmethod</a></code>\n&nbsp;HTML&nbsp;attribute, containing the HTTP&nbsp;method that the browser uses to submit the form. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-method\">method</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formNoValidate","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formnovalidate\">formnovalidate</a></code>\n&nbsp;HTML&nbsp;attribute, indicating that the form is not to be validated when it is submitted. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-novalidate\">novalidate</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formTarget","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-formtarget\">formtarget</a></code>\n HTML&nbsp;attribute, containing a name or keyword indicating where to display the response that is received after submitting the form. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-target\">target</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"height","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-height\">height</a></code>\n HTML attribute, which defines the height of the image displayed for the button, if the value of <strong>type</strong> is <span>image</span>.","obsolete":false},{"name":"indeterminate","help":"Indicates that a checkbox is neither on nor off.","obsolete":false},{"name":"labels","help":"A list of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/label\">&lt;label&gt;</a></code>\n elements that are labels for this element.","obsolete":false},{"name":"list","help":"Identifies a list of pre-defined options to suggest to the user. The value must be the <strong>id</strong> of a <code><a class=\"new\" href=\"https://developer.mozilla.org/en/HTML/Element/datalist\" rel=\"internal\">&lt;datalist&gt;</a></code> element in the same document. The browser displays only options that are valid values for this input element. This attribute is ignored when the <strong>type</strong> attribute's value is <span>hidden</span>, <span>checkbox</span>, <span>radio</span>, <span>file</span>, or a button type.","obsolete":false},{"name":"max","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-max\">max</a></code>\n HTML&nbsp;attribute, containing the maximum (numeric or date-time) value for this item, which must not be less than its minimum (<strong>min</strong> attribute) value.","obsolete":false},{"name":"maxLength","help":"<p>Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-maxlength\">maxlength</a></code>\n&nbsp;HTML attribute, containing the maximum length of text (in Unicode code points) that the value can be changed to. The constraint is evaluated only when the value is changed</p> <div class=\"note\"><strong>Note:</strong> If you set <code>maxlength</code> to a negative value programmatically, an exception will be thrown.</div>","obsolete":false},{"name":"min","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-min\">min</a></code>\n HTML&nbsp;attribute, containing the minimum (numeric or date-time) value for this item, which must not be greater than its maximum (<strong>max</strong> attribute) value.","obsolete":false},{"name":"multiple","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-multiple\">multiple</a></code>\n HTML&nbsp;attribute, indicating whether more than one value is possible (e.g., multiple files).","obsolete":false},{"name":"name","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-name\">name</a></code>\n HTML&nbsp;attribute, containing a name that identifies the element when submitting the form.","obsolete":false},{"name":"pattern","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-pattern\">pattern</a></code>\n HTML&nbsp;attribute, containing a regular expression that the control's value is checked against. The pattern must match the entire value, not just some subset. Use the <strong>title</strong> attribute to describe the pattern to help the user. This attribute applies when the value of the <strong>type</strong> attribute is <span>text</span>, <span>search</span>, <span>tel</span>, <span>url</span> or <span>email</span>; otherwise it is ignored.","obsolete":false},{"name":"placeholder","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-placeholder\">placeholder</a></code>\n HTML&nbsp;attribute, containing a hint to the user of what can be entered in the control. The placeholder text must not contain carriage returns or line-feeds. This attribute applies when the value of the <strong>type</strong> attribute is <span>text</span>, <span>search</span>, <span>tel</span>, <span>url</span> or <span>email</span>; otherwise it is ignored.","obsolete":false},{"name":"readOnly","help":"<p>Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-readonly\">readonly</a></code>\n HTML&nbsp;attribute, indicating that the user cannot modify the value of the control.</p> <p><span><a href=\"https://developer.mozilla.org/en/HTML/HTML5\" rel=\"custom nofollow\">HTML 5</a></span> This is ignored if the value of the <strong>type</strong> attribute is <span>hidden</span>, <span>range</span>, <span>color</span>, <span>checkbox</span>, <span>radio</span>, <span>file</span>, or a button type.</p>","obsolete":false},{"name":"required","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-required\">required</a></code>\n HTML&nbsp;attribute, indicating that the user must fill in a value before submitting a form.","obsolete":false},{"name":"selectionDirection","help":"The direction in which selection occurred. This is \"forward\" if selection was performed in the start-to-end direction of the current locale, or \"backward\" for the opposite direction. This can also be \"none\"&nbsp;if the direction is unknown.\"","obsolete":false},{"name":"selectionEnd","help":"The index of the end of selected text.","obsolete":false},{"name":"selectionStart","help":"The index of the beginning of selected text.","obsolete":false},{"name":"size","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-size\">size</a></code>\n HTML&nbsp;attribute, containing size of the control. This value is in pixels unless the value of <strong>type</strong> is <span>text</span> or <span>password</span>, in which case, it is an integer number of characters. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> Applies only when <strong>type</strong> is set to <span>text</span>, <span>search</span>, <span>tel</span>, <span>url</span>, <span>email</span>, or <span>password</span>; otherwise it is ignored.","obsolete":false},{"name":"src","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-src\">src</a></code>\n HTML&nbsp;attribute, which specifies a URI for the location of an image to display on the graphical submit button, if the value of <strong>type</strong> is <span>image</span>; otherwise it is ignored.","obsolete":false},{"name":"step","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-step\">step</a></code>\n HTML&nbsp;attribute, which works with<strong> min</strong> and <strong>max</strong> to limit the increments at which a numeric or date-time value can be set. It can be the string <span>any</span> or a positive floating point number. If this is not set to <span>any</span>, the control accepts only values at multiples of the step value greater than the minimum.","obsolete":false},{"name":"tabIndex","help":"The position of the element in the tabbing navigation order for the current document. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"type","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-type\">type</a></code>\n HTML&nbsp;attribute, indicating the type of control to display. See \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-type\">type</a></code>\n attribute of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input\">&lt;input&gt;</a></code>\n for possible values.","obsolete":false},{"name":"useMap","help":"A client-side image map. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.","obsolete":false},{"name":"validity","help":"The validity states that this element is in.&nbsp;","obsolete":false},{"name":"value","help":"Current value in the control.","obsolete":false},{"name":"valueAsDate","help":"The value of the element, interpreted as a date, or <code>null</code> if conversion is not possible.","obsolete":false},{"name":"valueAsNumber","help":"<p>The value of the element, interpreted as one of the following in order:</p> <ol> <li>a time value</li> <li>a number</li> <li><code>null</code> if conversion is not possible</li> </ol>","obsolete":false},{"name":"width","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input#attr-width\">width</a></code>\n HTML&nbsp;attribute, which defines the width of the image displayed for the button, if the value of <strong>type</strong> is <span>image</span>.","obsolete":false},{"name":"willValidate","help":"Indicates whether the element is a candidate for constraint validation. It is false if any conditions bar it from constraint validation.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLInputElement"},"HTMLButtonElement":{"title":"HTMLButtonElement","summary":"DOM&nbsp;<code>Button </code>objects expose the <a class=\" external\" title=\"http://www.w3.org/TR/html5/the-button-element.html#the-button-element\" rel=\"external\" href=\"http://www.w3.org/TR/html5/the-button-element.html#the-button-element\" target=\"_blank\">HTMLButtonElement</a> \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>&nbsp;(or <a class=\" external\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-34812697\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-34812697\" target=\"_blank\">HTMLButtonElement</a> \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span>) interface, which provides properties and methods (beyond the <a href=\"https://developer.mozilla.org/en/DOM/element\" rel=\"internal\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of button elements.","members":[{"name":"checkValidity","help":"Not supported for button elements.","obsolete":false},{"name":"setCustomValidity","help":"Not supported for button elements.","obsolete":false},{"name":"accessKey","help":"A single-character keyboard key to give access to the button. In \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> this attribute is inherited from <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/HTMLElement\">HTMLElement</a></code>","obsolete":false},{"name":"autofocus","help":"The control should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form-associated element in a document can have this attribute specified.","obsolete":false},{"name":"disabled","help":"The control is disabled, meaning that it does not accept any clicks.","obsolete":false},{"name":"form","help":"<p>The form that this button is associated with. If the button is a descendant of a form element, then this attribute is the ID of that form element.</p> <p>If the button is not a descendant of a form element, then:</p> <ul> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> The attribute can be the ID of any form element in the same document.</li> <li>\n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML\">HTML 4</a></span> The attribute is null.</li> </ul>","obsolete":false},{"name":"formAction","help":"The URI&nbsp;of a program that processes information submitted by the button. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-action\">action</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formEncType","help":"The type of content that is used to submit the form to the server. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-enctype\">enctype</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formMethod","help":"The HTTP&nbsp;method that the browser uses to submit the form. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-method\">method</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formNoValidate","help":"Indicates that the form is not to be validated when it is submitted. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-enctype\">enctype</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"formTarget","help":"A name or keyword indicating where to display the response that is received after submitting the form. If specified, this attribute overrides the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form#attr-target\">target</a></code>\n attribute of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/form\">&lt;form&gt;</a></code>\n element that owns this element.","obsolete":false},{"name":"labels","help":"A list of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/label\">&lt;label&gt;</a></code>\n elements that are labels for this button.","obsolete":false},{"name":"name","help":"The name of the object when submitted with a form. \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> If specified, it must not be the empty string.","obsolete":false},{"name":"tabIndex","help":"Number that represents this element's position in the tabbing order. in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> this attribute is inherited as a <a title=\"en/HTML/Global attributes#attr-tabindex\" rel=\"internal\" href=\"https://developer.mozilla.org/en/HTML/Global_attributes#attr-tabindex\">global attribute</a>.","obsolete":false},{"name":"type","help":"<p>Indicates the behavior of the button. This is an enumerated attribute with the following possible values:</p> <ul> <li><code>submit</code>:&nbsp;The button submits the form. This is the default value if the attribute is not specified, \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span> or if it is dynamically changed to an empty or invalid value.</li> <li><code>reset</code>:&nbsp;The button resets the form.</li> <li><code>button</code>:&nbsp;The button does nothing.</li> </ul>","obsolete":false},{"name":"validationMessage","help":"A localized message that describes the validation constraints that the control does not satisfy (if any). This attribute is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.","obsolete":false},{"name":"validity","help":"The validity states that this button is in.","obsolete":false},{"name":"value","help":"The current form control value of the button.&nbsp;","obsolete":false},{"name":"willValidate","help":"Indicates whether the button is a candidate for constraint validation. It is false if any conditions bar it from constraint validation.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLButtonElement"},"PageTransitionEvent":{"title":"Interface documentation status","members":[],"srcUrl":"https://developer.mozilla.org/User:trevorh/Interface_documentation_status","skipped":true,"cause":"Suspect title"},"TextTrack":{"title":"track","members":[],"srcUrl":"https://developer.mozilla.org/en/HTML/Element/track","skipped":true,"cause":"Suspect title"},"SVGLangSpace":{"title":"SVGImageElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGImageElement","skipped":true,"cause":"Suspect title"},"SVGTitleElement":{"title":"SVGTitleElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGTitleElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/title\">&lt;title&gt;</a></code>\n element.","members":[],"srcUrl":"https://developer.mozilla.org/en/Document_Object_Model_(DOM)/SVGTitleElement"},"SVGFECompositeElement":{"title":"feComposite","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap\">&lt;feDisplacementMap&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"<p>Two input images are joined by means of an \n<code><a rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Attribute/operator\" class=\"new\">operator</a></code> applied to each input pixel together with an arithmetic operation</p>\n<pre>result = k1*in1*in2 + k2*in1 + k3*in2 + k4</pre>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in2","name":"in2","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/k1","name":"k1","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/operator","name":"operator","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/k2","name":"k2","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in","name":"in","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/k3","name":"k3","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/k4","name":"k4","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feComposite"},"ElementTraversal":{"title":"element","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/element","skipped":true,"cause":"Suspect title"},"SVGAnimatedEnumeration":{"title":"SVGAnimatedEnumeration","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"The <code>SVGAnimatedEnumeration</code> interface is used for attributes whose value must be a constant from a particular enumeration and which can be animated.","members":[{"name":"baseVal","help":"The base value of the given attribute before applying any animations.","obsolete":false},{"name":"animVal","help":"If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGAnimatedEnumeration"},"CustomEvent":{"title":"CustomEvent","summary":"The DOM <code>CustomEvent</code> are events initialized by an application for any purpose. It's represented by the <code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIDOMCustomEvent&amp;ident=nsIDOMCustomEvent\" class=\"new\">nsIDOMCustomEvent</a></code>\n&nbsp;interface, which extends the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMEvent\">nsIDOMEvent</a></code>\n interface.","members":[{"name":"initCustomEvent","help":"<p>Initializes the event in a manner analogous to the similarly-named method in the DOM Events interfaces.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>type</code></dt> <dd>The name of the event.</dd> <dt><code>canBubble</code></dt> <dd>A boolean indicating whether the event bubbles up through the DOM or not.</dd> <dt><code>cancelable</code></dt> <dd>A boolean indicating whether the event is cancelable.</dd> <dt><code>detail</code></dt> <dd>The data passed when initializing the event.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void initCustomEvent(\n  in DOMString type,\n  in boolean canBubble,\n  in boolean cancelable,\n  in any detail\n);\n</pre>","obsolete":false},{"name":"detail","help":"The data passed when initializing the event.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/CustomEvent","specification":"<a rel=\"custom\" href=\"http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#interface-CustomEvent\">DOM Level 3 Events : CustomEvent</a><span title=\"Working Draft\">WD</span>"},"FileReader":{"title":"FileReader","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Firefox (Gecko)</th> <th>Chrome</th> <th>Internet Explorer*</th> <th>Opera*</th> <th>Safari</th> </tr> <tr> <td>Basic support</td> <td>3.6 (1.9.2)\n</td> <td>7</td> <td>10</td> <td><span title=\"Not supported.\">--</span></td> <td>\n<em><a rel=\"custom\" href=\"http://nightly.webkit.org/\">Nightly build</a></em></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Firefox Mobile (Gecko)</th> <th>Android</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<p>*IE9 has a <a class=\"external\" title=\"http://html5labs.interoperabilitybridges.com/prototypes/fileapi/fileapi/info\" rel=\"external\" href=\"http://html5labs.interoperabilitybridges.com/prototypes/fileapi/fileapi/info\" target=\"_blank\">File API Lab</a>. Opera has <a class=\"external\" title=\"http://my.opera.com/desktopteam/blog/2011/04/05/stability-gmail-socks\" rel=\"external\" href=\"http://my.opera.com/desktopteam/blog/2011/04/05/stability-gmail-socks\" target=\"_blank\">partial support</a> in 11.10.</p>","srcUrl":"https://developer.mozilla.org/en/DOM/FileReader","seeAlso":"<li><a title=\"en/Using files from web applications\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Using_files_from_web_applications\">Using files from web applications</a></li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n</li> <li>\n<a rel=\"custom\" href=\"http://www.w3.org/TR/FileAPI/#FileReader-interface\">Specification: File API: FileReader</a><span title=\"Working Draft\">WD</span></li>","summary":"<p>The <code>FileReader</code> object lets web applications asynchronously read the contents of files (or raw data buffers) stored on the user's computer, using <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n objects to specify the file or data to read. File objects may be obtained in one of two ways: from a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/FileList\">FileList</a></code>\n object returned as a result of a user selecting files using the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/input\">&lt;input&gt;</a></code>\n element, or from a drag and drop operation's <a title=\"En/DragDrop/DataTransfer\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DragDrop/DataTransfer\"><code>DataTransfer</code></a> object.</p>\n<p>To create a <code>FileReader</code>, simply do the following:</p>\n<pre>var reader = new FileReader();\n</pre>\n<p>See <a title=\"en/Using files from web applications\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Using_files_from_web_applications\">Using files from web applications</a> for details and examples.</p>","members":[{"name":"readAsDataURL","help":"<p>Starts reading the contents of the specified <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n. When the read operation is finished, the <code>readyState</code> will become <code>DONE</code>, and the <code>onloadend</code> callback, if any, will be called. At that time, the <code>result</code> attribute contains a <code>data:</code> URL representing the file's data.</p>\n\n<p>This method is useful, for example, to get a preview of an image before uploading it:</p>\n\n          <pre name=\"code\" class=\"xml\">&lt;!doctype html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;meta content=\"text/html; charset=UTF-8\" http-equiv=\"Content-Type\" /&gt;\n&lt;title&gt;Image preview example&lt;/title&gt;\n&lt;script type=\"text/javascript\"&gt;\noFReader = new FileReader(), rFilter = /^(image\\/bmp|image\\/cis-cod|image\\/gif|image\\/ief|image\\/jpeg|image\\/jpeg|image\\/jpeg|image\\/pipeg|image\\/png|image\\/svg\\+xml|image\\/tiff|image\\/x-cmu-raster|image\\/x-cmx|image\\/x-icon|image\\/x-portable-anymap|image\\/x-portable-bitmap|image\\/x-portable-graymap|image\\/x-portable-pixmap|image\\/x-rgb|image\\/x-xbitmap|image\\/x-xpixmap|image\\/x-xwindowdump)$/i;\n\noFReader.onload = function (oFREvent) {\n  document.getElementById(\"uploadPreview\").src = oFREvent.target.result;\n};\n\nfunction loadImageFile() {\n  if (document.getElementById(\"uploadImage\").files.length === 0) { return; }\n  var oFile = document.getElementById(\"uploadImage\").files[0];\n  if (!rFilter.test(oFile.type)) { alert(\"You must select a valid image file!\"); return; }\n  oFReader.readAsDataURL(oFile);\n}\n&lt;/script&gt;\n&lt;/head&gt;\n\n&lt;body onload=\"loadImageFile();\"&gt;\n&lt;form name=\"uploadForm\"&gt;\n&lt;table&gt;\n&lt;tbody&gt;\n&lt;tr&gt;\n&lt;td&gt;&lt;img id=\"uploadPreview\" style=\"width: 100px; height: 100px;\" src=\"data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Csvg%20width%3D%22153%22%20height%3D%22153%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%0A%20%3Cg%3E%0A%20%20%3Ctitle%3ENo%20image%3C/title%3E%0A%20%20%3Crect%20id%3D%22externRect%22%20height%3D%22150%22%20width%3D%22150%22%20y%3D%221.5%22%20x%3D%221.500024%22%20stroke-width%3D%223%22%20stroke%3D%22%23666666%22%20fill%3D%22%23e1e1e1%22/%3E%0A%20%20%3Ctext%20transform%3D%22matrix%286.66667%2C%200%2C%200%2C%206.66667%2C%20-960.5%2C%20-1099.33%29%22%20xml%3Aspace%3D%22preserve%22%20text-anchor%3D%22middle%22%20font-family%3D%22Fantasy%22%20font-size%3D%2214%22%20id%3D%22questionMark%22%20y%3D%22181.249569%22%20x%3D%22155.549819%22%20stroke-width%3D%220%22%20stroke%3D%22%23666666%22%20fill%3D%22%23000000%22%3E%3F%3C/text%3E%0A%20%3C/g%3E%0A%3C/svg%3E\" alt=\"Image preview\" /&gt;&lt;/td&gt;\n&lt;td&gt;&lt;input id=\"uploadImage\" type=\"file\" name=\"myPhoto\" onchange=\"loadImageFile();\" /&gt;&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/tbody&gt;\n&lt;/table&gt;\n&lt;p&gt;&lt;input type=\"submit\" value=\"Send\" /&gt;&lt;/p&gt;\n&lt;/form&gt;\n&lt;/body&gt;\n&lt;/html&gt;</pre>\n        \n<div id=\"section_13\"><span id=\"Parameters_4\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>file</code></dt> <dd>The DOM <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n from which to read.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void readAsDataURL(\n  in Blob file\n);\n</pre>","obsolete":false},{"name":"readAsText","help":"<p>Starts reading the specified blob's contents. When the read operation is finished, the <code>readyState</code> will become <code>DONE</code>, and the <code>onloadend</code> callback, if any, will be called. At that time, the <code>result</code> attribute contains the contents of the file as a text string.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_5\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n from which to read.</dd> <dt><code>encoding</code> \n<span title=\"\">Optional</span>\n</dt> <dd>A string indicating the encoding to use for the returned data. By default, UTF-8 is assumed if this parameter is not specified.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void readAsText(\n  in Blob blob,\n  in DOMString encoding \n<span style=\"border: 1px solid #9ED2A4; background-color: #C0FFC7; font-size: x-small; white-space: nowrap; padding: 2px;\" title=\"\">Optional</span>\n\n);\n</pre>","obsolete":false},{"name":"abort","help":"<p>Aborts the read operation. Upon return, the <code>readyState</code> will be <code>DONE</code>.</p>\n\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<p>None.</p>\n</div><div id=\"section_8\"><span id=\"Exceptions_thrown\"></span><h6 class=\"editable\">Exceptions thrown</h6>\n<dl> <dt><code>DOM_FILE_ABORT_ERR</code></dt> <dd><code>abort()</code> was called while no read operation was in progress (that is, the state wasn't <code>LOADING</code>). <div class=\"note\"><strong>Note:</strong>&nbsp;This exception was not thrown by Gecko until Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)\n.</div>\n</dd>\n</dl>\n<p>\n</p><div>\n<span id=\"readAsArrayBuffer()\"></span></div></div>","idl":"<pre class=\"eval\">void abort();\n</pre>","obsolete":false},{"name":"readAsBinaryString","help":"<p>Starts reading the contents of the specified <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n, which may be a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n. When the read operation is finished, the <code>readyState</code> will become <code>DONE</code>, and the <code>onloadend</code> callback, if any, will be called. At that time, the <code>result</code> attribute contains the raw binary data from the file.</p>\n\n<div id=\"section_11\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n from which to read.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void readAsBinaryString(\n  in Blob blob\n);\n</pre>","obsolete":false},{"name":"readAsArrayBuffer","help":"<div id=\"section_8\"><p>Starts reading the contents of the specified <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n. When the read operation is finished, the <code>readyState</code> will become <code>DONE</code>, and the <code>onloadend</code> callback, if any, will be called. At that time, the <code>result</code> attribute contains an <code><a title=\"/en/JavaScript_typed_arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code> representing the file's data.</p>\n\n</div><div id=\"section_9\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/Blob\">Blob</a></code>\n or <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/File\">File</a></code>\n to read into the <code><a title=\"/en/JavaScript_typed_arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void readAsArrayBuffer(\n  in Blob blob\n);\n</pre>","obsolete":false},{"name":"EMPTY","help":"No data has been loaded yet.","obsolete":false},{"name":"LOADING","help":"Data is currently being loaded.","obsolete":false},{"name":"DONE","help":"The entire read request has been completed.","obsolete":false},{"name":"error","help":"The error that occurred while reading the file. <strong>Read only.</strong>","obsolete":false},{"name":"readyState","help":"Indicates the state of the <code>FileReader</code>. This will be one of the <a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/FileReader#State_constants\">State constants</a>. <strong>Read only.</strong>","obsolete":false},{"name":"result","help":"The file's contents. This property is only valid after the read operation is complete, and the format of the data depends on which of the methods was used to initiate the read operation. <strong>Read only.</strong>","obsolete":false},{"name":"onload","help":"Called when the read operation is successfully completed.","obsolete":false},{"name":"onabort","help":"Called when the read operation is aborted.","obsolete":false},{"name":"onloadend","help":"Called when the read is completed, whether successful or not. This is called after either <code>onload</code> or <code>onerror</code>.","obsolete":false},{"name":"onprogress","help":"Called periodically while the data is being read.","obsolete":false},{"name":"onloadstart","help":"Called when reading the data is about to begin.","obsolete":false},{"name":"onerror","help":"Called when an error occurs.","obsolete":false}]},"DataView":{"title":"DataView","srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/DataView","seeAlso":"<li><a class=\"external\" rel=\"external\" href=\"http://www.khronos.org/registry/typedarray/specs/latest/#8\" title=\"http://www.khronos.org/registry/typedarray/specs/latest/#8\" target=\"_blank\">DataView Specification</a></li> <li><a class=\"external\" rel=\"external\" href=\"http://www.khronos.org/registry/typedarray/specs/latest/\" title=\"http://www.khronos.org/registry/typedarray/specs/latest/\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li> <li><a class=\"link-https\" rel=\"external\" href=\"https://github.com/vjeux/jDataView\" title=\"https://github.com/vjeux/jDataView\" target=\"_blank\">jDataView</a>: a Javascript library that provides the DataView API to all browsers.</li>","summary":"<div><strong>DRAFT</strong>\n<div>This page is not complete.</div>\n</div>\n\n<p></p>\n<div class=\"note\"><strong>Note:</strong> <code>DataView</code> is not yet implemented in Gecko. It is implemented in Chrome 9.</div>\n<p>An <code>ArrayBuffer</code> is a useful object for representing an arbitrary chunk of data. In many cases, such data will be read from disk or from the network, and will not follow the alignment restrictions that are imposed on the <a title=\"en/JavaScript_typed_arrays/ArrayBufferView\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView\">Typed Array Views</a> described earlier. In addition, the data will often be heterogeneous in nature and have a defined byte order.</p>\n<p>The <code>DataView</code> view provides a low-level interface for reading such data from and writing it to an <code><a title=\"en/JavaScript_typed_arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>.</p>","constructor":"DataView DataView(<a title=\"en/JavaScript_typed_arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a> buffer, optional unsigned long byteOffset, optional unsigned long byteLength);<p>Returns a new <code>DataView</code> object using the passed <a title=\"en/JavaScript_typed_arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a> for its storage.</p>\n<pre>DataView DataView(\n&nbsp; ArrayBuffer buffer,\n&nbsp; optional unsigned long byteOffset,\n&nbsp; optional unsigned long byteLength\n);\n</pre>\n<div id=\"section_6\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>buffer</code></dt> <dd>An existing <a title=\"en/JavaScript_typed_arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> to use as the storage for the new <code>DataView</code> object.</dd> <dt><code>byteOffset</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The offset, in bytes, to the first byte in the specified buffer for the new view to reference. If not specified, the view of the buffer will start with the first byte.</dd> <dt><code>byteLength</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The number of elements in the byte array. If unspecified, length of the view will match the buffer's length.</dd>\n</dl>\n</div><div id=\"section_7\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>DataView</code> object representing the specified data buffer.</p>\n</div><div id=\"section_8\"><span id=\"Exceptions_thrown\"></span><h6 class=\"editable\">Exceptions thrown</h6>\n<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>The <code>byteOffset</code> and <code>byteLength</code> result in the specified view extending past the end of the buffer.</dd>\n</dl>\n</div>","members":[{"name":"getInt8","help":"<p>Gets a signed 8-bit integer at the specified byte offset from the start of the view.</p>\n\n<div id=\"section_11\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>offset</code></dt> <dd>The offset, in byte, from the start of the view where to read the data.</dd>\n</dl>\n</div><div id=\"section_12\"><span id=\"Exceptions_thrown_2\"></span><h6 class=\"editable\">Exceptions thrown</h6>\n<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>The <code>byteOffset</code> is set such as it would read beyond the end of the view</dd>\n</dl>\n</div>","idl":"<pre>byte getInt8(\n  unsigned long byteOffset\n);\n</pre>","obsolete":false},{"name":"getUint8","help":"<p>Gets an unsigned 8-bit integer at the specified byte offset from the start of the view.</p>\n\n<div id=\"section_14\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>offset</code></dt> <dd>The offset, in byte, from the start of the view where to read the data.</dd>\n</dl>\n<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>The <code>byteOffset</code> is set such as it would read beyond the end of the view</dd>\n</dl>\n</div>","idl":"<pre>byte getUint8(\n  unsigned long byteOffset\n);\n</pre>","obsolete":false}]},"SVGLocatable":{"title":"SVGSVGElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGSVGElement","skipped":true,"cause":"Suspect title"},"SVGHKernElement":{"title":"SVGHKernElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGHKernElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/hkern\">&lt;hkern&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGHKernElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/hkern\">&lt;hkern&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/hkern\">&lt;hkern&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"SVGNumber":{"title":"SVGNumber","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>\n<div id=\"compat-mobile\">\n<table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody>\n</table>\n</div>","summary":"<p>The <code>SVGNumber</code> interface correspond to the <a title=\"https://developer.mozilla.org/en/SVG/Content_type#Number\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Content_type#Number\">&lt;number&gt;</a> basic data type.</p>\n<p>An <code>SVGNumber</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>","members":[{"name":"value","help":"<p>The value of the given attribute.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/DOM/DOMException\">DOMException</a></code>\n with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is Raised on an attempt to change the value of a read only attribute.</p>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGNumber"},"DirectoryEntrySync":{"title":"DirectoryEntrySync","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>13\n<span title=\"prefix\">webkit</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<div><strong>DRAFT</strong> <div>This page is not complete.</div>\n</div>\n<p>The <code>DirectoryEntry</code> interface of the <a title=\"en/DOM/File_API/File_System_API\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/File_API/File_System_API\">FileSystem API</a> represents a directory in a file system.</p>","members":[{"name":"getFile","help":"<p>Creates or looks up a file.</p>\n<pre>void moveTo (\n  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_8\"><span id=\"Parameter\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>\n</dl>\n<ul> <li>If create and exclusive are both true, and the path already exists, getFile must fail.</li> <li>If create is true, the path doesn't exist, and no other error occurs, getFile must create it as a zero-length file and return a corresponding FileEntry.</li> <li>If create is not true and the path doesn't exist, getFile must fail.</li> <li>If create is not true and the path exists, but is a directory, getFile must fail.</li> <li>Otherwise, if no other error occurs, getFile must return a FileEntry corresponding to path.</li>\n</ul>\n<dl> <dt>successCallback</dt> <dd>A callback that is called to return the file selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_9\"><span id=\"Returns_3\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"getDirectory","help":"<p>Creates or looks up a directory.</p>\n<pre>void vopyTo (\n  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>\n);</pre>\n<div id=\"section_11\"><span id=\"Parameter_2\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>\n</dl>\n<ul> <li>If create and exclusive are both true, and the path already exists, getDirectory must fail.</li> <li>If create is true, the path doesn't exist, and no other error occurs, getDirectory must create it as a zero-length file and return a corresponding getDirectory.</li> <li>If create is not true and the path doesn't exist, getDirectory must fail.</li> <li>If create is not true and the path exists, but is a directory, getDirectory must fail.</li> <li>Otherwise, if no other error occurs, getFile must return a getDirectory corresponding to path.</li>\n</ul>\n<dt>successCallback</dt>\n<dd>A callback that is called to return the DirectoryEntry selected or created.</dd>\n<dt>errorCallback</dt>\n<dd>A callback that is called when errors happen.</dd>\n</div><div id=\"section_12\"><span id=\"Returns_4\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"removeRecursively","help":"<p>Deletes a directory and all of its contents, if any. If you are deleting a directory that contains a file that cannot be removed, some of the contents of the directory might be deleted. You cannot delete the root directory of a file system.</p>\n<pre>DOMString toURL (\n  <em>(in </em>VoidCallback successCallback, optional ErrorCallback errorCallback<em>);</em>\n);</pre>\n<div id=\"section_14\"><span id=\"Parameter_3\"></span><h5 class=\"editable\">Parameter</h5>\n<dl> <dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>\n</dl>\n</div><div id=\"section_15\"><span id=\"Returns_5\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>void</code></dt>\n</dl>\n</div>","obsolete":false},{"name":"createReader","help":"<p>Creates a new DirectoryReader to read entries from this Directory.</p>\n<pre>void getMetada ();</pre>\n<div id=\"section_6\"><span id=\"Returns_2\"></span><h5 class=\"editable\">Returns</h5>\n<dl> <dt><code>DirectoryReader</code></dt>\n</dl>\n</div>","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/File_API/File_System_API/DirectoryEntrySync"},"HTMLTableRowElement":{"title":"HTMLTableRowElement","summary":"DOM <code>table row</code> objects expose the <code><a class=\"external\" rel=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-6986576\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-6986576\" target=\"_blank\">HTMLTableRowElement</a></code> interface, which provides special properties and methods (beyond the regular <a title=\"en/DOM/element\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/element\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of rows in an HTML table.","members":[{"name":"insertCell","help":"","obsolete":false},{"name":"deleteCell","help":"row.insertCell","obsolete":false},{"name":"bgColor","help":"row.cells","obsolete":false},{"name":"align","help":"<a title=\"en/DOM/tableRow.bgColor\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/tableRow.bgColor\" class=\"new \">row.bgColor</a> \n\n<span class=\"deprecatedInlineTemplate\" title=\"\">Deprecated</span>","obsolete":false},{"name":"cells","help":"row.ch","obsolete":false},{"name":"rowIndex","help":"row.sectionRowIndex","obsolete":false},{"name":"sectionRowIndex","help":"row.vAlign","obsolete":false},{"name":"ch","help":"row.chOff","obsolete":false},{"name":"chOff","help":"row.rowIndex","obsolete":false},{"name":"vAlign","help":"","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLTableRowElement"},"CanvasPixelArray":{"title":"CanvasPixelArray","summary":"<p>Returned by <a title=\"en/DOM/ImageData\" rel=\"internal\" href=\"https://developer.mozilla.org/en/DOM/ImageData\">ImageData</a>'s <code>data</code> attribute.</p>\n<p>The <code>CanvasPixelArray</code> object indicates the color components of each pixel of an image, first for each of its three RGB&nbsp;values in order (0-255) and then its alpha component (0-255), proceeding from left-to-right, for each row (rows are top to bottom).&nbsp;</p>\n<pre class=\"idl\">  readonly attribute unsigned long <strong>length</strong>\n  <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-canvaspixelarray-get\" title=\"dom-CanvasPixelArray-get\">getter</a> <strong>octet</strong> (in unsigned long index);\n  <a href=\"http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-canvaspixelarray-set\" title=\"dom-CanvasPixelArray-set\">setter</a> <strong>void</strong> (in unsigned long index, in octet value);\n</pre>","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/CanvasPixelArray","specification":"http://www.whatwg.org/specs/web-apps...nvaspixelarray"},"SVGURIReference":{"title":"SVGImageElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGImageElement","skipped":true,"cause":"Suspect title"},"SVGFontFaceNameElement":{"title":"SVGFontFaceNameElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGFontFaceNameElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-name\">&lt;font-face-name&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGFontFaceNameElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-name\">&lt;font-face-name&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-name\">&lt;font-face-name&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"HTMLIsIndexElement":{"title":"HTTP","members":[],"srcUrl":"https://developer.mozilla.org/en/HTTP?action=edit","skipped":true,"cause":"Suspect title"},"Geoposition":{"title":"Using geolocation","members":[],"srcUrl":"https://developer.mozilla.org/en/Using_geolocation","skipped":true,"cause":"Suspect title"},"SVGPathSegLinetoRel":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"SVGTextContentElement":{"title":"SVGTextPositioningElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGTextPositioningElement","skipped":true,"cause":"Suspect title"},"Notation":{"title":"Notation","summary":"<p><span>NOTE:&nbsp;This is not implemented in Mozilla</span></p>\n<p>Represents a DTD notation (read-only). May declare format of an unparsed entity or formally declare the document's processing instruction targets. Inherits methods and properties from <a title=\"En/DOM/Node\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node\"><code>Node</code></a>. Its <code><a title=\"En/DOM/Node/NodeName\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node/NodeName\" class=\"new internal\">nodeName</a></code> is the notation name. Has no parent.</p>","members":[{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Notation.systemId","name":"systemId","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/En/DOM/Notation.publicId","name":"publicId","help":""}],"srcUrl":"https://developer.mozilla.org/en/DOM/Notation","specification":"http://www.w3.org/TR/DOM-Level-3-Cor...ml#ID-5431D1B9"},"MutationEvent":{"title":"document.createEvent","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/document.createEvent","skipped":true,"cause":"Suspect title"},"Int8Array":{"title":"Int8Array","srcUrl":"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int8Array","seeAlso":"<li><a class=\"link-https\" title=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" rel=\"external\" href=\"https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html\" target=\"_blank\">Typed Array Specification</a></li> <li><a title=\"en/JavaScript typed arrays\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays\">JavaScript typed arrays</a></li>","summary":"<p>The <code>Int8Array</code> type represents an array of twos-complement 8-bit signed integers.</p>\n<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>","constructor":"<div class=\"note\"><strong>Note:</strong> In these methods, <code><em>TypedArray</em></code> represents any of the <a title=\"en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses\">typed array object types</a>.</div>\n<table class=\"standard-table\"> <tbody> <tr> <td><code>Int8Array <a title=\"en/JavaScript typed arrays/Int8Array#Int8Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int8Array#Int8Array%28%29\">Int8Array</a>(unsigned long length);<br> </code></td> </tr> <tr> <td><code>Int8Array <a title=\"en/JavaScript typed arrays/Int8Array#Int8Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int8Array#Int8Array%28%29\">Int8Array</a>(<em>TypedArray</em> array);<br> </code></td> </tr> <tr> <td><code>Int8Array <a title=\"en/JavaScript typed arrays/Int8Array#Int8Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int8Array#Int8Array%28%29\">Int8Array</a>(sequence&lt;type&gt; array);<br> </code></td> </tr> <tr> <td><code>Int8Array&nbsp;<a title=\"en/JavaScript typed arrays/Int8Array#Int8Array()\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/Int8Array#Int8Array%28%29\">Int8Array</a>(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length);<br> </code></td> </tr> </tbody>\n</table><p>Returns a new <code>Int8Array</code> object.</p>\n<pre>Int8Array Int8Array(\n&nbsp; unsigned long length\n);\n\nInt8Array Int8Array(\n&nbsp; <em>TypedArray</em> array\n);\n\nInt8Array Int8Array(\n&nbsp; sequence&lt;type&gt; array\n);\n\nInt8Array Int8Array(\n&nbsp; ArrayBuffer buffer,\n&nbsp; optional unsigned long byteOffset,\n&nbsp; optional unsigned long length\n);\n</pre>\n<div id=\"section_7\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>length</code></dt> <dd>The number of elements in the byte array. If unspecified, length of the array view will match the buffer's length.</dd> <dt><code>array</code></dt> <dd>An object of any of the typed array types (such as <code>Int32Array</code>), or a sequence of objects of a particular type, to copy into a new <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a>. Each value in the source array is converted to an 8-bit integer before being copied into the new array.</dd> <dt><code>buffer</code></dt> <dd>An existing <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> to use as the storage for the new <code>Int8Array</code> object.</dd> <dt><code>byteOffset<br> </code></dt> <dd>The offset, in bytes, to the first byte in the specified buffer for the new view to reference. If not specified, the <code>Int8Array</code>'s view of the buffer will start with the first byte.</dd>\n</dl>\n</div><div id=\"section_8\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>A new <code>Int8Array</code> object representing the specified data buffer.</p>\n</div>","members":[{"name":"subarray","help":"<p>Returns a new <code>Int8Array</code> view on the <a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\"><code>ArrayBuffer</code></a> store for this <code>Int8Array</code> object.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Int8Array</code> object.</dd> <dt><code>end</code> \n<span title=\"\">Optional</span>\n</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Int8Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>\n</dl>\n</div><div id=\"section_16\"><span id=\"Notes_2\"></span><h6 class=\"editable\">Notes</h6>\n<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>\n<div class=\"note\"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>\n</div>","idl":"<pre>Int8Array subarray(\n&nbsp; long begin,\n&nbsp; optional long end\n);\n</pre>","obsolete":false},{"name":"set","help":"<p>Sets multiple values in the typed array, reading input values from a specified array.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>array</code></dt> <dd>An array from which to copy values. All values from the source array are copied into the target array, unless the length of the source array plus the offset exceeds the length of the target array, in which case an exception is thrown. If the source array is a typed array, the two arrays may share the same underlying <code><a title=\"en/JavaScript typed arrays/ArrayBuffer\" rel=\"internal\" href=\"https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer\">ArrayBuffer</a></code>; the browser will intelligently copy the source range of the buffer to the destination range.</dd> <dt>offset \n<span title=\"\">Optional</span>\n</dt> <dd>The offset into the target array at which to begin writing values from the source <code>array</code>. If you omit this value, 0 is assumed (that is, the source <code>array</code> will overwrite values in the target array starting at index 0).</dd>\n</dl>\n</div>","idl":"<pre>void set(\n&nbsp; <em>TypedArray</em> array,\n&nbsp; optional unsigned long offset\n);\n\nvoid set(\n&nbsp; type[] array,\n&nbsp; optional unsigned long offset\n);\n</pre>","obsolete":false},{"name":"BYTES_PER_ELEMENT","help":"The size, in bytes, of each array element.","obsolete":false},{"name":"length","help":"The number of entries in the array; for these 8-bit values, this is the same as the size of the array in bytes. <strong>Read only.</strong>","obsolete":false}]},"IDBVersionChangeRequest":{"title":"IDBVersionChangeRequest","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td>12 \n<span title=\"prefix\">-webkit</span></td> <td>From 4.0 (2.0)\n to 4.0 (2.0)\n</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>6.0 (6.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<div class=\"warning\"><strong>Warning: </strong> The latest specification does not include this interface anymore as the <code>IDBDatabase.setVersion()</code> method has been removed. However, it is still implemented in not up-to-date browsers. See the compatibility table for version details.<br> The new way to do it is to use the <a title=\"en/IndexedDB/IDBOpenDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBOpenDBRequest\"><code>IDBOpenDBRequest</code></a> interface which has now the <code>onblocked</code> handler and the newly needed <code>onupgradeneeded</code> one.</div>\n<p>The <code>IDBVersionChangeRequest</code> interface the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB API </a>represents a request to change the version of a database. It is used only by the <a title=\"en/IndexedDB/IDBDatabase#setVersion\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabase#setVersion\"><code>setVersion()</code></a> method of <code><a title=\"en/IndexedDB/IDBDatabase\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBDatabase\">IDBDatabase</a></code>.</p>\n<p>Inherits from:&nbsp;<code><a title=\"en/IndexedDB/IDBRequest\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBRequest\">IDBRequest</a></code></p>","members":[{"url":"","name":"onblocked","help":"The event handler for the blocked event.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeRequest"},"SVGPathSegCurvetoCubicRel":{"title":"SVGPathElement","members":[],"srcUrl":"https://developer.mozilla.org/en/DOM/SVGPathElement","skipped":true,"cause":"Suspect title"},"IDBVersionChangeEvent":{"title":"IDBVersionChangeEvent","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td><code>version</code></td> <td>12</td> <td> <p>From 4.0 (2.0)\n to</p> <p>9.0 (9.0)\n</p> </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>oldVersion</code></td> <td><span title=\"Not supported.\">--</span></td> <td> <p>10.0 (10.0)\n</p> </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> <tr> <td><code>newVersion</code></td> <td><span title=\"Not supported.\">--</span></td> <td> <p>10.0 (10.0)\n</p> </td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE&nbsp;Phone</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td>4.0 (2.0)\n</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Not supported.\">--</span></td> </tr> </tbody> </table>\n</div>","summary":"<p>The <code>IDBVersionChangeEvent</code> interface of the <a title=\"en/IndexedDB\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB\">IndexedDB&nbsp;API</a> indicates that the version of the database has changed.</p>\n<p>The specification has changed and some not up-to-date browsers only support the deprecated unique attribute, <code>version</code>, from an early draft version.</p>","members":[{"url":"","name":"oldVersion","help":"Returns the old version of the database.","obsolete":false},{"url":"","name":"newVersion","help":"Returns the new version of the database.","obsolete":false},{"url":"","name":"version","help":"<div class=\"warning\"><strong>Warning:</strong> While this property is still implemented by not up-to-date browsers, the latest specification does replace it by the <code>oldVersion</code> and <code>newVersion</code> attributes. See compatibility table to know what browsers support them.</div> The new version of the database in a <a title=\"en/IndexedDB/IDBTransaction#VERSION CHANGE\" rel=\"internal\" href=\"https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE\">VERSION_CHANGE</a> transaction.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeEvent"},"SVGTextElement":{"title":"SVGTextElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGTextElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/text\">&lt;text&gt;</a></code>\n SVG Element","summary":"The <code>SVGTextElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/text\">&lt;text&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[]},"HTMLBRElement":{"title":"HTMLBRElement","summary":"DOM break elements expose the <a class=\"external\" href=\"http://www.w3.org/TR/html5/text-level-semantics.html#the-br-element\" rel=\"external nofollow\" target=\"_blank\" title=\"http://www.w3.org/TR/html5/text-level-semantics.html#the-br-element\">HTMLBRElement</a> (or <span><a href=\"https://developer.mozilla.org/en/HTML\" rel=\"custom nofollow\">HTML 4</a></span> <a class=\"external\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-56836063\" rel=\"external nofollow\" target=\"_blank\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-56836063\"><code>HTMLBRElement</code></a>) interface which inherits from HTMLElement, but defines no additional members in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>. The introduced additional property is also deprecated in \n<span>HTML 4.01</span>.","members":[{"name":"clear","help":"Indicates flow of text around floating objects.","obsolete":true}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLBRElement"},"WebGLTexture":{"title":"Cross-domain textures","members":[],"srcUrl":"https://developer.mozilla.org/en/WebGL/Cross-Domain_Textures","skipped":true,"cause":"Suspect title"},"SVGForeignObjectElement":{"title":"SVGForeignObjectElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td>9.0</td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Not supported.\">--</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> <td><span title=\"Please update this with the earliest version of support.\">(Supported)</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGForeignObjectElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/foreignObject\">&lt;foreignObject&gt;</a></code>\n SVG Element","summary":"The <code>SVGForeignObjectElement</code> interface provides access to the properties of <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/foreignObject\">&lt;foreignObject&gt;</a></code>\n elements, as well as methods to manipulate them.","members":[{"name":"width","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/width\">width</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/foreignObject\">&lt;foreignObject&gt;</a></code>\n element.","obsolete":false},{"name":"height","help":"Corresponds to attribute \n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Attribute/height\">height</a></code> on the given <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/foreignObject\">&lt;foreignObject&gt;</a></code>\n element.","obsolete":false}]},"XPathResult":{"title":"XPathResult","seeAlso":"document.evaluate()","summary":"Refer to <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathResult\">nsIDOMXPathResult</a></code>\n for more detail.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SnapshotItem()","name":"snapshotItem","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/IterateNext()","name":"iterateNext","help":""},{"name":"ANY_TYPE","help":"A result set containing whatever type naturally results from evaluation of the expression. Note that if the result is a node-set then UNORDERED_NODE_ITERATOR_TYPE is always the resulting type.\n","obsolete":false},{"name":"NUMBER_TYPE","help":"A result containing a single number. This is useful for example, in an XPath expression using the <code>count()</code> function.\n","obsolete":false},{"name":"STRING_TYPE","help":"A result containing a single string.\n","obsolete":false},{"name":"BOOLEAN_TYPE","help":"A result containing a single boolean value. This is useful for example, in an XPath expression using the <code>not()</code> function.\n","obsolete":false},{"name":"UNORDERED_NODE_ITERATOR_TYPE","help":"A result node-set containing all the nodes matching the expression. The nodes may not necessarily be in the same order that they appear in the document.\n","obsolete":false},{"name":"ORDERED_NODE_ITERATOR_TYPE","help":"A result node-set containing all the nodes matching the expression. The nodes in the result set are in the same order that they appear in the document.\n","obsolete":false},{"name":"UNORDERED_NODE_SNAPSHOT_TYPE","help":"A result node-set containing snapshots of all the nodes matching the expression. The nodes may not necessarily be in the same order that they appear in the document.\n","obsolete":false},{"name":"ORDERED_NODE_SNAPSHOT_TYPE","help":"A result node-set containing snapshots of all the nodes matching the expression. The nodes in the result set are in the same order that they appear in the document.\n","obsolete":false},{"name":"ANY_UNORDERED_NODE_TYPE","help":"A result node-set containing any single node that matches the expression. The node is not necessarily the first node in the document that matches the expression.\n","obsolete":false},{"name":"FIRST_ORDERED_NODE_TYPE","help":"A result node-set containing the first node in the document that matches the expression.\n","obsolete":false},{"obsolete":false,"url":"https://developer.mozilla.org/en/NumberValue","name":"numberValue","help":"readonly float"},{"obsolete":false,"url":"https://developer.mozilla.org/en/BooleanValue","name":"booleanValue","help":"readonly boolean"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SingleNodeValue","name":"singleNodeValue","help":"readonly Node"},{"obsolete":false,"url":"https://developer.mozilla.org/en/SnapshotLength","name":"snapshotLength","help":"readonly Integer"},{"obsolete":false,"url":"https://developer.mozilla.org/en/InvalidInteratorState","name":"invalidIteratorState","help":"readonly boolean"},{"obsolete":false,"url":"https://developer.mozilla.org/en/StringValue","name":"stringValue","help":"readonly String"},{"obsolete":false,"url":"https://developer.mozilla.org/en/ResultType","name":"resultType","help":"readonly integer (short)"}],"srcUrl":"https://developer.mozilla.org/en/XPathResult"},"SVGFontFaceUriElement":{"title":"SVGFontFaceUriElement","compatibility":"<div class=\"htab\"><a name=\"AutoCompatibilityTable\"></a>\n<ul> <li class=\"selected\">Desktop</li> <li>Mobile</li>\n</ul>\n</div><p></p>\n<div id=\"compat-desktop\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Chrome</th> <th>Firefox (Gecko)</th> <th>Internet Explorer</th> <th>Opera</th> <th>Safari (WebKit)</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>\n<div id=\"compat-mobile\"> <table class=\"compat-table\"> <tbody> <tr> <th>Feature</th> <th>Android</th> <th>Firefox Mobile (Gecko)</th> <th>IE Mobile</th> <th>Opera Mobile</th> <th>Safari Mobile</th> </tr> <tr> <td>Basic support</td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> <td><span title=\"Compatibility unknown; please update this.\">?</span></td> </tr> </tbody> </table>\n</div>","srcUrl":"https://developer.mozilla.org/en/DOM/SVGFontFaceUriElement","seeAlso":"<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-uri\">&lt;font-face-uri&gt;</a></code>\n SVG Element","summary":"<p>The <code>SVGFontFaceUriElement</code> interface corresponds to the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-uri\">&lt;font-face-uri&gt;</a></code>\n elements.</p>\n<p>Object-oriented access to the attributes of the <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/font-face-uri\">&lt;font-face-uri&gt;</a></code>\n element via the SVG DOM is not possible.</p>","members":[]},"HTMLAnchorElement":{"title":"HTMLAnchorElement","summary":"DOM anchor elements expose the <a target=\"_blank\" href=\"http://www.w3.org/TR/html5/text-level-semantics.html#htmlanchorelement\" rel=\"external nofollow\" class=\" external\" title=\"http://www.w3.org/TR/html5/text-level-semantics.html#htmlanchorelement\">HTMLAnchorElement</a> (or <span><a href=\"https://developer.mozilla.org/en/HTML\" rel=\"custom nofollow\">HTML 4</a></span> <a target=\"_blank\" title=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-48250443\" href=\"http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-48250443\" rel=\"external nofollow\" class=\" external\"><code>HTMLAnchorElement</code></a>) interface, which provides special properties and methods (beyond the regular <a href=\"https://developer.mozilla.org/en/DOM/element\" rel=\"internal\">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of hyperlink elements.","members":[{"name":"blur","help":"Removes keyboard focus from the current element.","obsolete":false},{"name":"focus","help":"Gives keyboard focus to the current element.","obsolete":false},{"name":"accessKey","help":"A single character that switches input focus to the hyperlink. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"charset","help":"The character encoding of the linked resource. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"coords","help":"Comma-separated list of coordinates. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"hash","help":"The fragment identifier (including the leading hash mark (#)), if any, in the referenced URL.","obsolete":false},{"name":"host","help":"The hostname and port (if it's not the default port) in the referenced URL.","obsolete":false},{"name":"hostname","help":"The hostname in the referenced URL.","obsolete":false},{"name":"href","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/a#attr-href\">href</a></code>\n HTML attribute, containing a valid URL of a linked resource.","obsolete":false},{"name":"hreflang","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/a#attr-hreflang\">hreflang</a></code>\n HTML&nbsp;attribute, indicating the language of the linked resource.","obsolete":false},{"name":"media","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/a#attr-media\">media</a></code>\n HTML attribute, indicating the intended media for the linked resource.","obsolete":false},{"name":"name","help":"Anchor name. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"pathname","help":"The path name component, if any, of the referenced URL.","obsolete":false},{"name":"port","help":"The port component, if any, of the referenced URL.","obsolete":false},{"name":"protocol","help":"The protocol component (including trailing colon (:)), of the referenced URL.","obsolete":false},{"name":"rel","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/a#attr-rel\">rel</a></code>\n HTML attribute, specifying the relationship of the target object to the link object.","obsolete":false},{"name":"relList","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/a#attr-rel\">rel</a></code>\n HTML&nbsp;attribute, as a list of tokens.","obsolete":false},{"name":"rev","help":"Reverse link type. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"search","help":"The search element (including leading question mark (?)), if any, of the referenced URL","obsolete":false},{"name":"shape","help":"The shape of the active area. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"tabIndex","help":"The position of the element in the tabbing navigation order for the current document. \n\n<span title=\"\">Obsolete</span> in \n<span><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/HTML5\">HTML5</a></span>","obsolete":true},{"name":"target","help":"Reflectst the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/a#attr-target\">target</a></code>\n HTML attribute, indicating where to display the linked resource.","obsolete":false},{"name":"text","help":"Same as the <strong><a title=\"https://developer.mozilla.org/En/DOM/Node.textContent\" rel=\"internal\" href=\"https://developer.mozilla.org/En/DOM/Node.textContent\">textContent</a></strong> property.","obsolete":false},{"name":"type","help":"Reflects the \n\n<code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/HTML/Element/a#attr-type\">type</a></code>\n HTML attribute, indicating the MIME type of the linked resource.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/DOM/HTMLAnchorElement"},"SVGFEDisplacementMapElement":{"title":"feDisplacementMap","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/filter\">&lt;filter&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/animate\">&lt;animate&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/set\">&lt;set&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feBlend\">&lt;feBlend&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feColorMatrix\">&lt;feColorMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComponentTransfer\">&lt;feComponentTransfer&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feComposite\">&lt;feComposite&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feConvolveMatrix\">&lt;feConvolveMatrix&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feDiffuseLighting\">&lt;feDiffuseLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feFlood\">&lt;feFlood&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feGaussianBlur\">&lt;feGaussianBlur&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feImage\">&lt;feImage&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMerge\">&lt;feMerge&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feMorphology\">&lt;feMorphology&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feOffset\">&lt;feOffset&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feSpecularLighting\">&lt;feSpecularLighting&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTile\">&lt;feTile&gt;</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/SVG/Element/feTurbulence\">&lt;feTurbulence&gt;</a></code>\n</li> <li><a title=\"en/SVG/Tutorial/Filter_effects\" rel=\"internal\" href=\"https://developer.mozilla.org/en/SVG/Tutorial/Filter_effects\">SVG tutorial: Filter effects</a></li>","summary":"The pixel value of an input image i2 is used to displace the original image i1.","members":[{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in2","name":"in2","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/scale","name":"scale","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/yChannelSelector","name":"yChannelSelector","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/class","name":"class","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/xChannelSelector","name":"xChannelSelector","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/in","name":"in","help":""},{"obsolete":false,"url":"https://developer.mozilla.org/en/SVG/Attribute/style","name":"style","help":"Specific attributes"}],"srcUrl":"https://developer.mozilla.org/en/SVG/Element/feDisplacementMap"},"Clipboard":{"title":"nsIClipboard","seeAlso":"<li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIClipboardOwner\">nsIClipboardOwner</a></code>\n</li> <li><code><a rel=\"internal\" href=\"https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsITransferable&amp;ident=nsITransferable\" class=\"new\">nsITransferable</a></code>\n</li> <li><code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIArray\">nsIArray</a></code>\n</li> <li><a title=\"Using the Clipboard\" class=\"internal\" rel=\"internal\" href=\"https://developer.mozilla.org/en/Using_the_Clipboard\">Using the Clipboard</a></li>","summary":"<div>\n\n<a rel=\"custom\" href=\"http://mxr.mozilla.org/mozilla-central/source/widget/public/nsIClipboard.idl\"><code>widget/public/nsIClipboard.idl</code></a><span><a rel=\"internal\" href=\"https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces\" title=\"en/Interfaces/About_Scriptable_Interfaces\">Scriptable</a></span></div><span>This interface supports basic clipboard operations such as: setting, retrieving, emptying, matching and supporting clipboard data.</span><div>Inherits from: <code><a rel=\"custom\" href=\"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsISupports\">nsISupports</a></code>\n<span>Last changed in Gecko 1.8 (Firefox 1.5 / Thunderbird 1.5 / SeaMonkey 1.0)\n</span></div>","members":[{"name":"hasDataMatchingFlavors","help":"<p>This method provides a way to give correct UI feedback about, for instance, whether a paste should be allowed. It does <strong>not</strong> actually retrieve the data and should be a very inexpensive call. All it does is check if there is data on the clipboard matching any of the flavors in the given list.</p>\n\n<div id=\"section_10\"><span id=\"Parameters_4\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>aFlavorList</code></dt> <dd>An array of ASCII strings.</dd> <dt><code>aLength</code></dt> <dd>The length of the <code>aFlavorList</code>.</dd> <dt><code>aWhichClipboard</code></dt> <dd>Specifies the clipboard to which this operation applies.</dd>\n</dl>\n</div><div id=\"section_11\"><span id=\"Return_value\"></span><h6 class=\"editable\">Return value</h6>\n<p>Returns <code>true</code>, if data is present and it matches the specified flavor. Otherwise it returns <code>false</code>.</p>\n</div>","idl":"<pre class=\"eval\">boolean hasDataMatchingFlavors(\n  [array, size_is(aLength)] in string aFlavorList,\n  in unsigned long aLength, \n<span title=\"(Firefox 3)\n\" style=\"border: 1px solid rgb(129, 129, 81); background-color: rgb(255, 255, 225); font-size: x-small; white-space: nowrap; padding: 2px;\">Requires Gecko 1.9</span>\n\n  in long aWhichClipboard \n);\n</pre>","obsolete":false},{"name":"emptyClipboard","help":"<p>This method empties the clipboard and notifies the clipboard owner. It empties the \"logical\" clipboard. It does not clear the native clipboard.</p>\n\n<div id=\"section_5\"><span id=\"Parameters\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>aWhichClipboard</code></dt> <dd>Specifies the clipboard to which this operation applies.</dd>\n</dl>\n<p>\n\n</p><div><span>Obsolete since Gecko 1.8 (Firefox 1.5 / Thunderbird 1.5 / SeaMonkey 1.0)\n</span><span id=\"forceDataToClipboard()\"></span></div></div>","idl":"<pre class=\"eval\">void emptyClipboard(\n  in long aWhichClipboard \n);\n</pre>","obsolete":false},{"name":"forceDataToClipboard","help":"<div id=\"section_5\"><p>Some platforms support deferred notification for putting data on the clipboard This method forces the data onto the clipboard in its various formats This may be used if the application going away.</p>\n\n</div><div id=\"section_6\"><span id=\"Parameters_2\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>aWhichClipboard</code></dt> <dd>Specifies the clipboard to which this operation applies.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void forceDataToClipboard(\n  in long aWhichClipboard \n);\n</pre>","obsolete":false},{"name":"setData","help":"<p>This method sets the data from a transferable on the native clipboard.</p>\n\n<div id=\"section_13\"><span id=\"Parameters_5\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>aTransferable</code></dt> <dd>The transferable containing the data to put on the clipboard.</dd> <dt><code>anOwner</code></dt> <dd>The owner of the transferable.</dd> <dt><code>aWhichClipboard</code></dt> <dd>Specifies the clipboard to which this operation applies.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void setData(\n  in nsITransferable aTransferable,\n  in nsIClipboardOwner anOwner,\n  in long aWhichClipboard \n);\n</pre>","obsolete":false},{"name":"getData","help":"<p>This method retrieves data from the clipboard into a transferable.</p>\n\n<div id=\"section_8\"><span id=\"Parameters_3\"></span><h6 class=\"editable\">Parameters</h6>\n<dl> <dt><code>aTransferable</code></dt> <dd>The transferable to receive data from the clipboard.</dd> <dt><code>aWhichClipboard</code></dt> <dd>Specifies the clipboard to which this operation applies.</dd>\n</dl>\n</div>","idl":"<pre class=\"eval\">void getData(\n  in nsITransferable aTransferable,\n  in long aWhichClipboard \n);\n</pre>","obsolete":false},{"name":"supportsSelectionClipboard","help":"<p>This method allows clients to determine if the implementation supports the concept of a separate clipboard for selection.</p>\n\n<div id=\"section_15\"><span id=\"Parameters_6\"></span>\n\n</div><div id=\"section_16\"><span id=\"Return_value_2\"></span><h6 class=\"editable\">Return value</h6>\n<p>Returns <code>true</code> if <code>kSelectionClipboard</code> is available. Otherwise it returns <code>false</code>.</p>\n</div>","idl":"<pre class=\"eval\">boolean supportsSelectionClipboard();\n</pre>","obsolete":false},{"name":"kSelectionClipboard","help":"Clipboard for selection.","obsolete":false},{"name":"kGlobalClipboard","help":"Clipboard for global use.","obsolete":false}],"srcUrl":"https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIClipboard"},"CSSUnknownRule":{"title":"cssRule","members":[],"srcUrl":"https://developer.mozilla.org/pl/DOM/cssRule","skipped":true,"cause":"Suspect title"}}
\ No newline at end of file
diff --git a/elemental/idl/elemental/elemental.idl b/elemental/idl/elemental/elemental.idl
new file mode 100644
index 0000000..d354df4
--- /dev/null
+++ b/elemental/idl/elemental/elemental.idl
@@ -0,0 +1,376 @@
+/**
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * License TBD
+ */
+
+module default {
+  FileList implements sequence<File>;
+  HTMLCollection implements sequence<Node>;
+  MediaList implements sequence<DOMString>;
+  NamedNodeMap implements sequence<Node>;
+  NodeList implements sequence<Node>;
+  StyleSheetList implements sequence<StyleSheet>;
+  TouchList implements sequence<Touch>;
+
+  Float32Array implements sequence<double>;
+  Float64Array implements sequence<double>;
+  Int8Array implements sequence<int>;
+  Int16Array implements sequence<int>;
+  Int32Array implements sequence<int>;
+  Uint8Array implements sequence<int>;
+  // Ugliness ahead: we cannot analyse inheritance right now when deducing if
+  // given interface is a typed array (database is not accessible), so I have
+  // to duplicate both sequence<int> and ArrayBufferView to make our heuristics
+  // work.
+  // FIXME: thread datatbase to all the clients that need it and probably
+  // move the method itself to database.
+  Uint8ClampedArray implements sequence<int>;
+  Uint8ClampedArray implements ArrayBufferView;
+  Uint16Array implements sequence<int>;
+  Uint32Array implements sequence<int>;
+
+  // Is List<int> because inherits from Uint8Array:
+  // Uint8ClampedArray implements sequence<int>;
+}
+
+module core {
+  [Supplemental]
+  interface Document {
+    [Suppressed] DOMObject getCSSCanvasContext(in DOMString contextId, in DOMString name, in long width, in long height);
+    CanvasRenderingContext getCSSCanvasContext(in DOMString contextId, in DOMString name, in long width, in long height);
+  };
+
+  DOMStringList implements sequence<DOMString>;
+};
+
+module dom {
+  // Force NodeSelector. WebKit defines these operations directly.
+  interface NodeSelector {
+    Element   querySelector(in DOMString selectors);
+    NodeList  querySelectorAll(in DOMString selectors);
+  };
+  Document implements NodeSelector;
+  DocumentFragment implements NodeSelector;
+  Element implements NodeSelector;
+
+  // Force ElementTraversal. WebKit defines these directly.
+  interface ElementTraversal {
+    getter attribute unsigned long childElementCount;
+    getter attribute Element firstElementChild;
+    getter attribute Element lastElementChild;
+    getter attribute Element nextElementSibling;
+    getter attribute Element previousElementSibling;
+  };
+  Element implements ElementTraversal;
+
+  [Callback]
+  interface TimeoutHandler {
+    void handleEvent();
+  };
+};
+
+module html {
+  [Supplemental]
+  interface Console {
+    [Suppressed] void debug();
+    [CallWith=ScriptArguments|CallStack] void debug(DOMObject arg);
+    [Suppressed] void error();
+    [CallWith=ScriptArguments|CallStack] void error(DOMObject arg);
+    [Suppressed] void info();
+    [CallWith=ScriptArguments|CallStack] void info(DOMObject arg);
+    [Suppressed] void log();
+    [CallWith=ScriptArguments|CallStack] void log(DOMObject arg);
+    [Suppressed] void warn();
+    [CallWith=ScriptArguments|CallStack] void warn(DOMObject arg);
+    [Suppressed] void trace();
+    [CallWith=ScriptArguments|CallStack] void trace(DOMObject arg);
+    [Suppressed] void assert(in boolean condition);
+    [CallWith=ScriptArguments|CallStack] void assertCondition(boolean condition, DOMObject arg);
+    [Suppressed] void timeEnd(in DOMString title);
+    [CallWith=ScriptArguments|CallStack] void timeEnd(DOMString title, DOMObject arg);
+    [Suppressed] void timeStamp();
+    [CallWith=ScriptArguments|CallStack] void timeStamp(DOMObject arg);
+    [Suppressed] void group();
+    [CallWith=ScriptArguments|CallStack] void group(DOMObject arg);
+    [Suppressed] void groupCollapsed();
+    [CallWith=ScriptArguments|CallStack] void groupCollapsed(DOMObject arg);
+  };
+
+  [Supplemental]
+  interface HTMLOptionsCollection {
+    [Suppressed] void add(in optional HTMLOptionElement element, in optional long before);
+  };
+
+  [Supplemental]
+  interface ImageData {
+    readonly attribute Uint8ClampedArray data;
+  };
+
+  [Supplemental]
+  interface WebGLContextEvent {
+    [Suppressed] void initEvent(in optional DOMString eventTypeArg,
+                                in optional boolean canBubbleArg,
+                                in optional boolean cancelableArg,
+                                in optional DOMString statusMessageArg);
+  };
+};
+
+module html {
+  [Supplemental]
+  interface WebGLRenderingContext {
+
+    //void         compressedTexImage2D(in unsigned long target, in long level, in unsigned long internalformat, in unsigned long width, in unsigned long height, in long border, in unsigned long imageSize, const void* data);
+    //void         compressedTexSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset, in unsigned long width, in unsigned long height, in unsigned long format, in unsigned long imageSize, const void* data);
+
+    any getBufferParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getBufferParameter();
+
+    any getFramebufferAttachmentParameter(in unsigned long target, in unsigned long attachment, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getFramebufferAttachmentParameter();
+
+    any getParameter(in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getParameter();
+
+    any getProgramParameter(in WebGLProgram program, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getProgramParameter();
+
+    any getRenderbufferParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getRenderbufferParameter();
+
+    any getShaderParameter(in WebGLShader shader, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getShaderParameter() raises(DOMException);
+
+    // TBD
+    // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+
+    DOMString[] getSupportedExtensions();
+    [Suppressed, StrictTypeChecking, Custom] void getSupportedExtensions();
+
+    any getTexParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getTexParameter();
+
+    any getUniform(in WebGLProgram program, in WebGLUniformLocation location) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getUniform();
+
+    any getVertexAttrib(in unsigned long index, in unsigned long pname) raises(DOMException);
+    [Suppressed, StrictTypeChecking, Custom] void getVertexAttrib();
+  };
+}
+
+
+
+module canvas {
+  // TODO(dstockwell): Define these manually.
+  [Supplemental]
+  interface Float32Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Float64Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Int16Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Int32Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Int8Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Uint16Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Uint32Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+  [Supplemental]
+  interface Uint8Array {
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+
+  [Supplemental]
+  interface Uint8ClampedArray {
+    // Avoid 'overriding static member BYTES_PER_ELEMENT'.
+    [Suppressed] const long BYTES_PER_ELEMENT = 1;
+
+    [Suppressed] void set();
+    [DartName=setElements, Custom] void set(in any array, in optional unsigned long offset);
+  };
+};
+
+module storage {
+  // TODO(vsm): Define new names for these (see b/4436830).
+  [Supplemental]
+  interface IDBCursor {
+    [DartName=continueFunction] void continue(in optional IDBKey key);
+  };
+  [Supplemental]
+  interface IDBIndex {
+    [DartName=getObject] IDBRequest get(in IDBKey key);
+  };
+  [Supplemental]
+  interface IDBObjectStore {
+    [DartName=getObject] IDBRequest get(in IDBKey key);
+    [DartName=getObject] IDBRequest get(in IDBKeyRange key);
+    [Suppressed] IDBRequest openCursor() raises (IDBDatabaseException);
+  };
+
+  interface EntrySync {
+    // Native implementation is declared to return EntrySync.
+    [Suppressed] DirectoryEntrySync getParent();
+    EntrySync getParent();
+  };
+};
+
+module html {
+  [Supplemental, Callback] // Add missing Callback attribute.
+  interface VoidCallback {
+  };
+};
+
+module svg {
+    interface SVGNumber {
+      [StrictTypeChecking, Custom] attribute double value;
+    };
+}
+
+module html {
+  [Supplemental]
+  interface HTMLCanvasElement {
+    [Suppressed] DOMObject getContext(in DOMString contextId);
+    // W3C defines this as returning 'object':
+    CanvasRenderingContext getContext(in DOMString contextId);
+  };
+};
+
+module svg {
+  // fix convariant return clash with Element
+  [Supplemental]
+  interface SVGStylable {
+    @WebKit [DartName=svgStyle] getter attribute CSSStyleDeclaration style;
+    @WebKit [DartName=animatedClassName] getter attribute SVGAnimatedString className;
+  };
+
+  // rename width/height covariant returns on several SVG classes
+  [Supplemental]
+  interface SVGFilterElement {
+    @WebKit [DartName=animatedWidth] getter attribute SVGAnimatedLength width;
+    @WebKit [DartName=animatedHeight] getter attribute SVGAnimatedLength height;
+  };
+
+  [Supplemental]
+  interface SVGFilterPrimitiveStandardAttributes {
+    @WebKit [DartName=animatedWidth] getter attribute SVGAnimatedLength width;
+    @WebKit [DartName=animatedHeight] getter attribute SVGAnimatedLength height;
+    @WebKit [DartName=animatedResult] getter attribute SVGAnimatedString result;
+    @WebKit [DartName=animatedX] getter attribute SVGAnimatedLength x;
+    @WebKit [DartName=animatedY] getter attribute SVGAnimatedLength y;
+  };
+
+  [Supplemental]
+  interface SVGForeignObjectElement {
+    @WebKit [DartName=animatedWidth] getter attribute SVGAnimatedLength width;
+    @WebKit [DartName=animatedHeight] getter attribute SVGAnimatedLength height;
+  };
+
+  [Supplemental]
+  interface SVGImageElement {
+    @WebKit [DartName=animatedWidth] getter attribute SVGAnimatedLength width;
+    @WebKit [DartName=animatedHeight] getter attribute SVGAnimatedLength height;
+  };
+
+  [Supplemental]
+  interface SVGMaskElement {
+    @WebKit [DartName=animatedWidth] getter attribute SVGAnimatedLength width;
+    @WebKit [DartName=animatedHeight] getter attribute SVGAnimatedLength height;
+  };
+
+  [Supplemental]
+  interface SVGPatternElement {
+    @WebKit [DartName=animatedWidth] getter attribute SVGAnimatedLength width;
+    @WebKit [DartName=animatedHeight] getter attribute SVGAnimatedLength height;
+  };
+
+  [Supplemental]
+  interface SVGRectElement {
+    @WebKit [DartName=animatedWidth] getter attribute SVGAnimatedLength width;
+    @WebKit [DartName=animatedHeight] getter attribute SVGAnimatedLength height;
+  };
+
+  [Supplemental]
+  interface SVGSVGElement {
+    @WebKit [DartName=animatedWidth] getter attribute SVGAnimatedLength width;
+    @WebKit [DartName=animatedHeight] getter attribute SVGAnimatedLength height;
+  };
+
+  [Supplemental]
+  interface SVGUseElement {
+    @WebKit [DartName=animatedWidth] getter attribute SVGAnimatedLength width;
+    @WebKit [DartName=animatedHeight] getter attribute SVGAnimatedLength height;
+  };
+
+  [Supplemental]
+  interface SVGTransformable :
+    @WebKit SVGLocatable {
+    @WebKit [DartName=animatedTransform] getter attribute SVGAnimatedTransformList transform;
+  };
+
+  [Supplemental]
+  interface SVGURIReference {
+    @WebKit [DartName=animatedHref] getter attribute SVGAnimatedString href;
+  };
+};
+
+module base {
+  interface ElementalMixinBase {
+  };
+};
+
+module html {
+  [Supplemental]
+  interface Uint8ClampedArray :
+    @WebKit Uint8Array,
+    sequence<int>,
+    ArrayBufferView {
+    /* suppressed, we don't support covariant return, just cast to the clamped interface if needed */
+    @WebKit [Suppressed] Uint8ClampedArray subarray(in long start);
+    @WebKit [Suppressed] Uint8ClampedArray subarray(in long start, in long end);
+  };
+};
+
+module events {
+  [Supplemental]
+  interface Event {
+    @WebKit [Suppressed] const unsigned short BLUR = 8192;
+    @WebKit [Suppressed] const unsigned short CHANGE = 32768;
+    @WebKit [Suppressed] const unsigned short CLICK = 64;
+    @WebKit [Suppressed] const unsigned short DBLCLICK = 128;
+    @WebKit [Suppressed] const unsigned short DRAGDROP = 2048;
+    @WebKit [Suppressed] const unsigned short FOCUS = 4096;
+    @WebKit [Suppressed] const unsigned short KEYDOWN = 256;
+    @WebKit [Suppressed] const unsigned short KEYPRESS = 1024;
+    @WebKit [Suppressed] const unsigned short KEYUP = 512;
+    @WebKit [Suppressed] const unsigned short MOUSEDOWN = 1;
+    @WebKit [Suppressed] const unsigned short MOUSEDRAG = 32;
+    @WebKit [Suppressed] const unsigned short MOUSEMOVE = 16;
+    @WebKit [Suppressed] const unsigned short MOUSEOUT = 8;
+    @WebKit [Suppressed] const unsigned short MOUSEOVER = 4;
+    @WebKit [Suppressed] const unsigned short MOUSEUP = 2;
+    @WebKit [Suppressed] const unsigned short SELECT = 16384;
+  };
+};
+
diff --git a/elemental/idl/scripts/all_tests.py b/elemental/idl/scripts/all_tests.py
new file mode 100755
index 0000000..f7d84fd
--- /dev/null
+++ b/elemental/idl/scripts/all_tests.py
@@ -0,0 +1,24 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+"""This entry point runs all script tests."""
+
+import logging.config
+import unittest
+
+if __name__ == '__main__':
+  logging.config.fileConfig('logging.conf')
+  suite = unittest.TestLoader().loadTestsFromNames([
+      'templateloader_test',
+      'pegparser_test',
+      'idlparser_test',
+      'idlnode_test',
+      'idlrenderer_test',
+      'database_test',
+      'databasebuilder_test',
+      'emitter_test',
+      'dartgenerator_test',
+      'multiemitter_test'])
+  unittest.TextTestRunner().run(suite)
diff --git a/elemental/idl/scripts/database.py b/elemental/idl/scripts/database.py
new file mode 100755
index 0000000..4c9ef09
--- /dev/null
+++ b/elemental/idl/scripts/database.py
@@ -0,0 +1,227 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+"""Module to manage IDL files."""
+
+import copy
+import pickle
+import logging
+import os
+import os.path
+import shutil
+import idlnode
+import idlparser
+import idlrenderer
+
+_logger = logging.getLogger('database')
+
+
+class Database(object):
+  """The Database class manages a collection of IDL files stored
+  inside a directory.
+
+  Each IDL is describing a single interface. The IDL files are written in the
+  FremontCut syntax, which is derived from the Web IDL syntax and includes
+  annotations.
+
+  Database operations include adding, updating and removing IDL files.
+  """
+
+  def __init__(self, root_dir):
+    """Initializes a Database over a given directory.
+
+    Args:
+      root_dir -- a directory. If directory does not exist, it will
+      be created.
+    """
+    self._root_dir = root_dir
+    if not os.path.exists(root_dir):
+      _logger.debug('creating root directory %s' % root_dir)
+      os.makedirs(root_dir)
+    self._all_interfaces = {}
+    self._interfaces_to_delete = []
+    self._idlparser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
+
+  def Clone(self):
+    new_database = Database(self._root_dir)
+    new_database._all_interfaces = copy.deepcopy(self._all_interfaces)
+    new_database._interfaces_to_delete = copy.deepcopy(
+        self._interfaces_to_delete)
+    return new_database
+
+  def Delete(self):
+    """Deletes the database by deleting its directory"""
+    if os.path.exists(self._root_dir):
+      shutil.rmtree(self._root_dir)
+    # reset in-memory constructs
+    self._all_interfaces = {}
+
+  def _ScanForInterfaces(self):
+    """Iteratores over the database files and lists all interface names.
+
+    Return:
+      A list of interface names.
+    """
+    res = []
+
+    def Visitor(_, dirname, names):
+      for name in names:
+        if os.path.isfile(os.path.join(dirname, name)):
+          root, ext = os.path.splitext(name)
+          if ext == '.idl':
+            res.append(root)
+
+    os.path.walk(self._root_dir, Visitor, None)
+    return res
+
+  def _FilePath(self, interface_name):
+    """Calculates the file path that a given interface should
+    be saved to.
+
+    Args:
+      interface_name -- the name of the interface.
+    """
+    return os.path.join(self._root_dir, '%s.idl' % interface_name)
+
+  def _LoadInterfaceFile(self, interface_name):
+    """Loads an interface from the database.
+
+    Returns:
+      An IDLInterface instance or None if the interface is not found.
+    Args:
+      interface_name -- the name of the interface.
+    """
+    file_name = self._FilePath(interface_name)
+    _logger.info('loading %s' % file_name)
+    if not os.path.exists(file_name):
+      return None
+
+    f = open(file_name, 'r')
+    content = f.read()
+    f.close()
+
+    # Parse file:
+    idl_file = idlnode.IDLFile(self._idlparser.parse(content), file_name)
+
+    if not idl_file.interfaces:
+      raise RuntimeError('No interface found in %s' % file_name)
+    elif len(idl_file.interfaces) > 1:
+      raise RuntimeError('Expected one interface in %s' % file_name)
+
+    interface = idl_file.interfaces[0]
+    self._all_interfaces[interface_name] = interface
+    return interface
+
+  def Load(self):
+    """Loads all interfaces into memory.
+    """
+    # FIXME: Speed this up by multi-threading.
+    for (interface_name) in self._ScanForInterfaces():
+      self._LoadInterfaceFile(interface_name)
+    self.Cache()
+
+  def Cache(self):
+    """Serialize the database using pickle for faster startup in the future
+    """
+    output_file = open(os.path.join(self._root_dir, 'cache.pickle'), 'wb')
+    pickle.dump(self._all_interfaces, output_file)
+    pickle.dump(self._interfaces_to_delete, output_file)
+
+  def LoadFromCache(self):
+    """Deserialize the database using pickle for fast startup
+    """
+    input_file_name = os.path.join(self._root_dir, 'cache.pickle')
+    if not os.path.isfile(input_file_name):
+      self.Load()
+      return
+    input_file = open(input_file_name, 'rb')
+    self._all_interfaces = pickle.load(input_file)
+    self._interfaces_to_delete = pickle.load(input_file)
+    input_file.close()
+
+  def Save(self):
+    """Saves all in-memory interfaces into files."""
+    for interface in self._all_interfaces.values():
+      self._SaveInterfaceFile(interface)
+    for interface_name in self._interfaces_to_delete:
+      self._DeleteInterfaceFile(interface_name)
+
+  def _SaveInterfaceFile(self, interface):
+    """Saves an interface into the database.
+
+    Args:
+      interface -- an IDLInterface instance.
+    """
+
+    interface_name = interface.id
+
+    # Actual saving
+    file_path = self._FilePath(interface_name)
+    _logger.debug('writing %s' % file_path)
+
+    dir_name = os.path.dirname(file_path)
+    if not os.path.exists(dir_name):
+      _logger.debug('creating directory %s' % dir_name)
+      os.mkdir(dir_name)
+
+    # Render the IDLInterface object into text.
+    text = idlrenderer.render(interface)
+
+    f = open(file_path, 'w')
+    f.write(text)
+    f.close()
+
+  def HasInterface(self, interface_name):
+    """Returns True if the interface is in memory"""
+    return interface_name in self._all_interfaces
+
+  def GetInterface(self, interface_name):
+    """Returns an IDLInterface corresponding to the interface_name
+    from memory.
+
+    Args:
+      interface_name -- the name of the interface.
+    """
+    if interface_name not in self._all_interfaces:
+      raise RuntimeError('Interface %s is not loaded' % interface_name)
+    return self._all_interfaces[interface_name]
+
+  def AddInterface(self, interface):
+    """Returns an IDLInterface corresponding to the interface_name
+    from memory.
+
+    Args:
+      interface -- the name of the interface.
+    """
+    interface_name = interface.id
+    if interface_name in self._all_interfaces:
+      raise RuntimeError('Interface %s already exists' % interface_name)
+    self._all_interfaces[interface_name] = interface
+
+  def GetInterfaces(self):
+    """Returns a list of all loaded interfaces."""
+    res = []
+    for _, interface in sorted(self._all_interfaces.items()):
+      res.append(interface)
+    return res
+
+  def DeleteInterface(self, interface_name):
+    """Deletes an interface from the database. File is deleted when
+    Save() is called.
+
+    Args:
+      interface_name -- the name of the interface.
+    """
+    if interface_name not in self._all_interfaces:
+      raise RuntimeError('Interface %s not found' % interface_name)
+    self._interfaces_to_delete.append(interface_name)
+    del self._all_interfaces[interface_name]
+
+  def _DeleteInterfaceFile(self, interface_name):
+    """Actual file deletion"""
+    file_path = self._FilePath(interface_name)
+    if os.path.exists(file_path):
+      _logger.debug('deleting %s' % file_path)
+      os.remove(file_path)
diff --git a/elemental/idl/scripts/database_test.py b/elemental/idl/scripts/database_test.py
new file mode 100755
index 0000000..de75160
--- /dev/null
+++ b/elemental/idl/scripts/database_test.py
@@ -0,0 +1,93 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+"""Tests for database module."""
+
+import logging.config
+import os.path
+import shutil
+import tempfile
+import unittest
+import database
+import idlnode
+import idlparser
+
+
+class DatabaseTestCase(unittest.TestCase):
+
+  def _ParseInterface(self, content):
+    ast = self._idl_parser.parse(content)
+    return idlnode.IDLFile(ast).interfaces[0]
+
+  def _ListInterfaces(self, db):
+    res = []
+    for interface in db.GetInterfaces():
+      name = interface.id
+      res.append(name)
+    return res
+
+  def setUp(self):
+    self._idl_parser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
+
+    working_dir = tempfile.mkdtemp()
+    self._database_dir = os.path.join(working_dir, 'database')
+    self.assertFalse(os.path.exists(self._database_dir))
+
+    # Create database and add one interface.
+    db = database.Database(self._database_dir)
+    interface = self._ParseInterface('interface I1 {};')
+    db.AddInterface(interface)
+    db.Save()
+    self.assertTrue(
+        os.path.exists(os.path.join(self._database_dir, 'I1.idl')))
+
+  def tearDown(self):
+    shutil.rmtree(self._database_dir)
+
+  def testCreate(self):
+    self.assertTrue(os.path.exists(self._database_dir))
+
+  def testListInterfaces(self):
+    db = database.Database(self._database_dir)
+    db.Load()
+    self.assertEquals(self._ListInterfaces(db), ['I1'])
+
+  def testHasInterface(self):
+    db = database.Database(self._database_dir)
+    db.Load()
+    self.assertTrue(db.HasInterface('I1'))
+    self.assertFalse(db.HasInterface('I2'))
+
+  def testAddInterface(self):
+    db = database.Database(self._database_dir)
+    db.Load()
+    interface = self._ParseInterface('interface I2 {};')
+    db.AddInterface(interface)
+    db.Save()
+    self.assertTrue(
+        os.path.exists(os.path.join(self._database_dir, 'I2.idl')))
+    self.assertEquals(self._ListInterfaces(db),
+                      ['I1', 'I2'])
+
+  def testDeleteInterface(self):
+    db = database.Database(self._database_dir)
+    db.Load()
+    db.DeleteInterface('I1')
+    db.Save()
+    self.assertFalse(
+        os.path.exists(os.path.join(self._database_dir, 'I1.idl')))
+    self.assertEquals(self._ListInterfaces(db), [])
+
+  def testGetInterface(self):
+    db = database.Database(self._database_dir)
+    db.Load()
+    interface = db.GetInterface('I1')
+    self.assertEquals(interface.id, 'I1')
+
+
+if __name__ == '__main__':
+  logging.config.fileConfig('logging.conf')
+  if __name__ == '__main__':
+    unittest.main()
diff --git a/elemental/idl/scripts/databasebuilder.py b/elemental/idl/scripts/databasebuilder.py
new file mode 100755
index 0000000..0dc2ce1
--- /dev/null
+++ b/elemental/idl/scripts/databasebuilder.py
@@ -0,0 +1,586 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import copy
+import database
+import idlparser
+import logging
+import os
+import os.path
+
+from idlnode import *
+
+_logger = logging.getLogger('databasebuilder')
+
+# Used in source annotations to specify the parent interface declaring
+# a displaced declaration. The 'via' attribute specifies the parent interface
+# which implements a displaced declaration.
+_VIA_ANNOTATION_ATTR_NAME = 'via'
+
+# Used in source annotations to specify the module that the interface was
+# imported from.
+_MODULE_ANNOTATION_ATTR_NAME = 'module'
+
+
+class DatabaseBuilderOptions(object):
+  """Used in specifying options when importing new interfaces"""
+
+  def __init__(self,
+      idl_syntax=idlparser.WEBIDL_SYNTAX,
+      idl_defines=[],
+      source=None, source_attributes={},
+      type_rename_map={},
+      rename_operation_arguments_on_merge=False,
+      add_new_interfaces=True,
+      obsolete_old_declarations=False):
+    """Constructor.
+    Args:
+      idl_syntax -- the syntax of the IDL file that is imported.
+      idl_defines -- list of definitions for the idl gcc pre-processor
+      source -- the origin of the IDL file, used for annotating the
+        database.
+      source_attributes -- this map of attributes is used as
+        annotation attributes.
+      rename_operation_arguments_on_merge -- if True, will rename
+        operation arguments when merging using the new name rather
+        than the old.
+      add_new_interfaces -- when False, if an interface is a new
+        addition, it will be ignored.
+      obsolete_old_declarations -- when True, if a declaration
+        from a certain source is not re-declared, it will be removed.
+    """
+    self.source = source
+    self.source_attributes = source_attributes
+    self.idl_syntax = idl_syntax
+    self.idl_defines = idl_defines
+    self.type_rename_map = type_rename_map
+    self.rename_operation_arguments_on_merge = \
+        rename_operation_arguments_on_merge
+    self.add_new_interfaces = add_new_interfaces
+    self.obsolete_old_declarations = obsolete_old_declarations
+
+
+class DatabaseBuilder(object):
+  def __init__(self, database):
+    """DatabaseBuilder is used for importing and merging interfaces into
+    the Database"""
+    self._database = database
+    self._imported_interfaces = []
+    self._impl_stmts = []
+
+  def _load_idl_file(self, file_name, import_options):
+    """Loads an IDL file intor memory"""
+    idl_parser = idlparser.IDLParser(import_options.idl_syntax)
+
+    try:
+      f = open(file_name, 'r')
+      content = f.read()
+      f.close()
+
+      idl_ast = idl_parser.parse(content,
+        defines=import_options.idl_defines)
+      return IDLFile(idl_ast, file_name)
+    except SyntaxError, e:
+      raise RuntimeError('Failed to load file %s: %s' % (file_name, e))
+
+  def _resolve_type_defs(self, idl_file):
+    type_def_map = {}
+    # build map
+    for type_def in idl_file.all(IDLTypeDef):
+      if type_def.type.id != type_def.id: # sanity check
+        type_def_map[type_def.id] = type_def.type.id
+    # use the map
+    for type_node in idl_file.all(IDLType):
+      while type_node.id in type_def_map:
+        type_node.id = type_def_map[type_node.id]
+
+  def _strip_ext_attributes(self, idl_file):
+    """Strips unuseful extended attributes."""
+    for ext_attrs in idl_file.all(IDLExtAttrs):
+      # TODO: Decide which attributes are uninteresting.
+      pass
+
+  def _split_declarations(self, interface, optional_argument_whitelist):
+    """Splits read-write attributes and operations with optional
+    arguments into multiple declarations"""
+
+    # split attributes into setters and getters
+    new_attributes = []
+    for attribute in interface.attributes:
+      if attribute.is_fc_getter or attribute.is_fc_setter:
+        new_attributes.append(attribute)
+        continue
+      getter_attr = copy.deepcopy(attribute)
+      getter_attr.is_fc_getter = True
+      new_attributes.append(getter_attr)
+      if not attribute.is_read_only:
+        setter_attr = copy.deepcopy(attribute)
+        setter_attr.is_fc_setter = True
+        new_attributes.append(setter_attr)
+    interface.attributes = new_attributes
+
+    # Remove optional annotations from legacy optional arguments.
+    for op in interface.operations:
+      for i in range(0, len(op.arguments)):
+        argument = op.arguments[i]
+
+        in_optional_whitelist = (interface.id, op.id, argument.id) in optional_argument_whitelist
+        if in_optional_whitelist or set(['Optional', 'Callback']).issubset(argument.ext_attrs.keys()):
+          argument.is_optional = True
+          argument.ext_attrs['RequiredCppParameter'] = None
+          continue
+
+        if argument.is_optional:
+          if 'Optional' in argument.ext_attrs:
+            optional_value = argument.ext_attrs['Optional']
+            if optional_value:
+              argument.is_optional = False
+              del argument.ext_attrs['Optional']
+
+    # split operations with optional args into multiple operations
+    new_ops = []
+    for op in interface.operations:
+      for i in range(0, len(op.arguments)):
+        if op.arguments[i].is_optional:
+          op.arguments[i].is_optional = False
+          new_op = copy.deepcopy(op)
+          new_op.arguments = new_op.arguments[:i]
+          new_ops.append(new_op)
+      new_ops.append(op)
+    interface.operations = new_ops
+
+  def _rename_types(self, idl_file, import_options):
+    """Rename interface and type names with names provided in the
+    options. Also clears scopes from scoped names"""
+
+    def rename(name):
+      name_parts = name.split('::')
+      name = name_parts[-1]
+      if name in import_options.type_rename_map:
+        name = import_options.type_rename_map[name]
+      return name
+
+    def rename_node(idl_node):
+      idl_node.id = rename(idl_node.id)
+
+    def rename_ext_attrs(ext_attrs_node):
+      for type_valued_attribute_name in ['Supplemental']:
+        if type_valued_attribute_name in ext_attrs_node:
+          value = ext_attrs_node[type_valued_attribute_name]
+          if isinstance(value, str):
+            ext_attrs_node[type_valued_attribute_name] = rename(value)
+
+    map(rename_node, idl_file.all(IDLInterface))
+    map(rename_node, idl_file.all(IDLType))
+    map(rename_ext_attrs, idl_file.all(IDLExtAttrs))
+
+  def _annotate(self, interface, module_name, import_options):
+    """Adds @ annotations based on the source and source_attributes
+    members of import_options."""
+
+    source = import_options.source
+    if not source:
+      return
+
+    def add_source_annotation(idl_node):
+      annotation = IDLAnnotation(
+        copy.deepcopy(import_options.source_attributes))
+      idl_node.annotations[source] = annotation
+      if ((isinstance(idl_node, IDLInterface) or
+           isinstance(idl_node, IDLMember)) and
+          idl_node.is_fc_suppressed):
+        annotation['suppressed'] = None
+
+    add_source_annotation(interface)
+    interface.annotations[source][_MODULE_ANNOTATION_ATTR_NAME] = module_name
+
+    map(add_source_annotation, interface.parents)
+    map(add_source_annotation, interface.constants)
+    map(add_source_annotation, interface.attributes)
+    map(add_source_annotation, interface.operations)
+
+  def _sign(self, node):
+    """Computes a unique signature for the node, for merging purposed, by
+    concatenating types and names in the declaration."""
+    if isinstance(node, IDLType):
+      res = node.id
+      if res.startswith('unsigned '):
+        res = res[len('unsigned '):]
+      return res
+
+    res = []
+    if isinstance(node, IDLInterface):
+      res = ['interface', node.id]
+    elif isinstance(node, IDLParentInterface):
+      res = ['parent', self._sign(node.type)]
+    elif isinstance(node, IDLOperation):
+      res = ['op']
+      for special in node.specials:
+        res.append(special)
+      if node.id is not None:
+        res.append(node.id)
+      for arg in node.arguments:
+        res.append(self._sign(arg.type))
+      res.append(self._sign(node.type))
+    elif isinstance(node, IDLAttribute):
+      res = []
+      if node.is_fc_getter:
+        res.append('getter')
+      elif node.is_fc_setter:
+        res.append('setter')
+      res.append(node.id)
+      res.append(self._sign(node.type))
+    elif isinstance(node, IDLConstant):
+      res = []
+      res.append('const')
+      res.append(node.id)
+      res.append(node.value)
+      res.append(self._sign(node.type))
+    else:
+      raise TypeError("Can't sign input of type %s" % type(node))
+    return ':'.join(res)
+
+  def _build_signatures_map(self, idl_node_list):
+    """Creates a hash table mapping signatures to idl_nodes for the
+    given list of nodes"""
+    res = {}
+    for idl_node in idl_node_list:
+      sig = self._sign(idl_node)
+      if sig is None:
+        continue
+      if sig in res:
+        raise RuntimeError('Warning: Multiple members have the same '
+                           'signature: "%s"' % sig)
+      res[sig] = idl_node
+    return res
+
+  def _get_parent_interfaces(self, interface):
+    """Return a list of all the parent interfaces of a given interface"""
+    res = []
+
+    def recurse(current_interface):
+      if current_interface in res:
+        return
+      res.append(current_interface)
+      for parent in current_interface.parents:
+        parent_name = parent.type.id
+        if self._database.HasInterface(parent_name):
+          recurse(self._database.GetInterface(parent_name))
+
+    recurse(interface)
+    return res[1:]
+
+  def _merge_ext_attrs(self, old_attrs, new_attrs):
+    """Merges two sets of extended attributes.
+
+    Returns: True if old_attrs has changed.
+    """
+    changed = False
+    for (name, value) in new_attrs.items():
+      if name in old_attrs and old_attrs[name] == value:
+        pass # Identical
+      else:
+        old_attrs[name] = value
+        changed = True
+    return changed
+
+  def _merge_nodes(self, old_list, new_list, import_options):
+    """Merges two lists of nodes. Annotates nodes with the source of each
+    node.
+
+    Returns:
+      True if the old_list has changed.
+
+    Args:
+      old_list -- the list to merge into.
+      new_list -- list containing more nodes.
+      import_options -- controls how merging is done.
+    """
+    changed = False
+
+    source = import_options.source
+
+    old_signatures_map = self._build_signatures_map(old_list)
+    new_signatures_map = self._build_signatures_map(new_list)
+
+    # Merge new items
+    for (sig, new_node) in new_signatures_map.items():
+      if sig not in old_signatures_map:
+        # New node:
+        old_list.append(new_node)
+        changed = True
+      else:
+        # Merge old and new nodes:
+        old_node = old_signatures_map[sig]
+        if (source not in old_node.annotations
+            and source in new_node.annotations):
+          old_node.annotations[source] = new_node.annotations[source]
+          changed = True
+        # Maybe rename arguments:
+        if isinstance(old_node, IDLOperation):
+          for i in range(0, len(old_node.arguments)):
+            old_arg_name = old_node.arguments[i].id
+            new_arg_name = new_node.arguments[i].id
+            if (old_arg_name != new_arg_name
+                and (old_arg_name == 'arg'
+                     or old_arg_name.endswith('Arg')
+                     or import_options.rename_operation_arguments_on_merge)):
+              old_node.arguments[i].id = new_arg_name
+              changed = True
+        # Maybe merge annotations:
+        if (isinstance(old_node, IDLAttribute) or
+            isinstance(old_node, IDLOperation)):
+          if self._merge_ext_attrs(old_node.ext_attrs, new_node.ext_attrs):
+            changed = True
+
+    # Remove annotations on obsolete items from the same source
+    if import_options.obsolete_old_declarations:
+      for (sig, old_node) in old_signatures_map.items():
+        if (source in old_node.annotations
+            and sig not in new_signatures_map):
+          _logger.warn('%s not available in %s anymore' %
+            (sig, source))
+          del old_node.annotations[source]
+          changed = True
+
+    return changed
+
+  def _merge_interfaces(self, old_interface, new_interface, import_options):
+    """Merges the new_interface into the old_interface, annotating the
+    interface with the sources of each change."""
+
+    changed = False
+
+    source = import_options.source
+    if (source and source not in old_interface.annotations and
+        source in new_interface.annotations and
+        not new_interface.is_supplemental):
+      old_interface.annotations[source] = new_interface.annotations[source]
+      changed = True
+
+    def merge_list(what):
+      old_list = old_interface.__dict__[what]
+      new_list = new_interface.__dict__[what]
+
+      if what != 'parents' and old_interface.id != new_interface.id:
+        for node in new_list:
+          node.ext_attrs['ImplementedBy'] = new_interface.id
+
+      changed = self._merge_nodes(old_list, new_list, import_options)
+
+      # Delete list items with zero remaining annotations.
+      if changed and import_options.obsolete_old_declarations:
+
+        def has_annotations(idl_node):
+          return len(idl_node.annotations)
+
+        old_interface.__dict__[what] = filter(has_annotations, old_list)
+
+      return changed
+
+    # Smartly merge various declarations:
+    if merge_list('parents'):
+      changed = True
+    if merge_list('constants'):
+      changed = True
+    if merge_list('attributes'):
+      changed = True
+    if merge_list('operations'):
+      changed = True
+
+    if self._merge_ext_attrs(old_interface.ext_attrs, new_interface.ext_attrs):
+      changed = True
+
+    _logger.info('merged interface %s (changed=%s, supplemental=%s)' %
+      (old_interface.id, changed, new_interface.is_supplemental))
+
+    return changed
+
+  def _merge_impl_stmt(self, impl_stmt, import_options):
+    """Applies "X implements Y" statemetns on the proper places in the
+    database"""
+    implementor_name = impl_stmt.implementor.id
+    implemented_name = impl_stmt.implemented.id
+    _logger.info('merging impl stmt %s implements %s' %
+                 (implementor_name, implemented_name))
+
+    source = import_options.source
+    if self._database.HasInterface(implementor_name):
+      interface = self._database.GetInterface(implementor_name)
+      if interface.parents is None:
+        interface.parents = []
+      for parent in interface.parents:
+        if parent.type.id == implemented_name:
+          if source and source not in parent.annotations:
+            parent.annotations[source] = IDLAnnotation(
+                import_options.source_attributes)
+          return
+      # not found, so add new one
+      parent = IDLParentInterface(None)
+      parent.type = IDLType(implemented_name)
+      if source:
+        parent.annotations[source] = IDLAnnotation(
+            import_options.source_attributes)
+      interface.parents.append(parent)
+
+  def merge_imported_interfaces(self, optional_argument_whitelist):
+    """Merges all imported interfaces and loads them into the DB."""
+
+    # Step 1: Pre process imported interfaces
+    for interface, module_name, import_options in self._imported_interfaces:
+      self._split_declarations(interface, optional_argument_whitelist)
+      self._annotate(interface, module_name, import_options)
+
+    # Step 2: Add all new interfaces and merge overlapping ones
+    for interface, module_name, import_options in self._imported_interfaces:
+      if not interface.is_supplemental:
+        if self._database.HasInterface(interface.id):
+          old_interface = self._database.GetInterface(interface.id)
+          self._merge_interfaces(old_interface, interface, import_options)
+        else:
+          if import_options.add_new_interfaces:
+            self._database.AddInterface(interface)
+
+    # Step 3: Merge in supplemental interfaces
+    for interface, module_name, import_options in self._imported_interfaces:
+      if interface.is_supplemental:
+        target_name = interface.ext_attrs['Supplemental']
+        if target_name:
+          # [Supplemental=DOMWindow] - merge into DOMWindow.
+          target = target_name
+        else:
+          # [Supplemental] - merge into existing inteface with same name.
+          target = interface.id
+        if self._database.HasInterface(target):
+          old_interface = self._database.GetInterface(target)
+          self._merge_interfaces(old_interface, interface, import_options)
+        else:
+          raise Exception("Supplemental target '%s' not found", target)
+
+    # Step 4: Resolve 'implements' statements
+    for impl_stmt, import_options in self._impl_stmts:
+      self._merge_impl_stmt(impl_stmt, import_options)
+
+    self._impl_stmts = []
+    self._imported_interfaces = []
+
+  def import_idl_file(self, file_path,
+            import_options=DatabaseBuilderOptions()):
+    """Parses, loads into memory and cleans up and IDL file"""
+    idl_file = self._load_idl_file(file_path, import_options)
+
+    self._strip_ext_attributes(idl_file)
+    self._resolve_type_defs(idl_file)
+    self._rename_types(idl_file, import_options)
+
+    def enabled(idl_node):
+      return self._is_node_enabled(idl_node, import_options.idl_defines)
+
+    for module in idl_file.modules:
+      for interface in module.interfaces:
+        if not self._is_node_enabled(interface, import_options.idl_defines):
+          _logger.info('skipping interface %s/%s (source=%s file=%s)'
+            % (module.id, interface.id, import_options.source,
+               file_path))
+          continue
+
+        _logger.info('importing interface %s/%s (source=%s file=%s)'
+          % (module.id, interface.id, import_options.source,
+             file_path))
+        interface.attributes = filter(enabled, interface.attributes)
+        interface.operations = filter(enabled, interface.operations)
+        self._imported_interfaces.append((interface, module.id, import_options))
+
+      for implStmt in module.implementsStatements:
+        self._impl_stmts.append((implStmt, import_options))
+
+  def _is_node_enabled(self, node, idl_defines):
+    if not 'Conditional' in node.ext_attrs:
+      return True
+
+    def enabled(condition):
+      return 'ENABLE_%s' % condition in idl_defines
+
+    conditional = node.ext_attrs['Conditional']
+    if conditional.find('&') != -1:
+      for condition in conditional.split('&'):
+        if not enabled(condition):
+          return False
+      return True
+
+    for condition in conditional.split('|'):
+      if enabled(condition):
+        return True
+    return False
+
+  def fix_displacements(self, source):
+    """E.g. In W3C, something is declared on HTMLDocument but in WebKit
+    its on Document, so we need to mark that something in HTMLDocument
+    with @WebKit(via=Document). The 'via' attribute specifies the
+    parent interface that has the declaration."""
+
+    for interface in self._database.GetInterfaces():
+      changed = False
+
+      _logger.info('fixing displacements in %s' % interface.id)
+
+      for parent_interface in self._get_parent_interfaces(interface):
+        _logger.info('scanning parent %s of %s' %
+          (parent_interface.id, interface.id))
+
+        def fix_nodes(local_list, parent_list):
+          changed = False
+          parent_signatures_map = self._build_signatures_map(
+            parent_list)
+          for idl_node in local_list:
+            sig = self._sign(idl_node)
+            if sig in parent_signatures_map:
+              parent_member = parent_signatures_map[sig]
+              if (source in parent_member.annotations
+                  and source not in idl_node.annotations
+                  and _VIA_ANNOTATION_ATTR_NAME
+                      not in parent_member.annotations[source]):
+                idl_node.annotations[source] = IDLAnnotation(
+                    {_VIA_ANNOTATION_ATTR_NAME: parent_interface.id})
+                changed = True
+          return changed
+
+        changed = fix_nodes(interface.constants,
+                  parent_interface.constants) or changed
+        changed = fix_nodes(interface.attributes,
+                  parent_interface.attributes) or changed
+        changed = fix_nodes(interface.operations,
+                  parent_interface.operations) or changed
+      if changed:
+        _logger.info('fixed displaced declarations in %s' %
+          interface.id)
+
+  def normalize_annotations(self, sources):
+    """Makes the IDLs less verbose by removing annotation attributes
+    that are identical to the ones defined at the interface level.
+
+    Args:
+      sources -- list of source names to normalize."""
+    for interface in self._database.GetInterfaces():
+      _logger.debug('normalizing annotations for %s' % interface.id)
+      for source in sources:
+        if (source not in interface.annotations or
+            not interface.annotations[source]):
+          continue
+        top_level_annotation = interface.annotations[source]
+
+        def normalize(idl_node):
+          if (source in idl_node.annotations
+              and idl_node.annotations[source]):
+            annotation = idl_node.annotations[source]
+            for name, value in annotation.items():
+              if (name in top_level_annotation
+                  and value == top_level_annotation[name]):
+                del annotation[name]
+
+        map(normalize, interface.parents)
+        map(normalize, interface.constants)
+        map(normalize, interface.attributes)
+        map(normalize, interface.operations)
diff --git a/elemental/idl/scripts/databasebuilder_test.py b/elemental/idl/scripts/databasebuilder_test.py
new file mode 100755
index 0000000..6a3d273
--- /dev/null
+++ b/elemental/idl/scripts/databasebuilder_test.py
@@ -0,0 +1,387 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import database
+import idlparser
+import logging.config
+import os
+import os.path
+import shutil
+import tempfile
+import unittest
+from databasebuilder import *
+
+
+class DatabaseBuilderTestCase(unittest.TestCase):
+
+  def _create_input(self, idl_file_name, content):
+    file_name = os.path.join(self._input_dir, idl_file_name)
+    f = open(file_name, 'w')
+    f.write(content)
+    f.close()
+    return file_name
+
+  def _assert_interface_exists(self, path):
+    file_path = os.path.join(self._database_dir, path)
+    self.assertTrue(os.path.exists(file_path))
+
+  def _assert_content_equals(self, path, expected_content):
+    def clean(content):
+      return ' '.join(filter(len, map(str.strip, content.split('\n'))))
+    file_path = os.path.join(self._database_dir, path)
+    self.assertTrue(os.path.exists(file_path))
+    f = open(file_path, 'r')
+    actual_content = f.read()
+    f.close()
+    if clean(actual_content) != clean(expected_content):
+      msg = '''
+FILE: %s
+EXPECTED:
+%s
+ACTUAL:
+%s
+''' % (file_path, expected_content, actual_content)
+      self.fail(msg)
+
+  def setUp(self):
+    working_dir = tempfile.mkdtemp()
+    self._database_dir = os.path.join(working_dir, 'database')
+    self.assertFalse(os.path.exists(self._database_dir))
+
+    self._input_dir = os.path.join(working_dir, 'inputdir')
+    os.makedirs(self._input_dir)
+
+    self._db = database.Database(self._database_dir)
+    self.assertTrue(os.path.exists(self._database_dir))
+
+    self._builder = DatabaseBuilder(self._db)
+
+  def tearDown(self):
+    shutil.rmtree(self._database_dir)
+
+  def test_basic_import(self):
+    file_name = self._create_input('input.idl', '''
+      module M {
+        interface I {
+          attribute int a;
+        };
+      };''')
+    self._builder.import_idl_file(file_name)
+    self._builder.merge_imported_interfaces([])
+    self._db.Save()
+    self._assert_interface_exists('I.idl')
+
+  def test_splitting(self):
+    file_name = self._create_input('input.idl', '''
+      module M {
+        interface I {
+          readonly attribute int a;
+          int o(in int x, in optional int y);
+        };
+      };''')
+    self._builder.import_idl_file(file_name)
+    self._builder.merge_imported_interfaces([])
+    self._db.Save()
+    self._assert_content_equals('I.idl', '''
+      interface I {
+        /* Attributes */
+        getter attribute int a;
+
+        /* Operations */
+        int o(in int x);
+        int o(in int x, in int y);
+      };''')
+
+  def test_renames(self):
+    file_name = self._create_input('input.idl', '''
+      module M {
+        [Constructor(in T x)] interface I {
+          T op(T x);
+          readonly attribute N::T attr;
+        };
+      };''')
+    options = DatabaseBuilderOptions(type_rename_map={'I': 'i', 'T': 't'})
+    self._builder.import_idl_file(file_name, options)
+    self._builder.merge_imported_interfaces([])
+    self._db.Save()
+    self._assert_content_equals('i.idl', '''
+      [Constructor(in t x)] interface i {
+        /* Attributes */
+        getter attribute t attr;
+        /* Operations */
+        t op(in t x);
+      };''')
+
+  def test_type_defs(self):
+    file_name = self._create_input('input.idl', '''
+      module M {
+        typedef T S;
+        interface I : S {
+          S op(S x);
+          readonly attribute S attr;
+        };
+      };''')
+    options = DatabaseBuilderOptions()
+    self._builder.import_idl_file(file_name, options)
+    self._builder.merge_imported_interfaces([])
+    self._db.Save()
+    self._assert_content_equals('I.idl', '''
+      interface I :
+        T {
+        /* Attributes */
+        getter attribute T attr;
+        /* Operations */
+        T op(in T x);
+      };''')
+
+  def test_merge(self):
+    file_name1 = self._create_input('input1.idl', '''
+      module M {
+        interface I {
+          const int CONST_BOTH = 0;
+          const int CONST_ONLY_FIRST = 0;
+          const int CONST_BOTH_DIFFERENT_VALUE = 0;
+
+          readonly attribute int attr_only_first;
+          readonly attribute int attr_both;
+          readonly attribute int attr_both_readonly_difference;
+          readonly attribute int attr_both_int_long_difference;
+
+          int op_only_first();
+          int op_both(int a);
+          int op_both_optionals_difference(int a,
+            in optional int b);
+          int op_both_arg_rename(int arg);
+        };
+      };''')
+    self._builder.import_idl_file(file_name1,
+      DatabaseBuilderOptions(source='1st',
+        idl_syntax=idlparser.FREMONTCUT_SYNTAX))
+    file_name2 = self._create_input('input2.idl', '''
+      module M {
+        interface I {
+          const int CONST_BOTH = 0;
+          const int CONST_ONLY_SECOND = 0;
+          const int CONST_BOTH_DIFFERENT_VALUE = 1;
+
+          readonly attribute int attr_only_second;
+          readonly attribute int attr_both;
+          readonly attribute long attr_both_int_long_difference;
+          attribute int attr_both_readonly_difference;
+
+          int op_only_second();
+          int op_both(int a);
+          int op_both_optionals_difference(int a,
+            optional boolean b);
+          int op_both_arg_rename(int betterName);
+        };
+      };''')
+    self._builder.import_idl_file(file_name2,
+      DatabaseBuilderOptions(source='2nd',
+        idl_syntax=idlparser.FREMONTCUT_SYNTAX))
+    self._builder.set_same_signatures({'int': 'long'})
+    self._builder.merge_imported_interfaces([])
+    self._db.Save()
+    self._assert_content_equals('I.idl', '''
+      @1st(module=M) @2nd(module=M) interface I {
+        /* Constants */
+        @1st @2nd const int CONST_BOTH = 0;
+        @1st const int CONST_BOTH_DIFFERENT_VALUE = 0;
+        @2nd const int CONST_BOTH_DIFFERENT_VALUE = 1;
+        @1st const int CONST_ONLY_FIRST = 0;
+        @2nd const int CONST_ONLY_SECOND = 0;
+
+        /* Attributes */
+        @1st @2nd getter attribute int attr_both;
+        @1st @2nd getter attribute int attr_both_int_long_difference;
+        @1st @2nd getter attribute int attr_both_readonly_difference;
+        @2nd setter attribute int attr_both_readonly_difference;
+        @1st getter attribute int attr_only_first;
+        @2nd getter attribute int attr_only_second;
+
+        /* Operations */
+        @1st @2nd int op_both(in t a);
+        @1st @2nd int op_both_arg_rename(in t betterName);
+        @1st @2nd int op_both_optionals_difference(in t a);
+        @1st int op_both_optionals_difference(in t a, in int b);
+        @2nd int op_both_optionals_difference(in t a, in boolean b);
+        @1st int op_only_first();
+        @2nd int op_only_second();
+      };''')
+
+  def test_mergeDartName(self):
+    file_name1 = self._create_input('input1.idl', '''
+      module M {
+        interface I {
+          [ImplementationFunction=foo] int member(in int a);
+        };
+      };''')
+    self._builder.import_idl_file(file_name1,
+      DatabaseBuilderOptions(source='1st',
+        idl_syntax=idlparser.FREMONTCUT_SYNTAX))
+    file_name2 = self._create_input('input2.idl', '''
+      module M {
+        interface I {
+          [DartName=bar] int member(in int a);
+        };
+      };''')
+    self._builder.import_idl_file(file_name2,
+      DatabaseBuilderOptions(source='2nd',
+        idl_syntax=idlparser.FREMONTCUT_SYNTAX))
+    self._builder.merge_imported_interfaces([])
+    self._db.Save()
+    self._assert_content_equals('I.idl', '''
+      @1st(module=M) @2nd(module=M) interface I {
+        /* Operations */
+        @1st @2nd [DartName=bar, ImplementationFunction=foo] int member(in int a);
+      };''')
+
+  def test_supplemental(self):
+    file_name = self._create_input('input1.idl', '''
+      module M {
+        interface I {
+          readonly attribute int a;
+        };
+        [Supplemental] interface I {
+          readonly attribute int b;
+        };
+      };''')
+    self._builder.import_idl_file(file_name,
+      DatabaseBuilderOptions(source='Src'))
+    self._builder.merge_imported_interfaces([])
+    self._db.Save()
+    self._assert_content_equals('I.idl', '''
+      @Src(module=M) [Supplemental] interface I {
+        /* Attributes */
+        @Src getter attribute int a;
+        @Src getter attribute int b;
+      };''')
+
+  def test_impl_stmt(self):
+    file_name = self._create_input('input.idl', '''
+      module M {
+        interface I {};
+        I implements J;
+      };''')
+    self._builder.import_idl_file(file_name,
+      DatabaseBuilderOptions(source='Src'))
+    self._builder.merge_imported_interfaces([])
+    self._db.Save()
+    self._assert_content_equals('I.idl', '''
+      @Src(module=M) interface I :
+        @Src J {
+      };''')
+
+  def test_obsolete(self):
+    file_name1 = self._create_input('input1.idl', '''
+      module M {
+        interface I {
+          readonly attribute int keep;
+          readonly attribute int obsolete; // Would be removed
+        };
+      };''')
+    self._builder.import_idl_file(file_name1,
+      DatabaseBuilderOptions(source='src'))
+    file_name2 = self._create_input('input2.idl', '''
+      module M {
+        interface I {
+          readonly attribute int keep;
+          readonly attribute int new;
+        };
+      };''')
+    self._builder.import_idl_file(file_name2,
+      DatabaseBuilderOptions(source='src',
+                   obsolete_old_declarations=True))
+    self._builder.merge_imported_interfaces([])
+    self._db.Save()
+    self._assert_content_equals('I.idl', '''
+      @src(module=M) interface I {
+        /* Attributes */
+        @src getter attribute int keep;
+        @src getter attribute int new;
+      };''')
+
+  def test_annotation_normalization(self):
+    file_name = self._create_input('input.idl', '''
+      module M {
+        interface I : J{
+          const int C = 0;
+          readonly attribute int a;
+          int op();
+        };
+      };''')
+    self._builder.import_idl_file(file_name,
+      DatabaseBuilderOptions(source='Src', source_attributes={'x': 'y'}))
+    self._builder.merge_imported_interfaces([])
+    interface = self._db.GetInterface('I')
+    interface.parents[0].annotations['Src']['x'] = 'u'
+    interface.constants[0].annotations['Src']['z'] = 'w'
+    interface.attributes[0].annotations['Src']['x'] = 'u'
+    self._db.Save()
+
+    # Before normalization
+    self._assert_content_equals('I.idl', '''
+      @Src(module=M, x=y)
+      interface I : @Src(x=u) J {
+        /* Constants */
+        @Src(x=y, z=w) const int C = 0;
+        /* Attributes */
+        @Src(x=u) getter attribute int a;
+        /* Operations */
+        @Src(x=y) int op();
+      };''')
+
+    # Normalize
+    self._builder.normalize_annotations(['Src'])
+    self._db.Save()
+
+    # After normalization
+    self._assert_content_equals('I.idl', '''
+      @Src(module=M, x=y)
+      interface I : @Src(x=u) J {
+        /* Constants */
+        @Src(z=w) const int C = 0;
+        /* Attributes */
+        @Src(x=u) getter attribute int a;
+        /* Operations */
+        @Src int op();
+      };''')
+
+  def test_fix_displacements(self):
+    file_name1 = self._create_input('input1.idl', '''
+      module M {
+        interface I {};
+        interface J : I {
+          readonly attribute int attr;
+        };
+      };''')
+    self._builder.import_idl_file(file_name1,
+      DatabaseBuilderOptions(source='1st'))
+    file_name2 = self._create_input('input2.idl', '''
+      module M {
+        interface I {
+          readonly attribute int attr;
+        };
+        interface J : I {};
+      };''')
+    self._builder.import_idl_file(file_name2,
+      DatabaseBuilderOptions(source='2nd'))
+    self._builder.merge_imported_interfaces([])
+    self._builder.fix_displacements('2nd')
+    self._db.Save()
+    self._assert_content_equals('J.idl', '''
+      @1st(module=M) @2nd(module=M) interface J :
+        @1st @2nd I {
+        /* Attributes */
+        @1st
+        @2nd(via=I)
+        getter attribute int attr;
+      };''')
+
+
+if __name__ == "__main__":
+  logging.config.fileConfig("logging.conf")
+  if __name__ == '__main__':
+    unittest.main()
diff --git a/elemental/idl/scripts/elemental_fremontcutbuilder.py b/elemental/idl/scripts/elemental_fremontcutbuilder.py
new file mode 100755
index 0000000..4fe8af3
--- /dev/null
+++ b/elemental/idl/scripts/elemental_fremontcutbuilder.py
@@ -0,0 +1,217 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import database
+import databasebuilder
+import idlparser
+import logging.config
+import os.path
+import sys
+
+# TODO(antonm): most probably should go away or be autogenerated on IDLs roll.
+DEFAULT_FEATURE_DEFINES = [
+    # Enabled Chrome WebKit build.
+    'ENABLE_3D_PLUGIN',
+    'ENABLE_3D_RENDERING',
+    'ENABLE_ACCELERATED_2D_CANVAS',
+    'ENABLE_BATTERY_STATUS',
+    'ENABLE_BLOB',
+    'ENABLE_BLOB_SLICE',
+    'ENABLE_CALENDAR_PICKER',
+    'ENABLE_CHANNEL_MESSAGING',
+    'ENABLE_CSS_FILTERS',
+    'ENABLE_CSS_IMAGE_SET',
+    'ENABLE_CSS_SHADERS',
+    'ENABLE_DART',
+    'ENABLE_DATA_TRANSFER_ITEMS',
+    'ENABLE_DETAILS',
+    'ENABLE_DEVICE_ORIENTATION',
+    'ENABLE_DIRECTORY_UPLOAD',
+    'ENABLE_DOWNLOAD_ATTRIBUTE',
+    'ENABLE_ENCRYPTED_MEDIA',
+    'ENABLE_FILE_SYSTEM',
+    'ENABLE_FILTERS',
+    'ENABLE_FULLSCREEN_API',
+    'ENABLE_GAMEPAD',
+    'ENABLE_GEOLOCATION',
+    'ENABLE_GESTURE_EVENTS',
+    'ENABLE_INDEXED_DATABASE',
+    'ENABLE_INPUT_SPEECH',
+    'ENABLE_INPUT_TYPE_COLOR',
+    'ENABLE_INPUT_TYPE_DATE',
+    'ENABLE_JAVASCRIPT_DEBUGGER',
+    'ENABLE_JAVASCRIPT_I18N_API',
+    'ENABLE_LEGACY_NOTIFICATIONS',
+    'ENABLE_LINK_PREFETCH',
+    'ENABLE_MEDIA_SOURCE',
+    'ENABLE_MEDIA_STATISTICS',
+    'ENABLE_MEDIA_STREAM',
+    'ENABLE_METER_TAG',
+    'ENABLE_MHTML',
+    'ENABLE_MUTATION_OBSERVERS',
+    'ENABLE_NOTIFICATIONS',
+    'ENABLE_OVERFLOW_SCROLLING',
+    'ENABLE_PAGE_POPUP',
+    'ENABLE_PAGE_VISIBILITY_API',
+    'ENABLE_POINTER_LOCK',
+    'ENABLE_PROGRESS_TAG',
+    'ENABLE_QUOTA',
+    'ENABLE_REGISTER_PROTOCOL_HANDLER',
+    'ENABLE_REQUEST_ANIMATION_FRAME',
+    'ENABLE_RUBY',
+    'ENABLE_SANDBOX',
+    'ENABLE_SCRIPTED_SPEECH',
+    'ENABLE_SHADOW_DOM',
+    'ENABLE_SHARED_WORKERS',
+    'ENABLE_SMOOTH_SCROLLING',
+    'ENABLE_SQL_DATABASE',
+    'ENABLE_STYLE_SCOPED',
+    'ENABLE_SVG',
+    'ENABLE_SVG_FONTS',
+    'ENABLE_TOUCH_EVENTS',
+    'ENABLE_V8_SCRIPT_DEBUG_SERVER',
+    'ENABLE_VIDEO',
+    'ENABLE_VIDEO_TRACK',
+    'ENABLE_VIEWPORT',
+    'ENABLE_WEBGL',
+    'ENABLE_WEB_AUDIO',
+    'ENABLE_WEB_INTENTS',
+    'ENABLE_WEB_SOCKETS',
+    'ENABLE_WEB_TIMING',
+    'ENABLE_WORKERS',
+    'ENABLE_XHR_RESPONSE_BLOB',
+    'ENABLE_XSLT',
+]
+
+# TODO(antonm): Remove this filter.
+UNSUPPORTED_FEATURES = [ 'ENABLE_WEB_INTENTS' ]
+
+def build_database(idl_files, database_dir, feature_defines = None):
+  """This code reconstructs the FremontCut IDL database from W3C,
+  WebKit and Dart IDL files."""
+  current_dir = os.path.dirname(__file__)
+  logging.config.fileConfig(os.path.join(current_dir, "logging.conf"))
+
+  db = database.Database(database_dir)
+
+  # Delete all existing IDLs in the DB.
+  db.Delete()
+
+  builder = databasebuilder.DatabaseBuilder(db)
+
+  # TODO(vsm): Move this to a README.
+  # This is the Dart SVN revision.
+  webkit_revision = '1060'
+
+  # TODO(vsm): Reconcile what is exposed here and inside WebKit code
+  # generation.  We need to recheck this periodically for now.
+  webkit_defines = [ 'LANGUAGE_DART', 'LANGUAGE_JAVASCRIPT' ]
+  if feature_defines is None:
+      feature_defines = DEFAULT_FEATURE_DEFINES
+
+  webkit_options = databasebuilder.DatabaseBuilderOptions(
+      idl_syntax=idlparser.WEBKIT_SYNTAX,
+# TODO(vsm): What else should we define as on when processing IDL?
+      idl_defines=[define for define in webkit_defines + feature_defines if define not in UNSUPPORTED_FEATURES],
+      source='WebKit',
+      source_attributes={'revision': webkit_revision},
+      type_rename_map={
+        'BarInfo': 'BarProp',
+        'DedicatedWorkerContext': 'DedicatedWorkerGlobalScope',
+        'DOMApplicationCache': 'ApplicationCache',
+        'DOMCoreException': 'DOMException',
+        'DOMFormData': 'FormData',
+        'DOMSelection': 'Selection',
+        'DOMWindow': 'Window',
+        'SharedWorkerContext': 'SharedWorkerGlobalScope',
+        'WorkerContext': 'WorkerGlobalScope',
+      })
+
+  optional_argument_whitelist = [
+      ('CSSStyleDeclaration', 'setProperty', 'priority'),
+      ('IDBDatabase', 'transaction', 'mode'),
+      ]
+
+  # Import WebKit IDLs.
+  for file_name in idl_files:
+    builder.import_idl_file(file_name, webkit_options)
+
+  # Import Dart idl:
+  dart_options = databasebuilder.DatabaseBuilderOptions(
+    idl_syntax=idlparser.FREMONTCUT_SYNTAX,
+    source='Dart',
+    rename_operation_arguments_on_merge=True)
+
+  builder.import_idl_file(
+      os.path.join(current_dir, '..', 'elemental', 'elemental.idl'),
+      dart_options)
+
+  # Merging:
+  builder.merge_imported_interfaces(optional_argument_whitelist)
+
+  builder.fix_displacements('WebKit')
+
+  # Cleanup:
+  builder.normalize_annotations(['WebKit', 'Dart'])
+
+  db.Save()
+
+def main():
+  current_dir = os.path.dirname(__file__)
+
+  webkit_dirs = [
+    'css',
+    'dom',
+    'fileapi',
+    'html',
+    'html/canvas',
+    'inspector',
+    'loader',
+    'loader/appcache',
+    'Modules/battery',
+    'Modules/filesystem',
+    'Modules/geolocation',
+    'Modules/indexeddb',
+    'Modules/mediastream',
+    'Modules/speech',
+    'Modules/webaudio',
+    'Modules/webdatabase',
+    'Modules/websockets',
+    'notifications',
+    'page',
+    'plugins',
+    'storage',
+    'svg',
+    'workers',
+    'xml',
+    ]
+
+  ignored_idls = [
+    'AbstractView.idl',
+    ]
+
+  idl_files = []
+
+  webcore_dir = os.path.join(current_dir, '..', 
+                             'third_party', 'WebCore')
+  if not os.path.exists(webcore_dir):
+    raise RuntimeError('directory not found: %s' % webcore_dir)
+
+  def visitor(arg, dir_name, names):
+    for name in names:
+      file_name = os.path.join(dir_name, name)
+      (interface, ext) = os.path.splitext(file_name)
+      if ext == '.idl' and name not in ignored_idls:
+        idl_files.append(file_name)
+
+  for dir_name in webkit_dirs:
+    dir_path = os.path.join(webcore_dir, dir_name)
+    os.path.walk(dir_path, visitor, None)
+
+  database_dir = os.path.join(current_dir, '..', 'database')
+  return build_database(idl_files, database_dir)
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/elemental/idl/scripts/elementaldomgenerator.py b/elemental/idl/scripts/elementaldomgenerator.py
new file mode 100755
index 0000000..7c55bed
--- /dev/null
+++ b/elemental/idl/scripts/elementaldomgenerator.py
@@ -0,0 +1,164 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+"""This is the entry point to create Elemental APIs from the IDL database."""
+
+import elementalgenerator
+import database
+import logging.config
+import optparse
+import os
+import shutil
+import subprocess
+import sys
+
+_logger = logging.getLogger('elementaldomgenerator')
+
+_webkit_renames = {
+    # W3C -> WebKit name conversion
+    # TODO(vsm): Maybe Store these renames in the IDLs.
+    'ApplicationCache': 'DOMApplicationCache',
+    'BarProp': 'BarInfo',
+    'DedicatedWorkerGlobalScope': 'DedicatedWorkerContext',
+    'FormData': 'DOMFormData',
+    'Selection': 'DOMSelection',
+    'SharedWorkerGlobalScope': 'SharedWorkerContext',
+    'Window': 'DOMWindow',
+    'WorkerGlobalScope': 'WorkerContext'}
+
+_html_strip_webkit_prefix_classes = [
+    'Animation',
+    'AnimationEvent',
+    'AnimationList',
+    'BlobBuilder',
+    'CSSKeyframeRule',
+    'CSSKeyframesRule',
+    'CSSMatrix',
+    'CSSTransformValue',
+    'Flags',
+    'LoseContext',
+    'Point',
+    'TransitionEvent']
+
+def HasAncestor(interface, names_to_match, database):
+  for parent in interface.parents:
+    if (parent.type.id in names_to_match or
+        (database.HasInterface(parent.type.id) and
+        HasAncestor(database.GetInterface(parent.type.id), names_to_match,
+            database))):
+      return True
+  return False
+
+def _MakeHtmlRenames(common_database):
+  html_renames = {}
+
+  for interface in common_database.GetInterfaces():
+    if (interface.id.startswith("HTML") and
+        HasAncestor(interface, ['Element', 'Document'], common_database)):
+      html_renames[interface.id] = interface.id[4:]
+
+  for subclass in _html_strip_webkit_prefix_classes:
+    html_renames['WebKit' + subclass] = subclass
+
+  # TODO(jacobr): we almost want to add this commented out line back.
+  #    html_renames['HTMLCollection'] = 'ElementList'
+  #    html_renames['NodeList'] = 'ElementList'
+  #    html_renames['HTMLOptionsCollection'] = 'ElementList'
+  html_renames['DOMWindow'] = 'Window'
+  html_renames['DOMSelection'] = 'Selection'
+  html_renames['DOMFormData'] = 'FormData'
+  html_renames['DOMApplicationCache'] = 'ApplicationCache'
+  html_renames['BarInfo'] = 'BarProp'
+  html_renames['DedicatedWorkerContext']='DedicatedWorkerGlobalScope'
+  html_renames['SharedWorkerContext']='SharedWorkerGlobalScope'
+  html_renames['WorkerContext']='WorkerGlobalScope'
+
+  return html_renames
+
+def GenerateDOM(systems, generate_html_systems, output_dir,
+                database_dir, use_database_cache):
+  current_dir = os.path.dirname(__file__)
+
+  generator = elementalgenerator.ElementalGenerator(
+      auxiliary_dir=os.path.join(current_dir, '..', 'src'),
+      template_dir=os.path.join(current_dir, '..', 'templates'),
+      base_package='')
+  generator.LoadAuxiliary()
+
+  common_database = database.Database(database_dir)
+  if use_database_cache:
+    common_database.LoadFromCache()
+  else:
+    common_database.Load()
+
+  generator.FilterMembersWithUnidentifiedTypes(common_database)
+  webkit_database = common_database.Clone()
+
+  # Generate Dart interfaces for the WebKit DOM.
+  generator.FilterInterfaces(database = webkit_database,
+                             or_annotations = ['WebKit', 'Dart'],
+                             exclude_displaced = ['WebKit'],
+                             exclude_suppressed = ['WebKit', 'Dart'])
+  generator.RenameTypes(webkit_database, _webkit_renames, True)
+  html_renames = _MakeHtmlRenames(common_database)
+  generator.RenameTypes(webkit_database, html_renames, True)
+
+  html_renames_inverse = dict((v,k) for k, v in html_renames.iteritems())
+  webkit_renames_inverse = dict((v,k) for k, v in _webkit_renames.iteritems())
+
+  generator.Generate(database = webkit_database,
+                     output_dir = output_dir,
+                     lib_dir = output_dir,
+                     module_source_preference = ['WebKit', 'Dart'],
+                     source_filter = ['WebKit', 'Dart'],
+                     super_database = common_database,
+                     common_prefix = 'common',
+                     super_map = webkit_renames_inverse,
+                     html_map = html_renames_inverse,
+                     systems = systems)
+
+  generator.Flush()
+
+def main():
+  parser = optparse.OptionParser()
+  parser.add_option('--systems', dest='systems',
+                    action='store', type='string',
+                    default='gwt,gwtjso',
+                    help='Systems to generate (gwt)')
+  parser.add_option('--output-dir', dest='output_dir',
+                    action='store', type='string',
+                    default=None,
+                    help='Directory to put the generated files')
+  parser.add_option('--use-database-cache', dest='use_database_cache',
+                    action='store_true',
+                    default=False,
+                    help='''Use the cached database from the previous run to
+                    improve startup performance''')
+  (options, args) = parser.parse_args()
+
+  current_dir = os.path.dirname(__file__)
+  systems = options.systems.split(',')
+  html_system_names = ['htmlgwt']
+  html_systems = [s for s in systems if s in html_system_names]
+  dom_systems = [s for s in systems if s not in html_system_names]
+
+  database_dir = os.path.join(current_dir, '..', 'database')
+  use_database_cache = options.use_database_cache
+  logging.config.fileConfig(os.path.join(current_dir, 'logging.conf'))
+
+  if dom_systems:
+    output_dir = options.output_dir or os.path.join(current_dir,
+        '../generated')
+    GenerateDOM(dom_systems, False, output_dir,
+                database_dir, use_database_cache)
+
+  if html_systems:
+    output_dir = options.output_dir or os.path.join(current_dir,
+        '../generated')
+    GenerateDOM(html_systems, True, output_dir,
+                database_dir, use_database_cache or dom_systems)
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/elemental/idl/scripts/elementalgenerator.py b/elemental/idl/scripts/elementalgenerator.py
new file mode 100755
index 0000000..a105c10
--- /dev/null
+++ b/elemental/idl/scripts/elementalgenerator.py
@@ -0,0 +1,712 @@
+#!/usr/bin/python
+# 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.
+
+"""This module generates Elemental APIs from the IDL database."""
+
+import emitter
+import idlnode
+import logging
+import multiemitter
+import os
+import re
+import shutil
+from generator_java import *
+from systembaseelemental import *
+from systemgwt import *
+from systemgwtjso import *
+from templateloader import TemplateLoader
+
+_logger = logging.getLogger('elementalgenerator')
+
+def MergeNodes(node, other):
+  node.operations.extend(other.operations)
+  for attribute in other.attributes:
+    if not node.has_attribute(attribute):
+      node.attributes.append(attribute)
+
+  node.constants.extend(other.constants)
+
+class ElementalGenerator(object):
+  """Utilities to generate Elemental APIs and corresponding JavaScript."""
+
+  def __init__(self, auxiliary_dir, template_dir, base_package):
+    """Constructor for the DartGenerator.
+
+    Args:
+      auxiliary_dir -- location of auxiliary handwritten classes
+      template_dir -- location of template files
+      base_package -- the base package name for the generated code.
+    """
+    self._auxiliary_dir = auxiliary_dir
+    self._template_dir = template_dir
+    self._base_package = base_package
+    self._auxiliary_files = {}
+    self._dart_templates_re = re.compile(r'[\w.:]+<([\w\.<>:]+)>')
+
+    self._emitters = None  # set later
+
+
+  def _StripModules(self, type_name):
+    return type_name.split('::')[-1]
+
+  def _IsCompoundType(self, database, type_name):
+    if IsPrimitiveType(type_name):
+      return True
+
+    striped_type_name = self._StripModules(type_name)
+    if database.HasInterface(striped_type_name):
+      return True
+
+    dart_template_match = self._dart_templates_re.match(type_name)
+    if dart_template_match:
+      # Dart templates
+      parent_type_name = type_name[0 : dart_template_match.start(1) - 1]
+      sub_type_name = dart_template_match.group(1)
+      return (self._IsCompoundType(database, parent_type_name) and
+              self._IsCompoundType(database, sub_type_name))
+    return False
+
+  def _IsDartType(self, type_name):
+    return '.' in type_name
+
+  def LoadAuxiliary(self):
+    def Visitor(_, dirname, names):
+      for name in names:
+        if name.endswith('.dart'):
+          name = name[0:-5]  # strip off ".dart"
+        self._auxiliary_files[name] = os.path.join(dirname, name)
+    os.path.walk(self._auxiliary_dir, Visitor, None)
+
+  def RenameTypes(self, database, conversion_table, rename_javascript_binding_names):
+    """Renames interfaces using the given conversion table.
+
+    References through all interfaces will be renamed as well.
+
+    Args:
+      database: the database to apply the renames to.
+      conversion_table: maps old names to new names.
+    """
+
+    if conversion_table is None:
+      conversion_table = {}
+     
+    # Rename interfaces:
+    for old_name, new_name in conversion_table.items():
+      if database.HasInterface(old_name):
+        _logger.info('renaming interface %s to %s' % (old_name, new_name))
+        interface = database.GetInterface(old_name)
+        database.DeleteInterface(old_name)
+        if not database.HasInterface(new_name):
+          interface.id = new_name
+          database.AddInterface(interface)
+        else:
+          new_interface = database.GetInterface(new_name)
+          MergeNodes(new_interface, interface)
+        
+        if rename_javascript_binding_names:
+          interface.javascript_binding_name = new_name
+          interface.doc_js_name = new_name
+          for member in (interface.operations + interface.constants
+              + interface.attributes):
+            member.doc_js_interface_name = new_name
+
+ 
+    # Fix references:
+    for interface in database.GetInterfaces():
+      for idl_type in interface.all(idlnode.IDLType):
+        type_name = self._StripModules(idl_type.id)
+        if type_name in conversion_table:
+          idl_type.id = conversion_table[type_name]
+
+  def FilterMembersWithUnidentifiedTypes(self, database):
+    """Removes unidentified types.
+
+    Removes constants, attributes, operations and parents with unidentified
+    types.
+    """
+
+    for interface in database.GetInterfaces():
+      def IsIdentified(idl_node):
+        node_name = idl_node.id if idl_node.id else 'parent'
+        for idl_type in idl_node.all(idlnode.IDLType):
+          type_name = idl_type.id
+          if (type_name is not None and
+              self._IsCompoundType(database, type_name)):
+            continue
+          _logger.warn('removing %s in %s which has unidentified type %s' %
+                       (node_name, interface.id, type_name))
+          return False
+        return True
+
+      interface.constants = filter(IsIdentified, interface.constants)
+      interface.attributes = filter(IsIdentified, interface.attributes)
+      interface.operations = filter(IsIdentified, interface.operations)
+      interface.parents = filter(IsIdentified, interface.parents)
+
+  def FilterInterfaces(self, database,
+                       and_annotations=[],
+                       or_annotations=[],
+                       exclude_displaced=[],
+                       exclude_suppressed=[]):
+    """Filters a database to remove interfaces and members that are missing
+    annotations.
+
+    The FremontCut IDLs use annotations to specify implementation
+    status in various platforms. For example, if a member is annotated
+    with @WebKit, this means that the member is supported by WebKit.
+
+    Args:
+      database -- the database to filter
+      all_annotations -- a list of annotation names a member has to
+        have or it will be filtered.
+      or_annotations -- if a member has one of these annotations, it
+        won't be filtered even if it is missing some of the
+        all_annotations.
+      exclude_displaced -- if a member has this annotation and it
+        is marked as displaced it will always be filtered.
+      exclude_suppressed -- if a member has this annotation and it
+        is marked as suppressed it will always be filtered.
+    """
+
+    # Filter interfaces and members whose annotations don't match.
+    for interface in database.GetInterfaces():
+      def HasAnnotations(idl_node):
+        """Utility for determining if an IDLNode has all
+        the required annotations"""
+        for a in exclude_displaced:
+          if (a in idl_node.annotations
+              and 'via' in idl_node.annotations[a]):
+            return False
+        for a in exclude_suppressed:
+          if (a in idl_node.annotations
+              and 'suppressed' in idl_node.annotations[a]):
+            return False
+        for a in or_annotations:
+          if a in idl_node.annotations:
+            return True
+        if and_annotations == []:
+          return False
+        for a in and_annotations:
+          if a not in idl_node.annotations:
+            return False
+        return True
+
+      if HasAnnotations(interface):
+        interface.constants = filter(HasAnnotations, interface.constants)
+        interface.attributes = filter(HasAnnotations, interface.attributes)
+        interface.operations = filter(HasAnnotations, interface.operations)
+        interface.parents = filter(HasAnnotations, interface.parents)
+      else:
+        database.DeleteInterface(interface.id)
+
+    self.FilterMembersWithUnidentifiedTypes(database)
+
+
+  def Generate(self, database, output_dir,
+               module_source_preference=[], source_filter=None,
+               super_database=None, common_prefix=None, super_map={},
+               html_map={}, lib_dir=None, systems=[]):
+    """Generates Dart and JS files for the loaded interfaces.
+
+    Args:
+      database -- database containing interfaces to generate code for.
+      output_dir -- directory to write generated files to.
+      module_source_preference -- priority order list of source annotations to
+        use when choosing a module name, if none specified uses the module name
+        from the database.
+      source_filter -- if specified, only outputs interfaces that have one of
+        these source annotation and rewrites the names of superclasses not
+        marked with this source to use the common prefix.
+      super_database -- database containing super interfaces that the generated
+        interfaces should extend.
+      common_prefix -- prefix for the common library, if any.
+      lib_file_path -- filename for generated .lib file, None if not required.
+      lib_template -- template file in this directory for generated lib file.
+    """
+  
+    self._emitters = multiemitter.MultiEmitter()
+    self._database = database
+    self._output_dir = output_dir
+
+    self._FixEventTargets()
+    self._ComputeInheritanceClosure()
+
+    self._systems = []
+
+    # TODO(jmesserly): only create these if needed
+    if ('gwtjso' in systems):
+      jso_system = ElementalJsoSystem(
+          TemplateLoader(self._template_dir, ['dom/jso', 'dom', '']),
+          self._database, self._emitters, self._output_dir)
+      self._systems.append(jso_system)
+    if ('gwt' in systems):
+      interface_system = ElementalInterfacesSystem(
+          TemplateLoader(self._template_dir, ['dom/interface', 'dom', '']),
+          self._database, self._emitters, self._output_dir)
+      self._systems.append(interface_system)
+
+#    if 'gwt' in systems:
+#      elemental_system = ElementalSystem(
+#          TemplateLoader(self._template_dir, ['dom/elemental', 'dom', '']),
+#          self._database, self._emitters, self._output_dir)
+
+#      elemental_system._interface_system = interface_system
+#      self._systems.append(elemental_system)
+
+
+
+    # Collect interfaces
+    interfaces = []
+    for interface in database.GetInterfaces():
+      if not MatchSourceFilter(source_filter, interface):
+        # Skip this interface since it's not present in the required source
+        _logger.info('Omitting interface - %s' % interface.id)
+        continue
+      interfaces.append(interface)
+
+    # TODO(sra): Use this list of exception names to generate information to
+    # tell Frog which exceptions can be passed from JS to Dart code.
+    exceptions = self._CollectExceptions(interfaces)
+
+    mixins = self._ComputeMixins(self._PreOrderInterfaces(interfaces))
+    for system in self._systems:
+      # give outputters a chance to see the mixin list before starting
+      system.ProcessMixins(mixins)
+
+    # copy all mixin methods from every interface to this base interface
+    self.PopulateMixinBase(self._database.GetInterface('ElementalMixinBase'), mixins)
+
+    # Render all interfaces into Dart and save them in files.
+    for interface in self._PreOrderInterfaces(interfaces):
+
+      super_interface = None
+      super_name = interface.id
+
+      if super_name in super_map:
+        super_name = super_map[super_name]
+
+      if (super_database is not None and
+          super_database.HasInterface(super_name)):
+        super_interface = super_name
+
+      interface_name = interface.id
+      auxiliary_file = self._auxiliary_files.get(interface_name)
+      if auxiliary_file is not None:
+        _logger.info('Skipping %s because %s exists' % (
+            interface_name, auxiliary_file))
+        continue
+      
+      info = RecognizeCallback(interface)
+      if info:
+        for system in self._systems:
+          system.ProcessCallback(interface, info)
+      else:
+        if 'Callback' in interface.ext_attrs:
+          _logger.info('Malformed callback: %s' % interface.id)
+        self._ProcessInterface(interface, super_interface,
+                               source_filter, common_prefix)
+
+    for system in self._systems:
+      system.Finish()
+
+  def PopulateMixinBase(self, mixinbase, mixins):
+    """Copy all mixin attributes and operations to mixin base class"""
+    for mixin_name in mixins:
+      if self._database.HasInterface(mixin_name):
+        mixin = self._database.GetInterface(mixin_name)
+        mixinbase.attributes.extend(mixin.attributes)
+        mixinbase.operations.extend(mixin.operations)
+        for extattr in mixin.ext_attrs.keys():
+          mixinbase.ext_attrs[extattr] = mixin.ext_attrs[extattr]
+
+  # compute all interfaces which are in disjoint type hierarchies
+  # that is, cannot be SingleImplJSO without hoisting      
+  def _ComputeMixins(self, interfaces):
+    implementors = {}
+    mixins = {}
+    parents = {}
+    # first compute the set of all inherited super-interfaces of every interface
+    for interface in interfaces:
+      if interface.parents:
+        # the first parent interface is the superclass
+        parent = interface.parents[0]
+        # if we haven't processed this one before
+        if not interface.id in parents:
+          # compute a list of all of the direct superclass this interface
+          parents[interface.id] = []
+          parents[interface.id].append(parent)
+          if parent.type.id in parents:
+            # inherit all the super-interfaces
+            parents[interface.id].extend(parents[parent.type.id])
+
+    implemented_by = None
+    for interface in interfaces:
+      # now, examining secondary interfaces 
+      for secondary in interface.parents[1:]:
+        if secondary.type.id in implementors:
+          implemented_by = implementors[secondary.type.id]
+          # if the interface is implemented by someone else who is not one of my parents, it is not SingleJsoImpl
+          if not implemented_by in parents[interface.id]:
+            mixins[secondary.type.id]=implemented_by
+            print "Mixin detected %s, previously implemented by %s, but also implemented by %s" % (secondary.type.id, implemented_by, interface.id)
+            # add all parents of the mixin as well
+            superparents = []
+            superiface = secondary.type.id
+            if self._database.HasInterface(superiface):
+              self.getParents(self._database.GetInterface(superiface), superparents)
+            for parent in superparents:
+              mixins[parent.id]=implemented_by
+              print "Super Mixin detected %s, previously implemented by %s, but also implemented by %s" % (parent.id, implemented_by, interface.id)
+
+        else:
+          implementors[secondary.type.id] = interface.id
+    # manual patch for outliers not picked up by this logic
+    mixins['ElementTimeControl']=1         
+    mixins['ElementTraversal']=1         
+    return mixins.keys()
+
+  def _PreOrderInterfaces(self, interfaces):
+    """Returns the interfaces in pre-order, i.e. parents first."""
+    seen = set()
+    ordered = []
+    def visit(interface):
+      if interface.id in seen:
+        return
+      seen.add(interface.id)
+      for parent in interface.parents:
+        if IsDartCollectionType(parent.type.id):
+          continue
+        if self._database.HasInterface(parent.type.id):
+          parent_interface = self._database.GetInterface(parent.type.id)
+          visit(parent_interface)
+      ordered.append(interface)
+
+    for interface in interfaces:
+      visit(interface)
+    return ordered
+
+
+  def _ProcessInterface(self, interface, super_interface_name,
+                        source_filter,
+                        common_prefix):
+    """."""
+    
+    _logger.info('Generating %s' % interface.id)
+
+    generators = [system.InterfaceGenerator(interface,
+                                            common_prefix,
+                                            super_interface_name,
+                                            source_filter)
+                  for system in self._systems]
+    generators = filter(None, generators)
+
+
+    mixinbase = self._database.GetInterface("ElementalMixinBase")
+    parentops = []
+    parentattrs = []
+
+
+    directParents = []
+    mixinOps = []
+    # compute the immediate parents of each interface (not including secondary interfaces)
+    self.getParents(interface, directParents)
+
+    # if not the mixin base, add its parents
+    if interface.id != 'ElementalMixinBase':
+      self.getParents(mixinbase, directParents)
+      # add the mixin base class itself as the parent of everything                                                                                                           
+      directParents.insert(0, mixinbase)
+
+    # for each parent interface
+    for pint in directParents:
+      for op in pint.operations:
+        # compute unique method signatures for each operation                                                                                                           :
+        op_name = op.ext_attrs.get('DartName', op.id)
+        sig = "%s %s(" % (op.type.id, op_name)
+        for arg in op.arguments:
+          sig += arg.type.id
+          parentops.append(sig)
+      for attr in pint.attributes:
+        # compute attributes                                                                                                             
+        if attr.is_fc_getter:
+          parentattrs.append("getter_" + DartDomNameOfAttribute(attr))
+        if attr.is_fc_setter:
+          parentattrs.append("setter_" + DartDomNameOfAttribute(attr))
+
+    for generator in generators:
+      generator.StartInterface()
+
+    for const in sorted(interface.constants, ConstantOutputOrder):
+      for generator in generators:
+        generator.AddConstant(const)
+
+    attributes = [attr for attr in interface.attributes]
+
+    for (getter, setter) in  _PairUpAttributes(attributes):
+      for generator in generators:
+        # detect if attribute is inherited (as opposed to just redeclared)                                                                                                             
+        inheritedGetter = ("getter_" + DartDomNameOfAttribute(getter)) in parentattrs
+        inheritedSetter = setter and ("setter_" + DartDomNameOfAttribute(setter)) in parentattrs
+        generator.AddAttribute(getter, setter, inheritedGetter, inheritedSetter)
+
+    # The implementation should define an indexer if the interface directly
+    # extends List.
+    element_type = MaybeListElementType(interface)
+    if element_type:
+      for generator in generators:
+        generator.AddIndexer(element_type)
+
+    # Generate operations
+    alreadyGenerated = []
+    for operation in interface.operations:
+      op_name = operation.ext_attrs.get('DartName', operation.id)
+      sig = "%s %s(" % (operation.type.id, op_name)
+      for arg in operation.arguments:
+        sig += arg.type.id
+      if sig in alreadyGenerated:
+        continue
+      alreadyGenerated.append(sig)
+
+      # hacks, should be able to compute this from IDL database
+      if operation.id == 'toString':
+        # implemented on JSO.toString()
+        continue
+      operations = []
+      operations.append(operation)
+      info = AnalyzeOperation(interface, operations)
+      for generator in generators:
+        # don't override stuff hoisted to mixin base in implementors
+        inherited = sig in parentops
+        if info.IsStatic():
+          generator.AddStaticOperation(info, inherited)
+        else:
+          generator.AddOperation(info, inherited)
+
+    # With multiple inheritance, attributes and operations of non-first
+    # interfaces need to be added.  Sometimes the attribute or operation is
+    # defined in the current interface as well as a parent.  In that case we
+    # avoid making a duplicate definition and pray that the signatures match.
+
+    for parent_interface in self._TransitiveSecondaryParents(interface):
+      if isinstance(parent_interface, str):  # IsDartCollectionType(parent_interface)
+        continue
+      attributes = [attr for attr in parent_interface.attributes
+                    if not FindMatchingAttribute(interface, attr)]
+      for (getter, setter) in _PairUpAttributes(attributes):
+        for generator in generators:
+          generator.AddSecondaryAttribute(parent_interface, getter, setter)
+
+      # Group overloaded operations by id
+      operationsById = {}
+      for operation in parent_interface.operations:
+        if operation.id not in operationsById:
+          operationsById[operation.id] = []
+        operationsById[operation.id].append(operation)
+
+      # Generate operations
+      for id in sorted(operationsById.keys()):
+        if not any(op.id == id for op in interface.operations):
+          operations = operationsById[id]
+          info = AnalyzeOperation(interface, operations)
+          for generator in generators:
+            generator.AddSecondaryOperation(parent_interface, info)
+
+    for generator in generators:
+      generator.FinishInterface()
+    return
+
+  def getParents(self, interface, results):
+    if interface.parents:
+      pid = interface.parents[0].type.id
+      if self._database.HasInterface(pid):
+        pint = self._database.GetInterface(interface.parents[0].type.id)
+        results.append(pint)
+        self.getParents(pint, results)
+    
+  def _TransitiveSecondaryParents(self, interface):
+    """Returns a list of all non-primary parents.
+
+    The list contains the interface objects for interfaces defined in the
+    database, and the name for undefined interfaces.
+    """
+    def walk(parents):
+      for parent in parents:
+        if IsDartCollectionType(parent.type.id):
+          result.append(parent.type.id)
+          continue
+        if self._database.HasInterface(parent.type.id):
+          parent_interface = self._database.GetInterface(parent.type.id)
+          result.append(parent_interface)
+          walk(parent_interface.parents)
+
+    result = []
+    walk(interface.parents[1:])
+    return result;
+
+
+  def _CollectExceptions(self, interfaces):
+    """Returns the names of all exception classes raised."""
+    exceptions = set()
+    for interface in interfaces:
+      for attribute in interface.attributes:
+        if attribute.get_raises:
+          exceptions.add(attribute.get_raises.id)
+        if attribute.set_raises:
+          exceptions.add(attribute.set_raises.id)
+      for operation in interface.operations:
+        if operation.raises:
+          exceptions.add(operation.raises.id)
+    return exceptions
+
+
+  def Flush(self):
+    """Write out all pending files."""
+    _logger.info('Flush...')
+    self._emitters.Flush()
+
+  def _FixEventTargets(self):
+    for interface in self._database.GetInterfaces():
+      # Create fake EventTarget parent interface for interfaces that have
+      # 'EventTarget' extended attribute.
+      if 'EventTarget' in interface.ext_attrs:
+        ast = [('Annotation', [('Id', 'WebKit')]),
+               ('InterfaceType', ('ScopedName', 'EventTarget'))]
+        interface.parents.append(idlnode.IDLParentInterface(ast))
+
+  def _ComputeInheritanceClosure(self):
+    def Collect(interface, seen, collected):
+      name = interface.id
+      if '<' in name:
+        # TODO(sra): Handle parameterized types.
+        return
+      if not name in seen:
+        seen.add(name)
+        collected.append(name)
+        for parent in interface.parents:
+          # TODO(sra): Handle parameterized types.
+          if not '<' in parent.type.id:
+            if self._database.HasInterface(parent.type.id):
+              Collect(self._database.GetInterface(parent.type.id),
+                      seen, collected)
+
+    self._inheritance_closure = {}
+    for interface in self._database.GetInterfaces():
+      seen = set()
+      collected = []
+      Collect(interface, seen, collected)
+      self._inheritance_closure[interface.id] = collected
+
+  def _AllImplementedInterfaces(self, interface):
+    """Returns a list of the names of all interfaces implemented by 'interface'.
+    List includes the name of 'interface'.
+    """
+    return self._inheritance_closure[interface.id]
+
+def _PairUpAttributes(attributes):
+  """Returns a list of (getter, setter) pairs sorted by name.
+
+  One element of the pair may be None.
+  """
+  names = sorted(set(attr.id for attr in attributes))
+  getters = {}
+  setters = {}
+  for attr in attributes:
+    if attr.is_fc_getter:
+      getters[attr.id] = attr
+    elif attr.is_fc_setter and 'Replaceable' not in attr.ext_attrs:
+      setters[attr.id] = attr
+  return [(getters.get(id), setters.get(id)) for id in names]
+
+# ------------------------------------------------------------------------------
+
+class DummyImplementationSystem(SystemElemental):
+  """Generates a dummy implementation for use by the editor analysis.
+
+  All the code comes from hand-written library files.
+  """
+
+  def __init__(self, templates, database, emitters, output_dir):
+    super(DummyImplementationSystem, self).__init__(
+        templates, database, emitters, output_dir)
+    factory_providers_file = os.path.join(self._output_dir, 'src', 'dummy',
+                                          'RegularFactoryProviders.dart')
+    self._factory_providers_emitter = self._emitters.FileEmitter(
+        factory_providers_file)
+    self._impl_file_paths = [factory_providers_file]
+
+  def InterfaceGenerator(self,
+                         interface,
+                         common_prefix,
+                         super_interface_name,
+                         source_filter):
+    return DummyInterfaceGenerator(self, interface)
+
+  def ProcessCallback(self, interface, info):
+    pass
+
+  def GenerateLibraries(self, lib_dir):
+    # Library generated for implementation.
+    self._GenerateLibFile(
+        'dom_dummy.darttemplate',
+        os.path.join(lib_dir, 'dom_dummy.dart'),
+        (self._interface_system._dart_interface_file_paths +
+         self._interface_system._dart_callback_file_paths +
+         self._impl_file_paths))
+
+
+# ------------------------------------------------------------------------------
+
+class DummyInterfaceGenerator(object):
+  """Generates dummy implementation."""
+
+  def __init__(self, system, interface):
+    self._system = system
+    self._interface = interface
+
+  def StartInterface(self):
+    # There is no implementation to match the interface, but there might be a
+    # factory constructor for the Dart interface.
+    constructor_info = AnalyzeConstructor(self._interface)
+    if constructor_info:
+      dart_interface_name = self._interface.id
+      self._EmitFactoryProvider(dart_interface_name, constructor_info)
+
+  def _EmitFactoryProvider(self, interface_name, constructor_info):
+    factory_provider = '_' + interface_name + 'FactoryProvider'
+    self._system._factory_providers_emitter.Emit(
+        self._system._templates.Load('factoryprovider.darttemplate'),
+        FACTORYPROVIDER=factory_provider,
+        CONSTRUCTOR=interface_name,
+        PARAMETERS=constructor_info.ParametersImplementationDeclaration())
+
+  def FinishInterface(self):
+    pass
+
+  def AddConstant(self, constant):
+    pass
+
+  def AddAttribute(self, getter, setter, inheritedGetter, inheritedSetter):
+    pass
+
+  def AddSecondaryAttribute(self, interface, getter, setter):
+    pass
+
+  def AddSecondaryOperation(self, interface, info):
+    pass
+
+  def AddIndexer(self, element_type):
+    pass
+
+  def AddTypedArrayConstructors(self, element_type):
+    pass
+
+  def AddOperation(self, info, inherited):
+    pass
+
+  def AddStaticOperation(self, info, inherited):
+    pass
+
+  def AddEventAttributes(self, event_attrs):
+    pass
diff --git a/elemental/idl/scripts/emitter.py b/elemental/idl/scripts/emitter.py
new file mode 100755
index 0000000..792458f
--- /dev/null
+++ b/elemental/idl/scripts/emitter.py
@@ -0,0 +1,217 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+"""Templating to help generate structured text."""
+
+import logging
+import re
+
+_logger = logging.getLogger('emitter')
+
+
+def Format(template, **parameters):
+  """Create a string using the same template syntax as Emitter.Emit."""
+  e = Emitter()
+  e._Emit(template, parameters)
+  return ''.join(e.Fragments())
+
+
+class Emitter(object):
+  """An Emitter collects string fragments to be assembled into a single string.
+  """
+
+  def __init__(self, bindings=None):
+    self._items = []     # A new list
+    self._bindings = bindings or Emitter.Frame({}, None)
+
+  def EmitRaw(self, item):
+    """Emits literal string with no substitition."""
+    self._items.append(item)
+
+  def Emit(self, template_source, **parameters):
+    """Emits a template, substituting named parameters and returning emitters to
+    fill the named holes.
+
+    Ordinary substitution occurs at $NAME or $(NAME).  If there is no parameter
+    called NAME, the text is left as-is. So long as you don't bind FOO as a
+    parameter, $FOO in the template will pass through to the generated text.
+
+    Substitution of $?NAME and $(?NAME) yields an empty string if NAME is not a
+    parameter.
+
+    Values passed as named parameters should be strings or simple integral
+    values (int or long).
+
+    Named holes are created at $!NAME or $(!NAME).  A hole marks a position in
+    the template that may be filled in later.  An Emitter is returned for each
+    named hole in the template.  The holes are filled by emitting to the
+    corresponding emitter.
+
+    Emit returns either a single Emitter if the template contains one hole or a
+    tuple of emitters for several holes, in the order that the holes occur in
+    the template.
+
+    The emitters for the holes remember the parameters passed to the initial
+    call to Emit.  Holes can be used to provide a binding context.
+    """
+    return self._Emit(template_source, parameters)
+
+  def _Emit(self, template_source, parameters):
+    """Implementation of Emit, with map in place of named parameters."""
+    template = self._ParseTemplate(template_source)
+
+    parameter_bindings = self._bindings.Extend(parameters)
+
+    hole_names = template._holes
+
+    if hole_names:
+      hole_map = {}
+      replacements = {}
+      for name in hole_names:
+        emitter = Emitter(parameter_bindings)
+        replacements[name] = emitter._items
+        hole_map[name] = emitter
+      full_bindings = parameter_bindings.Extend(replacements)
+    else:
+      full_bindings = parameter_bindings
+
+    self._ApplyTemplate(template, full_bindings)
+
+    # Return None, a singleton or tuple of the hole names.
+    if not hole_names:
+      return None
+    if len(hole_names) == 1:
+      return hole_map[hole_names[0]]
+    else:
+      return tuple(hole_map[name] for name in hole_names)
+
+  def Fragments(self):
+    """Returns a list of all the string fragments emitted."""
+    def _FlattenTo(item, output):
+      if isinstance(item, list):
+        for subitem in item:
+          _FlattenTo(subitem, output)
+      elif isinstance(item, Emitter.DeferredLookup):
+        value = item._environment.Lookup(item._lookup._name,
+                                         item._lookup._value_if_missing)
+        _FlattenTo(value, output)
+      else:
+        output.append(str(item))
+
+    output = []
+    _FlattenTo(self._items, output)
+    return output
+
+  def Bind(self, var, template_source, **parameters):
+    """Adds a binding for var to this emitter."""
+    template = self._ParseTemplate(template_source)
+    if template._holes:
+      raise RuntimeError('Cannot have holes in Emitter.Bind')
+    bindings = self._bindings.Extend(parameters)
+    value = Emitter(bindings)
+    value._ApplyTemplate(template, bindings)
+    self._bindings = self._bindings.Extend({var: value._items})
+    return value
+
+  def _ParseTemplate(self, source):
+    """Converts the template string into a Template object."""
+    # TODO(sra): Cache the parsing.
+    items = []
+    holes = []
+
+    # Break source into a sequence of text fragments and substitution lookups.
+    pos = 0
+    while True:
+      match = Emitter._SUBST_RE.search(source, pos)
+      if not match:
+        items.append(source[pos:])
+        break
+      text_fragment = source[pos : match.start()]
+      if text_fragment:
+        items.append(text_fragment)
+      pos = match.end()
+      term = match.group()
+      name = match.group(1) or match.group(2)    # $NAME and $(NAME)
+      if name:
+        item = Emitter.Lookup(name, term, term)
+        items.append(item)
+        continue
+      name = match.group(3) or match.group(4)    # $!NAME and $(!NAME)
+      if name:
+        item = Emitter.Lookup(name, term, term)
+        items.append(item)
+        holes.append(name)
+        continue
+      name = match.group(5) or match.group(6)    # $?NAME and $(?NAME)
+      if name:
+        item = Emitter.Lookup(name, term, '')
+        items.append(item)
+        holes.append(name)
+        continue
+      raise RuntimeError('Unexpected group')
+
+    if len(holes) != len(set(holes)):
+      raise RuntimeError('Cannot have repeated holes %s' % holes)
+    return Emitter.Template(items, holes)
+
+  _SUBST_RE = re.compile(
+      #  $FOO    $(FOO)      $!FOO    $(!FOO)      $?FOO     $(?FOO)
+      r'\$(\w+)|\$\((\w+)\)|\$!(\w+)|\$\(!(\w+)\)|\$\?(\w+)|\$\(\?(\w+)\)')
+
+  def _ApplyTemplate(self, template, bindings):
+    """Emits the items from the parsed template."""
+    result = []
+    for item in template._items:
+      if isinstance(item, str):
+        if item:
+          result.append(item)
+      elif isinstance(item, Emitter.Lookup):
+        # Bind lookup to the current environment (bindings)
+        # TODO(sra): More space efficient to do direct lookup.
+        result.append(Emitter.DeferredLookup(item, bindings))
+      else:
+        raise RuntimeError('Unexpected template element')
+    # Collected fragments are in a sublist, so self._items contains one element
+    # (sublist) per template application.
+    self._items.append(result)
+
+  class Lookup(object):
+    """An element of a parsed template."""
+    def __init__(self, name, original, default):
+      self._name = name
+      self._original = original
+      self._value_if_missing = default
+
+  class DeferredLookup(object):
+    """A lookup operation that is deferred until final string generation."""
+    # TODO(sra): A deferred lookup will be useful when we add expansions that
+    # have behaviour condtional on the contents, e.g. adding separators between
+    # a list of items.
+    def __init__(self, lookup, environment):
+      self._lookup = lookup
+      self._environment = environment
+
+  class Template(object):
+    """A parsed template."""
+    def __init__(self, items, holes):
+      self._items = items  # strings and lookups
+      self._holes = holes
+
+
+  class Frame(object):
+    """A Frame is a set of bindings derived from a parent."""
+    def __init__(self, map, parent):
+      self._map = map
+      self._parent = parent
+
+    def Lookup(self, name, default):
+      if name in self._map:
+        return self._map[name]
+      if self._parent:
+        return self._parent.Lookup(name, default)
+      return default
+
+    def Extend(self, map):
+      return Emitter.Frame(map, self)
diff --git a/elemental/idl/scripts/emitter_test.py b/elemental/idl/scripts/emitter_test.py
new file mode 100755
index 0000000..8247e3f
--- /dev/null
+++ b/elemental/idl/scripts/emitter_test.py
@@ -0,0 +1,100 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+"""Tests for emitter module."""
+
+import logging.config
+import unittest
+import emitter
+
+
+class EmitterTestCase(unittest.TestCase):
+
+  def setUp(self):
+    pass
+
+  def tearDown(self):
+    pass
+
+  def check(self, e, expected):
+    self.assertEquals(''.join(e.Fragments()), expected)
+
+  def testExample(self):
+    e = emitter.Emitter()
+    body = e.Emit('$TYPE $NAME() {\n'
+                  '  $!BODY\n'
+                  '}\n',
+                  TYPE='int', NAME='foo')
+    body.Emit('return $VALUE;', VALUE='100')
+    self.check(e,
+               'int foo() {\n'
+               '  return 100;\n'
+               '}\n')
+
+  def testTemplateErrorDuplicate(self):
+    try:
+      e = emitter.Emitter()
+      b = e.Emit('$(A)$(!B)$(A)$(!B)')   # $(!B) is duplicated
+    except RuntimeError, ex:
+      return
+    raise AssertionError('Expected error')
+
+  def testTemplate1(self):
+    e = emitter.Emitter()
+    e.Emit('-$A+$B-$A+$B-', A='1', B='2')
+    self.check(e, '-1+2-1+2-')
+
+  def testTemplate2(self):
+    e = emitter.Emitter()
+    r = e.Emit('1$(A)2$(B)3$(A)4$(B)5', A='x', B='y')
+    self.assertEquals(None, r)
+    self.check(e, '1x2y3x4y5')
+
+  def testTemplate3(self):
+    e = emitter.Emitter()
+    b = e.Emit('1$(A)2$(!B)3$(A)4$(B)5', A='x')
+    b.Emit('y')
+    self.check(e, '1x2y3x4y5')
+    self.check(b, 'y')
+
+  def testTemplate4(self):
+    e = emitter.Emitter()
+    (a, b) = e.Emit('$!A$!B$A$B')   # pair of holes.
+    a.Emit('x')
+    b.Emit('y')
+    self.check(e, 'xyxy')
+
+  def testMissing(self):
+    # Behaviour of Undefined parameters depends on form.
+    e = emitter.Emitter();
+    e.Emit('$A $?B $(C) $(?D)')
+    self.check(e, '$A  $(C) ')
+
+  def testHoleScopes(self):
+    e = emitter.Emitter()
+    # Holes have scope.  They remember the bindings of the template application
+    # in which they are created.  Create two holes which inherit bindings for C
+    # and D.
+    (a, b) = e.Emit('[$!A][$!B]$C$D$E', C='1', D='2')
+    e.Emit('  $A$B$C$D')  # Bindings are local to the Emit
+    self.check(e, '[][]12$E  $A$B$C$D')
+
+    # Holes are not bound within holes.  That would too easily lead to infinite
+    # expansions.
+    a.Emit('$A$C$D')   # $A12
+    b.Emit('$D$C$B')   # 21$B
+    self.check(e, '[$A12][21$B]12$E  $A$B$C$D')
+    # EmitRaw avoids interpolation.
+    a.EmitRaw('$C$D')
+    b.EmitRaw('$D$C')
+    self.check(e, '[$A12$C$D][21$B$D$C]12$E  $A$B$C$D')
+
+  def testFormat(self):
+    self.assertEquals(emitter.Format('$A$B', A=1, B=2), '12')
+
+if __name__ == '__main__':
+  logging.config.fileConfig('logging.conf')
+  if __name__ == '__main__':
+    unittest.main()
diff --git a/elemental/idl/scripts/generator_java.py b/elemental/idl/scripts/generator_java.py
new file mode 100644
index 0000000..dbf12d4
--- /dev/null
+++ b/elemental/idl/scripts/generator_java.py
@@ -0,0 +1,782 @@
+#!/usr/bin/python
+# 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.
+
+"""This module provides shared functionality for systems to generate
+Dart APIs from the IDL database."""
+
+import re
+import pdb
+
+_pure_interfaces = set([
+    'DOMStringMap',
+    'ElementTimeControl',
+    'ElementTraversal',
+    'MediaQueryListListener',
+    'NodeSelector',
+    'SVGExternalResourcesRequired',
+    'SVGFilterPrimitiveStandardAttributes',
+    'SVGFitToViewBox',
+    'SVGLangSpace',
+    'SVGLocatable',
+    'SVGStylable',
+    'SVGTests',
+    'SVGTransformable',
+    'SVGURIReference',
+    'SVGViewSpec',
+    'SVGZoomAndPan',
+    'TimeoutHandler'])
+
+def IsPureInterface(interface_name):
+  return interface_name in _pure_interfaces
+
+#
+# Renames for attributes that have names that are not legal Dart names.
+#
+_dart_attribute_renames = {
+    'default': 'defaultValue',
+    'final': 'finalValue',
+}
+
+#
+# Interface version of the DOM needs to delegate typed array constructors to a
+# factory provider.
+#
+interface_factories = {
+    'Float32Array': '_TypedArrayFactoryProvider',
+    'Float64Array': '_TypedArrayFactoryProvider',
+    'Int8Array': '_TypedArrayFactoryProvider',
+    'Int16Array': '_TypedArrayFactoryProvider',
+    'Int32Array': '_TypedArrayFactoryProvider',
+    'Uint8Array': '_TypedArrayFactoryProvider',
+    'Uint16Array': '_TypedArrayFactoryProvider',
+    'Uint32Array': '_TypedArrayFactoryProvider',
+    'Uint8ClampedArray': '_TypedArrayFactoryProvider',
+}
+
+#
+# Custom native specs for the Frog dom.
+#
+_frog_dom_custom_native_specs = {
+    # Decorate the singleton Console object, if present (workers do not have a
+    # console).
+    'Console': "=(typeof console == 'undefined' ? {} : console)",
+
+    # DOMWindow aliased with global scope.
+    'DOMWindow': '@*DOMWindow',
+}
+
+#
+# Custom native bodies for frog implementations of dom operations that appear in
+# dart:dom and dart:html.  This is used to work-around the lack of a 'rename'
+# feature in the 'native' string - the correct name is available on the DartName
+# extended attribute. See Issue 1814
+#
+dom_frog_native_bodies = {
+    # Some JavaScript processors, especially tools like yuicompress and
+    # JSCompiler, choke on 'this.continue'
+    'IDBCursor.continueFunction':
+      """
+        if (key == null) return this['continue']();
+        return this['continue'](key);
+      """,
+}
+
+def IsPrimitiveType(type_name):
+  return isinstance(GetIDLTypeInfo(type_name), PrimitiveIDLTypeInfo)
+
+def MaybeListElementTypeName(type_name):
+  """Returns the List element type T from string of form "List<T>", or None."""
+  match = re.match(r'sequence<(\w*)>$', type_name)
+  if match:
+    return match.group(1)
+  return None
+
+def MaybeListElementType(interface):
+  """Returns the List element type T, or None in interface does not implement
+  List<T>.
+  """
+  for parent in interface.parents:
+    element_type = MaybeListElementTypeName(parent.type.id)
+    if element_type:
+      return element_type
+  return None
+
+def MaybeTypedArrayElementType(interface):
+  """Returns the typed array element type, or None in interface is not a
+  TypedArray.
+  """
+  # Typed arrays implement ArrayBufferView and List<T>.
+  for parent in interface.parents:
+    if  parent.type.id == 'ArrayBufferView':
+      return MaybeListElementType(interface)
+  return None
+
+def MakeNativeSpec(javascript_binding_name):
+  if javascript_binding_name in _frog_dom_custom_native_specs:
+    return _frog_dom_custom_native_specs[javascript_binding_name]
+  else:
+    # Make the class 'hidden' so it is dynamically patched at runtime.  This
+    # is useful not only for browser compat, but to allow code that links
+    # against dart:dom to load in a worker isolate.
+    return '*' + javascript_binding_name
+
+
+def MatchSourceFilter(filter, thing):
+  if not filter:
+    return True
+  else:
+    return any(token in thing.annotations for token in filter)
+
+
+def DartType(idl_type_name):
+  return GetIDLTypeInfo(idl_type_name).dart_type()
+
+
+class ParamInfo(object):
+  """Holder for various information about a parameter of a Dart operation.
+
+  Attributes:
+    name: Name of parameter.
+    type_id: Original type id.  None for merged types.
+    dart_type: DartType of parameter.
+    default_value: String holding the expression.  None for mandatory parameter.
+  """
+  def __init__(self, name, type_id, dart_type, default_value, interface):
+    self.name = name
+    self.type_id = type_id
+    self.dart_type = dart_type
+    self.default_value = default_value
+    self.interface = interface
+
+
+# Given a list of overloaded arguments, render a dart argument.
+def _DartArg(args, interface):
+  # Given a list of overloaded arguments, choose a suitable name.
+  def OverloadedName(args):
+    return '_OR_'.join(sorted(set(arg.id for arg in args)))
+
+  # Given a list of overloaded arguments, choose a suitable type.
+  def OverloadedType(args):
+    type_ids = sorted(set(arg.type.id for arg in args))
+    dart_types = sorted(set(DartType(arg.type.id) for arg in args))
+    if len(dart_types) == 1:
+      if len(type_ids) == 1:
+        return (type_ids[0], dart_types[0])
+      else:
+        return (None, dart_types[0])
+    else:
+      return (None, TypeName(type_ids, interface))
+
+  filtered = filter(None, args)
+  optional = any(not arg or arg.is_optional for arg in args)
+  (type_id, dart_type) = OverloadedType(filtered)
+  name = OverloadedName(filtered)
+  if optional:
+    return ParamInfo(name, type_id, dart_type, None, interface)
+  else:
+    return ParamInfo(name, type_id, dart_type, None, interface)
+
+
+def AnalyzeOperation(interface, operations):
+  """Makes operation calling convention decision for a set of overloads.
+
+  Returns: An OperationInfo object.
+  """
+
+  # Zip together arguments from each overload by position, then convert
+  # to a dart argument.
+  args = map(lambda *args: _DartArg(args, interface),
+             *(op.arguments for op in operations))
+
+  info = OperationInfo()
+  info.interface = interface
+  info.overloads = operations
+  info.declared_name = operations[0].id
+  info.name = operations[0].ext_attrs.get('DartName', info.declared_name)
+  info.js_name = info.declared_name
+  info.type_name = DartType(operations[0].type.id)   # TODO: widen.
+  info.param_infos = args
+  info.arguments = operations[0].arguments
+  return info
+
+
+def AnalyzeConstructor(interface):
+  """Returns an OperationInfo object for the constructor.
+
+  Returns None if the interface has no Constructor.
+  """
+  def GetArgs(func_value):
+    return map(lambda arg: _DartArg([arg], interface), func_value.arguments)
+
+  if 'Constructor' in interface.ext_attrs:
+    name = None
+    func_value = interface.ext_attrs.get('Constructor')
+    if func_value:
+      # [Constructor(param,...)]
+      args = GetArgs(func_value)
+      idl_args = func_value.arguments
+    else: # [Constructor]
+      args = []
+      idl_args = []
+  else:
+    func_value = interface.ext_attrs.get('NamedConstructor')
+    if func_value:
+      name = func_value.id
+      args = GetArgs(func_value)
+      idl_args = func_value.arguments
+    else:
+      return None
+
+  info = OperationInfo()
+  info.overloads = None
+  info.idl_args = idl_args
+  info.declared_name = name
+  info.name = name
+  info.js_name = name
+  info.type_name = interface.id
+  info.param_infos = args
+  return info
+
+
+def RecognizeCallback(interface):
+  """Returns the info for the callback method if the interface smells like a
+  callback.
+  """
+  if 'Callback' not in interface.ext_attrs: return None
+  handlers = [op for op in interface.operations if op.id == 'handleEvent']
+  if not handlers: return None
+  if not (handlers == interface.operations): return None
+  return AnalyzeOperation(interface, handlers)
+
+def IsDartListType(type):
+  return type == 'List' or type.startswith('sequence<')
+
+def IsDartCollectionType(type):
+  return IsDartListType(type)
+
+def FindMatchingAttribute(interface, attr1):
+  matches = [attr2 for attr2 in interface.attributes
+             if attr1.id == attr2.id
+             and attr1.is_fc_getter == attr2.is_fc_getter
+             and attr1.is_fc_setter == attr2.is_fc_setter]
+  if matches:
+    assert len(matches) == 1
+    return matches[0]
+  return None
+
+
+def DartDomNameOfAttribute(attr):
+  """Returns the Dart name for an IDLAttribute.
+
+  attr.id is the 'native' or JavaScript name.
+
+  To ensure uniformity, work with the true IDL name until as late a possible,
+  e.g. translate to the Dart name when generating Dart code.
+  """
+  name = attr.id
+  name = _dart_attribute_renames.get(name, name)
+  name = attr.ext_attrs.get('DartName', None) or name
+  return name
+
+
+def TypeOrNothing(dart_type, info):
+  """Returns string for declaring something with |dart_type| in a context
+  where a type may be omitted.
+  The string is empty or has a trailing space.
+  """
+  # hack until over-loaded callback issue is fixed
+  if dart_type == 'Dynamic' or info is not None and info.interface == 'DatabaseCallback':
+      return 'Object '
+  else:
+    return dart_type + ' '
+
+def NameOrEntry(param, database):
+  """Returns either the name of the param, or a $entry wrapper"""
+  if param.type_id.endswith('Callback') or param.type_id.endswith('Handler'):
+    argtype = database.GetInterface(param.type_id)
+    op = argtype.operations[0]
+    jsniArgs = []
+    for arg in op.arguments:
+      if database.HasInterface(arg.type.id):
+        argface = database.GetInterface(arg.type.id)
+        # HACK: this interface is overloaded, we should fix the IDL or detect overloaded callbacks automatically
+        if param.type_id == 'DatabaseCallback' and (argface.id == 'Database' or argface.id == 'DatabaseSync'):
+          jsniArgs.append("Ljava/lang/Object;")
+        else:
+          jsniArgs.append("Lelemental/%s/%s;" % (getModule(argface.annotations), DartType(arg.type.id)))
+
+      else:
+        jsniArgs.append(primitives[DartType(arg.type.id)])
+
+    return "$entry(%s.@elemental.%s.%s::on%s(%s)).bind(%s)" % (param.name, getModule(argtype.annotations), argtype.id, argtype.id,  ''.join(jsniArgs), param.name)
+  else:
+    return param.name
+
+def TypeOrVar(dart_type, comment=None):
+    return dart_type
+
+def JsoTypeOrVar(dart_type, mixins):
+    if dart_type.endswith("Handler") or dart_type.endswith("Callback") or dart_type in mixins:
+      return dart_type
+    if dart_type[0].isupper() and not dart_type.startswith("Js") and not dart_type in java_lang:
+      return "Js" + dart_type
+    return dart_type
+
+
+class OperationInfo(object):
+  """Holder for various derived information from a set of overloaded operations.
+
+  Attributes:
+    overloads: A list of IDL operation overloads with the same name.
+    name: A string, the simple name of the operation.
+    type_name: A string, the name of the return type of the operation.
+    param_infos: A list of ParamInfo.
+  """
+
+  def ParametersInterfaceDeclaration(self):
+    """Returns a formatted string declaring the parameters for the interface."""
+    return self._FormatParams(
+        self.param_infos, True,
+        lambda param: TypeOrNothing(param.dart_type, param))
+
+  def ParametersImplementationDeclaration(self, rename_type=None):
+    """Returns a formatted string declaring the parameters for the
+    implementation.
+
+    Args:
+      rename_type: A function that allows the types to be renamed.
+        The function is applied to the parameter's dart_type.
+    """
+    if rename_type:
+      def renamer(param_info):
+        return TypeOrNothing(rename_type(param_info.dart_type), param_info)
+      return self._FormatParams(self.param_infos, False, renamer)
+    else:
+      def type_fn(param_info):
+        if param_info.dart_type == 'Dynamic':
+          if param_info.type_id:
+            # It is more informative to use a comment IDL type.
+            return 'Object'
+          else:
+            return 'Object'
+        else:
+          return param_info.dart_type
+      return self._FormatParams(
+          self.param_infos, False,
+          lambda param: TypeOrNothing(param.dart_type, param))
+
+  def ParametersAsArgumentList(self, database):
+    """Returns a string of the parameter names suitable for passing the
+    parameters as arguments.
+    """
+    return ', '.join(map(lambda param_info: NameOrEntry(param_info, database), self.param_infos))
+
+  def _FormatParams(self, params, is_interface, type_fn):
+    def FormatParam(param):
+      """Returns a parameter declaration fragment for an ParamInfo."""
+      type = type_fn(param)
+      if is_interface or param.default_value is None:
+        return '%s%s' % (type, param.name)
+      else:
+        return '%s%s = %s' % (type, param.name, param.default_value)
+
+    required = []
+    optional = []
+    for param_info in params:
+      if param_info.default_value:
+        optional.append(param_info)
+      else:
+        if optional:
+          raise Exception('Optional parameters cannot precede required ones: '
+                          + str(args))
+        required.append(param_info)
+    argtexts = map(FormatParam, required)
+    if optional:
+      argtexts.append(', '.join(map(FormatParam, optional)))
+    return ', '.join(argtexts)
+
+  def IsStatic(self):
+    is_static = self.overloads[0].is_static
+    assert any([is_static == o.is_static for o in self.overloads])
+    return is_static
+
+
+def AttributeOutputOrder(a, b):
+  """Canonical output ordering for attributes."""
+    # Getters before setters:
+  if a.id < b.id: return -1
+  if a.id > b.id: return 1
+  if a.is_fc_setter < b.is_fc_setter: return -1
+  if a.is_fc_setter > b.is_fc_setter: return 1
+  return 0
+
+def ConstantOutputOrder(a, b):
+  """Canonical output ordering for constants."""
+  if a.id < b.id: return -1
+  if a.id > b.id: return 1
+  return 0
+
+
+def _FormatNameList(names):
+  """Returns JavaScript array literal expression with one name per line."""
+  #names = sorted(names)
+  if len(names) <= 1:
+    expression_string = str(names)  # e.g.  ['length']
+  else:
+    expression_string = ',\n   '.join(str(names).split(','))
+    expression_string = expression_string.replace('[', '[\n    ')
+  return expression_string
+
+
+def IndentText(text, indent):
+  """Format lines of text with indent."""
+  def FormatLine(line):
+    if line.strip():
+      return '%s%s\n' % (indent, line)
+    else:
+      return '\n'
+  return ''.join(FormatLine(line) for line in text.split('\n'))
+
+# Given a sorted sequence of type identifiers, return an appropriate type
+# name
+def TypeName(type_ids, interface):
+  # Dynamically type this field for now.
+  return 'Dynamic'
+
+# ------------------------------------------------------------------------------
+
+class IDLTypeInfo(object):
+  def __init__(self, idl_type, dart_type=None,
+               native_type=None,
+               custom_to_native=False,
+               custom_to_dart=False, conversion_includes=[]):
+    self._idl_type = idl_type
+    self._dart_type = dart_type
+    self._native_type = native_type
+    self._custom_to_native = custom_to_native
+    self._custom_to_dart = custom_to_dart
+    self._conversion_includes = conversion_includes + [idl_type]
+
+  def idl_type(self):
+    return self._idl_type
+
+  def dart_type(self):
+    return self._dart_type or self._idl_type
+
+  def native_type(self):
+    return self._native_type or self._idl_type
+
+  def emit_to_native(self, emitter, idl_node, name, handle, interface_name):
+    if 'Callback' in idl_node.ext_attrs:
+      if 'RequiredCppParameter' in idl_node.ext_attrs:
+        flag = 'DartUtilities::ConvertNullToDefaultValue'
+      else:
+        flag = 'DartUtilities::ConvertNone'
+      emitter.Emit(
+        '\n'
+        '        RefPtr<$TYPE> $NAME = Dart$IDL_TYPE::create($HANDLE, $FLAG, exception);\n'
+        '        if (exception)\n'
+        '            goto fail;\n',
+        TYPE=self.native_type(),
+        NAME=name,
+        IDL_TYPE=self.idl_type(),
+        HANDLE=handle,
+        FLAG=flag)
+      return name
+
+    argument = name
+    if self.custom_to_native():
+      type = 'RefPtr<%s>' % self.native_type()
+      argument = '%s.get()' % name
+    else:
+      type = '%s*' % self.native_type()
+      if isinstance(self, SVGTearOffIDLTypeInfo) and not interface_name.endswith('List'):
+        argument = '%s->propertyReference()' % name
+    emitter.Emit(
+        '\n'
+        '        $TYPE $NAME = Dart$IDL_TYPE::toNative($HANDLE, exception);\n'
+        '        if (exception)\n'
+        '            goto fail;\n',
+        TYPE=type,
+        NAME=name,
+        IDL_TYPE=self.idl_type(),
+        HANDLE=handle)
+    return argument
+
+  def custom_to_native(self):
+    return self._custom_to_native
+
+  def parameter_type(self):
+    return '%s*' % self.native_type()
+
+  def webcore_includes(self):
+    WTF_INCLUDES = [
+        'ArrayBuffer',
+        'ArrayBufferView',
+        'Float32Array',
+        'Float64Array',
+        'Int8Array',
+        'Int16Array',
+        'Int32Array',
+        'Uint8Array',
+        'Uint16Array',
+        'Uint32Array',
+        'Uint8ClampedArray',
+    ]
+
+    if self._idl_type in WTF_INCLUDES:
+      return ['<wtf/%s.h>' % self.native_type()]
+
+    if not self._idl_type.startswith('SVG'):
+      return ['"%s.h"' % self.native_type()]
+
+    if self._idl_type in ['SVGNumber', 'SVGPoint']:
+      return ['"SVGPropertyTearOff.h"']
+    if self._idl_type.startswith('SVGPathSeg'):
+      include = self._idl_type.replace('Abs', '').replace('Rel', '')
+    else:
+      include = self._idl_type
+    return ['"%s.h"' % include] + _svg_supplemental_includes
+
+  def receiver(self):
+    return 'receiver->'
+
+  def conversion_includes(self):
+    return ['"Dart%s.h"' % include for include in self._conversion_includes]
+
+  def to_dart_conversion(self, value, interface_name=None, attributes=None):
+    return 'Dart%s::toDart(%s)' % (self._idl_type, value)
+
+  def custom_to_dart(self):
+    return self._custom_to_dart
+
+
+class SequenceIDLTypeInfo(IDLTypeInfo):
+  def __init__(self, idl_type, item_info):
+    super(SequenceIDLTypeInfo, self).__init__(idl_type)
+    self._item_info = item_info
+
+  def dart_type(self):
+    etype = self._item_info.dart_type()
+    if etype == 'int':
+      return "IndexableInt"
+    elif etype == 'float' or etype == 'double':
+      return "IndexableNumber"
+    return "Indexable"
+# TODO(cromwellian) fix when generic SingleJsoImpl JSOs are fixed
+#   return 'Indexable<%s>' % self._item_info.dart_type()
+
+  def to_dart_conversion(self, value, interface_name=None, attributes=None):
+    return 'DartDOMWrapper::vectorToDart<Dart%s>(%s)' % (self._item_info.native_type(), value)
+
+  def conversion_includes(self):
+    return self._item_info.conversion_includes()
+
+
+class PrimitiveIDLTypeInfo(IDLTypeInfo):
+  def __init__(self, idl_type, dart_type, native_type=None,
+               webcore_getter_name='getAttribute',
+               webcore_setter_name='setAttribute'):
+    super(PrimitiveIDLTypeInfo, self).__init__(idl_type, dart_type=dart_type,
+        native_type=native_type)
+    self._webcore_getter_name = webcore_getter_name
+    self._webcore_setter_name = webcore_setter_name
+
+  def emit_to_native(self, emitter, idl_node, name, handle, interface_name):
+    arguments = [handle]
+    if idl_node.ext_attrs.get('Optional') == 'DefaultIsNullString' or 'RequiredCppParameter' in idl_node.ext_attrs:
+      arguments.append('DartUtilities::ConvertNullToDefaultValue')
+    emitter.Emit(
+        '\n'
+        '        const ParameterAdapter<$TYPE> $NAME($ARGUMENTS);\n'
+        '        if (!$NAME.conversionSuccessful()) {\n'
+        '            exception = $NAME.exception();\n'
+        '            goto fail;\n'
+        '        }\n',
+        TYPE=self.native_type(),
+        NAME=name,
+        ARGUMENTS=', '.join(arguments))
+    return name
+
+  def parameter_type(self):
+    if self.native_type() == 'String':
+      return 'const String&'
+    return self.native_type()
+
+  def conversion_includes(self):
+    return []
+
+  def to_dart_conversion(self, value, interface_name=None, attributes=None):
+    conversion_arguments = [value]
+    if attributes and 'TreatReturnedNullStringAs' in attributes:
+      conversion_arguments.append('DartUtilities::ConvertNullToDefaultValue')
+    function_name = re.sub(r' [a-z]', lambda x: x.group(0)[1:].upper(), self.native_type())
+    function_name = function_name[0].lower() + function_name[1:]
+    function_name = 'DartUtilities::%sToDart' % function_name
+    return '%s(%s)' % (function_name, ', '.join(conversion_arguments))
+
+  def webcore_getter_name(self):
+    return self._webcore_getter_name
+
+  def webcore_setter_name(self):
+    return self._webcore_setter_name
+
+class SVGTearOffIDLTypeInfo(IDLTypeInfo):
+  def __init__(self, idl_type, native_type=''):
+    super(SVGTearOffIDLTypeInfo, self).__init__(idl_type,
+                                                native_type=native_type)
+
+  def native_type(self):
+    if self._native_type:
+      return self._native_type
+    tear_off_type = 'SVGPropertyTearOff'
+    if self._idl_type.endswith('List'):
+      tear_off_type = 'SVGListPropertyTearOff'
+    return '%s<%s>' % (tear_off_type, self._idl_type)
+
+  def receiver(self):
+    if self._idl_type.endswith('List'):
+      return 'receiver->'
+    return 'receiver->propertyReference().'
+
+  def to_dart_conversion(self, value, interface_name, attributes):
+    svg_primitive_types = ['SVGAngle', 'SVGLength', 'SVGMatrix',
+        'SVGNumber', 'SVGPoint', 'SVGRect', 'SVGTransform']
+    conversion_cast = '%s::create(%s)'
+    if interface_name.startswith('SVGAnimated'):
+      conversion_cast = 'static_cast<%s*>(%s)'
+    elif self.idl_type() == 'SVGStringList':
+      conversion_cast = '%s::create(receiver, %s)'
+    elif interface_name.endswith('List'):
+      conversion_cast = 'static_cast<%s*>(%s.get())'
+    elif self.idl_type() in svg_primitive_types:
+      conversion_cast = '%s::create(%s)'
+    else:
+      conversion_cast = 'static_cast<%s*>(%s)'
+    conversion_cast = conversion_cast % (self.native_type(), value)
+    return 'Dart%s::toDart(%s)' %  (self._idl_type, conversion_cast)
+
+_idl_type_registry = {
+    'boolean': PrimitiveIDLTypeInfo('boolean', dart_type='boolean', native_type='bool',
+                                    webcore_getter_name='hasAttribute',
+                                    webcore_setter_name='setBooleanAttribute'),
+    'short': PrimitiveIDLTypeInfo('short', dart_type='short', native_type='short'),
+    'unsigned short': PrimitiveIDLTypeInfo('unsigned short', dart_type='int',
+        native_type='int'),
+    'int': PrimitiveIDLTypeInfo('int', dart_type='int'),
+    'unsigned int': PrimitiveIDLTypeInfo('unsigned int', dart_type='int',
+        native_type='unsigned'),
+    'long': PrimitiveIDLTypeInfo('long', dart_type='int', native_type='int',
+        webcore_getter_name='getIntegralAttribute',
+        webcore_setter_name='setIntegralAttribute'),
+    'unsigned long': PrimitiveIDLTypeInfo('unsigned long', dart_type='int',
+        native_type='unsigned',
+        webcore_getter_name='getUnsignedIntegralAttribute',
+        webcore_setter_name='setUnsignedIntegralAttribute'),
+    'long long': PrimitiveIDLTypeInfo('long long', dart_type='double'),
+    'unsigned long long': PrimitiveIDLTypeInfo('unsigned long long', dart_type='double'),
+    'float': PrimitiveIDLTypeInfo('float', dart_type='float', native_type='double'),
+    'double': PrimitiveIDLTypeInfo('double', dart_type='double'),
+
+    'any': PrimitiveIDLTypeInfo('any', dart_type='Object'),
+    'any[]': PrimitiveIDLTypeInfo('any[]', dart_type='Indexable'),
+    'Array': PrimitiveIDLTypeInfo('Array', dart_type='Indexable'),
+    'custom': PrimitiveIDLTypeInfo('custom', dart_type='Object'),
+    'Date': PrimitiveIDLTypeInfo('Date', dart_type='Date', native_type='double'),
+    'DOMObject': PrimitiveIDLTypeInfo('DOMObject', dart_type='Object', native_type='ScriptValue'),
+    'DOMString': PrimitiveIDLTypeInfo('DOMString', dart_type='String', native_type='String'),
+    # TODO(vsm): This won't actually work until we convert the Map to
+    # a native JS Map for JS DOM.
+    'Dictionary': PrimitiveIDLTypeInfo('Dictionary', dart_type='Mappable'),
+    # TODO(sra): Flags is really a dictionary: {create:bool, exclusive:bool}
+    # http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#the-flags-interface
+    'Flags': PrimitiveIDLTypeInfo('Flags', dart_type='Object'),
+    'DOMTimeStamp': PrimitiveIDLTypeInfo('DOMTimeStamp', dart_type='double', native_type='unsigned long long'),
+    'object': PrimitiveIDLTypeInfo('object', dart_type='Object', native_type='ScriptValue'),
+    # TODO(sra): Come up with some meaningful name so that where this appears in
+    # the documentation, the user is made aware that only a limited subset of
+    # serializable types are actually permitted.
+    'SerializedScriptValue': PrimitiveIDLTypeInfo('SerializedScriptValue', dart_type='Object'),
+    # TODO(sra): Flags is really a dictionary: {create:bool, exclusive:bool}
+    # http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#the-flags-interface
+    'WebKitFlags': PrimitiveIDLTypeInfo('WebKitFlags', dart_type='Object'),
+
+    'sequence': PrimitiveIDLTypeInfo('sequence', dart_type='Indexable'),
+    'void': PrimitiveIDLTypeInfo('void', dart_type='void'),
+
+    'CSSRule': IDLTypeInfo('CSSRule', conversion_includes=['CSSImportRule']),
+    'DOMException': IDLTypeInfo('DOMException', native_type='DOMCoreException'),
+#    'DOMStringList': IDLTypeInfo('DOMStringList', dart_type='Indexable<String>', custom_to_native=True),
+    'DOMStringList': IDLTypeInfo('DOMStringList', dart_type='Indexable', custom_to_native=True),
+#    'DOMStringMap': IDLTypeInfo('DOMStringMap', dart_type='Mappable<String>'),
+    'DOMStringMap': IDLTypeInfo('DOMStringMap', dart_type='Mappable'),
+    'DOMWindow': IDLTypeInfo('DOMWindow', custom_to_dart=True),
+    'Element': IDLTypeInfo('Element', custom_to_dart=True),
+    'EventListener': IDLTypeInfo('EventListener', custom_to_native=True),
+    'EventTarget': IDLTypeInfo('EventTarget', custom_to_native=True),
+    'HTMLElement': IDLTypeInfo('HTMLElement', custom_to_dart=True),
+    'IDBAny': IDLTypeInfo('IDBAny', dart_type='Object', custom_to_native=True),
+    'IDBKey': IDLTypeInfo('IDBKey', dart_type='Object', custom_to_native=True),
+    'StyleSheet': IDLTypeInfo('StyleSheet', conversion_includes=['CSSStyleSheet']),
+    'SVGElement': IDLTypeInfo('SVGElement', custom_to_dart=True),
+
+    'SVGAngle': SVGTearOffIDLTypeInfo('SVGAngle'),
+    'SVGLength': SVGTearOffIDLTypeInfo('SVGLength'),
+    'SVGLengthList': SVGTearOffIDLTypeInfo('SVGLengthList'),
+    'SVGMatrix': SVGTearOffIDLTypeInfo('SVGMatrix'),
+    'SVGNumber': SVGTearOffIDLTypeInfo('SVGNumber', native_type='SVGPropertyTearOff<float>'),
+    'SVGNumberList': SVGTearOffIDLTypeInfo('SVGNumberList'),
+    'SVGPathSegList': SVGTearOffIDLTypeInfo('SVGPathSegList', native_type='SVGPathSegListPropertyTearOff'),
+    'SVGPoint': SVGTearOffIDLTypeInfo('SVGPoint', native_type='SVGPropertyTearOff<FloatPoint>'),
+    'SVGPointList': SVGTearOffIDLTypeInfo('SVGPointList'),
+    'SVGPreserveAspectRatio': SVGTearOffIDLTypeInfo('SVGPreserveAspectRatio'),
+    'SVGRect': SVGTearOffIDLTypeInfo('SVGRect', native_type='SVGPropertyTearOff<FloatRect>'),
+    'SVGStringList': SVGTearOffIDLTypeInfo('SVGStringList', native_type='SVGStaticListPropertyTearOff<SVGStringList>'),
+    'SVGTransform': SVGTearOffIDLTypeInfo('SVGTransform'),
+    'SVGTransformList': SVGTearOffIDLTypeInfo('SVGTransformList', native_type='SVGTransformListPropertyTearOff')
+}
+
+_svg_supplemental_includes = [
+    '"SVGAnimatedPropertyTearOff.h"',
+    '"SVGAnimatedListPropertyTearOff.h"',
+    '"SVGStaticListPropertyTearOff.h"',
+    '"SVGAnimatedListPropertyTearOff.h"',
+    '"SVGTransformListPropertyTearOff.h"',
+    '"SVGPathSegListPropertyTearOff.h"',
+]
+
+def GetIDLTypeInfo(idl_type_name):
+  match = re.match(r'sequence<(\w+)>$', idl_type_name)
+  if match:
+    return SequenceIDLTypeInfo(idl_type_name, GetIDLTypeInfo(match.group(1)))
+  return _idl_type_registry.get(idl_type_name, IDLTypeInfo(idl_type_name))
+
+
+def getModule(annotations):
+  htmlaliases = ['audio', 'webaudio', 'inspector', 'offline', 'p2p', 'window', 'websockets', 'threads', 'view', 'storage', 'fileapi']
+
+  module = "dom"
+  if 'WebKit' in annotations and 'module' in annotations['WebKit']:
+    module = annotations['WebKit']['module']
+  if module in  htmlaliases:
+    return "html"
+  if module == 'core':
+    return 'dom'
+  return module
+
+java_lang = ['Object', 'String', 'Exception', 'DOMTimeStamp', 'DOMString', 'Date']
+
+primitives = {
+  'int' : 'I',
+  'short' : 'S',
+  'float' : 'F',
+  'double' : 'D',
+  'byte' : 'B',
+  'char' : 'C',
+  'long' : 'L',
+  'boolean' : 'Z',
+  'String' : 'Ljava/lang/String;',
+  'Object' : 'Ljava/lang/Object;'
+}
diff --git a/elemental/idl/scripts/idlnode.py b/elemental/idl/scripts/idlnode.py
new file mode 100755
index 0000000..921bf56
--- /dev/null
+++ b/elemental/idl/scripts/idlnode.py
@@ -0,0 +1,500 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import sys
+
+
+class IDLNode(object):
+  """Base class for all IDL elements.
+  IDLNode may contain various child nodes, and have properties. Examples
+  of IDLNode are modules, interfaces, interface members, function arguments,
+  etc.
+  """
+
+  def __init__(self, ast):
+    """Initializes an IDLNode from a PegParser AST output."""
+    self.id = self._find_first(ast, 'Id') if ast is not None else None
+
+  def __repr__(self):
+    """Generates string of the form <class id extra extra ... 0x12345678>."""
+    extras = self._extra_repr()
+    if isinstance(extras, list):
+      extras = ' '.join([str(e) for e in extras])
+    try:
+      if self.id:
+        return '<%s %s 0x%x>' % (
+            type(self).__name__,
+            ('%s %s' % (self.id, extras)).strip(),
+            hash(self))
+      return '<%s %s 0x%x>' % (
+          type(self).__name__,
+          extras,
+          hash(self))
+    except Exception, e:
+      return "can't convert to string: %s" % e
+
+  def _extra_repr(self):
+    """Returns string of extra info for __repr__()."""
+    return ''
+
+  def __cmp__(self, other):
+    """Override default compare operation.
+    IDLNodes are equal if all their properties are equal."""
+    if other is None or not isinstance(other, IDLNode):
+      return 1
+    return self.__dict__.__cmp__(other.__dict__)
+
+  def all(self, type_filter=None):
+    """Returns a list containing this node and all it child nodes
+    (recursive).
+
+    Args:
+      type_filter -- can be used to limit the results to a specific
+        node type (e.g. IDLOperation).
+    """
+    res = []
+    if type_filter is None or isinstance(self, type_filter):
+      res.append(self)
+    for v in self._all_subnodes():
+      if isinstance(v, IDLNode):
+        res.extend(v.all(type_filter))
+      elif isinstance(v, list):
+        for item in v:
+          if isinstance(item, IDLNode):
+            res.extend(item.all(type_filter))
+    return res
+
+  def _all_subnodes(self):
+    """Accessor used by all() to find subnodes."""
+    return self.__dict__.values()
+
+  def to_dict(self):
+    """Converts the IDLNode and its children into a dictionary.
+    This method is useful mostly for debugging and pretty printing.
+    """
+    res = {}
+    for (k, v) in self.__dict__.items():
+      if v == None or v == False or v == [] or v == {}:
+        # Skip empty/false members.
+        continue
+      elif isinstance(v, IDLDictNode) and not len(v):
+        # Skip empty dict sub-nodes.
+        continue
+      elif isinstance(v, list):
+        # Convert lists:
+        new_v = []
+        for sub_node in v:
+          if isinstance(sub_node, IDLNode):
+            # Convert sub-node:
+            new_v.append(sub_node.to_dict())
+          else:
+            new_v.append(sub_node)
+        v = new_v
+      elif isinstance(v, IDLNode):
+        # Convert sub-node:
+        v = v.to_dict()
+      res[k] = v
+    return res
+
+  def _find_all(self, ast, label, max_results=sys.maxint):
+    """Searches the AST for tuples with a given label. The PegParser
+    output is composed of lists and tuples, where the tuple 1st argument
+    is a label. If ast root is a list, will search recursively inside each
+    member in the list.
+
+    Args:
+      ast -- the AST to search.
+      label -- the label to look for.
+      res -- results are put into this list.
+      max_results -- maximum number of results.
+    """
+    res = []
+    if max_results <= 0:
+      return res
+
+    if isinstance(ast, list):
+      for childAst in ast:
+        sub_res = self._find_all(childAst, label,
+                     max_results - len(res))
+        res.extend(sub_res)
+    elif isinstance(ast, tuple):
+      (nodeLabel, value) = ast
+      if nodeLabel == label:
+        res.append(value)
+    return res
+
+  def _find_first(self, ast, label):
+    """Convenience method for _find_all(..., max_results=1).
+    Returns a single element instead of a list, or None if nothing
+    is found."""
+    res = self._find_all(ast, label, max_results=1)
+    if len(res):
+      return res[0]
+    return None
+
+  def _has(self, ast, label):
+    """Returns true if an element with the given label is
+    in the AST by searching for it."""
+    return len(self._find_all(ast, label, max_results=1)) == 1
+
+  def _convert_all(self, ast, label, idlnode_ctor):
+    """Converts AST elements into IDLNode elements.
+    Uses _find_all to find elements with a given label and converts
+    them into IDLNodes with a given constructor.
+    Returns:
+      A list of the converted nodes.
+    Args:
+      ast -- the ast element to start a search at.
+      label -- the element label to look for.
+      idlnode_ctor -- a constructor function of one of the IDLNode
+        sub-classes.
+    """
+    res = []
+    found = self._find_all(ast, label)
+    if not found:
+      return res
+    if not isinstance(found, list):
+      raise RuntimeError("Expected list but %s found" % type(found))
+    for childAst in found:
+      converted = idlnode_ctor(childAst)
+      res.append(converted)
+    return res
+
+  def _convert_first(self, ast, label, idlnode_ctor):
+    """Like _convert_all, but only converts the first found results."""
+    childAst = self._find_first(ast, label)
+    if not childAst:
+      return None
+    return idlnode_ctor(childAst)
+
+  def _convert_ext_attrs(self, ast):
+    """Helper method for uniform conversion of extended attributes."""
+    self.ext_attrs = IDLExtAttrs(ast)
+
+  def _convert_annotations(self, ast):
+    """Helper method for uniform conversion of annotations."""
+    self.annotations = IDLAnnotations(ast)
+
+
+class IDLDictNode(IDLNode):
+  """Base class for dictionary-like IDL nodes such as extended attributes
+  and annotations. The base class implements various dict interfaces."""
+
+  def __init__(self, ast):
+    IDLNode.__init__(self, None)
+    if ast is not None and isinstance(ast, dict):
+      self.__map = ast
+    else:
+      self.__map = {}
+
+  def __len__(self):
+    return len(self.__map)
+
+  def __getitem__(self, key):
+    return self.__map[key]
+
+  def __setitem__(self, key, value):
+    self.__map[key] = value
+
+  def __delitem__(self, key):
+    del self.__map[key]
+
+  def __contains__(self, key):
+    return key in self.__map
+
+  def __iter__(self):
+    return self.__map.__iter__()
+
+  def get(self, key, default=None):
+    return self.__map.get(key, default)
+
+  def items(self):
+    return self.__map.items()
+
+  def keys(self):
+    return self.__map.keys()
+
+  def values(self):
+    return self.__map.values()
+
+  def clear(self):
+    self.__map = {}
+
+  def to_dict(self):
+    """Overrides the default IDLNode.to_dict behavior.
+    The IDLDictNode members are copied into a new dictionary, and
+    IDLNode members are recursively converted into dicts as well.
+    """
+    res = {}
+    for (k, v) in self.__map.items():
+      if isinstance(v, IDLNode):
+        v = v.to_dict()
+      res[k] = v
+    return res
+
+  def _all_subnodes(self):
+    # Usually an IDLDictNode does not contain further IDLNodes.
+    return []
+
+
+class IDLFile(IDLNode):
+  """IDLFile is the top-level node in each IDL file. It may contain
+  modules or interfaces."""
+
+  def __init__(self, ast, filename=None):
+    IDLNode.__init__(self, ast)
+    self.filename = filename
+    self.modules = self._convert_all(ast, 'Module', IDLModule)
+    self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
+
+
+class IDLModule(IDLNode):
+  """IDLModule has an id, and may contain interfaces, type defs and
+  implements statements."""
+  def __init__(self, ast):
+    IDLNode.__init__(self, ast)
+    self._convert_ext_attrs(ast)
+    self._convert_annotations(ast)
+    self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
+    self.typeDefs = self._convert_all(ast, 'TypeDef', IDLTypeDef)
+    self.implementsStatements = self._convert_all(ast, 'ImplStmt',
+      IDLImplementsStatement)
+
+
+class IDLExtAttrs(IDLDictNode):
+  """IDLExtAttrs is an IDLDictNode that stores IDL Extended Attributes.
+  Modules, interfaces, members and arguments can all own IDLExtAttrs."""
+  def __init__(self, ast=None):
+    IDLDictNode.__init__(self, None)
+    if not ast:
+      return
+    ext_attrs_ast = self._find_first(ast, 'ExtAttrs')
+    if not ext_attrs_ast:
+      return
+    for ext_attr in self._find_all(ext_attrs_ast, 'ExtAttr'):
+      name = self._find_first(ext_attr, 'Id')
+      value = self._find_first(ext_attr, 'ExtAttrValue')
+
+      func_value = self._find_first(value, 'ExtAttrFunctionValue')
+      if func_value:
+        # E.g. NamedConstructor=Audio(in [Optional] DOMString src)
+        self[name] = IDLExtAttrFunctionValue(
+            func_value,
+            self._find_first(func_value, 'ExtAttrArgList'))
+        continue
+
+      ctor_args = not value and self._find_first(ext_attr, 'ExtAttrArgList')
+      if ctor_args:
+        # E.g. Constructor(Element host)
+        self[name] = IDLExtAttrFunctionValue(None, ctor_args)
+        continue
+
+      self[name] = value
+
+  def _all_subnodes(self):
+    # Extended attributes may contain IDLNodes, e.g. IDLExtAttrFunctionValue
+    return self.values()
+
+
+class IDLExtAttrFunctionValue(IDLNode):
+  """IDLExtAttrFunctionValue."""
+  def __init__(self, func_value_ast, arg_list_ast):
+    IDLNode.__init__(self, func_value_ast)
+    self.arguments = self._convert_all(arg_list_ast, 'Argument', IDLArgument)
+
+
+class IDLType(IDLNode):
+  """IDLType is used to describe constants, attributes and operations'
+  return and input types. IDLType matches AST labels such as ScopedName,
+  StringType, VoidType, IntegerType, etc."""
+
+  def __init__(self, ast):
+    IDLNode.__init__(self, ast)
+    # Search for a 'ScopedName' or any label ending with 'Type'.
+    if isinstance(ast, list):
+      self.id = self._find_first(ast, 'ScopedName')
+      if not self.id:
+        # FIXME: use regexp search instead
+        for childAst in ast:
+          (label, childAst) = childAst
+          if label.endswith('Type'):
+            self.id = self._label_to_type(label, ast)
+            break
+    elif isinstance(ast, tuple):
+      (label, value) = ast
+      if label == 'ScopedName':
+        self.id = value
+      else:
+        self.id = self._label_to_type(label, ast)
+    elif isinstance(ast, str):
+      self.id = ast
+    if not self.id:
+      raise SyntaxError('Could not parse type %s' % (ast))
+
+  def _label_to_type(self, label, ast):
+    if label == 'AnyArrayType':
+      return 'any[]'
+    if label == 'DOMStringArrayType':
+      return 'DOMString[]'
+    if label == 'LongLongType':
+      label = 'long long'
+    elif label.endswith('Type'):
+      # Omit 'Type' suffix and lowercase the rest.
+      label = '%s%s' % (label[0].lower(), label[1:-4])
+
+    # Add unsigned qualifier.
+    if self._has(ast, 'Unsigned'):
+      label = 'unsigned %s' % label
+    return label
+
+
+class IDLTypeDef(IDLNode):
+  """IDLNode for 'typedef [type] [id]' declarations."""
+  def __init__(self, ast):
+    IDLNode.__init__(self, ast)
+    self._convert_annotations(ast)
+    self.type = self._convert_first(ast, 'Type', IDLType)
+
+
+class IDLInterface(IDLNode):
+  """IDLInterface node contains operations, attributes, constants,
+  as well as parent references."""
+
+  def __init__(self, ast):
+    IDLNode.__init__(self, ast)
+    self._convert_ext_attrs(ast)
+    self._convert_annotations(ast)
+    self.parents = self._convert_all(ast, 'ParentInterface',
+      IDLParentInterface)
+    self.javascript_binding_name = self.id
+    self.doc_js_name = self.id
+    self.operations = self._convert_all(ast, 'Operation', 
+      lambda ast: IDLOperation(ast, self.doc_js_name))
+    self.attributes = self._convert_all(ast, 'Attribute',
+      lambda ast: IDLAttribute(ast, self.doc_js_name))
+    self.constants = self._convert_all(ast, 'Const',
+      lambda ast: IDLConstant(ast, self.doc_js_name))
+    self.is_supplemental = 'Supplemental' in self.ext_attrs
+    self.is_no_interface_object = 'NoInterfaceObject' in self.ext_attrs
+    self.is_fc_suppressed = 'Suppressed' in self.ext_attrs
+
+  def has_attribute(self, candidate):
+    for attribute in self.attributes:
+      if (attribute.id == candidate.id and
+          attribute.is_fc_getter == candidate.is_fc_getter and
+          attribute.is_fc_setter == candidate.is_fc_setter):
+        return True
+    return False
+
+
+class IDLParentInterface(IDLNode):
+  """This IDLNode specialization is for 'Interface Child : Parent {}'
+  declarations."""
+  def __init__(self, ast):
+    IDLNode.__init__(self, ast)
+    self._convert_annotations(ast)
+    self.type = self._convert_first(ast, 'InterfaceType', IDLType)
+
+
+class IDLMember(IDLNode):
+  """A base class for constants, attributes and operations."""
+
+  def __init__(self, ast, doc_js_interface_name):
+    IDLNode.__init__(self, ast)
+    self.type = self._convert_first(ast, 'Type', IDLType)
+    self._convert_ext_attrs(ast)
+    self._convert_annotations(ast)
+    self.doc_js_interface_name = doc_js_interface_name
+    self.is_fc_suppressed = 'Suppressed' in self.ext_attrs
+    self.is_static = self._has(ast, 'Static')
+
+
+class IDLOperation(IDLMember):
+  """IDLNode specialization for 'type name(args)' declarations."""
+  def __init__(self, ast, doc_js_interface_name):
+    IDLMember.__init__(self, ast, doc_js_interface_name)
+    self.type = self._convert_first(ast, 'ReturnType', IDLType)
+    self.arguments = self._convert_all(ast, 'Argument', IDLArgument)
+    self.raises = self._convert_first(ast, 'Raises', IDLType)
+    self.specials = self._find_all(ast, 'Special')
+    self.is_stringifier = self._has(ast, 'Stringifier')
+  def _extra_repr(self):
+    return [self.arguments]
+
+
+class IDLAttribute(IDLMember):
+  """IDLNode specialization for 'attribute type name' declarations."""
+  def __init__(self, ast, doc_js_interface_name):
+    IDLMember.__init__(self, ast, doc_js_interface_name)
+    self.is_read_only = self._has(ast, 'ReadOnly')
+    # There are various ways to define exceptions for attributes:
+    self.raises = self._convert_first(ast, 'Raises', IDLType)
+    self.get_raises = self.raises \
+      or self._convert_first(ast, 'GetRaises', IDLType)
+    self.set_raises = self.raises \
+      or self._convert_first(ast, 'SetRaises', IDLType)
+    # FremontCut IDL syntax defines getters and setters separately:
+    self.is_fc_getter = self._has(ast, 'AttrGetter')
+    self.is_fc_setter = self._has(ast, 'AttrSetter')
+  def _extra_repr(self):
+    extra = []
+    if self.is_fc_getter: extra.append('get')
+    if self.is_fc_setter: extra.append('set')
+    if self.is_read_only: extra.append('readonly')
+    if self.raises: extra.append('raises')
+    return extra
+
+class IDLConstant(IDLMember):
+  """IDLNode specialization for 'const type name = value' declarations."""
+  def __init__(self, ast, doc_js_interface_name):
+    IDLMember.__init__(self, ast, doc_js_interface_name)
+    self.value = self._find_first(ast, 'ConstExpr')
+
+
+class IDLArgument(IDLNode):
+  """IDLNode specialization for operation arguments."""
+  def __init__(self, ast):
+    IDLNode.__init__(self, ast)
+    self.type = self._convert_first(ast, 'Type', IDLType)
+    self._convert_ext_attrs(ast)
+    # WebKit and Web IDL differ in how Optional is declared:
+    self.is_optional = self._has(ast, 'Optional') \
+      or ('Optional' in self.ext_attrs)
+
+
+class IDLImplementsStatement(IDLNode):
+  """IDLNode specialization for 'X implements Y' declarations."""
+  def __init__(self, ast):
+    IDLNode.__init__(self, ast)
+    self.implementor = self._convert_first(ast, 'ImplStmtImplementor',
+      IDLType)
+    self.implemented = self._convert_first(ast, 'ImplStmtImplemented',
+      IDLType)
+
+
+class IDLAnnotations(IDLDictNode):
+  """IDLDictNode specialization for a list of FremontCut annotations."""
+  def __init__(self, ast=None):
+    IDLDictNode.__init__(self, ast)
+    self.id = None
+    if not ast:
+      return
+    for annotation in self._find_all(ast, 'Annotation'):
+      name = self._find_first(annotation, 'Id')
+      value = IDLAnnotation(annotation)
+      self[name] = value
+
+
+class IDLAnnotation(IDLDictNode):
+  """IDLDictNode specialization for one annotation."""
+  def __init__(self, ast=None):
+    IDLDictNode.__init__(self, ast)
+    self.id = None
+    if not ast:
+      return
+    for arg in self._find_all(ast, 'AnnotationArg'):
+      name = self._find_first(arg, 'Id')
+      value = self._find_first(arg, 'AnnotationArgValue')
+      self[name] = value
diff --git a/elemental/idl/scripts/idlnode_test.py b/elemental/idl/scripts/idlnode_test.py
new file mode 100755
index 0000000..1230de3
--- /dev/null
+++ b/elemental/idl/scripts/idlnode_test.py
@@ -0,0 +1,147 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import idlnode
+import idlparser
+import logging.config
+import sys
+import unittest
+
+
+class IDLNodeTestCase(unittest.TestCase):
+
+  def _run_test(self, syntax, content, expected):
+    """Utility run tests and prints extra contextual information.
+
+    Args:
+      syntax -- IDL grammar to use (either idlparser.WEBKIT_SYNTAX,
+        WEBIDL_SYNTAX or FREMONTCUT_SYNTAX). If None, will run
+        multiple tests, each with a different syntax.
+      content -- input text for the parser.
+      expected -- expected parse result.
+    """
+    if syntax is None:
+      self._run_test(idlparser.WEBIDL_SYNTAX, content, expected)
+      self._run_test(idlparser.WEBKIT_SYNTAX, content, expected)
+      self._run_test(idlparser.FREMONTCUT_SYNTAX, content, expected)
+      return
+
+    actual = None
+    error = None
+    ast = None
+    parseResult = None
+    try:
+      parser = idlparser.IDLParser(syntax)
+      ast = parser.parse(content)
+      node = idlnode.IDLFile(ast)
+      actual = node.to_dict() if node else None
+    except SyntaxError, e:
+      error = e
+      pass
+    if actual == expected:
+      return
+    else:
+      msg = '''
+SYNTAX  : %s
+CONTENT :
+%s
+EXPECTED:
+%s
+ACTUAL  :
+%s
+ERROR   : %s
+AST   :
+%s
+      ''' % (syntax, content, expected, actual, error, ast)
+      self.fail(msg)
+
+  def test_empty_module(self):
+    self._run_test(
+      None,
+      'module TestModule {};',
+      {'modules': [{'id': 'TestModule'}]})
+
+  def test_empty_interface(self):
+    self._run_test(
+      None,
+      'module TestModule { interface Interface1 {}; };',
+      {'modules': [{'interfaces': [{'javascript_binding_name': 'Interface1', 'doc_js_name': 'Interface1', 'id': 'Interface1'}], 'id': 'TestModule'}]})
+
+  def test_gcc_preprocessor(self):
+    self._run_test(
+      idlparser.WEBKIT_SYNTAX,
+      '#if 1\nmodule TestModule {};\n#endif\n',
+      {'modules': [{'id': 'TestModule'}]})
+
+  def test_extended_attributes(self):
+    self._run_test(
+      idlparser.WEBKIT_SYNTAX,
+      'module M { interface [ExAt1, ExAt2] I {};};',
+      {'modules': [{'interfaces': [{'javascript_binding_name': 'I', 'doc_js_name': 'I', 'ext_attrs': {'ExAt1': None, 'ExAt2': None}, 'id': 'I'}], 'id': 'M'}]})
+
+  def test_implements_statement(self):
+    self._run_test(
+      idlparser.WEBIDL_SYNTAX,
+      'module M { X implements Y; };',
+      {'modules': [{'implementsStatements': [{'implementor': {'id': 'X'}, 'implemented': {'id': 'Y'}}], 'id': 'M'}]})
+
+  def test_attributes(self):
+    self._run_test(
+      idlparser.WEBIDL_SYNTAX,
+      '''interface I {
+        attribute long a1;
+        readonly attribute DOMString a2;
+        attribute any a3;
+      };''',
+      {'interfaces': [{'javascript_binding_name': 'I', 'attributes': [{'type': {'id': 'long'}, 'id': 'a1', 'doc_js_interface_name': 'I'}, {'type': {'id': 'DOMString'}, 'is_read_only': True, 'id': 'a2', 'doc_js_interface_name': 'I'}, {'type': {'id': 'any'}, 'id': 'a3', 'doc_js_interface_name': 'I'}], 'id': 'I', 'doc_js_name': 'I'}]})
+
+  def test_operations(self):
+    self._run_test(
+      idlparser.WEBIDL_SYNTAX,
+      '''interface I {
+        [ExAttr] t1 op1();
+        t2 op2(in int arg1, in long arg2);
+        getter any item(in long index);
+        stringifier name();
+      };''',
+      {'interfaces': [{'operations': [{'doc_js_interface_name': 'I', 'type': {'id': 't1'}, 'ext_attrs': {'ExAttr': None}, 'id': 'op1'}, {'doc_js_interface_name': 'I', 'type': {'id': 't2'}, 'id': 'op2', 'arguments': [{'type': {'id': 'int'}, 'id': 'arg1'}, {'type': {'id': 'long'}, 'id': 'arg2'}]}, {'specials': ['getter'], 'doc_js_interface_name': 'I', 'type': {'id': 'any'}, 'id': 'item', 'arguments': [{'type': {'id': 'long'}, 'id': 'index'}]}, {'is_stringifier': True, 'type': {'id': 'name'}, 'doc_js_interface_name': 'I'}], 'javascript_binding_name': 'I', 'id': 'I', 'doc_js_name': 'I'}]})
+
+  def test_constants(self):
+    self._run_test(
+      None,
+      '''interface I {
+        const long c1 = 0;
+        const long c2 = 1;
+        const long c3 = 0x01;
+        const long c4 = 10;
+        const boolean b1 = false;
+        const boolean b2 = true;
+      };''',
+      {'interfaces': [{'javascript_binding_name': 'I', 'doc_js_name': 'I', 'id': 'I', 'constants': [{'type': {'id': 'long'}, 'id': 'c1', 'value': '0', 'doc_js_interface_name': 'I'}, {'type': {'id': 'long'}, 'id': 'c2', 'value': '1', 'doc_js_interface_name': 'I'}, {'type': {'id': 'long'}, 'id': 'c3', 'value': '0x01', 'doc_js_interface_name': 'I'}, {'type': {'id': 'long'}, 'id': 'c4', 'value': '10', 'doc_js_interface_name': 'I'}, {'type': {'id': 'boolean'}, 'id': 'b1', 'value': 'false', 'doc_js_interface_name': 'I'}, {'type': {'id': 'boolean'}, 'id': 'b2', 'value': 'true', 'doc_js_interface_name': 'I'}]}]})
+
+  def test_annotations(self):
+    self._run_test(
+      idlparser.FREMONTCUT_SYNTAX,
+      '@Ano1 @Ano2() @Ano3(x=1) @Ano4(x,y=2) interface I {};',
+      {'interfaces': [{'javascript_binding_name': 'I', 'doc_js_name': 'I', 'id': 'I', 'annotations': {'Ano4': {'y': '2', 'x': None}, 'Ano1': {}, 'Ano2': {}, 'Ano3': {'x': '1'}}}]})
+    self._run_test(
+      idlparser.FREMONTCUT_SYNTAX,
+      '''interface I : @Ano1 J {
+        @Ano2 attribute int someAttr;
+        @Ano3 void someOp();
+        @Ano3 const int someConst = 0;
+      };''',
+      {'interfaces': [{'operations': [{'annotations': {'Ano3': {}}, 'type': {'id': 'void'}, 'id': 'someOp', 'doc_js_interface_name': 'I'}], 'javascript_binding_name': 'I', 'parents': [{'type': {'id': 'J'}, 'annotations': {'Ano1': {}}}], 'attributes': [{'annotations': {'Ano2': {}}, 'type': {'id': 'int'}, 'id': 'someAttr', 'doc_js_interface_name': 'I'}], 'doc_js_name': 'I', 'id': 'I', 'constants': [{'annotations': {'Ano3': {}}, 'type': {'id': 'int'}, 'id': 'someConst', 'value': '0', 'doc_js_interface_name': 'I'}]}]})
+
+  def test_inheritance(self):
+    self._run_test(
+      None,
+      'interface Shape {}; interface Rectangle : Shape {}; interface Square : Rectangle, Shape {};',
+      {'interfaces': [{'javascript_binding_name': 'Shape', 'doc_js_name': 'Shape', 'id': 'Shape'}, {'javascript_binding_name': 'Rectangle', 'doc_js_name': 'Rectangle', 'parents': [{'type': {'id': 'Shape'}}], 'id': 'Rectangle'}, {'javascript_binding_name': 'Square', 'doc_js_name': 'Square', 'parents': [{'type': {'id': 'Rectangle'}}, {'type': {'id': 'Shape'}}], 'id': 'Square'}]})
+
+if __name__ == "__main__":
+  logging.config.fileConfig("logging.conf")
+  if __name__ == '__main__':
+    unittest.main()
diff --git a/elemental/idl/scripts/idlparser.dart b/elemental/idl/scripts/idlparser.dart
new file mode 100644
index 0000000..d9c5219
--- /dev/null
+++ b/elemental/idl/scripts/idlparser.dart
@@ -0,0 +1,549 @@
+// Copyright (c) 2011, 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.
+
+// IDL grammar variants.
+final int WEBIDL_SYNTAX = 0;
+final int WEBKIT_SYNTAX = 1;
+final int FREMONTCUT_SYNTAX = 2;
+
+/**
+ * IDLFile is the top-level node in each IDL file. It may contain modules or
+ * interfaces.
+ */
+class IDLFile extends IDLNode {
+
+  String filename;
+  List<IDLModule> modules;
+  List<IDLInterface> interfaces;
+
+  IDLFile(this.filename, this.modules, this.interfaces);
+}
+
+/**
+ * IDLModule has an id, and may contain interfaces, type defs andimplements
+ * statements.
+ */
+class IDLModule extends IDLNode {
+  String id;
+  List interfaces;
+  List typedefs;
+  List implementsStatements;
+
+  IDLModule(String this.id, IDLExtAttrs extAttrs, IDLAnnotations annotations,
+            List<IDLNode> elements) {
+    setExtAttrs(extAttrs);
+    this.annotations = annotations;
+    this.interfaces = elements.filter((e) => e is IDLInterface);
+    this.typedefs = elements.filter((e) => e is IDLTypeDef);
+    this.implementsStatements =
+        elements.filter((e) => e is IDLImplementsStatement);
+  }
+
+  toString() => '<IDLModule $id $extAttrs $annotations>';
+}
+
+class IDLNode {
+  IDLExtAttrs extAttrs;
+  IDLAnnotations annotations;
+  IDLNode();
+
+  setExtAttrs(IDLExtAttrs ea) {
+    assert(ea != null);
+    this.extAttrs = ea != null ? ea : new IDLExtAttrs();
+  }
+}
+
+class IDLType extends IDLNode {
+  String id;
+  IDLType parameter;
+  bool nullable = false;
+  IDLType(String this.id, [IDLType this.parameter, bool this.nullable = false]);
+
+  // TODO: Figure out why this constructor was failing in mysterious ways.
+  // IDLType.nullable(IDLType base) {
+  //   return new IDLType(base.id, base.parameter, true);
+  // }
+
+  //String toString() => '<IDLType $nullable $id $parameter>';
+  String toString() {
+    String nullableTag = nullable ? '?' : '';
+    return '<IDLType $id${parameter == null ? '' : ' $parameter'}$nullableTag>';
+  }
+}
+
+class IDLTypeDef extends IDLNode {
+  String id;
+  IDLType type;
+  IDLTypeDef(String this.id, IDLType this.type);
+
+  toString() => '<IDLTypeDef $id $type>';
+}
+
+class IDLImplementsStatement extends IDLNode {
+}
+
+class IDLInterface extends IDLNode {
+  String id;
+  List parents;
+  List operations;
+  List attributes;
+  List constants;
+  List snippets;
+
+  bool isSupplemental;
+  bool isNoInterfaceObject;
+  bool isFcSuppressed;
+
+  IDLInterface(String this.id, IDLExtAttrs ea, IDLAnnotations ann,
+               List this.parents, List members) {
+    setExtAttrs(ea);
+    this.annotations = ann;
+    if (this.parents == null) this.parents = [];
+
+    operations = members.filter((e) => e is IDLOperation);
+    attributes = members.filter((e) => e is IDLAttribute);
+    constants = members.filter((e) => e is IDLConstant);
+    snippets = members.filter((e) => e is IDLSnippet);
+
+    isSupplemental = extAttrs.has('Supplemental');
+    isNoInterfaceObject = extAttrs.has('NoInterfaceObject');
+    isFcSuppressed = extAttrs.has('Suppressed');
+  }
+
+  toString() => '<IDLInterface $id $extAttrs $annotations>';
+}
+
+class IDLMember extends IDLNode {
+  String id;
+  IDLType type;
+  bool isFcSuppressed;
+
+  IDLMember(String this.id, IDLType this.type, IDLExtAttrs ea, IDLAnnotations ann) {
+    setExtAttrs(ea);
+    this.annotations = ann;
+
+    isFcSuppressed = extAttrs.has('Suppressed');
+  }
+}
+
+class IDLOperation extends IDLMember {
+  List arguments;
+
+  // Ignore all forms of raises for now.
+  List specials;
+  bool isStringifier;
+
+  IDLOperation(String id, IDLType type, IDLExtAttrs ea, IDLAnnotations ann,
+               List this.arguments, List this.specials, bool this.isStringifier)
+      : super(id, type, ea, ann) {
+  }
+
+  toString() => '<IDLOperation $type $id ${printList(arguments)}>';
+}
+
+class IDLAttribute extends IDLMember {
+}
+
+class IDLConstant extends IDLMember {
+  var value;
+  IDLConstant(String id, IDLType type, IDLExtAttrs ea, IDLAnnotations ann,
+              var this.value)
+      : super(id, type, ea, ann);
+}
+
+class IDLSnippet extends IDLMember {
+  String text;
+  IDLSnippet(IDLAnnotations ann, String this.text)
+      : super(null, null, new IDLExtAttrs(), ann);
+}
+
+/** Maps string to something. */
+class IDLDictNode {
+  Map<String, Object> map;
+  IDLDictNode() {
+    map = new Map<String, Object>();
+  }
+
+  setMap(List associationList) {
+    if (associationList == null) return;
+    for (var element in associationList) {
+      var name = element[0];
+      var value = element[1];
+      map[name] = value;
+    }
+  }
+
+  bool has(String key) => map.containsKey(key);
+
+  formatMap() {
+    if (map.isEmpty())
+      return '';
+    StringBuffer sb = new StringBuffer();
+    map.forEach((k, v) {
+        sb.add(' $k');
+        if (v != null) {
+          sb.add('=$v');
+        }
+      });
+    return sb.toString();
+  }
+
+}
+
+class IDLExtAttrs extends IDLDictNode {
+  IDLExtAttrs([List attrs = const []]) : super() {
+    setMap(attrs);
+  }
+
+  toString() => '<IDLExtAttrs${formatMap()}>';
+}
+
+class IDLArgument extends IDLNode {
+  String id;
+  IDLType type;
+  bool isOptional;
+  bool isIn;
+  bool hasElipsis;
+  IDLArgument(String this.id, IDLType this.type, IDLExtAttrs extAttrs,
+              bool this.isOptional, bool this.isIn, bool this.hasElipsis) {
+    setExtAttrs(extAttrs);
+  }
+
+  toString() => '<IDLArgument $id>';
+}
+
+class IDLAnnotations extends IDLDictNode {
+  IDLAnnotations(List annotations) : super() {
+    for (var annotation in annotations) {
+      map[annotation.id] = annotation;
+    }
+  }
+
+  toString() => '<IDLAnnotations${formatMap()}>';
+}
+
+class IDLAnnotation extends IDLDictNode {
+  String id;
+  IDLAnnotation(String this.id, List args) : super() {
+    setMap(args);
+  }
+
+  toString() => '<IDLAnnotation $id${formatMap()}>';
+}
+
+class IDLExtAttrFunctionValue extends IDLNode {
+  String name;
+  List arguments;
+  IDLExtAttrFunctionValue(String this.name, this.arguments);
+
+  toString() => '<IDLExtAttrFunctionValue $name(${arguments.length})>';
+}
+
+class IDLParentInterface extends IDLNode {}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class IDLParser {
+  final int syntax;
+  Grammar grammar;
+  var axiom;
+
+  IDLParser([syntax=WEBIDL_SYNTAX]) : syntax = syntax {
+    grammar = new Grammar();
+    axiom = _makeParser();
+  }
+
+  syntax_switch([WebIDL, WebKit, FremontCut]) {
+    assert(WebIDL != null && WebKit != null);  // Not options, just want names.
+    if (syntax == WEBIDL_SYNTAX)
+      return WebIDL;
+    if (syntax == WEBKIT_SYNTAX)
+      return WebKit;
+    if (syntax == FREMONTCUT_SYNTAX)
+      return FremontCut == null ?  WebIDL : FremontCut;
+    throw new Exception('unsupported IDL syntax $syntax');
+  }
+
+  _makeParser() {
+    Grammar g = grammar;
+
+    // TODO: move syntax_switch back to here.
+
+    var idStartCharSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_';
+    var idNextCharSet = idStartCharSet + '0123456789';
+    var hexCharSet = '0123456789ABCDEFabcdef';
+
+    var idStartChar = CHAR(idStartCharSet);
+    var idNextChar = CHAR(idNextCharSet);
+
+    var digit = CHAR('0123456789');
+
+    var Id = TEXT(LEX('an identifier',[idStartChar, MANY(idNextChar, min:0)]));
+
+    var IN = SKIP(LEX("'in'", ['in',NOT(idNextChar)]));
+
+    var BooleanLiteral = OR(['true', 'false']);
+    var IntegerLiteral = TEXT(LEX('hex-literal', OR([['0x', MANY(CHAR(hexCharSet))],
+                                      [MANY(digit)]])));
+    var FloatLiteral = TEXT(LEX('float-literal', [MANY(digit), '.', MANY(digit, min:0)]));
+
+
+    var Argument = g['Argument'];
+    var Module = g['Module'];
+    var Member = g['Member'];
+    var Interface = g['Interface'];
+    var ExceptionDef = g['ExceptionDef'];
+    var Type = g['Type'];
+    var TypeDef = g['TypeDef'];
+    var ImplStmt = g['ImplStmt'];
+    var ValueTypeDef = g['ValueTypeDef'];
+    var Const = g['Const'];
+    var Attribute = g['Attribute'];
+    var Operation = g['Operation'];
+    var Snippet = g['Snippet'];
+    var ExtAttrs = g['ExtAttrs'];
+    var MaybeExtAttrs = g['MaybeExtAttrs'];
+    var MaybeAnnotations = g['MaybeAnnotations'];
+    var ParentInterfaces = g['ParentInterfaces'];
+
+
+    final ScopedName = TEXT(LEX('scoped-name', MANY(CHAR(idStartCharSet + '_:.<>'))));
+
+    final ScopedNames = MANY(ScopedName, separator:',');
+
+    // Types
+
+    final IntegerTypeName = OR([
+        ['byte', () => 'byte'],
+        ['int', () => 'int'],
+        ['long', 'long', () => 'long long'],
+        ['long', () => 'long'],
+        ['octet', () => 'octet'],
+        ['short', () => 'short']]);
+
+    final IntegerType = OR([
+        ['unsigned', IntegerTypeName, (name) => new IDLType('unsigned $name')],
+        [IntegerTypeName, (name) => new IDLType(name)]]);
+
+    final BooleanType = ['boolean', () => new IDLType('boolean')];
+    final OctetType = ['octet', () => new IDLType('octet')];
+    final FloatType = ['float', () => new IDLType('float')];
+    final DoubleType = ['double', () => new IDLType('double')];
+
+    final SequenceType = ['sequence', '<', Type, '>',
+                          (type) => new IDLType('sequence', type)];
+
+    final ScopedNameType = [ScopedName, (name) => new IDLType(name)];
+
+    final NullableType =
+        [OR([IntegerType, BooleanType, OctetType, FloatType,
+             DoubleType, SequenceType, ScopedNameType]),
+         MAYBE('?'),
+         (type, nullable) =>
+             nullable ? new IDLType(type.id, type.parameter, true) : type];
+
+    final VoidType = ['void', () => new IDLType('void')];
+    final AnyType = ['any', () => new IDLType('any')];
+    final ObjectType = ['object', () => new IDLType('object')];
+
+    Type.def = OR([AnyType, ObjectType, NullableType]);
+
+    final ReturnType = OR([VoidType, Type]);
+
+    var Definition = syntax_switch(
+        WebIDL: OR([Module, Interface, ExceptionDef, TypeDef, ImplStmt,
+                    ValueTypeDef, Const]),
+        WebKit: OR([Module, Interface]));
+
+    var Definitions = MANY(Definition, min:0);
+
+    Module.def = syntax_switch(
+        WebIDL: [MaybeExtAttrs, 'module', Id, '{', Definitions, '}',
+                 SKIP(MAYBE(';')),
+                 (ea, id, defs) => new IDLModule(id, ea, null, defs)],
+        WebKit: ['module', MaybeExtAttrs, Id, '{', Definitions, '}',
+                 SKIP(MAYBE(';')),
+                 (ea, id, defs) => new IDLModule(id, ea, null, defs)],
+        FremontCut: [MaybeAnnotations, MaybeExtAttrs, 'module', Id,
+                     '{', Definitions, '}', SKIP(MAYBE(';')),
+                     (ann, ea, id, defs) => new IDLModule(id, ea, ann, defs)]);
+
+    Interface.def = syntax_switch(
+        WebIDL: [MaybeExtAttrs, 'interface', Id, MAYBE(ParentInterfaces),
+                 MAYBE(['{', MANY0(Member), '}']), ';',
+                 (ea, id, p, ms) => new IDLInterface(id, ea, null, p, ms)],
+        WebKit: ['interface', MaybeExtAttrs, Id, MAYBE(ParentInterfaces),
+                 MAYBE(['{', MANY0(Member), '}']), ';',
+                 (ea, id, p, ms) => new IDLInterface(id, ea, null, p, ms)],
+        FremontCut: [MaybeAnnotations, MaybeExtAttrs, 'interface',
+                     Id, MAYBE(ParentInterfaces),
+                     MAYBE(['{', MANY0(Member), '}']), ';',
+                     (ann, ea, id, p, ms) => new IDLInterface(id, ea, ann, p, ms)]);
+
+    Member.def = syntax_switch(
+        WebIDL: OR([Const, Attribute, Operation, ExtAttrs]),
+        WebKit: OR([Const, Attribute, Operation]),
+        FremontCut: OR([Const, Attribute, Operation, Snippet]));
+
+    var InterfaceType = ScopedName;
+
+    var ParentInterface = syntax_switch(
+        WebIDL: [InterfaceType],
+        WebKit: [InterfaceType],
+        FremontCut: [MaybeAnnotations, InterfaceType]);
+
+    ParentInterfaces.def = [':', MANY(ParentInterface, ',')];
+
+    // TypeDef (Web IDL):
+    TypeDef.def = ['typedef', Type, Id, ';', (type, id) => new IDLTypeDef(id, type)];
+
+    // TypeDef (Old-school W3C IDLs)
+    ValueTypeDef.def = ['valuetype', Id, Type, ';'];
+
+    // Implements Statement (Web IDL):
+    var ImplStmtImplementor = ScopedName;
+    var ImplStmtImplemented = ScopedName;
+
+    ImplStmt.def = [ImplStmtImplementor, 'implements', ImplStmtImplemented, ';'];
+
+    var ConstExpr = OR([BooleanLiteral, IntegerLiteral, FloatLiteral]);
+
+    Const.def = syntax_switch(
+        WebIDL: [MaybeExtAttrs, 'const', Type, Id, '=', ConstExpr, ';',
+                 (ea, type, id, v) => new IDLConstant(id, type, ea, null, v)],
+        WebKit: ['const', MaybeExtAttrs, Type, Id, '=', ConstExpr, ';',
+                 (ea, type, id, v) => new IDLConstant(id, type, ea, null, v)],
+        FremontCut: [MaybeAnnotations, MaybeExtAttrs,
+                     'const', Type, Id, '=', ConstExpr, ';',
+                     (ann, ea, type, id, v) =>
+                         new IDLConstant(id, type, ea, ann, v)]);
+
+    // Attributes
+
+    var Stringifier = 'stringifier';
+    var AttrGetter = 'getter';
+    var AttrSetter = 'setter';
+    var ReadOnly = 'readonly';
+    var AttrGetterSetter = OR([AttrGetter, AttrSetter]);
+
+    var GetRaises = syntax_switch(
+        WebIDL: ['getraises', '(', ScopedNames, ')'],
+        WebKit: ['getter', 'raises', '(', ScopedNames, ')']);
+
+    var SetRaises = syntax_switch(
+        WebIDL: ['setraises', '(', ScopedNames, ')'],
+        WebKit: ['setter', 'raises', '(', ScopedNames, ')']);
+
+    var Raises = ['raises', '(', ScopedNames, ')'];
+
+    var AttrRaises = syntax_switch(
+        WebIDL: MANY(OR([GetRaises, SetRaises])),
+        WebKit: MANY(OR([GetRaises, SetRaises, Raises]), separator:','));
+
+    Attribute.def = syntax_switch(
+        WebIDL: [MaybeExtAttrs, MAYBE(Stringifier), MAYBE(ReadOnly),
+                 'attribute', Type, Id, MAYBE(AttrRaises), ';'],
+        WebKit: [MAYBE(Stringifier), MAYBE(ReadOnly), 'attribute',
+                 MaybeExtAttrs, Type, Id, MAYBE(AttrRaises), ';'],
+        FremontCut: [MaybeAnnotations, MaybeExtAttrs,
+                     MAYBE(AttrGetterSetter), MAYBE(Stringifier), MAYBE(ReadOnly),
+                     'attribute', Type, Id, MAYBE(AttrRaises), ';'
+                     ]);
+
+    // Operations
+
+    final Special = TEXT(OR(['getter', 'setter', 'creator', 'deleter', 'caller']));
+    final Specials = MANY(Special);
+
+    final Optional = 'optional';
+    final AnEllipsis = '...';
+
+    Argument.def = syntax_switch(
+        WebIDL: SEQ(MaybeExtAttrs, MAYBE(Optional), MAYBE(IN),
+                    MAYBE(Optional), Type, MAYBE(AnEllipsis), Id,
+                    (e, opt1, isin, opt2, type, el, id) =>
+                        new IDLArgument(id, type, e, opt1 || opt2, isin, el)),
+
+        WebKit: SEQ(MAYBE(Optional), MAYBE('in'), MAYBE(Optional),
+                    MaybeExtAttrs, Type, Id
+                    (opt1, isin, opt2, e, type, id) =>
+                        new IDLArgument(id, type, e, opt1 || opt2, isin, false)));
+
+    final Arguments = MANY0(Argument, ',');
+
+    Operation.def = syntax_switch(
+        WebIDL: [MaybeExtAttrs, MAYBE(Stringifier), MAYBE(Specials),
+                 ReturnType, MAYBE(Id), '(', Arguments, ')', MAYBE(Raises), ';',
+                 (ea, isStringifier, specials, type, id, args, raises) =>
+                     new IDLOperation(id, type, ea, null, args, specials, isStringifier)
+                 ],
+        WebKit: [MaybeExtAttrs, ReturnType, MAYBE(Id), '(', Arguments, ')',
+                 MAYBE(Raises), ';',
+                 (ea, type, id, args, raises) =>
+                     new IDLOperation(id, type, ea, null, args, [], false)
+                 ],
+        FremontCut: [MaybeAnnotations, MaybeExtAttrs, MAYBE(Stringifier),
+                     MAYBE(Specials), ReturnType, MAYBE(Id), '(', Arguments, ')',
+                     MAYBE(Raises), ';',
+                     (ann, ea, isStringifier, specials, type, id, args, raises) =>
+                       new IDLOperation(id, type, ea, ann, args, specials, isStringifier)
+                     ]);
+
+    // Exceptions
+
+    final ExceptionField = [Type, Id, ';'];
+    final ExceptionMember = OR([Const, ExceptionField, ExtAttrs]);
+    ExceptionDef.def = ['exception', Id, '{', MANY0(ExceptionMember), '}', ';'];
+
+    // ExtendedAttributes
+
+    var ExtAttrArgList = ['(', MANY0(Argument, ','), ')'];
+
+    var ExtAttrFunctionValue =
+        [Id, '(', MANY0(Argument, ','), ')',
+         (name, args) => new IDLExtAttrFunctionValue(name, args)
+         ];
+
+    var ExtAttrValue = OR([ExtAttrFunctionValue,
+                           TEXT(LEX('value', MANY(CHAR(idNextCharSet + '&:-|'))))]);
+
+    var ExtAttr = [Id, MAYBE(OR([['=', ExtAttrValue], ExtAttrArgList]))];
+
+    ExtAttrs.def = ['[', MANY(ExtAttr, ','), ']',
+                    (list) => new IDLExtAttrs(list)];;
+
+    MaybeExtAttrs.def = OR(ExtAttrs,
+                           [ () => new IDLExtAttrs() ] );
+
+    // Annotations - used in the FremontCut IDL grammar.
+
+    var AnnotationArgValue = TEXT(LEX('xx', MANY(CHAR(idNextCharSet + '&:-|'))));
+
+    var AnnotationArg = [Id, MAYBE(['=', AnnotationArgValue])];
+
+    var AnnotationBody = ['(', MANY0(AnnotationArg, ','), ')'];
+
+    var Annotation = ['@', Id, MAYBE(AnnotationBody),
+                      (id, body) => new IDLAnnotation(id, body)];
+
+    MaybeAnnotations.def = [MANY0(Annotation), (list) => new IDLAnnotations(list)];
+
+    // Snippets - used in the FremontCut IDL grammar.
+
+    final SnippetText = TEXT(LEX('snippet body', MANY0([NOT('}'), CHAR()])));
+    Snippet.def = [MaybeAnnotations, 'snippet', '{', SnippetText, '}', ';',
+                   (ann, text) => new IDLSnippet(ann, text)];
+
+
+    grammar.whitespace =
+        OR([MANY(CHAR(' \t\r\n')),
+            ['//', MANY0([NOT(CHAR('\r\n')), CHAR()])],
+            ['#', MANY0([NOT(CHAR('\r\n')), CHAR()])],
+            ['/*', MANY0([NOT('*/'), CHAR()]), '*/']]);
+
+    // Top level - at least one definition.
+    return MANY(Definition);
+
+  }
+}
diff --git a/elemental/idl/scripts/idlparser.py b/elemental/idl/scripts/idlparser.py
new file mode 100755
index 0000000..c2470c0
--- /dev/null
+++ b/elemental/idl/scripts/idlparser.py
@@ -0,0 +1,442 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import re
+import subprocess
+import tempfile
+
+from pegparser import *
+
+# IDL grammar variants.
+WEBIDL_SYNTAX = 0
+WEBKIT_SYNTAX = 1
+FREMONTCUT_SYNTAX = 2
+
+
+class IDLParser(object):
+  """IDLParser is a PEG based IDL files parser."""
+
+  def __init__(self, syntax=WEBIDL_SYNTAX):
+    """Constructor.
+
+    Initializes the IDLParser by defining the grammar and initializing
+    a PEGParserinstance.
+
+    Args:
+      syntax -- supports either WEBIDL_SYNTAX (0) or WEBKIT_SYNTAX (1)
+    """
+    self._syntax = syntax
+    self._pegparser = PegParser(self._idl_grammar(),
+      self._whitespace_grammar(),
+      strings_are_tokens=True)
+
+  def _idl_grammar(self):
+    """Returns the PEG grammar for IDL parsing."""
+
+    # utilities:
+    def syntax_switch(w3c_syntax, webkit_syntax, fremontcut_syntax=None):
+      """Returns w3c_syntax or web_syntax, depending on the current
+      configuration.
+      """
+      if self._syntax == WEBIDL_SYNTAX:
+        return w3c_syntax
+      elif self._syntax == WEBKIT_SYNTAX:
+        return webkit_syntax
+      elif self._syntax == FREMONTCUT_SYNTAX:
+        if fremontcut_syntax is not None:
+          return fremontcut_syntax
+        return w3c_syntax
+      else:
+        raise RuntimeError('unsupported IDL syntax %s' % syntax)
+
+    # The following grammar is based on the Web IDL's LL(1) grammar
+    # (specified in: http://dev.w3.org/2006/webapi/WebIDL/#idl-grammar).
+    # It is adjusted to PEG grammar, as well as to also support
+    # WebKit IDL and FremontCut grammar.
+
+    ###################### BEGIN GRAMMAR #####################
+
+    def Id():
+      return re.compile(r'[\w\_]+')
+
+    def _Definitions():
+      return MAYBE(MANY(_Definition))
+
+    def _Definition():
+      return syntax_switch(
+        # Web IDL:
+        OR(Module, Interface, ExceptionDef, TypeDef, ImplStmt,
+           ValueTypeDef, Const),
+        # WebKit:
+        OR(Module, Interface))
+
+    def Module():
+      return syntax_switch(
+        # Web IDL:
+        [MAYBE(ExtAttrs), 'module', Id, '{', _Definitions, '}',
+         MAYBE(';')],
+        # WebKit:
+        ['module', MAYBE(ExtAttrs), Id, '{', _Definitions, '}',
+         MAYBE(';')],
+        # FremontCut:
+        [MAYBE(_Annotations), MAYBE(ExtAttrs), 'module', Id,
+         '{', _Definitions, '}', MAYBE(';')])
+
+    def Interface():
+      return syntax_switch(
+        # Web IDL:
+        [MAYBE(ExtAttrs), 'interface', Id, MAYBE(_ParentInterfaces),
+         MAYBE(['{', MAYBE(MANY(_Member)), '}']), ';'],
+        # WebKit:
+        [OR('interface', 'exception'), MAYBE(ExtAttrs), Id, MAYBE(_ParentInterfaces),
+         MAYBE(['{', MAYBE(MANY(_Member)), '}']), MAYBE(';')],
+        # FremontCut:
+        [MAYBE(_Annotations), MAYBE(ExtAttrs), 'interface',
+         Id, MAYBE(_ParentInterfaces), MAYBE(['{', MAYBE(MANY(_Member)),
+         '}']), ';'])
+
+    def _Member():
+      return syntax_switch(
+        # Web IDL:
+        OR(Const, Attribute, Operation, ExtAttrs),
+        # WebKit:
+        OR(Const, Attribute, Operation),
+        # FremontCut:
+        OR(Const, Attribute, Operation))
+
+    # Interface inheritance:
+    def _ParentInterfaces():
+      return [':', MANY(ParentInterface, separator=',')]
+
+    def ParentInterface():
+      return syntax_switch(
+        # Web IDL:
+        [InterfaceType],
+        # WebKit:
+        [InterfaceType],
+        # FremontCut:
+        [MAYBE(_Annotations), InterfaceType])
+
+    # TypeDef (Web IDL):
+    def TypeDef():
+      return ['typedef', Type, Id, ';']
+
+    # TypeDef (Old-school W3C IDLs)
+    def ValueTypeDef():
+      return ['valuetype', Id, Type, ';']
+
+    # Implements Statement (Web IDL):
+    def ImplStmt():
+      return [ImplStmtImplementor, 'implements', ImplStmtImplemented,
+          ';']
+
+    def ImplStmtImplementor():
+      return ScopedName
+
+    def ImplStmtImplemented():
+      return ScopedName
+
+    # Constants:
+    def Const():
+      return syntax_switch(
+        # Web IDL:
+        [MAYBE(ExtAttrs), 'const', Type, Id, '=', ConstExpr, ';'],
+        # WebKit:
+        [MAYBE(ExtAttrs), 'const', Type, Id, '=', ConstExpr, ';'],
+        # FremontCut:
+        [MAYBE(_Annotations), MAYBE(ExtAttrs), 'const', Type, Id, '=',
+         ConstExpr, ';'])
+
+    def ConstExpr():
+      return OR(_BooleanLiteral,
+            _IntegerLiteral,
+            _FloatLiteral)
+
+    def _BooleanLiteral():
+      return re.compile(r'true|false')
+
+    def _IntegerLiteral():
+      return OR(re.compile(r'(0x)?[0-9ABCDEF]+'),
+            re.compile(r'[0-9]+'))
+
+    def _FloatLiteral():
+      return re.compile(r'[0-9]+\.[0-9]*')
+
+    # Attributes:
+    def Attribute():
+      return syntax_switch(
+        # Web IDL:
+        [MAYBE(ExtAttrs), MAYBE(Stringifier), MAYBE(ReadOnly),
+         'attribute', Type, Id, MAYBE(_AttrRaises), ';'],
+        # WebKit:
+        [MAYBE(Stringifier), MAYBE(ReadOnly), 'attribute',
+         MAYBE(ExtAttrs), Type, Id, MAYBE(_AttrRaises), ';'],
+        # FremontCut:
+        [MAYBE(_Annotations), MAYBE(ExtAttrs),
+         MAYBE(_AttrGetterSetter), MAYBE(Stringifier), MAYBE(ReadOnly),
+         'attribute', Type, Id, MAYBE(_AttrRaises), ';'])
+
+    def _AttrRaises():
+      return syntax_switch(
+        # Web IDL:
+        MANY(OR(GetRaises, SetRaises)),
+        # WebKit:
+        MANY(OR(GetRaises, SetRaises, Raises), separator=','))
+
+    # Special fremontcut feature:
+    def _AttrGetterSetter():
+      return OR(AttrGetter, AttrSetter)
+
+    def AttrGetter():
+      return 'getter'
+
+    def AttrSetter():
+      return 'setter'
+
+    def ReadOnly():
+      return 'readonly'
+
+    def GetRaises():
+      return syntax_switch(
+        # Web IDL:
+        ['getraises', '(', _ScopedNames, ')'],
+        # WebKit:
+        ['getter', 'raises', '(', _ScopedNames, ')'])
+
+    def SetRaises():
+      return syntax_switch(
+        # Web IDL:
+        ['setraises', '(', _ScopedNames, ')'],
+        # WebKit:
+        ['setter', 'raises', '(', _ScopedNames, ')'])
+
+    # Operation:
+    def Operation():
+      return syntax_switch(
+        # Web IDL:
+        [MAYBE(ExtAttrs), MAYBE(Static), MAYBE(Stringifier), MAYBE(_Specials),
+         ReturnType, MAYBE(Id), '(', _Arguments, ')', MAYBE(Raises),
+         ';'],
+        # WebKit:
+        [MAYBE(ExtAttrs), MAYBE(Static),
+         ReturnType, MAYBE(Id), '(', _Arguments, ')',
+         MAYBE(Raises), ';'],
+        # FremontCut:
+        [MAYBE(_Annotations), MAYBE(ExtAttrs), MAYBE(Static), MAYBE(Stringifier),
+         MAYBE(_Specials), ReturnType, MAYBE(Id), '(', _Arguments, ')',
+         MAYBE(Raises), ';'])
+
+    def Static():
+      return 'static'
+
+    def _Specials():
+      return MANY(Special)
+
+    def Special():
+      return re.compile(r'getter|setter|creator|deleter|caller')
+
+    def Stringifier():
+      return 'stringifier'
+
+    def Raises():
+      return ['raises', '(', _ScopedNames, ')']
+
+    # Operation arguments:
+    def _Arguments():
+      return MAYBE(MANY(Argument, ','))
+
+    def Argument():
+      return syntax_switch(
+        # Web IDL:
+        [MAYBE(ExtAttrs), MAYBE(Optional), MAYBE('in'),
+         MAYBE(Optional), Type, MAYBE(AnEllipsis), Id],
+        # WebKit:
+        [MAYBE(Optional), MAYBE('in'), MAYBE(Optional),
+         MAYBE(ExtAttrs), Type, Id])
+
+    def Optional():
+      return 'optional'
+
+    def AnEllipsis():
+      return '...'
+
+    # Exceptions (Web IDL).
+    def ExceptionDef():
+      return ['exception', Id, '{', MAYBE(MANY(_ExceptionMember)), '}',
+          ';']
+
+    def _ExceptionMember():
+      return OR(Const, ExceptionField, ExtAttrs)
+
+    def ExceptionField():
+      return [Type, Id, ';']
+
+    # Types:
+    def Type():
+      return _Type
+
+    def ReturnType():
+      return OR(VoidType, _Type)
+
+    def InterfaceType():
+      return ScopedName
+
+    def _Type():
+      return OR(AnyArrayType, AnyType, ObjectType, _NullableType)
+
+    def _NullableType():
+      return [OR(_IntegerType, BooleanType, OctetType, FloatType,
+             DoubleType, SequenceType, DOMStringArrayType, ScopedName),
+          MAYBE(Nullable)]
+
+    def Nullable():
+      return '?'
+
+    def SequenceType():
+      return ['sequence', '<', Type, '>']
+
+    def AnyType():
+      return 'any'
+
+    def AnyArrayType():
+      # TODO(sra): Do more general handling of array types.
+      return 'any[]'
+
+    def ObjectType():
+      return re.compile(r'(object|Object)\b')   # both spellings.
+
+    def VoidType():
+      return 'void'
+
+    def _IntegerType():
+      return [MAYBE(Unsigned), OR(ByteType, IntType, LongLongType,
+                    LongType, OctetType, ShortType)]
+
+    def Unsigned():
+      return 'unsigned'
+
+    def ShortType():
+      return 'short'
+
+    def LongLongType():
+      return ['long', 'long']
+
+    def LongType():
+      return 'long'
+
+    def IntType():
+      return 'int'
+
+    def ByteType():
+      return 'byte'
+
+    def OctetType():
+      return 'octet'
+
+    def BooleanType():
+      return 'boolean'
+
+    def FloatType():
+      return 'float'
+
+    def DoubleType():
+      return 'double'
+
+    def _ScopedNames():
+      return MANY(ScopedName, separator=',')
+
+    def ScopedName():
+      return re.compile(r'[\w\_\:\.\<\>]+')
+
+    def DOMStringArrayType():
+      return 'DOMString[]'
+
+    # Extended Attributes:
+    def ExtAttrs():
+      return ['[', MAYBE(MANY(ExtAttr, ',')), ']']
+
+    def ExtAttr():
+      return [Id, MAYBE(OR(['=', ExtAttrValue], ExtAttrArgList))]
+
+    def ExtAttrValue():
+      return OR(ExtAttrFunctionValue, re.compile(r'[\w&0-9:\-\|]+'))
+
+    def ExtAttrFunctionValue():
+      return [Id, ExtAttrArgList]
+
+    def ExtAttrArgList():
+      return ['(', MAYBE(MANY(Argument, ',')), ')']
+
+    # Annotations - used in the FremontCut IDL grammar:
+    def _Annotations():
+      return MANY(Annotation)
+
+    def Annotation():
+      return ['@', Id, MAYBE(_AnnotationBody)]
+
+    def _AnnotationBody():
+      return ['(', MAYBE(MANY(AnnotationArg, ',')), ')']
+
+    def AnnotationArg():
+      return [Id, MAYBE(['=', AnnotationArgValue])]
+
+    def AnnotationArgValue():
+      return re.compile(r'[\w&0-9:/\-\.]+')
+
+    ###################### END GRAMMAR #####################
+
+    # Return the grammar's root rule:
+    return MANY(_Definition)
+
+  def _whitespace_grammar(self):
+    return OR(re.compile(r'\s+'),
+          re.compile(r'//.*'),
+          re.compile(r'#.*'),
+          re.compile(r'/\*.*?\*/', re.S))
+
+  def _pre_process(self, content, defines, includePaths):
+    """Pre-processes the content using gcc.
+
+    WebKit IDLs require pre-processing by gcc. This is done by invoking
+    gcc in a sub-process and capturing the results.
+
+    Returns:
+      The result of running gcc on the content.
+
+    Args:
+      content -- text to process.
+      defines -- an array of pre-processor defines.
+      includePaths -- an array of path strings.
+    """
+    # FIXME: Handle gcc not found, or any other processing errors
+    gcc = 'gcc'
+    cmd = [gcc, '-E', '-P', '-C', '-x', 'c++'];
+    for define in defines:
+      cmd.append('-D%s' % define)
+    cmd.append('-')
+    pipe = subprocess.Popen(cmd, stdin=subprocess.PIPE,
+      stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    (content, stderr) = pipe.communicate(content)
+    return content
+
+  def parse(self, content, defines=[], includePaths=[]):
+    """Parse the give content string.
+
+    The WebKit IDL syntax also allows gcc pre-processing instructions.
+    Lists of defined variables and include paths can be provided.
+
+    Returns:
+      An abstract syntax tree (AST).
+
+    Args:
+      content -- text to parse.
+      defines -- an array of pre-processor defines.
+      includePaths -- an array of path strings used by the
+        gcc pre-processor.
+    """
+    if self._syntax == WEBKIT_SYNTAX:
+      content = self._pre_process(content, defines, includePaths)
+
+    return self._pegparser.parse(content)
diff --git a/elemental/idl/scripts/idlparser_test.dart b/elemental/idl/scripts/idlparser_test.dart
new file mode 100644
index 0000000..3ef11f3
--- /dev/null
+++ b/elemental/idl/scripts/idlparser_test.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2011, 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.
+
+#library('idlparser_test');
+#import('../../../utils/peg/pegparser.dart');
+#source('idlparser.dart');
+#source('idlrenderer.dart');
+
+main() {
+  IDLParser parser = new IDLParser(FREMONTCUT_SYNTAX);
+  Grammar g = parser.grammar;
+
+  var Type = g['Type'];
+
+  show(g, Type, 'int');
+  show(g, Type, 'int ?');
+  show(g, Type, 'sequence<int?> ?');
+  show(g, Type, 'unsigned long long?');
+  show(g, Type, 'unsignedlonglong?');
+
+
+  var MaybeAnnotations = g['MaybeAnnotations'];
+
+  show(g, MaybeAnnotations, '');
+  show(g, MaybeAnnotations, '@Foo');
+  show(g, MaybeAnnotations, '@Foo @Bar');
+  show(g, MaybeAnnotations, '@Foo(A,B=1) @Bar');
+
+  var MaybeExtAttrs = g['MaybeExtAttrs'];
+  print(MaybeExtAttrs);
+
+  show(g, MaybeExtAttrs, '');
+  show(g, MaybeExtAttrs, '[A]');
+
+  var Module = g['Module'];
+
+  show(g, Module, 'module Harry { const int bob = 30;};');
+  show(g, Module, """
+module Harry { [X,Y,Z=99] const int bob = 30; typedef x y;
+
+  interface Thing : SuperA, @Friendly SuperB {
+
+    [Nice] const unsigned long long kFoo = 12345;
+    [A,B,C,D,E] attribute int attr1;
+    [F=f(int a),K=99,DartName=Bert] int smudge(int a, int b, double x);
+
+    [X,Y,Z] int xyz([U,V] optional in optional int z);
+    [P,Q,R] int pqr();
+    int op1();
+    @Smurf @Beans(B=1,C,A=2) int op2();
+
+    snippet { yadda
+              yadda
+    };
+  };
+
+//[A] const unsigned long long dweeb = 0xff;
+
+};
+""");
+}
+
+
+
+show(grammar, rule, input) {
+  print('show: "$input"');
+  var ast;
+  try {
+    ast = grammar.parse(rule, input);
+  } catch (var exception) {
+    if (exception is ParseError)
+      ast = exception;
+    else
+      throw;
+  }
+  print('${printList(ast)}');
+  print(render(ast));
+}
+
+void check(grammar, rule, input, expected) {
+  // If [expected] is String then the result is coerced to string.
+  // If [expected] is !String, the result is compared directly.
+  print('check: "$input"');
+  var ast;
+  try {
+    ast = grammar.parse(rule, input);
+  } catch (var exception) {
+    ast = exception;
+  }
+
+  var formatted = ast;
+  if (expected is String)
+    formatted = printList(ast);
+
+  Expect.equals(expected, formatted, "parse: $input");
+}
+
+// Prints the list in [1,2,3] notation, including nested lists.
+void printList(item) {
+  if (item is List) {
+    StringBuffer sb = new StringBuffer();
+    sb.add('[');
+    var sep = '';
+    for (var x in item) {
+      sb.add(sep);
+      sb.add(printList(x));
+      sep = ',';
+    }
+    sb.add(']');
+    return sb.toString();
+  }
+  if (item == null)
+    return 'null';
+  return item.toString();
+}
diff --git a/elemental/idl/scripts/idlparser_test.py b/elemental/idl/scripts/idlparser_test.py
new file mode 100755
index 0000000..7155da7
--- /dev/null
+++ b/elemental/idl/scripts/idlparser_test.py
@@ -0,0 +1,159 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import idlparser
+import logging.config
+import sys
+import unittest
+
+
+class IDLParserTestCase(unittest.TestCase):
+
+  def _run_test(self, syntax, content, expected):
+    """Utility for running a IDL parsing tests and comparing results.
+
+    Program exits (sys.exit) if expected does not match actual.
+
+    Args:
+      syntax -- IDL grammar to use (either idlparser.WEBKIT_SYNTAX,
+        WEBIDL_SYNTAX or FREMONTCUT_SYNTAX). If None, will run
+        multiple tests, each with a different syntax.
+      content -- input text for the parser.
+      expected -- expected parse result.
+    """
+
+    all_syntaxes = {idlparser.WEBIDL_SYNTAX: 'Web IDL',
+            idlparser.WEBKIT_SYNTAX: 'WebKit',
+            idlparser.FREMONTCUT_SYNTAX: 'FremontCut'}
+
+    if syntax is None:
+      for syntax in all_syntaxes:
+        self._run_test(syntax, content, expected)
+      return
+
+    if syntax not in all_syntaxes:
+      raise RuntimeError('Unexpected syntax %s' % syntax)
+
+    actual = None
+    error = None
+    try:
+      parser = idlparser.IDLParser(syntax)
+      actual = parser.parse(content)
+    except SyntaxError, e:
+      error = e
+      pass
+    if actual != expected:
+      self.fail('''
+SYNTAX  : %s
+CONTENT :
+%s
+EXPECTED:
+%s
+ACTUAL  :
+%s
+ERROR   : %s''' % (all_syntaxes[syntax], content, expected, actual, error))
+
+  def test_empty_module(self):
+    self._run_test(
+      None,
+      'module M {};',
+      [('Module', [('Id', 'M')])])
+
+  def test_empty_interface(self):
+    self._run_test(
+      None,
+      'interface I {};',
+      [('Interface', [('Id', 'I')])])
+
+  def test_module_with_empty_interface(self):
+    self._run_test(
+      None,
+      'module M { interface I {}; };',
+      [('Module', [('Id', 'M'), ('Interface', [('Id', 'I')])])])
+
+  # testing the gcc pre-processing
+  def test_gcc_preprocessing(self):
+    self._run_test(
+      idlparser.WEBKIT_SYNTAX,
+      '''
+      #if 1
+        module M1 {};
+      #endif
+      #if 0
+        module M2 {};
+      #endif
+      ''',
+      [('Module', [('Id', 'M1')])])
+
+  def test_attribute_with_exceptoins(self):
+    self._run_test(
+      idlparser.WEBKIT_SYNTAX,
+      '''interface I {
+        attribute boolean A setter raises (E), getter raises (E);
+      };''',
+      [('Interface', [('Id', 'I'), ('Attribute', [('Type', [('BooleanType', None)]), ('Id', 'A'), ('SetRaises', [('ScopedName', 'E')]), ('GetRaises', [('ScopedName', 'E')])])])])
+
+  def test_interface_with_extended_attributes(self):
+    self._run_test(
+      idlparser.WEBKIT_SYNTAX,
+      'interface [ExAt1, ExAt2] I {};',
+      [('Interface', [('ExtAttrs', [('ExtAttr', [('Id', 'ExAt1')]), ('ExtAttr', [('Id', 'ExAt2')])]), ('Id', 'I')])])
+
+  def test_implements_statement(self):
+    self._run_test(
+      idlparser.WEBIDL_SYNTAX,
+      'X implements Y;',
+      [('ImplStmt', [('ImplStmtImplementor', ('ScopedName', 'X')), ('ImplStmtImplemented', ('ScopedName', 'Y'))])])
+
+  def test_operation(self):
+    self._run_test(
+      None,
+      'interface I { boolean func(); };',
+      [('Interface', [('Id', 'I'), ('Operation', [('ReturnType', [('BooleanType', None)]), ('Id', 'func')])])])
+
+  def test_attribute_types(self):
+    self._run_test(
+      None,
+      '''interface I {
+        attribute boolean boolAttr;
+        attribute DOMString strAttr;
+        attribute SomeType someAttr;
+      };''',
+      [('Interface', [('Id', 'I'), ('Attribute', [('Type', [('BooleanType', None)]), ('Id', 'boolAttr')]), ('Attribute', [('Type', [('ScopedName', 'DOMString')]), ('Id', 'strAttr')]), ('Attribute', [('Type', [('ScopedName', 'SomeType')]), ('Id', 'someAttr')])])])
+
+  def test_constants(self):
+    self._run_test(
+      None,
+      '''interface I {
+        const long c1 = 0;
+        const long c2 = 1;
+        const long c3 = 0x01;
+        const long c4 = 10;
+        const boolean b1 = true;
+        const boolean b1 = false;
+      };''',
+      [('Interface', [('Id', 'I'), ('Const', [('Type', [('LongType', None)]), ('Id', 'c1'), ('ConstExpr', '0')]), ('Const', [('Type', [('LongType', None)]), ('Id', 'c2'), ('ConstExpr', '1')]), ('Const', [('Type', [('LongType', None)]), ('Id', 'c3'), ('ConstExpr', '0x01')]), ('Const', [('Type', [('LongType', None)]), ('Id', 'c4'), ('ConstExpr', '10')]), ('Const', [('Type', [('BooleanType', None)]), ('Id', 'b1'), ('ConstExpr', 'true')]), ('Const', [('Type', [('BooleanType', None)]), ('Id', 'b1'), ('ConstExpr', 'false')])])])
+
+  def test_inheritance(self):
+    self._run_test(
+      None,
+      '''
+      interface Shape {};
+      interface Rectangle : Shape {};
+      interface Square : Rectangle, Shape {};
+      ''',
+      [('Interface', [('Id', 'Shape')]), ('Interface', [('Id', 'Rectangle'), ('ParentInterface', [('InterfaceType', ('ScopedName', 'Shape'))])]), ('Interface', [('Id', 'Square'), ('ParentInterface', [('InterfaceType', ('ScopedName', 'Rectangle'))]), ('ParentInterface', [('InterfaceType', ('ScopedName', 'Shape'))])])])
+
+  def test_annotations(self):
+    self._run_test(
+      idlparser.FREMONTCUT_SYNTAX,
+      '@Ano1 @Ano2() @Ano3(x) @Ano4(x=1,y=2) interface I {};',
+      [('Interface', [('Annotation', [('Id', 'Ano1')]), ('Annotation', [('Id', 'Ano2')]), ('Annotation', [('Id', 'Ano3'), ('AnnotationArg', [('Id', 'x')])]), ('Annotation', [('Id', 'Ano4'), ('AnnotationArg', [('Id', 'x'), ('AnnotationArgValue', '1')]), ('AnnotationArg', [('Id', 'y'), ('AnnotationArgValue', '2')])]), ('Id', 'I')])])
+
+
+if __name__ == "__main__":
+  logging.config.fileConfig("logging.conf")
+  if __name__ == '__main__':
+    unittest.main()
diff --git a/elemental/idl/scripts/idlrenderer.dart b/elemental/idl/scripts/idlrenderer.dart
new file mode 100644
index 0000000..e62c4a7
--- /dev/null
+++ b/elemental/idl/scripts/idlrenderer.dart
@@ -0,0 +1,180 @@
+// Copyright (c) 2011, 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.
+
+List sorted(Iterable input, [compare, key]) {
+  comparator(compare, key) {
+    if (compare == null && key == null)
+      return (a, b) => a.compareTo(b);
+    if (compare == null)
+      return (a, b) => key(a).compareTo(key(b));
+    if (key == null)
+      return compare;
+    return (a, b) => compare(key(a), key(b));
+  }
+  List copy = new List.from(input);
+  copy.sort(comparator(compare, key));
+  return copy;
+}
+
+render(idl_node, [indent_str='  ']) {
+  var output = [''];
+  var indent_stack = [];
+
+  indented(action) {  // TODO: revert to  indented(action()) {
+    indent_stack.add(indent_str);
+    action();
+    indent_stack.removeLast();
+  }
+
+  sort(nodes) => sorted(nodes, key: (a) => a.id);
+
+  var w; // For some reason mutually recursive local functions don't work.
+
+  wln([node]) {
+    w(node);
+    output.add('\n');
+  }
+
+  w = (node, [list_separator]) {
+    /*
+     Writes the given node.
+
+    Args:
+      node -- a string, IDLNode instance or a list of such.
+      list_separator -- if provided, and node is a list,
+        list_separator will be written between the list items.
+    */
+    if (node == null) {
+      return;
+    } else if (node is String) {
+      if (output.last().endsWith('\n'))
+        output.addAll(indent_stack);
+      output.add(node);
+    } else if (node is List) {
+      var separator = null;
+      for (var element in node) {
+        w(separator);
+        separator = list_separator;
+        w(element);
+      }
+    } else if (node is IDLFile) {
+      w(node.modules);
+      w(node.interfaces);
+    } else if (node is IDLModule) {
+      w(node.annotations);
+      w(node.extAttrs);
+      wln('module ${node.id} {');
+      indented(() {
+          w(node.interfaces);
+          w(node.typedefs);
+        });
+      wln('};');
+    } else if (node is IDLInterface) {
+      w(node.annotations);
+      w(node.extAttrs);
+      w('interface ${node.id}');
+      indented(() {
+          if (!node.parents.isEmpty()) {
+            wln(' :');
+            w(node.parents, ',\n');
+          }
+          wln(' {');
+          section(list, comment) {
+            if (list != null && !list.isEmpty()) {
+              wln();
+              wln(comment);
+              w(sort(list));
+            }
+          }
+          section(node.constants, '/* Constants */');
+          section(node.attributes, '/* Attributes */');
+          section(node.operations, '/* Operations */');
+          section(node.snippets, '/* Snippets */');
+        });
+      wln('};');
+    } else if (node is IDLParentInterface) {
+      w(node.annotations);
+      w(node.type.id);
+    } else if (node is IDLAnnotations) {
+      for (var name in sorted(node.map.getKeys())) {
+        IDLAnnotation annotation = node.map[name];
+        var args = annotation.map;
+        if (args.isEmpty()) {
+          w('@$name');
+        } else {
+          var formattedArgs = [];
+          for (var argName in sorted(args.getKeys())) {
+            var argValue = args[argName];
+            if (argValue == null)
+              formattedArgs.add(argName);
+            else
+              formattedArgs.add('$argName=$argValue');
+          }
+          w('@$name(${Strings.join(formattedArgs,',')})');
+        }
+        w(' ');
+      }
+    } else if (node is IDLExtAttrs) {
+      if(!node.map.isEmpty()) {
+        w('[');
+        var sep = null;
+        for (var name in sorted(node.map.getKeys())) {
+          w(sep);
+          sep = ', ';
+          w(name);
+          var value = node.map[name];
+          if (value != null) {
+            w('=');
+            w(value);
+          }
+        }
+        w('] ');
+      }
+    } else if (node is IDLAttribute) {
+      w(node.annotations);
+      w(node.extAttrs);
+      //if (node.isFcGetter)
+      //  w('getter ');
+      //if (node.isFcSetter)
+      //  w('setter ');
+      wln('attribute ${node.type.id} ${node.id};');
+    } else if (node is IDLConstant) {
+      w(node.annotations);
+      w(node.extAttrs);
+      wln('const ${node.type.id} ${node.id} = ${node.value};');
+    } else if (node is IDLSnippet) {
+      w(node.annotations);
+      wln('snippet {${node.text}};');
+    } else if (node is IDLOperation) {
+      w(node.annotations);
+      w(node.extAttrs);
+      if (node.specials != null && !node.specials.isEmpty()) {
+        w(node.specials, ' ');
+        w(' ');
+      }
+      w('${node.type.id} ${node.id}');
+      w('(');
+      w(node.arguments, ', ');
+      wln(');');
+    } else if (node is IDLArgument) {
+      w(node.extAttrs);
+      w('in ');
+      if (node.isOptional)
+        w('optional ');
+      w('${node.type.id} ${node.id}');
+    } else if (node is IDLExtAttrFunctionValue) {
+      w(node.name);
+      w('(');
+      w(node.arguments, ', ');
+      w(')');
+    } else if (node is IDLTypeDef) {
+      wln('typedef ${node.type.id} ${node.id};');
+    } else {
+      w('// $node\n');
+    }
+  };
+
+  w(idl_node);
+  return Strings.concatAll(output);
+}
diff --git a/elemental/idl/scripts/idlrenderer.py b/elemental/idl/scripts/idlrenderer.py
new file mode 100755
index 0000000..131a476
--- /dev/null
+++ b/elemental/idl/scripts/idlrenderer.py
@@ -0,0 +1,180 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+from idlnode import *
+
+
+def render(idl_node, indent_str='  '):
+  output = []
+  indent_stack = []
+
+  def begin_indent():
+    indent_stack.append(indent_str)
+  def end_indent():
+    indent_stack.pop()
+
+  def sort(nodes):
+    return sorted(nodes, key=lambda node: node.id)
+
+  def wln(node=None):
+    """Writes the given node and adds a new line."""
+    w(node)
+    output.append('\n')
+
+  def wsp(node):
+    """Writes the given node and adds a space if there was output."""
+    mark = len(output)
+    w(node)
+    if mark != len(output):
+      w(' ')
+
+  def w(node, list_separator=None):
+    """Writes the given node.
+
+    Args:
+      node -- a string, IDLNode instance or a list of such.
+      list_separator -- if provided, and node is a list,
+        list_separator will be written between the list items.
+    """
+    if node is None:
+      return
+    elif isinstance(node, str):
+      if output and output[-1].endswith('\n'):
+        # Auto-indent.
+        output.extend(indent_stack)
+      output.append(node)
+    elif isinstance(node, list):
+      for i in range(0, len(node)):
+        if i > 0:
+          w(list_separator)
+        w(node[i])
+    elif isinstance(node, IDLFile):
+      w(node.modules)
+      w(node.interfaces)
+    elif isinstance(node, IDLModule):
+      wsp(node.annotations)
+      wsp(node.ext_attrs)
+      wln('module %s {' % node.id)
+      begin_indent()
+      w(node.interfaces)
+      w(node.typeDefs)
+      end_indent()
+      wln('};')
+    elif isinstance(node, IDLInterface):
+      if node.annotations:
+        wln(node.annotations)
+      if node.ext_attrs:
+        wln(node.ext_attrs)
+      w('interface %s' % node.id)
+      begin_indent()
+      begin_indent()
+      if node.parents:
+        wln(' :')
+        w(node.parents, ',\n')
+      wln(' {')
+      end_indent()
+      if node.constants:
+        wln()
+        wln('/* Constants */')
+        w(sort(node.constants))
+      if node.attributes:
+        wln()
+        wln('/* Attributes */')
+        w(sort(node.attributes))
+      if node.operations:
+        wln()
+        wln('/* Operations */')
+        w(sort(node.operations))
+      end_indent()
+      wln('};')
+    elif isinstance(node, IDLParentInterface):
+      wsp(node.annotations)
+      w(node.type.id)
+    elif isinstance(node, IDLAnnotations):
+      sep = ''
+      for (name, annotation) in sorted(node.items()):
+        w(sep)
+        sep = ' '
+        if annotation and len(annotation):
+          subRes = []
+          for (argName, argValue) in sorted(annotation.items()):
+            if argValue is None:
+              subRes.append(argName)
+            else:
+              subRes.append('%s=%s' % (argName, argValue))
+          w('@%s(%s)' % (name, ', '.join(subRes)))
+        else:
+          w('@%s' % name)
+    elif isinstance(node, IDLExtAttrs):
+      if len(node):
+        w('[')
+        i = 0
+        for k in sorted(node):
+          if i > 0:
+            w(', ')
+          w(k)
+          v = node[k]
+          if v is not None:
+            if isinstance(v, IDLExtAttrFunctionValue):
+              if v.id:
+                w('=')
+              w(v)
+            else:
+              w('=%s' % v.__str__())
+          i += 1
+        w(']')
+    elif isinstance(node, IDLExtAttrFunctionValue):
+      if node.id:
+        w(node.id)
+      w('(')
+      w(node.arguments, ', ')
+      w(')')
+    elif isinstance(node, IDLAttribute):
+      wsp(node.annotations)
+      wsp(node.ext_attrs)
+      if node.is_fc_getter:
+        w('getter ')
+      if node.is_fc_setter:
+        w('setter ')
+      w('attribute %s %s' % (node.type.id, node.id))
+      if node.raises:
+        w(' raises (%s)' % node.raises.id)
+      elif node.is_fc_getter and node.get_raises:
+        w(' getraises (%s)' % node.get_raises.id)
+      elif node.is_fc_setter and node.set_raises:
+        w(' setraises (%s)' % node.set_raises.id)
+      wln(';')
+    elif isinstance(node, IDLConstant):
+      wsp(node.annotations)
+      wsp(node.ext_attrs)
+      wln('const %s %s = %s;' % (node.type.id, node.id, node.value))
+    elif isinstance(node, IDLOperation):
+      wsp(node.annotations)
+      wsp(node.ext_attrs)
+      if node.is_static:
+        w('static ')
+      if node.specials:
+        w(node.specials, ' ')
+        w(' ')
+      w('%s ' % node.type.id)
+      w(node.id)
+      w('(')
+      w(node.arguments, ', ')
+      w(')')
+      if node.raises:
+        w(' raises (%s)' % node.raises.id)
+      wln(';')
+    elif isinstance(node, IDLArgument):
+      wsp(node.ext_attrs)
+      w('in ')
+      if node.is_optional:
+        w('optional ')
+      w('%s %s' % (node.type.id, node.id))
+    else:
+      raise TypeError("Expected str or IDLNode but %s found" %
+        type(node))
+
+  w(idl_node)
+  return ''.join(output)
diff --git a/elemental/idl/scripts/idlrenderer_test.py b/elemental/idl/scripts/idlrenderer_test.py
new file mode 100755
index 0000000..ba788af
--- /dev/null
+++ b/elemental/idl/scripts/idlrenderer_test.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import idlnode
+import idlparser
+import idlrenderer
+import logging.config
+import unittest
+
+
+class IDLRendererTestCase(unittest.TestCase):
+
+  def _run_test(self, input_text, expected_text):
+    """Parses input, renders it and compares the results"""
+    parser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
+    idl_file = idlnode.IDLFile(parser.parse(input_text))
+    output_text = idlrenderer.render(idl_file)
+
+    if output_text != expected_text:
+      msg = '''
+EXPECTED:
+%s
+ACTUAL  :
+%s
+''' % (expected_text, output_text)
+      self.fail(msg)
+
+  def test_rendering(self):
+    input_text = \
+'''module M {
+  [Constructor(long x)] interface I : @A J, K {
+    attribute int attr;
+    readonly attribute long attr2;
+    getter attribute int get_attr;
+    setter attribute int set_attr;
+
+    [A,B=123] void function(in long x, in optional boolean y);
+
+    const boolean CONST = 1;
+
+    @A @B() @C(x) @D(x=1) @E(x,y=2)
+    void something();
+  };
+};
+@X module M2 {
+  @Y interface I {};
+};'''
+
+    expected_text = \
+'''module M {
+  [Constructor(in long x)]
+  interface I :
+      @A J,
+      K {
+
+    /* Constants */
+    const boolean CONST = 1;
+
+    /* Attributes */
+    attribute int attr;
+    attribute long attr2;
+    getter attribute int get_attr;
+    setter attribute int set_attr;
+
+    /* Operations */
+    [A, B=123] void function(in long x, in optional boolean y);
+    @A @B @C(x) @D(x=1) @E(x, y=2) void something();
+  };
+};
+@X module M2 {
+  @Y
+  interface I {
+  };
+};
+'''
+    self._run_test(input_text, expected_text)
+
+if __name__ == "__main__":
+  logging.config.fileConfig("logging.conf")
+  if __name__ == '__main__':
+    unittest.main()
diff --git a/elemental/idl/scripts/idlsync.py b/elemental/idl/scripts/idlsync.py
new file mode 100755
index 0000000..930698f
--- /dev/null
+++ b/elemental/idl/scripts/idlsync.py
@@ -0,0 +1,119 @@
+#!/usr/bin/python
+# 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.
+
+import optparse
+import os
+import os.path
+import re
+import shutil
+import subprocess
+import sys
+
+SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__))
+DART_PATH = os.path.abspath(os.path.join(SCRIPT_PATH, '..', '..', '..'))
+
+# Path to install latest IDL.
+IDL_PATH = os.path.join(DART_PATH, 'third_party', 'WebCore')
+
+# Whitelist of files to keep.
+WHITELIST = [
+    r'LICENSE(\S+)',
+    r'(\S+)\.idl']
+
+# README file to generate.
+README = os.path.join(IDL_PATH, 'README')
+
+# SVN URL to latest Dartium version of WebKit.
+DEPS = 'http://dart.googlecode.com/svn/branches/bleeding_edge/deps/dartium.deps/DEPS'
+URL_PATTERN = r'"dartium_webkit_trunk": "(\S+)",'
+REV_PATTERN = r'"dartium_webkit_revision": "(\d+)",'
+WEBCORE_SUBPATH = 'Source/WebCore'
+
+
+def RunCommand(cmd):
+  """Executes a shell command and return its stdout."""
+  print ' '.join(cmd)
+  pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+  output = pipe.communicate()
+  if pipe.returncode == 0:
+    return output[0]
+  else:
+    print output[1]
+    print 'FAILED. RET_CODE=%d' % pipe.returncode
+    sys.exit(pipe.returncode)
+
+
+def GetWebkitSvnRevision():
+  """Returns a tuple with the (dartium webkit repo, latest revision)."""
+  deps = RunCommand(['svn', 'cat', DEPS])
+  url = re.search(URL_PATTERN, deps).group(1)
+  revision = re.search(REV_PATTERN, deps).group(1)
+  return (url, revision)
+
+
+def RefreshIDL(url, revision):
+  """Refreshes the IDL to specific WebKit url / revision."""
+  cwd = os.getcwd()
+  try:
+    shutil.rmtree(IDL_PATH)
+    os.chdir(os.path.dirname(IDL_PATH))
+    RunCommand(['svn', 'export', '-r', revision, url + '/' + WEBCORE_SUBPATH])
+  finally:
+    os.chdir(cwd)
+
+
+def PruneExtraFiles():
+  """Removes all files that do not match the whitelist."""
+  pattern = re.compile(reduce(lambda x,y: '%s|%s' % (x,y),
+                              map(lambda z: '(%s)' % z, WHITELIST)))
+  for (root, dirs, files) in os.walk(IDL_PATH, topdown=False):
+    for f in files:
+      if not pattern.match(f):
+        os.remove(os.path.join(root, f))
+    for d in dirs:
+      dirpath = os.path.join(root, d)
+      if not os.listdir(dirpath):
+        shutil.rmtree(dirpath)
+
+
+def ParseOptions():
+  parser = optparse.OptionParser()
+  parser.add_option('--revision', '-r', dest='revision',
+                    help='Revision to install', default=None)
+  args, _ = parser.parse_args()
+  return args.revision
+
+
+def GenerateReadme(url, revision):
+  readme = """This directory contains a copy of WebKit/WebCore IDL files.
+See the attached LICENSE-* files in this directory.
+
+Please do not modify the files here.  They are periodically copied
+using the script: $DART_ROOT/lib/dom/scripts/%(script)s
+
+The current version corresponds to:
+URL: %(url)s
+Current revision: %(revision)s
+""" % {
+    'script': os.path.basename(__file__),
+    'url': url,
+    'revision': revision }
+  out = open(README, 'w')
+  out.write(readme)
+  out.close()
+
+
+def main():
+  revision = ParseOptions()
+  url, latest = GetWebkitSvnRevision()
+  if not revision:
+    revision = latest
+  RefreshIDL(url, revision)
+  PruneExtraFiles()
+  GenerateReadme(url, revision)
+
+
+if __name__ == '__main__':
+  main()
diff --git a/elemental/idl/scripts/logging.conf b/elemental/idl/scripts/logging.conf
new file mode 100644
index 0000000..99e2496
--- /dev/null
+++ b/elemental/idl/scripts/logging.conf
@@ -0,0 +1,64 @@
+[loggers]
+keys=root,pegparser,database,databasebuilder,dartgenerator,elementalgenerator,snippet_manager,w3cscraper
+
+[handlers]
+keys=consoleHandler
+
+[formatters]
+keys=simpleFormatter
+
+[logger_root]
+level=INFO
+handlers=consoleHandler
+
+[logger_pegparser]
+level=INFO
+propagate=0
+handlers=consoleHandler
+qualname=pegparser
+
+[logger_database]
+level=INFO
+propagate=0
+handlers=consoleHandler
+qualname=database
+
+[logger_databasebuilder]
+level=INFO
+propagate=0
+handlers=consoleHandler
+qualname=databasebuilder
+
+[logger_w3cscraper]
+level=INFO
+propagate=0
+handlers=consoleHandler
+qualname=w3cscraper
+
+[logger_snippet_manager]
+level=INFO
+propagate=0
+handlers=consoleHandler
+qualname=snippet_manager
+
+[logger_dartgenerator]
+level=INFO
+propagate=0
+handlers=consoleHandler
+qualname=dartgenerator
+
+[logger_elementalgenerator]
+level=INFO
+propagate=0
+handlers=consoleHandler
+qualname=elementalgenerator
+
+[handler_consoleHandler]
+class=StreamHandler
+level=INFO
+formatter=simpleFormatter
+args=(sys.stdout,)
+
+[formatter_simpleFormatter]
+format=%(name)s - %(levelname)s - %(message)s
+datefmt=
diff --git a/elemental/idl/scripts/multiemitter.py b/elemental/idl/scripts/multiemitter.py
new file mode 100644
index 0000000..19d9000
--- /dev/null
+++ b/elemental/idl/scripts/multiemitter.py
@@ -0,0 +1,85 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+"""Templating to help generate structured text."""
+
+import os
+import re
+import emitter
+import logging
+
+_logger = logging.getLogger('multiemitter')
+
+class MultiEmitter(object):
+  """A set of Emitters that write to different files.
+
+  Each entry has a key.
+
+  file --> emitter
+  key --> emitter
+
+  """
+
+  def __init__(self):
+    self._key_to_emitter = {}     # key -> Emitter
+    self._filename_to_emitter = {}    # filename -> Emitter
+
+
+  def FileEmitter(self, filename, key=None):
+    """Creates an emitter for writing to a file.
+
+    When this MultiEmitter is flushed, the contents of the emitter are written
+    to the file.
+
+    Arguments:
+      filename: a string, the path name of the file
+      key: provides an access key to retrieve the emitter.
+
+    Returns: the emitter.
+    """
+    e = emitter.Emitter()
+    self._filename_to_emitter[filename] = e
+    if key:
+      self.Associate(key, e)
+    return e
+
+  def Associate(self, key, emitter):
+    """Associates a key with an emitter."""
+    self._key_to_emitter[key] = emitter
+
+  def Find(self, key):
+    """Returns the emitter associated with |key|."""
+    return self._key_to_emitter[key]
+
+  def Flush(self, writer=None):
+    """Writes all pending files.
+
+    Arguments:
+      writer: a function called for each file and it's lines.
+    """
+    if not writer:
+      writer = _WriteFile
+    for file in sorted(self._filename_to_emitter.keys()):
+      emitter = self._filename_to_emitter[file]
+      writer(file, emitter.Fragments())
+
+
+def _WriteFile(path, lines):
+  (dir, file) = os.path.split(path)
+
+  # Ensure dir exists.
+  if dir:
+    if not os.path.isdir(dir):
+      os.makedirs(dir)
+
+  # Remove file if pre-existing.
+  if os.path.exists(path):
+    os.remove(path)
+
+  # Write the file.
+  # _logger.info('Flushing - %s' % path)
+  f = open(path, 'w')
+  f.writelines(lines)
+  f.close()
diff --git a/elemental/idl/scripts/multiemitter_test.py b/elemental/idl/scripts/multiemitter_test.py
new file mode 100644
index 0000000..00a28b7
--- /dev/null
+++ b/elemental/idl/scripts/multiemitter_test.py
@@ -0,0 +1,47 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+"""Tests for emitter module."""
+
+import logging.config
+import unittest
+import emitter
+import multiemitter
+
+
+class MultiEmitterTestCase(unittest.TestCase):
+
+  def setUp(self):
+    pass
+
+  def tearDown(self):
+    pass
+
+  def check(self, m, expected):
+    """Verifies that the multiemitter contains the expected contents.
+
+    Expected is a list of (filename, content) pairs, sorted by filename.
+    """
+    files = []
+    def _Collect(file, contents):
+      files.append((file, ''.join(contents)))
+    m.Flush(_Collect)
+    self.assertEquals(expected, files)
+
+  def testExample(self):
+    m = multiemitter.MultiEmitter()
+    e1 = m.FileEmitter('file1')
+    e2 = m.FileEmitter('file2', 'key2')
+    e1.Emit('Hi 1')
+    e2.Emit('Hi 2')
+    m.Find('key2').Emit('Bye 2')
+    self.check(m,
+               [('file1', 'Hi 1'),
+                ('file2', 'Hi 2Bye 2') ])
+
+if __name__ == '__main__':
+  logging.config.fileConfig('logging.conf')
+  if __name__ == '__main__':
+    unittest.main()
diff --git a/elemental/idl/scripts/pegparser.py b/elemental/idl/scripts/pegparser.py
new file mode 100755
index 0000000..ffc12cc
--- /dev/null
+++ b/elemental/idl/scripts/pegparser.py
@@ -0,0 +1,527 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import logging
+import re
+import weakref
+
+_logger = logging.getLogger('pegparser')
+
+# functions can refer to each other, hence creating infinite loops. The
+# following hashmap is used to memoize functions that were already compiled.
+_compiled_functions_memory = weakref.WeakKeyDictionary()
+
+_regex_type = type(re.compile(r''))
+_list_type = type([])
+_function_type = type(lambda func: 0)
+
+
+class _PegParserState(object):
+  """Object for storing parsing state variables and options"""
+
+  def __init__(self, text, whitespace_rule, strings_are_tokens):
+    # Parsing state:
+    self.text = text
+    self.is_whitespace_mode = False
+
+    # Error message helpers:
+    self.max_pos = None
+    self.max_rule = None
+
+    # Parsing options:
+    self.whitespace_rule = whitespace_rule
+    self.strings_are_tokens = strings_are_tokens
+
+
+class _PegParserRule(object):
+  """Base class for all rules"""
+
+  def __init__(self):
+    return
+
+  def __str__(self):
+    return self.__class__.__name__
+
+  def _match_impl(self, state, pos):
+    """Default implementation of the matching algorithm.
+    Should be overwritten by sub-classes.
+    """
+    raise RuntimeError('_match_impl not implemented')
+
+  def match(self, state, pos):
+    """Matches the rule against the text in the given position.
+
+    The actual rule evaluation is delegated to _match_impl,
+    while this function deals mostly with support tasks such as
+    skipping whitespace, debug information and data for exception.
+
+    Args:
+      state -- the current parsing state and options.
+      pos -- the current offset in the text.
+
+    Returns:
+      (next position, value) if the rule matches, or
+      (None, None) if it doesn't.
+    """
+    if not state.is_whitespace_mode:
+      # Skip whitespace
+      pos = _skip_whitespace(state, pos)
+
+      # Track position for possible error messaging
+      if pos > state.max_pos:
+        # Store position and the rule.
+        state.max_pos = pos
+        if isinstance(self, _StringRule):
+          state.max_rule = [self]
+        else:
+          state.max_rule = []
+      elif pos == state.max_pos:
+        if isinstance(self, _StringRule):
+          state.max_rule.append(self)
+
+      if _logger.isEnabledFor(logging.DEBUG):
+        # Used for debugging
+        _logger.debug('Try:   pos=%s char=%s rule=%s' % \
+          (pos, state.text[pos:pos + 1], self))
+
+    # Delegate the matching logic to the the specialized function.
+    res = self._match_impl(state, pos)
+
+    if not state.is_whitespace_mode \
+      and _logger.isEnabledFor(logging.DEBUG):
+      # More debugging information
+      (nextPos, ast) = res
+      if nextPos is not None:
+        _logger.debug('Match! pos=%s char=%s rule=%s' % \
+          (pos, state.text[pos:pos + 1], self))
+      else:
+        _logger.debug('Fail.  pos=%s char=%s rule=%s' % \
+          (pos, state.text[pos:pos + 1], self))
+
+    return res
+
+
+def _compile(rule):
+  """Recursively compiles user-defined rules into parser rules.
+  Compilation is performed by converting strings, regular expressions, lists
+  and functions into _StringRule, _RegExpRule, SEQUENCE and _FunctionRule
+  (respectively). Memoization is used to avoid infinite recursion as rules
+  may refer to each other."""
+  if rule is None:
+    raise RuntimeError('None is not a valid rule')
+  elif isinstance(rule, str):
+    return _StringRule(rule)
+  elif isinstance(rule, _regex_type):
+    return _RegExpRule(rule)
+  elif isinstance(rule, _list_type):
+    return SEQUENCE(*rule)
+  elif isinstance(rule, _function_type):
+    # Memoize compiled functions to avoid infinite compliation loops.
+    if rule in _compiled_functions_memory:
+      return _compiled_functions_memory[rule]
+    else:
+      compiled_function = _FunctionRule(rule)
+      _compiled_functions_memory[rule] = compiled_function
+      compiled_function._sub_rule = _compile(rule())
+      return compiled_function
+  elif isinstance(rule, _PegParserRule):
+    return rule
+  else:
+    raise RuntimeError('Invalid rule type %s: %s', (type(rule), rule))
+
+
+def _skip_whitespace(state, pos):
+  """Returns the next non-whitespace position.
+  This is done by matching the optional whitespace_rule with the current
+  text."""
+  if not state.whitespace_rule:
+    return pos
+  state.is_whitespace_mode = True
+  nextPos = pos
+  while nextPos is not None:
+    pos = nextPos
+    (nextPos, ast) = state.whitespace_rule.match(state, pos)
+  state.is_whitespace_mode = False
+  return pos
+
+
+class _StringRule(_PegParserRule):
+  """This rule tries to match a whole string."""
+
+  def __init__(self, string):
+    """Constructor.
+    Args:
+      string -- string to match.
+    """
+    _PegParserRule.__init__(self)
+    self._string = string
+
+  def __str__(self):
+    return '"%s"' % self._string
+
+  def _match_impl(self, state, pos):
+    """Tries to match the string at the current position"""
+    if state.text.startswith(self._string, pos):
+      nextPos = pos + len(self._string)
+      if state.strings_are_tokens:
+        return (nextPos, None)
+      else:
+        return (nextPos, self._string)
+    return (None, None)
+
+
+class _RegExpRule(_PegParserRule):
+  """This rule tries to matches a regular expression."""
+
+  def __init__(self, reg_exp):
+    """Constructor.
+    Args:
+      reg_exp -- a regular expression used in matching.
+    """
+    _PegParserRule.__init__(self)
+    self.reg_exp = reg_exp
+
+  def __str__(self):
+    return 'regexp'
+
+  def _match_impl(self, state, pos):
+    """Tries to match the regular expression with current text"""
+    matchObj = self.reg_exp.match(state.text, pos)
+    if matchObj:
+      matchStr = matchObj.group()
+      return (pos + len(matchStr), matchStr)
+    return (None, None)
+
+
+class _FunctionRule(_PegParserRule):
+  """Function rule wraps a rule defined via a Python function.
+
+  Defining rules via functions helps break the grammar into parts, labeling
+  the ast, and supporting recursive definitions in the grammar
+
+  Usage Example:
+    def Func(): return ['function', TOKEN('('), TOKEN(')')]
+    def Var(): return OR('x', 'y')
+    def Program(): return OR(Func, Var)
+
+  When matched with 'function()', will return the tuple:
+    ('Program', ('Func', 'function'))
+  When matched with 'x', will return the tuple:
+    ('Program', ('Var', 'x'))
+
+  Functions who's name begins with '_' will not be labelled. This is useful
+  for creating utility rules. Extending the example above:
+
+    def _Program(): return OR(Func, Var)
+
+  When matched with 'function()', will return the tuple:
+    ('Func', 'function')
+  """
+
+  def __init__(self, func):
+    """Constructor.
+    Args:
+      func -- the original function will be used for labeling output.
+    """
+    _PegParserRule.__init__(self)
+    self._func = func
+    # Sub-rule is compiled by _compile to avoid infinite recursion.
+    self._sub_rule = None
+
+  def __str__(self):
+    return self._func.__name__
+
+  def _match_impl(self, state, pos):
+    """Simply invokes the sub rule"""
+    (nextPos, ast) = self._sub_rule.match(state, pos)
+    if nextPos is not None:
+      if not self._func.__name__.startswith('_'):
+        ast = (self._func.__name__, ast)
+      return (nextPos, ast)
+    return (None, None)
+
+
+class SEQUENCE(_PegParserRule):
+  """This rule expects all given rules to match in sequence.
+  Note that SEQUENCE is equivalent to a rule composed of a Python list of
+  rules.
+  Usage example: SEQUENCE('A', 'B', 'C')
+         or: ['A', 'B', 'C']
+  Will match 'ABC' but not 'A', 'B' or ''.
+  """
+  def __init__(self, *rules):
+    """Constructor.
+    Args:
+      rules -- one or more rules to match.
+    """
+    _PegParserRule.__init__(self)
+    self._sub_rules = []
+    for rule in rules:
+      self._sub_rules.append(_compile(rule))
+
+  def _match_impl(self, state, pos):
+    """Tries to match all the sub rules"""
+    sequence = []
+    for rule in self._sub_rules:
+      (nextPos, ast) = rule.match(state, pos)
+      if nextPos is not None:
+        if ast:
+          if isinstance(ast, _list_type):
+            sequence.extend(ast)
+          else:
+            sequence.append(ast)
+        pos = nextPos
+      else:
+        return (None, None)
+    return (pos, sequence)
+
+
+class OR(_PegParserRule):
+  """This rule matches one and only one of multiple sub-rules.
+  Usage example: OR('A', 'B', 'C')
+  Will match 'A', 'B' or 'C'.
+  """
+  def __init__(self, *rules):
+    """Constructor.
+    Args:
+      rules -- rules to choose from.
+    """
+    _PegParserRule.__init__(self)
+    self._sub_rules = []
+    for rule in rules:
+      self._sub_rules.append(_compile(rule))
+
+  def _match_impl(self, state, pos):
+    """Tries to match at leat one of the sub rules"""
+    for rule in self._sub_rules:
+      (nextPos, ast) = rule.match(state, pos)
+      if nextPos is not None:
+        return (nextPos, ast)
+    return (None, None)
+
+
+class MAYBE(_PegParserRule):
+  """Will try to match the given rule, tolerating absence.
+  Usage example: MAYBE('A')
+  Will match 'A' but also ''.
+  """
+  def __init__(self, rule):
+    """Constructor.
+    Args:
+      rule -- the rule that may be absent.
+    """
+    _PegParserRule.__init__(self)
+    self._sub_rule = _compile(rule)
+
+  def _match_impl(self, state, pos):
+    """Tries to match at leat one of the sub rules"""
+    (nextPos, ast) = self._sub_rule.match(state, pos)
+    if nextPos is not None:
+      return (nextPos, ast)
+    return (pos, None)
+
+
+class MANY(_PegParserRule):
+  """Will try to match the given rule one or more times.
+  Usage example 1: MANY('A')
+  Will match 'A', 'AAAAA' but not ''.
+  Usage example 2: MANY('A', separator=',')
+  Will match 'A', 'A,A' but not 'AA'.
+  """
+
+  def __init__(self, rule, separator=None):
+    """Constructor.
+    Args:
+      rule -- the rule to match multiple times.
+      separator -- this optional rule is used to match separators.
+    """
+    _PegParserRule.__init__(self)
+    self._sub_rule = _compile(rule)
+    self._separator = _compile(separator) if separator else None
+
+  def _match_impl(self, state, pos):
+    res = []
+    count = 0
+    while True:
+      if count > 0 and self._separator:
+        (nextPos, ast) = self._separator.match(state, pos)
+        if nextPos is not None:
+          pos = nextPos
+          if ast:
+            res.append(ast)
+        else:
+          break
+      (nextPos, ast) = self._sub_rule.match(state, pos)
+      if nextPos is None:
+        break
+      count += 1
+      pos = nextPos
+      res.append(ast)
+    if count > 0:
+      return (pos, res)
+    return (None, None)
+
+
+class TOKEN(_PegParserRule):
+  """The matched rule will not appear in the the output.
+  Usage example: ['A', TOKEN('.'), 'B']
+  When matching 'A.B', will return the sequence ['A', 'B'].
+  """
+
+  def __init__(self, rule):
+    """Constructor.
+    Args:
+      rule -- the rule to match.
+    """
+    _PegParserRule.__init__(self)
+    self._sub_rule = _compile(rule)
+
+  def _match_impl(self, state, pos):
+    (nextPos, ast) = self._sub_rule.match(state, pos)
+    if nextPos is not None:
+      return (nextPos, None)
+    return (None, None)
+
+
+class LABEL(_PegParserRule):
+  """The matched rule will appear in the output with the given label.
+  Usage example: LABEL('number', re.compile(r'[0-9]+'))
+  When matched with '1234', will return ('number', '1234').
+
+  Keyword arguments:
+  label -- a string.
+  rule -- the rule to match.
+  """
+
+  def __init__(self, label, rule):
+    """Constructor.
+    Args:
+      rule -- the rule to match.
+    """
+    _PegParserRule.__init__(self)
+    self._label = label
+    self._sub_rule = _compile(rule)
+
+  def _match_impl(self, state, pos):
+    (nextPos, ast) = self._sub_rule.match(state, pos)
+    if nextPos is not None:
+      return (nextPos, (self._label, ast))
+    return (None, None)
+
+
+class RAISE(_PegParserRule):
+  """Raises a SyntaxError with a user-provided message.
+  Usage example: ['A','B', RAISE('should have not gotten here')]
+  Will not match 'A' but will raise an exception for 'AB'.
+  This rule is useful mostly for debugging grammars.
+  """
+  def __init__(self, message):
+    """Constructor.
+    Args:
+      message -- the message for the raised exception.
+    """
+    _PegParserRule.__init__(self)
+    self._message = message
+
+  def _match_impl(self, state, pos):
+    raise RuntimeError(self._message)
+
+
+class PegParser(object):
+  """PegParser class.
+  This generic parser can be configured with rules to parse a wide
+  range of inputs.
+  """
+
+  def __init__(self, root_rule, whitespace_rule=None,
+         strings_are_tokens=False):
+    """Initializes a PegParser with rules and parsing options.
+
+    Args:
+      root_rule -- the top level rule to start matching at. Rule can be
+        a regular expression, a string, or one of the special rules
+        such as SEQUENCE, MANY, OR, etc.
+      whitespace_rule -- used to identify and strip whitespace. Default
+        isNone, configuring the parser to not tolerate whitespace.
+      strings_are_tokens -- by default string rules are not treated as
+        tokens. In many programming languages, strings are tokens,
+        so this should be set to True.
+    """
+    self._strings_are_tokens = strings_are_tokens
+    self._root_rule = _compile(root_rule)
+    if whitespace_rule is None:
+      self._whitespace_rule = None
+    else:
+      self._whitespace_rule = _compile(whitespace_rule)
+
+  def parse(self, text, start_pos=0):
+    """Parses the given text input
+    Args:
+      text -- data to parse.
+      start_pos -- the offset to start parsing at.
+
+    Returns:
+      An abstract syntax tree, with nodes being pairs of the format
+      (label, value), where label is a string or a function, and value
+      is a string, a pair or a list of pairs.
+    """
+
+    def calculate_line_number_and_offset(globalOffset):
+      """Calculates the line number and in-line offset"""
+      i = 0
+      lineNumber = 1
+      lineOffset = 0
+      lineData = []
+      while i < globalOffset and i < len(text):
+        if text[i] == '\n':
+          lineNumber += 1
+          lineOffset = 0
+          lineData = []
+        else:
+          lineData.append(text[i])
+          lineOffset += 1
+        i += 1
+      while i < len(text) and  text[i] != '\n':
+        lineData.append(text[i])
+        i += 1
+      return (lineNumber, lineOffset, ''.join(lineData))
+
+    def analyze_result(state, pos, ast):
+      """Analyze match output"""
+      if pos is not None:
+        # Its possible that matching is successful but trailing
+        # whitespace remains, so skip it.
+        pos = _skip_whitespace(state, pos)
+      if pos == len(state.text):
+        # End of intput reached. Success!
+        return ast
+
+      # Failure - analyze and raise an error.
+      (lineNumber, lineOffset, lineData) = \
+        calculate_line_number_and_offset(state.max_pos)
+      message = 'unexpected error'
+      if state.max_rule:
+        set = {}
+        map(set.__setitem__, state.max_rule, [])
+
+        def to_str(item):
+          return item.__str__()
+
+        expected = ' or '.join(map(to_str, set.keys()))
+        found = state.text[state.max_pos:state.max_pos + 1]
+        message = 'Expected %s but "%s" found: "%s"' % \
+          (expected, found, lineData)
+      raise SyntaxError(
+        'At line %s offset %s: %s' % \
+        (lineNumber, lineOffset, message))
+
+    # Initialize state
+    state = _PegParserState(text,
+      whitespace_rule=self._whitespace_rule,
+      strings_are_tokens=self._strings_are_tokens)
+
+    # Match and analyze result
+    (pos, ast) = self._root_rule.match(state, start_pos)
+    return analyze_result(state, pos, ast)
diff --git a/elemental/idl/scripts/pegparser_test.py b/elemental/idl/scripts/pegparser_test.py
new file mode 100755
index 0000000..8af0f2d
--- /dev/null
+++ b/elemental/idl/scripts/pegparser_test.py
@@ -0,0 +1,200 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import logging.config
+import pprint
+import re
+import sys
+import unittest
+from pegparser import *
+
+
+class PegParserTestCase(unittest.TestCase):
+
+  def _run_test(self, grammar, text, expected,
+          strings_are_tokens=False, whitespace_rule=None):
+    """Utility for running a parser test and comparing results.
+
+    Program exits (sys.exit) if expected does not match actual.
+
+    Args:
+      grammar -- the root rule to be used by the parser.
+      text -- the text to parse.
+      expected -- the expected abstract syntax tree. None means
+        failure is expected.
+      strings_are_tokens -- whether strings are treated as tokens.
+      whitespace_rule -- the rule used for matching whitespace.
+        Default is None, which means that no whitespace is tolerated.
+    """
+    parser = PegParser(grammar, whitespace_rule,
+               strings_are_tokens=strings_are_tokens)
+    actual = None
+    error = None
+    try:
+      actual = parser.parse(text)
+    except SyntaxError, e:
+      error = e
+      pass
+
+    if actual != expected:
+      msg = '''
+CONTENT:
+%s
+EXPECTED:
+%s
+ACTUAL:
+%s
+ERROR: %s''' % (text, pprint.pformat(expected), pprint.pformat(actual), error)
+      self.fail(msg)
+
+  def test_sequence(self):
+    sequence = SEQUENCE('A', 'BB', 'C')
+    self._run_test(grammar=sequence, text='ABBC', expected=['A', 'BB', 'C'])
+    self._run_test(grammar=sequence, text='BBAC', expected=None)
+    # Syntax Sugar
+    sequence = ['A', 'BB', 'C']
+    self._run_test(grammar=sequence, text='ABBC', expected=['A', 'BB', 'C'])
+    self._run_test(grammar=sequence, text='BBAC', expected=None)
+
+  def test_regex(self):
+    regex = re.compile(r'[A-Za-z]*')
+    self._run_test(grammar=regex, text='AaBb', expected='AaBb')
+    self._run_test(grammar=regex, text='0AaBb', expected=None)
+    self._run_test(grammar=regex, text='Aa0Bb', expected=None)
+
+  def test_function(self):
+    def Func():
+      return 'ABC'
+    self._run_test(grammar=Func, text='ABC', expected=('Func', 'ABC'))
+    self._run_test(grammar=Func, text='XYZ', expected=None)
+
+  def test_function_label(self):
+    def func():
+      return 'ABC'
+
+    def _func():
+      return 'ABC'
+
+    self._run_test(grammar=func, text='ABC', expected=('func', 'ABC'))
+    self._run_test(grammar=_func, text='ABC', expected='ABC')
+
+  def test_label(self):
+    sequence = [TOKEN('def'), LABEL('funcName', re.compile(r'[a-z0-9]*')),
+          TOKEN('():')]
+    self._run_test(grammar=sequence, text='def f1():',
+      whitespace_rule=' ', expected=[('funcName', 'f1')])
+    self._run_test(grammar=sequence, text='def f2():',
+      whitespace_rule=' ', expected=[('funcName', 'f2')])
+
+  def test_or(self):
+    grammer = OR('A', 'B')
+    self._run_test(grammar=grammer, text='A', expected='A')
+    self._run_test(grammar=grammer, text='B', expected='B')
+    self._run_test(grammar=grammer, text='C', expected=None)
+
+  def test_maybe(self):
+    seq = ['A', MAYBE('B'), 'C']
+    self._run_test(grammar=seq, text='ABC', expected=['A', 'B', 'C'])
+    self._run_test(grammar=seq, text='ADC', expected=None)
+    self._run_test(grammar=seq, text='AC', expected=['A', 'C'])
+    self._run_test(grammar=seq, text='AB', expected=None)
+
+  def test_many(self):
+    seq = ['A', MANY('B'), 'C']
+    self._run_test(grammar=seq, text='ABC', expected=['A', 'B', 'C'])
+    self._run_test(grammar=seq, text='ABBBBC',
+      expected=['A', 'B', 'B', 'B', 'B', 'C'])
+    self._run_test(grammar=seq, text='AC', expected=None)
+
+  def test_many_with_separator(self):
+    letter = OR('A', 'B', 'C')
+
+    def _gram():
+      return [letter, MAYBE([TOKEN(','), _gram])]
+
+    self._run_test(grammar=_gram, text='A,B,C,B',
+      expected=['A', 'B', 'C', 'B'])
+    self._run_test(grammar=_gram, text='A B C', expected=None)
+    shortergrammar = MANY(letter, TOKEN(','))
+    self._run_test(grammar=shortergrammar, text='A,B,C,B',
+      expected=['A', 'B', 'C', 'B'])
+    self._run_test(grammar=shortergrammar, text='A B C', expected=None)
+
+  def test_raise(self):
+    self._run_test(grammar=['A', 'B'], text='AB',
+      expected=['A', 'B'])
+    try:
+      self._run_test(grammar=['A', 'B', RAISE('test')], text='AB',
+        expected=None)
+      print 'Expected RuntimeError'
+      sys.exit(-1)
+    except RuntimeError, e:
+      return
+
+  def test_whitespace(self):
+    gram = MANY('A')
+    self._run_test(grammar=gram, text='A A  A', expected=None)
+    self._run_test(grammar=gram, whitespace_rule=' ', text='A A  A',
+      expected=['A', 'A', 'A'])
+
+  def test_math_expression_syntax(self):
+    operator = LABEL('op', OR('+', '-', '/', '*'))
+    literal = LABEL('num', re.compile(r'[0-9]+'))
+
+    def _exp():
+      return MANY(OR(literal, [TOKEN('('), _exp, TOKEN(')')]),
+            separator=operator)
+
+    self._run_test(grammar=_exp,
+      text='(1-2)+3*((4*5)*6)+(7+8/9)-10',
+      expected=[[('num', '1'), ('op', '-'), ('num', '2')],
+        ('op', '+'),
+        ('num', '3'),
+        ('op', '*'),
+        [[('num', '4'), ('op', '*'), ('num', '5')],
+          ('op', '*'), ('num', '6')],
+        ('op', '+'),
+        [('num', '7'), ('op', '+'), ('num', '8'),
+         ('op', '/'), ('num', '9')],
+        ('op', '-'),
+        ('num', '10')])
+
+  def test_mini_language(self):
+    def name():
+      return re.compile(r'[a-z]+')
+
+    def var_decl():
+      return ['var', name, ';']
+
+    def func_invoke():
+      return [name, '(', ')', ';']
+
+    def func_body():
+      return MANY(OR(var_decl, func_invoke))
+
+    def func_decl():
+      return ['function', name, '(', ')', '{', func_body, '}']
+
+    def args():
+      return MANY(name, ',')
+
+    def program():
+      return MANY(OR(var_decl, func_decl))
+
+    self._run_test(grammar=program,
+      whitespace_rule=OR('\n', ' '),
+      strings_are_tokens=True,
+      text='var x;\nfunction f(){\n  var y;\n  g();\n}\n',
+      expected=('program',[
+             ('var_decl', [('name', 'x')]),
+             ('func_decl', [('name', 'f'), ('func_body', [
+              ('var_decl', [('name', 'y')]),
+              ('func_invoke', [('name', 'g')])])])]))
+
+
+if __name__ == "__main__":
+  logging.config.fileConfig("logging.conf")
+  if __name__ == '__main__':
+    unittest.main()
diff --git a/elemental/idl/scripts/systembase.py b/elemental/idl/scripts/systembase.py
new file mode 100644
index 0000000..c4304b3
--- /dev/null
+++ b/elemental/idl/scripts/systembase.py
@@ -0,0 +1,111 @@
+#!/usr/bin/python
+# 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.
+
+"""This module provides base functionality for systems to generate
+Dart APIs from the IDL database."""
+
+import os
+#import re
+import generator
+
+def MassagePath(path):
+  # The most robust way to emit path separators is to use / always.
+  return path.replace('\\', '/')
+
+class System(object):
+  """A System generates all the files for one implementation.
+
+  This is a base class for all the specific systems.
+  The life-cycle of a System is:
+  - construction (__init__)
+  - (InterfaceGenerator | ProcessCallback)*  # for each IDL interface
+  - GenerateLibraries
+  - Finish
+  """
+
+  def __init__(self, templates, database, emitters, output_dir):
+    self._templates = templates
+    self._database = database
+    self._emitters = emitters
+    self._output_dir = output_dir
+    self._dart_callback_file_paths = []
+
+  def InterfaceGenerator(self,
+                         interface,
+                         common_prefix,
+                         super_interface_name,
+                         source_filter):
+    """Returns an interface generator for |interface|.
+
+    Called once for each interface that is not a callback function.
+    """
+    return None
+
+  def ProcessCallback(self, interface, info):
+    """Processes an interface that is a callback function."""
+    pass
+
+  def GenerateLibraries(self, lib_dir):
+    pass
+
+  def Finish(self):
+    pass
+
+
+  # Helper methods used by several systems.
+
+  def _ProcessCallback(self, interface, info, file_path):
+    """Generates a typedef for the callback interface."""
+    self._dart_callback_file_paths.append(file_path)
+    code = self._emitters.FileEmitter(file_path)
+
+    code.Emit(self._templates.Load('callback.darttemplate'))
+    code.Emit('typedef $TYPE $NAME($PARAMS);\n',
+              NAME=interface.id,
+              TYPE=info.type_name,
+              PARAMS=info.ParametersImplementationDeclaration())
+
+
+  def _GenerateLibFile(self, lib_template, lib_file_path, file_paths,
+                       **template_args):
+    """Generates a lib file from a template and a list of files.
+
+    Additional keyword arguments are passed to the template.
+    Typically called from self.GenerateLibraries.
+    """
+    # Load template.
+    template = self._templates.Load(lib_template)
+    # Generate the .lib file.
+    lib_file_contents = self._emitters.FileEmitter(lib_file_path)
+
+    # Emit the list of #source directives.
+    list_emitter = lib_file_contents.Emit(template, **template_args)
+    lib_file_dir = os.path.dirname(lib_file_path)
+    for path in sorted(file_paths):
+      relpath = os.path.relpath(path, lib_file_dir)
+      list_emitter.Emit("#source('$PATH');\n", PATH=MassagePath(relpath))
+
+
+  def _BaseDefines(self, interface):
+    """Returns a set of names (strings) for members defined in a base class.
+    """
+    def WalkParentChain(interface):
+      if interface.parents:
+        # Only consider primary parent, secondary parents are not on the
+        # implementation class inheritance chain.
+        parent = interface.parents[0]
+        if generator.IsDartCollectionType(parent.type.id):
+          return
+        if self._database.HasInterface(parent.type.id):
+          parent_interface = self._database.GetInterface(parent.type.id)
+          for attr in parent_interface.attributes:
+            result.add(attr.id)
+          for op in parent_interface.operations:
+            result.add(op.id)
+          WalkParentChain(parent_interface)
+
+    result = set()
+    WalkParentChain(interface)
+    return result;
diff --git a/elemental/idl/scripts/systembaseelemental.py b/elemental/idl/scripts/systembaseelemental.py
new file mode 100644
index 0000000..0258992
--- /dev/null
+++ b/elemental/idl/scripts/systembaseelemental.py
@@ -0,0 +1,146 @@
+#!/usr/bin/python
+# 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.
+
+"""This module provides base functionality for systems to generate
+Dart APIs from the IDL database."""
+
+import os
+#import re
+from generator_java import *
+
+
+def MassagePath(path):
+  # The most robust way to emit path separators is to use / always.
+  return path.replace('\\', '/')
+
+class SystemElemental(object):
+  """A System generates all the files for one implementation.
+
+  This is a base class for all the specific systems.
+  The life-cycle of a System is:
+  - construction (__init__)
+  - (InterfaceGenerator | ProcessCallback)*  # for each IDL interface
+  - GenerateLibraries
+  - Finish
+  """
+
+  def __init__(self, templates, database, emitters, output_dir):
+    self._templates = templates
+    self._database = database
+    self._emitters = emitters
+    self._output_dir = output_dir
+    self._dart_callback_file_paths = []
+
+  def InterfaceGenerator(self,
+                         interface,
+                         common_prefix,
+                         super_interface_name,
+                         source_filter):
+    """Returns an interface generator for |interface|.
+
+    Called once for each interface that is not a callback function.
+    """
+    return None
+
+  def ProcessCallback(self, interface, info):
+    """Processes an interface that is a callback function."""
+    pass
+
+  def GenerateLibraries(self, lib_dir):
+    pass
+
+  def Finish(self):
+    pass
+
+
+  # Helper methods used by several systems.
+
+  def _ProcessCallback(self, interface, info, file_path):
+    """Generates a typedef for the callback interface."""
+    self._dart_callback_file_paths.append(file_path)
+    code = self._emitters.FileEmitter(file_path)
+
+    code.Emit(self._templates.Load('callback.darttemplate'))
+    code.Emit('typedef $TYPE $NAME($PARAMS);\n',
+              NAME=interface.id,
+              TYPE=info.type_name,
+              PARAMS=info.ParametersImplementationDeclaration())
+
+
+  def _GenerateLibFile(self, lib_template, lib_file_path, file_paths,
+                       **template_args):
+    """Generates a lib file from a template and a list of files.
+
+    Additional keyword arguments are passed to the template.
+    Typically called from self.GenerateLibraries.
+    """
+    # Load template.
+    template = self._templates.Load(lib_template)
+    # Generate the .lib file.
+    lib_file_contents = self._emitters.FileEmitter(lib_file_path)
+
+    # Emit the list of #source directives.
+    list_emitter = lib_file_contents.Emit(template, **template_args)
+    lib_file_dir = os.path.dirname(lib_file_path)
+    for path in sorted(file_paths):
+      relpath = os.path.relpath(path, lib_file_dir)
+      list_emitter.Emit("#source('$PATH');\n", PATH=MassagePath(relpath))
+
+      
+  def _BaseDefines(self, interface):
+    """Returns a set of names (strings) for members defined in a base class.
+    """
+    def WalkParentChain(interface):
+      if interface.parents:
+        # Only consider primary parent, secondary parents are not on the
+        # implementation class inheritance chain.
+        parent = interface.parents[0]
+        if generator.IsDartCollectionType(parent.type.id):
+          return
+        if self._database.HasInterface(parent.type.id):
+          parent_interface = self._database.GetInterface(parent.type.id)
+          for attr in parent_interface.attributes:
+            result.add(attr.id)
+          for op in parent_interface.operations:
+            result.add(op.id)
+          WalkParentChain(parent_interface)
+
+    result = set()
+    WalkParentChain(interface)
+    return result;
+
+  def ProcessMixins(self, mixins):
+    """Handle interfaces which must be hoisted to a common JSO base class"""
+    self._mixins = mixins
+
+
+class ElementalBase(object):
+  def __init__(self):
+    self.reserved_keywords = []
+    self.reserved_keywords = ['continue', 'delete', 'for', 'while', 'do', 'class', 'switch', 'try', 'catch', 'finally',
+                'int', 'float', 'short', 'double', 'char', 'byte', 'long', 'implements', 'extends', 'throws', 'case', 'if',
+                'else', 'throw', 'instanceof', 'true', 'false', 'default', 'null', 'abstract', 'package', 'super',
+                'public', 'protected', 'private', 'volatile', 'transient', 'final', 'synchronized', 'import', 'enum', 'boolean', 'assert']
+
+  def getImplements(self, alreadyImplemented, iface):
+    if '<' in iface.type.id:
+      return DartType(iface.type.id)
+    if iface.type.id in alreadyImplemented:
+      return
+    alreadyImplemented[iface.type.id]=1
+    piface = self._database.GetInterface(iface.type.id)
+    for parent in piface.parents:
+        self.getImplements(alreadyImplemented, parent)
+
+  def fixReservedKeyWords(self, name):
+    if name in ['continue', 'delete', 'for', 'while', 'do', 'class', 'switch', 'try', 'catch', 'finally',
+                'int', 'float', 'short', 'double', 'char', 'byte', 'long', 'implements', 'extends', 'throws', 'case', 'if',
+                'else', 'throw', 'instanceof', 'true', 'false', 'default', 'null', 'abstract', 'package', 'super',
+                'public', 'protected', 'private', 'volatile', 'transient', 'final', 'synchronized', 'import', 'enum', 'boolean', 'assert']:
+      return '_' + name;
+    return name
+
+
+
diff --git a/elemental/idl/scripts/systemgwt.py b/elemental/idl/scripts/systemgwt.py
new file mode 100644
index 0000000..f05f428
--- /dev/null
+++ b/elemental/idl/scripts/systemgwt.py
@@ -0,0 +1,416 @@
+#!/usr/bin/python
+# 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.
+
+"""This module providesfunctionality for systems to generate
+Elemental interfaces from the IDL database."""
+
+import pdb
+import os
+import json
+import systembaseelemental
+from generator_java import *
+
+
+class ElementalInterfacesSystem(systembaseelemental.SystemElemental):
+
+  def __init__(self, templates, database, emitters, output_dir):
+    super(ElementalInterfacesSystem, self).__init__(
+        templates, database, emitters, output_dir)
+    self._dart_interface_file_paths = []
+
+  def InterfaceGenerator(self,
+                         interface,
+                         common_prefix,
+                         super_interface_name,
+                         source_filter):
+    """."""
+
+    module = getModule(interface.annotations)
+    if super_interface_name is not None:
+      interface_name = super_interface_name
+    else:
+      interface_name = interface.id
+
+    dart_interface_file_path = self._FilePathForElementalInterface(module, interface_name)
+
+    self._dart_interface_file_paths.append(dart_interface_file_path)
+
+    dart_interface_code = self._emitters.FileEmitter(dart_interface_file_path)
+
+    template_file = 'java_interface_%s.darttemplate' % interface_name
+    template = self._templates.TryLoad(template_file)
+    if not template:
+      template = self._templates.Load('java_interface.darttemplate')
+
+    return ElementalInterfaceGenerator(module, self._database,
+        interface, dart_interface_code,
+        template,
+        common_prefix, super_interface_name,
+        source_filter)
+
+
+  def ProcessCallback(self, interface, info):
+    """Generates a typedef for the callback interface."""
+    interface_name = interface.id
+    module = getModule(interface.annotations)
+    file_path = self._FilePathForElementalInterface(module, interface_name)
+    self._dart_callback_file_paths.append(file_path)
+    code = self._emitters.FileEmitter(file_path)
+
+    code.Emit(self._templates.Load('javacallback.darttemplate'),
+              ID=interface.id,
+              NAME=interface.id,
+              TYPE=info.type_name,
+              PARAMS=info.ParametersImplementationDeclaration(),
+              PACKAGE='elemental.%s' % module,
+              IMPORTS='',
+              CLASSJAVADOC='')
+
+  def GenerateLibraries(self, lib_dir):
+    pass
+
+
+  def _FilePathForElementalInterface(self, module, interface_name):
+    """Returns the file path of the Dart interface definition."""
+    return os.path.join(self._output_dir, 'src', 'elemental', module,
+                        '%s.java' % interface_name)
+
+def _escapeComments(text):
+  return text.replace('*/', '*&#47;').encode('utf-8')
+
+# ------------------------------------------------------------------------------
+
+class ElementalInterfaceGenerator(systembaseelemental.ElementalBase):
+  """Generates Elemental Interface definition for one DOM IDL interface."""
+
+
+  def _GetJavaDoc(self, interface):
+    docid = interface.id
+    if docid not in self._docdatabase:
+        docid = 'HTML%s' % interface.id
+
+    if docid in self._docdatabase:
+        if 'summary' in self._docdatabase[docid]:
+          return _escapeComments(self._docdatabase[docid]['summary'])
+    return ""
+
+
+  def __init__(self, module, database, interface, emitter, template,
+               common_prefix, super_interface, source_filter):
+    """Generates Dart code for the given interface.
+
+    Args:
+      interface -- an IDLInterface instance. It is assumed that all types have
+        been converted to Dart types (e.g. int, String), unless they are in the
+        same package as the interface.
+      common_prefix -- the prefix for the common library, if any.
+      super_interface -- the name of the common interface that this interface
+        implements, if any.
+      source_filter -- if specified, rewrites the names of any superinterfaces
+        that are not from these sources to use the common prefix.
+    """
+    self._module = module
+    self._database = database
+    self._interface = interface
+    self._emitter = emitter
+    self._template = template
+    self._common_prefix = common_prefix
+    self._super_interface = super_interface
+    self._source_filter = source_filter
+
+    current_dir = os.path.dirname(__file__)
+    self._docdatabase = json.load(open(os.path.join(current_dir, '..', 'docs/database.json')))
+
+
+  def addImport(self, imports, typeid):
+      # skip primitive types that are all lowercase first letter
+      etype = DartType(typeid)
+      if '<' not in typeid and etype[0].isupper():
+        rawtype = etype.split('<')[0]
+
+        if rawtype in ['Indexable', 'Settable', 'Mappable']:
+          pmodule = 'util'
+          imports['import elemental.%s.%s;\n' % (pmodule, rawtype)]=1
+        elif etype not in java_lang and self._database.HasInterface(typeid):
+          pinterface = self._database.GetInterface(typeid)
+          pmodule = getModule(pinterface.annotations)
+          if pmodule != self._module:
+            imports['import elemental.%s.%s;\n' % (pmodule, rawtype)]=1
+
+  def StartInterface(self):
+    if self._super_interface:
+      typename = self._super_interface
+    else:
+      typename = self._interface.id
+
+
+    extends = []
+    suppressed_extends = []
+    imports = {}
+    implements_raw = {}
+
+    for attr in self._interface.attributes:
+      self.addImport(imports, attr.type.id)
+
+    for oper in self._interface.operations:
+      self.addImport(imports, oper.type.id)
+      for arg in oper.arguments:
+        self.addImport(imports, arg.type.id)
+
+
+    alreadyImplemented = {}        
+    if len(self._interface.parents) > 0:
+      self.getImplements(alreadyImplemented, self._interface.parents[0])
+
+    for parent in self._interface.parents:
+      if not parent.type.id in alreadyImplemented or parent.type.id == 'ElementalMixinBase':
+        self.addImport(imports, parent.type.id)
+      # TODO(vsm): Remove source_filter.
+        rawtype = DartType(parent.type.id).split('<')[0]
+        if MatchSourceFilter(self._source_filter, parent) and DartType(parent.type.id) != 'Object' and rawtype not in implements_raw:
+          # Parent is a DOM type.
+          extends.append(DartType(parent.type.id))
+          implements_raw[rawtype]=1
+
+#TODO(cromwellian) add in Indexable/IndexableInt/IndexableNumber
+#      elif '<' in parent.type.id:
+        # Parent is a Dart collection type.
+        # TODO(vsm): Make this check more robust.
+#        extends.append(parent.type.id)
+#      else:
+#        suppressed_extends.append('%s.%s' %
+#                                  (self._common_prefix, parent.type.id))
+
+    if self._interface.parents:
+      rawtype = DartType(self._interface.parents[0].type.id).split('<')[0]
+      if rawtype not in implements_raw:
+        extends.insert(0, DartType(self._interface.parents[0].type.id))
+        self.addImport(imports, self._interface.parents[0].type.id)          
+
+
+    comment = ' extends'
+    extends_str = ''
+    if extends:
+      extends_str += ' extends ' + ', '.join(extends)
+      comment = ','
+    if suppressed_extends:
+      extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends))
+
+    factory_provider = None
+    constructor_info = AnalyzeConstructor(self._interface)
+
+    # TODO(vsm): Add appropriate package / namespace syntax.
+    (self._members_emitter,
+     self._top_level_emitter) = self._emitter.Emit(
+         self._template + '$!TOP_LEVEL',
+         ID=typename,
+         EXTENDS=extends_str, PACKAGE='elemental.' + self._module,
+         CLASSJAVADOC = self._GetJavaDoc(self._interface),
+         IMPORTS = ''.join(imports.keys()))
+
+# TODO(cromwellian) auto-generate factory classes?
+
+#    if constructor_info:
+#      self._members_emitter.Emit(
+#          '\n'
+#          '  $CTOR($PARAMS);\n',
+#          CTOR=typename,
+#          PARAMS=constructor_info.ParametersInterfaceDeclaration());
+
+#    element_type = MaybeTypedArrayElementType(self._interface)
+#    if element_type:
+#      self._members_emitter.Emit(
+#          '\n'
+#          '  $CTOR(int length);\n'
+#          '\n'
+#          '  $CTOR.fromList(List<$TYPE> list);\n'
+#          '\n'
+#          '  $CTOR.fromBuffer(ArrayBuffer buffer,'
+#                            ' [int byteOffset, int length]);\n',
+#          CTOR=self._interface.id,
+#          TYPE=DartType(element_type))
+
+
+  def FinishInterface(self):
+    # TODO(vsm): Use typedef if / when that is supported in Dart.
+    # Define variant as subtype.
+    if (self._super_interface and
+        self._interface.id is not self._super_interface):
+      consts_emitter = self._top_level_emitter.Emit(
+          '\n'
+          'interface $NAME extends $BASE {\n'
+          '$!CONSTS'
+          '}\n',
+          NAME=self._interface.id,
+          BASE=self._super_interface)
+      for const in sorted(self._interface.constants, ConstantOutputOrder):
+        self._EmitConstant(consts_emitter, const)
+    if self._interface.id == 'Document':
+     for iface in self._database.GetInterfaces():
+       if iface.id.endswith("Element"):
+         if iface.id == 'Element' or iface.id == 'SVGElement':
+           continue
+         callName = DartType(iface.id)
+         if iface.id == 'SVGSVGElement':
+           callName = 'SVGElement'
+         self._members_emitter.Emit('\n  $TYPE create$CALL();\n',
+                                    CALL = callName,
+                                    TYPE=DartType(iface.id))
+
+    if self._interface.id == 'Window':
+     for iface in self._database.GetInterfaces():
+       element_type = MaybeTypedArrayElementType(iface)
+       if element_type:
+         self._members_emitter.Emit(
+           '\n'
+           '  $TYPE new$CTOR(int length);\n'
+           '\n'
+           '  $TYPE new$CTOR(IndexableNumber list);\n'
+           '\n'
+           '  $TYPE new$CTOR(ArrayBuffer buffer,'
+           ' int byteOffset, int length);\n',
+           CTOR=iface.id,
+           TYPE=iface.id)
+       constructor_info = AnalyzeConstructor(iface)
+       if constructor_info:
+         self._members_emitter.Emit(
+           '\n'
+           '  $TYPE new$CTOR($PARAMS);\n',
+           TYPE=iface.id,
+           CTOR=iface.id,
+           PARAMS=constructor_info.ParametersInterfaceDeclaration());
+           
+  def AddConstant(self, constant):
+    if (not self._super_interface or
+        self._interface.id is self._super_interface):
+      self._EmitConstant(self._members_emitter, constant)
+
+  def _EmitConstant(self, emitter, constant):
+    javadoc = self.find_doc(constant.id)
+    javadoctemplate = '\n  /**\n    * $JAVADOC\n    */\n';
+    if javadoc == '':
+      javadoctemplate = ''
+
+    emitter.Emit('%s\n    static final $TYPE$NAME = $VALUE;\n' % javadoctemplate,
+                 NAME=constant.id,
+                 TYPE=TypeOrNothing(DartType(constant.type.id),
+                                    None),
+                 VALUE=constant.value,
+                 JAVADOC = javadoc)
+
+
+  def AddAttribute(self, getter, setter, inheritedGetter, inheritedSetter):
+    javadoc = self.find_doc(getter.id)
+    javadoctemplate = '\n  /**\n    * $JAVADOC\n    */\n';
+    if javadoc == '':
+      javadoctemplate = ''
+
+    if getter:
+      self._members_emitter.Emit('\n%s  $TYPE $NAME();\n' % javadoctemplate,
+                                 NAME=getterName(getter),
+                                 TYPE=TypeOrVar(DartType(getter.type.id),
+                                                getter.type.id),
+                                 JAVADOC=javadoc)
+
+    if setter:
+      self._members_emitter.Emit('\n  void $NAME($TYPE arg);\n',
+                                 NAME=setterName(setter),
+                                 TYPE=TypeOrVar(DartType(setter.type.id),
+                                                setter.type.id),
+                                 ARG=setter.type.id)
+      return
+
+  def AddIndexer(self, element_type):
+    # Interface inherits all operations from List<element_type>.
+    pass
+
+  def AddOperation(self, info, inherited):
+    """
+    Arguments:
+      operations - contains the overloads, one or more operations with the same
+        name.
+    """
+    javadoc = self.find_doc(info.name)
+    javadoctemplate = '\n  /**\n    * $JAVADOC\n    */\n';
+    
+    if javadoc == '':
+      javadoctemplate = ''
+    get_attrs = []
+    set_attrs = []
+    for attr in self._interface.attributes:
+      get_attrs.append(getterName(attr))
+      set_attrs.append(setterName(attr))
+
+    if info.name in get_attrs or info.name in set_attrs:
+      return
+
+    return_type = info.type_name
+    if info.name == 'addEventListener':
+      return_type = 'EventRemover'
+
+    self._members_emitter.Emit('\n%s  $TYPE $NAME($PARAMS);\n' % javadoctemplate,
+                               TYPE=return_type,
+                               NAME=self.fixReservedKeyWords(info.name),
+                               PARAMS=info.ParametersInterfaceDeclaration(),
+                               JAVADOC=javadoc)
+
+  def AddStaticOperation(self, info, inherited):
+    pass
+
+  # Interfaces get secondary members directly via the superinterfaces.
+  def AddSecondaryAttribute(self, interface, getter, setter):
+    pass
+
+  def AddSecondaryOperation(self, interface, attr):
+    pass
+
+  def find_doc(self, name):
+    docid = self._interface.id
+    if docid not in self._docdatabase:
+        docid = 'HTML%s' % self._interface.id
+
+    docmembers = []
+    docmember = {}
+    if docid in self._docdatabase and 'members' in self._docdatabase[docid]:
+        docmembers  = self._docdatabase[docid]['members']
+    for member in docmembers:
+      if member['name'] == name:
+        docmember = member
+    if 'help' in docmember:
+      return _escapeComments(docmember['help'])
+    return ""
+
+def ucfirst(string):
+  """Upper cases the 1st character in a string"""
+  if len(string):
+    return '%s%s' % (string[0].upper(), string[1:])
+  return string
+
+def getterName(attr):
+  name = DartDomNameOfAttribute(attr)
+  if attr.type.id == 'boolean':
+    if name.startswith('is'):
+      name = name[2:]
+    return 'is%s' % ucfirst(name)
+  return 'get%s' % ucfirst(name)
+
+def setterName(attr):
+  name = DartDomNameOfAttribute(attr)
+  return 'set%s' % ucfirst(name)
+
+def getModule(annotations):
+  htmlaliases = ['audio', 'webaudio', 'inspector', 'offline', 'p2p', 'window', 'websockets', 'threads', 'view', 'storage', 'fileapi']
+
+  module = "dom"
+  if 'WebKit' in annotations and 'module' in annotations['WebKit']:
+    module = annotations['WebKit']['module']
+  if module in  htmlaliases:
+    return "html"
+  if module == 'core':
+    return 'dom'
+  return module
+
+java_lang = ['Object', 'String', 'Exception', 'DOMTimeStamp', 'DOMString']
+
diff --git a/elemental/idl/scripts/systemgwtjso.py b/elemental/idl/scripts/systemgwtjso.py
new file mode 100644
index 0000000..fceeb46
--- /dev/null
+++ b/elemental/idl/scripts/systemgwtjso.py
@@ -0,0 +1,441 @@
+#!/usr/bin/python
+# 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.
+
+"""This module providesfunctionality for systems to generate
+Elemental interfaces from the IDL database."""
+
+import pdb
+import os
+import json
+import systembaseelemental
+from generator_java import *
+
+
+class ElementalJsoSystem(systembaseelemental.SystemElemental):
+
+  def __init__(self, templates, database, emitters, output_dir):
+    super(ElementalJsoSystem, self).__init__(
+        templates, database, emitters, output_dir)
+    self._dart_interface_file_paths = []
+
+  def InterfaceGenerator(self,
+                         interface,
+                         common_prefix,
+                         super_interface_name,
+                         source_filter):
+    """."""
+
+    module = getModule(interface.annotations)
+    if super_interface_name is not None:
+      interface_name = super_interface_name
+    else:
+      interface_name = interface.id
+
+    template_file = 'jso_impl_%s.darttemplate' % interface_name
+    template = self._templates.TryLoad(template_file)
+    if not template:
+      template = self._templates.Load('jso_impl.darttemplate')
+
+    if interface_name in self._mixins or interface_name.endswith("Callback") or interface_name.endswith('Handler'):
+      return NullInterfaceGenerator(module, self._database,
+        interface, None,
+        template,
+        common_prefix, super_interface_name,
+        source_filter)
+
+    dart_interface_file_path = self._FilePathForElementalInterface(module, interface_name)
+
+    self._dart_interface_file_paths.append(dart_interface_file_path)
+
+    dart_interface_code = self._emitters.FileEmitter(dart_interface_file_path)
+
+    return ElementalInterfaceGenerator(module, self._database,
+        interface, dart_interface_code,
+        template,
+        common_prefix, super_interface_name,
+        source_filter, self._mixins)
+
+  def ProcessCallback(self, interface, info):
+    pass
+
+
+  def _FilePathForElementalInterface(self, module, interface_name):
+    """Returns the file path of the Dart interface definition."""
+    return os.path.join(self._output_dir, 'src', 'elemental', "js", module,
+                        'Js%s.java' % interface_name)
+
+
+# ------------------------------------------------------------------------------
+# Used to suppress generation of JSO classes that are not needed
+class NullInterfaceGenerator(systembaseelemental.ElementalBase):
+  def __init__(self, module, database, interface, emitter, template,
+               common_prefix, super_interface, source_filter):
+    pass
+
+  def StartInterface(self):
+    pass
+  def AddOperation(self, x, inherited):
+    pass
+
+  def AddIndexer(self, x):
+    pass
+
+  def AddConstant(self, x):
+    pass
+
+  def AddAttribute(self, x, y, inheritedGetter, inheritedSetter):
+    pass
+
+  def FinishInterface(self):
+    pass
+
+
+class ElementalInterfaceGenerator(systembaseelemental.ElementalBase):
+  """Generates Elemental Interface definition for one DOM IDL interface."""
+
+  def __init__(self, module, database, interface, emitter, template,
+               common_prefix, super_interface, source_filter, mixins):
+    """Generates Dart code for the given interface.
+
+    Args:
+      interface -- an IDLInterface instance. It is assumed that all types have
+        been converted to Dart types (e.g. int, String), unless they are in the
+        same package as the interface.
+      common_prefix -- the prefix for the common library, if any.
+      super_interface -- the name of the common interface that this interface
+        implements, if any.
+      source_filter -- if specified, rewrites the names of any superinterfaces
+        that are not from these sources to use the common prefix.
+    """
+    super(self.__class__, self).__init__()
+    self._module = module
+    self._database = database
+    self._interface = interface
+    self._emitter = emitter
+    self._template = template
+    self._common_prefix = common_prefix
+    self._super_interface = super_interface
+    self._source_filter = source_filter
+    self._mixins = mixins
+
+    current_dir = os.path.dirname(__file__)
+    self._docdatabase = json.load(open(os.path.join(current_dir, '..', 'docs/database.json')))
+
+
+  def addImport(self, imports, typeid):
+      # skip primitive types that are all lowercase first letter
+      etype = DartType(typeid)
+
+      if '<' not in typeid and etype[0].isupper():
+        rawtype = etype.split('<')[0]
+
+        if rawtype in ['Indexable', 'Settable', 'Mappable']:
+          pmodule = 'util'
+          imports['import elemental.js.%s.%s;\n' % (pmodule, 'Js' + rawtype)]=1
+          imports['import elemental.%s.%s;\n' % (pmodule, rawtype)]=1
+        elif etype not in java_lang and self._database.HasInterface(typeid):
+          pinterface = self._database.GetInterface(typeid)
+          pmodule = getModule(pinterface.annotations)
+          if pmodule != self._module and not rawtype.endswith("Callback") and not rawtype.endswith("Handler") and not rawtype == 'EventTarget':
+            imports['import elemental.js.%s.%s;\n' % (pmodule, 'Js' + rawtype)]=1
+          imports['import elemental.%s.%s;\n' % (pmodule, rawtype)]=1
+
+  def StartInterface(self):
+    if self._super_interface:
+      typename = self._super_interface
+    else:
+      typename = self._interface.id
+
+
+    implements = []
+    implements_raw = {}
+    extends = ''
+    suppressed_extends = []
+    imports = {}
+
+    alreadyImplemented = {}        
+    for p in self._interface.parents:
+      self.getImplements(alreadyImplemented, p)
+
+    for attr in self._interface.attributes:
+      self.addImport(imports, attr.type.id)
+
+    for oper in self._interface.operations:
+      self.addImport(imports, oper.type.id)
+      for arg in oper.arguments:
+        self.addImport(imports, arg.type.id)
+
+    for parent in self._interface.parents:
+      if not parent.type.id in alreadyImplemented or parent.type.id == 'ElementalMixinBase':
+        self.addImport(imports, parent.type.id)
+      # TODO(vsm): Remove source_filter.
+        rawtype = DartType(parent.type.id).split('<')[0]
+        if rawtype == 'Object':
+          continue
+        if MatchSourceFilter(self._source_filter, parent) and DartType(parent.type.id) != 'Object' and rawtype not in implements_raw:
+          # Parent is a DOM type.
+          implements.append(DartType(parent.type.id))
+          implements_raw[rawtype]=1
+
+#TODO(cromwellian) add in Indexable/IndexableInt/IndexableNumber
+#      elif '<' in parent.type.id:
+        # Parent is a Dart collection type.
+        # TODO(vsm): Make this check more robust.
+#        extends.append(parent.type.id)
+#      else:
+#        suppressed_extends.append('%s.%s' %
+#                                  (self._common_prefix, parent.type.id))
+
+    comment = ' extends'
+
+    implements_str = ''
+
+    # the Mixin base class is special, it extends JSO
+    if self._interface.id == 'ElementalMixinBase':
+      extends = ' extends JsElementalBase'
+      filtered_mixins = []
+      for mixin in self._mixins:
+        filtered_mixins.append(DartType(mixin))
+      implements.extend(filtered_mixins)
+    else:
+      # default, every type extends the Mixin base
+      extends = ' extends JsElementalMixinBase'
+    
+    rawtype = DartType(self._interface.id).split('<')[0]
+    if rawtype not in implements_raw and rawtype != 'Object':
+      implements.insert(0, DartType(self._interface.id))
+    self.addImport(imports, self._interface.id)
+
+    # parents[0] is the implementing superclass, if exists, but not a mixin, reference its JSO impl
+    if len(self._interface.parents) > 0 and not self._interface.parents[0].type.id in self._mixins:
+      extends = ' extends Js' + DartType(self._interface.parents[0].type.id)
+      self.addImport(imports, self._interface.parents[0].type.id)
+
+    if implements:
+      implements_str += ' implements ' + ', '.join(implements)
+      comment = ','
+
+    factory_provider = None
+    constructor_info = AnalyzeConstructor(self._interface)
+
+    # TODO(vsm): Add appropriate package / namespace syntax.
+    (self._members_emitter,
+     self._top_level_emitter) = self._emitter.Emit(
+         self._template + '$!TOP_LEVEL',
+         ID='Js' + typename,
+         IMPLEMENTS=implements_str,
+         EXTENDS=extends, PACKAGE='elemental.js.' + self._module,
+         IMPORTS = ''.join(imports.keys()))
+
+# TODO(cromwellian) auto-generate factory classes?
+
+#    if constructor_info:
+#      self._members_emitter.Emit(
+#          '\n'
+#          '  $CTOR($PARAMS);\n',
+#          CTOR=typename,
+#          PARAMS=constructor_info.ParametersInterfaceDeclaration());
+
+#    element_type = MaybeTypedArrayElementType(self._interface)
+#    if element_type:
+#      self._members_emitter.Emit(
+#          '\n'
+#          '  $CTOR(int length);\n'
+#          '\n'
+#          '  $CTOR.fromList(List<$TYPE> list);\n'
+#          '\n'
+#          '  $CTOR.fromBuffer(ArrayBuffer buffer,'
+#                            ' [int byteOffset, int length]);\n',
+#          CTOR=self._interface.id,
+#          TYPE=DartType(element_type))
+
+
+  def FinishInterface(self):
+     # add all create* method implementations to Document
+     if self._interface.id == 'Document':
+       for iface in self._database.GetInterfaces():
+         if iface.id.endswith("Element"):
+           # try to determine tag name from interface name
+           elementName = iface.id;
+           elementName = elementName[0:len(elementName) - len("Element")].lower()
+           # tablecaption -> <caption>
+           if elementName == 'tablecaption':
+             elementName = 'caption'
+           # SVG is special, it needs createElementNS, strip off prefix
+           if elementName.startswith("svg"):
+             elementName = elementName[3:]
+             # special case, SVGElement is a root class, not a createable element
+             if elementName != '':
+               callName = DartType(iface.id)
+               # SVGSVGElement -> createSVGElement with tag as <svg>
+               if elementName == 'svg':
+                 callName = 'SVGElement'
+               self._members_emitter.Emit('\n  public final Js$TYPE create$CALL() {\n    return createSvgElement("$ELEMENT").cast();\n  }\n',
+                                          TYPE=DartType(iface.id),
+                                          CALL = callName,
+                                          ELEMENT=elementName)
+           elif elementName != '':
+               self._members_emitter.Emit('\n  public final Js$TYPE create$TYPE() {\n    return createElement("$ELEMENT").cast();\n  }\n',
+                                          TYPE=DartType(iface.id),
+                                          ELEMENT=elementName)
+     if self._interface.id == 'Window':
+       for iface in self._database.GetInterfaces():
+         element_type = MaybeTypedArrayElementType(iface)
+         if element_type:
+           self._members_emitter.Emit(
+           '\n'
+           '  public final native Js$TYPE new$CTOR(int length) /*-{ return new $TYPE(length); }-*/;\n'
+           '\n'
+           '  public final native Js$TYPE new$CTOR(IndexableNumber list) /*-{ return new $TYPE(list); }-*/;\n'
+           '\n'
+           '  public final native Js$TYPE new$CTOR(ArrayBuffer buffer,'
+           ' int byteOffset, int length) /*-{ return new $TYPE(buffer, byteOffset, length); }-*/;\n',
+           CTOR=iface.id,
+           TYPE=iface.id)
+         constructor_info = AnalyzeConstructor(iface)
+         if constructor_info:
+           self._members_emitter.Emit(
+             '\n'
+             '  public final native Js$TYPE new$CTOR($PARAMS) /*-{ return new $TYPE($ARGS); }-*/;\n',
+             TYPE=iface.id,
+             CTOR=iface.id,
+             PARAMS=constructor_info.ParametersInterfaceDeclaration(),
+             ARGS=constructor_info.ParametersAsArgumentList(self._database));
+
+
+  def AddConstant(self, constant):
+    pass
+
+  def AddAttribute(self, getter, setter, inheritedGetter, inheritedSetter):
+    # you can't override methods in a JSO superclass
+    if getter and not inheritedGetter:
+      if getter.type.id == 'EventListener':
+        self._members_emitter.Emit('\n  public final native $TYPE $NAME() /*-{\n    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.$FIELD);\n  }-*/;\n',
+                                   NAME=getterName(getter),
+                                   TYPE=TypeOrVar(DartType(getter.type.id),
+                                                  getter.type.id),
+                                   FIELD=getter.id)
+      else:
+        field = 'this.$FIELD'
+        if getter.id in self.reserved_keywords:
+          field_template = "this['$FIELD']"
+        else:
+          field_template = "this.$FIELD"
+        self._members_emitter.Emit('\n  public final native $TYPE $NAME() /*-{\n    return %s;\n  }-*/;\n' % field_template ,
+                                   NAME=getterName(getter),
+                                   TYPE=JsoTypeOrVar(DartType(getter.type.id), self._mixins),
+                                   FIELD=getter.id)
+    if setter and not inheritedSetter:
+        if setter.type.id == 'EventListener':
+          self._members_emitter.Emit('\n  public final native void $NAME($TYPE listener) /*-{\n    this.$FIELD = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);\n  }-*/;',
+                                     NAME=setterName(setter),
+                                     TYPE=TypeOrVar(DartType(setter.type.id),
+                                                    setter.type.id),
+                                     FIELD=setter.type.id)
+        else:
+          if setter.id in self.reserved_keywords:
+            field_template = "this['$FIELD']"
+          else:
+            field_template = "this.$FIELD"
+          self._members_emitter.Emit('\n  public final native void $NAME($TYPE param_$FIELD) /*-{\n    %s = param_$FIELD;\n  }-*/;\n' % field_template,
+                                     NAME=setterName(setter),
+                                     TYPE=TypeOrVar(DartType(setter.type.id)),
+                                     FIELD=setter.id)
+
+  def AddIndexer(self, element_type):
+    # Interface inherits all operations from List<element_type>.
+    pass
+
+  def AddOperation(self, info, inherited):
+    """
+    Arguments:
+      operations - contains the overloads, one or more operations with the same
+        name.
+    """
+    # you can't override methods on a JSO superclass
+    if inherited:
+      return
+    # implemented on mixin base template (hack)
+    if info.name == 'addEventListener' or info.name == 'removeEventListener':
+      return
+
+    get_attrs = []
+    set_attrs = []
+    for attr in self._interface.attributes:
+      get_attrs.append(getterName(attr))
+      set_attrs.append('set%s' % ucfirst(attr.id))
+
+    if info.name in get_attrs or info.name in set_attrs:
+      return
+    body = ''
+    if info.type_name != 'void':
+      body += 'return '
+#    if op.is_fc_deleter:
+#            w('delete ')
+#     if info.id is None:
+#            w('this[')
+#        else:
+    args = info.ParametersAsArgumentList(self._database)
+    if info.name in self.reserved_keywords:
+      body += "this['%s'](%s" % (info.name, args)
+    else:
+      body += 'this.%s(%s' % (info.name, args)
+
+
+    #if op.id is None:
+#            w('];\n')
+#        else:
+    body += ');'
+
+    self._members_emitter.Emit('\n  public final native $TYPE $NAME($PARAMS) /*-{\n    $BODY\n  }-*/;\n',
+                               TYPE=JsoTypeOrVar(info.type_name, self._mixins),
+                               NAME=self.fixReservedKeyWords(info.name),
+                               PARAMS=info.ParametersInterfaceDeclaration(),
+                               BODY=body)
+
+  def AddStaticOperation(self, info, inherited):
+    pass
+
+  # Interfaces get secondary members directly via the superinterfaces.
+  def AddSecondaryAttribute(self, interface, getter, setter):
+    pass
+
+  def AddSecondaryOperation(self, interface, attr):
+    pass
+
+
+def ucfirst(string):
+  """Upper cases the 1st character in a string"""
+  if len(string):
+    return '%s%s' % (string[0].upper(), string[1:])
+  return string
+
+def getterName(attr):
+  name = DartDomNameOfAttribute(attr)
+  if attr.type.id == 'boolean':
+    if name.startswith('is'):
+      name = name[2:]
+    return 'is%s' % ucfirst(name)
+  return 'get%s' % ucfirst(name)
+
+def setterName(attr):
+  name = DartDomNameOfAttribute(attr)
+  return 'set%s' % ucfirst(name)
+
+
+def getModule(annotations):
+  htmlaliases = ['audio', 'webaudio', 'inspector', 'offline', 'p2p', 'window', 'websockets', 'threads', 'view', 'storage', 'fileapi']
+
+  module = "dom"
+  if 'WebKit' in annotations and 'module' in annotations['WebKit']:
+    module = annotations['WebKit']['module']
+  if module in  htmlaliases:
+    return "html"
+  if module == 'core':
+    return 'dom'
+  return module
+
+java_lang = ['Object', 'String', 'Exception', 'DOMTimeStamp', 'DOMString']
+
diff --git a/elemental/idl/scripts/templateloader.py b/elemental/idl/scripts/templateloader.py
new file mode 100644
index 0000000..64e4a8d
--- /dev/null
+++ b/elemental/idl/scripts/templateloader.py
@@ -0,0 +1,113 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+# Template loader and preprocessor.
+#
+# Preprocessor language:
+#
+#   $if VAR
+#   $else
+#   $endif
+#
+# VAR must be defined in the conditions dictionary.
+
+import os
+
+class TemplateLoader(object):
+  """Loads template files from a path."""
+
+  def __init__(self, root, subpaths, conditions = {}):
+    """Initializes loader.
+
+    Args:
+      root - a string, the directory under which the templates are stored.
+      subpaths - a list of strings, subpaths of root in search order.
+      conditions - a dictionay from strings to booleans.  Any conditional
+        expression must be a key in the map.
+    """
+    self._root = root
+    self._subpaths = subpaths
+    self._conditions = conditions
+    self._cache = {}
+
+  def TryLoad(self, name):
+    """Returns content of template file as a string, or None of not found."""
+    if name in self._cache:
+      return self._cache[name]
+
+    for subpath in self._subpaths:
+      template_file = os.path.join(self._root, subpath, name)
+      if os.path.exists(template_file):
+        template = ''.join(open(template_file).readlines())
+        template = self._Preprocess(template, template_file)
+        self._cache[name] = template
+        return template
+
+    return None
+
+  def Load(self, name):
+    """Returns contents of template file as a string, or raises an exception."""
+    template = self.TryLoad(name)
+    if template is not None:  # Can be empty string
+      return template
+    raise Exception("Could not find template '%s' on %s / %s" % (
+        name, self._root, self._subpaths))
+
+  def _Preprocess(self, template, filename):
+    def error(lineno, message):
+      raise Exception('%s:%s: %s' % (filename, lineno, message))
+
+    lines = template.splitlines(True)
+    out = []
+
+    condition_stack = []
+    active = True
+    seen_else = False
+
+    for (lineno, full_line) in enumerate(lines):
+      line = full_line.strip()
+
+      if line.startswith('$'):
+        words = line.split()
+        directive = words[0]
+
+        if directive == '$if':
+          if len(words) != 2:
+            error(lineno, '$if does not have single variable')
+          variable = words[1]
+          if variable in self._conditions:
+            condition_stack.append((active, seen_else))
+            active = self._conditions[variable]
+            seen_else = False
+          else:
+            error(lineno, "Unknown $if variable '%s'" % variable)
+
+        elif directive == '$else':
+          if not condition_stack:
+            error(lineno, '$else without $if')
+          if seen_else:
+            raise error(lineno, 'Double $else')
+          seen_else = True
+          active = not active
+
+        elif directive == '$endif':
+          if not condition_stack:
+            error(lineno, '$endif without $if')
+          (active, seen_else) = condition_stack.pop()
+
+        else:
+          # Something else, like '$!MEMBERS'
+          if active:
+            out.append(full_line)
+
+      else:
+        if active:
+          out.append(full_line);
+        continue
+
+    if condition_stack:
+      error(len(lines), 'Unterminated $if')
+
+    return ''.join(out)
diff --git a/elemental/idl/scripts/templateloader_test.py b/elemental/idl/scripts/templateloader_test.py
new file mode 100755
index 0000000..165b566
--- /dev/null
+++ b/elemental/idl/scripts/templateloader_test.py
@@ -0,0 +1,125 @@
+#!/usr/bin/python
+# Copyright (c) 2011, 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.
+
+import logging.config
+import unittest
+import templateloader
+
+class TemplateLoaderTestCase(unittest.TestCase):
+
+  def _preprocess(self, input_text, conds):
+    loader = templateloader.TemplateLoader('.', [], conds)
+    return loader._Preprocess(input_text, '<file>')
+
+
+  def _preprocess_test(self, input_text, conds, expected_text):
+    output_text = self._preprocess(input_text, conds)
+    if output_text != expected_text:
+      msg = '''
+EXPECTED:
+%s
+---
+ACTUAL  :
+%s
+---''' % (expected_text, output_text)
+      self.fail(msg)
+
+
+  def _preprocess_error_test(self, input_text, conds, expected_message):
+    threw = False
+    try:
+      output_text = self._preprocess(input_text, conds)
+    except Exception, e:
+      threw = True
+      if str(e).find(expected_message) == -1:
+        self.fail("'%s' does not contain '%s'" % (e, expected_message))
+    if not threw:
+      self.fail("missing error, expected '%s'" % expected_message)
+
+
+  def test_freevar(self):
+    input_text = '''$A
+$B'''
+    self._preprocess_test(input_text, {}, input_text)
+
+
+  def test_ite1(self):
+    input_text = '''
+        aaa
+        $if A
+        bbb
+        $else
+        ccc
+        $endif
+        ddd
+        '''
+    self._preprocess_test(input_text, {'A':True},
+        '''
+        aaa
+        bbb
+        ddd
+        ''')
+
+  def test_ite2(self):
+    input_text = '''
+        aaa
+        $if A
+        bbb
+        $else
+        ccc
+        $endif
+        ddd
+        '''
+    self._preprocess_test(input_text, {'A':False},
+        '''
+        aaa
+        ccc
+        ddd
+        ''')
+
+  def test_if1(self):
+    input_text = '''
+       $if
+       '''
+    self._preprocess_error_test(input_text, {},
+        '$if does not have single variable')
+
+  def test_if2(self):
+    input_text = '''
+       $if A
+       '''
+    self._preprocess_error_test(input_text, {}, 'Unknown $if variable')
+
+  def test_else1(self):
+    input_text = '''
+       $else
+       '''
+    self._preprocess_error_test(input_text, {}, '$else without $if')
+
+  def test_else2(self):
+    input_text = '''
+       $if A
+       $else
+       $else
+       '''
+    self._preprocess_error_test(input_text, {'A':True}, 'Double $else')
+
+  def test_eof1(self):
+    input_text = '''
+       $if A
+       '''
+    self._preprocess_error_test(input_text, {'A':True}, 'Unterminated')
+
+  def test_eof2(self):
+    input_text = '''
+       $if A
+       $else
+       '''
+    self._preprocess_error_test(input_text, {'A':True}, 'Unterminated')
+
+if __name__ == "__main__":
+  logging.config.fileConfig("logging.conf")
+  if __name__ == '__main__':
+    unittest.main()
diff --git a/elemental/idl/templates/java_impl.darttemplate b/elemental/idl/templates/java_impl.darttemplate
new file mode 100644
index 0000000..3b4c501
--- /dev/null
+++ b/elemental/idl/templates/java_impl.darttemplate
@@ -0,0 +1,10 @@
+
+package $PACKAGE;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * $CLASS_JAVADOC
+  */
+public class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS}
diff --git a/elemental/idl/templates/java_impl_CSSStyleDeclaration.darttemplate b/elemental/idl/templates/java_impl_CSSStyleDeclaration.darttemplate
new file mode 100644
index 0000000..e4955b4
--- /dev/null
+++ b/elemental/idl/templates/java_impl_CSSStyleDeclaration.darttemplate
@@ -0,0 +1,1179 @@
+
+package $PACKAGE;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * $CLASS_JAVADOC
+  */
+public class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+public interface Unit {
+  public static final String PX = "px";
+  public static final String PCT = "%";
+  public static final String EM = "em";
+  public static final String EX = "ex";
+  public static final String PT = "pt";
+  public static final String PC = "pc";
+  public static final String IN = "in";
+  public static final String CM = "cm";
+  public static final String MM = "mm";
+}
+
+String getColor();
+void setColor(String value);
+void clearColor();
+String getDirection();
+void setDirection(String value);
+void clearDirection();
+
+public interface Display {
+  public static final String NONE = "none";
+  public static final String BLOCK = "block";
+  public static final String INLINE = "inline";
+  public static final String INLINE_BLOCK = "inline-block";
+}
+
+String getDisplay();
+void setDisplay(String value);
+void clearDisplay();
+String getFont();
+void setFont(String value);
+void clearFont();
+String getFontFamily();
+void setFontFamily(String value);
+void clearFontFamily();
+String getFontSize();
+void setFontSize(String value);
+void clearFontSize();
+void setFontSize(double value, String unit);
+
+public interface FontStyle {
+  public static final String NORMAL = "normal";
+  public static final String ITALIC = "italic";
+  public static final String OBLIQUE = "oblique";
+}
+
+String getFontStyle();
+void setFontStyle(String value);
+void clearFontStyle();
+
+public interface FontWeight {
+  public static final String NORMAL = "normal";
+  public static final String BOLD = "bold";
+  public static final String BOLDER = "bolder";
+  public static final String LIGHTER = "lighter";
+}
+
+String getFontWeight();
+void setFontWeight(String value);
+void clearFontWeight();
+String getFontVariant();
+void setFontVariant(String value);
+void clearFontVariant();
+String getTextRendering();
+void setTextRendering(String value);
+void clearTextRendering();
+String getWebkitFontFeatureSettings();
+void setWebkitFontFeatureSettings(String value);
+void clearWebkitFontFeatureSettings();
+String getWebkitFontKerning();
+void setWebkitFontKerning(String value);
+void clearWebkitFontKerning();
+String getWebkitFontSmoothing();
+void setWebkitFontSmoothing(String value);
+void clearWebkitFontSmoothing();
+String getWebkitFontVariantLigatures();
+void setWebkitFontVariantLigatures(String value);
+void clearWebkitFontVariantLigatures();
+String getWebkitLocale();
+void setWebkitLocale(String value);
+void clearWebkitLocale();
+String getWebkitTextOrientation();
+void setWebkitTextOrientation(String value);
+void clearWebkitTextOrientation();
+String getWebkitTextSizeAdjust();
+void setWebkitTextSizeAdjust(String value);
+void clearWebkitTextSizeAdjust();
+String getWebkitWritingMode();
+void setWebkitWritingMode(String value);
+void clearWebkitWritingMode();
+String getZoom();
+void setZoom(String value);
+void clearZoom();
+String getLineHeight();
+void setLineHeight(String value);
+void clearLineHeight();
+String getBackground();
+void setBackground(String value);
+void clearBackground();
+String getBackgroundAttachment();
+void setBackgroundAttachment(String value);
+void clearBackgroundAttachment();
+String getBackgroundClip();
+void setBackgroundClip(String value);
+void clearBackgroundClip();
+String getBackgroundColor();
+void setBackgroundColor(String value);
+void clearBackgroundColor();
+String getBackgroundImage();
+void setBackgroundImage(String value);
+void clearBackgroundImage();
+String getBackgroundOrigin();
+void setBackgroundOrigin(String value);
+void clearBackgroundOrigin();
+String getBackgroundPosition();
+void setBackgroundPosition(String value);
+void clearBackgroundPosition();
+String getBackgroundPositionX();
+void setBackgroundPositionX(String value);
+void clearBackgroundPositionX();
+String getBackgroundPositionY();
+void setBackgroundPositionY(String value);
+void clearBackgroundPositionY();
+String getBackgroundRepeat();
+void setBackgroundRepeat(String value);
+void clearBackgroundRepeat();
+String getBackgroundRepeatX();
+void setBackgroundRepeatX(String value);
+void clearBackgroundRepeatX();
+String getBackgroundRepeatY();
+void setBackgroundRepeatY(String value);
+void clearBackgroundRepeatY();
+String getBackgroundSize();
+void setBackgroundSize(String value);
+void clearBackgroundSize();
+String getBorder();
+void setBorder(String value);
+void clearBorder();
+String getBorderBottom();
+void setBorderBottom(String value);
+void clearBorderBottom();
+String getBorderBottomColor();
+void setBorderBottomColor(String value);
+void clearBorderBottomColor();
+String getBorderBottomLeftRadius();
+void setBorderBottomLeftRadius(String value);
+void clearBorderBottomLeftRadius();
+String getBorderBottomRightRadius();
+void setBorderBottomRightRadius(String value);
+void clearBorderBottomRightRadius();
+String getBorderBottomStyle();
+void setBorderBottomStyle(String value);
+void clearBorderBottomStyle();
+String getBorderBottomWidth();
+void setBorderBottomWidth(String value);
+void clearBorderBottomWidth();
+String getBorderCollapse();
+void setBorderCollapse(String value);
+void clearBorderCollapse();
+String getBorderColor();
+void setBorderColor(String value);
+void clearBorderColor();
+String getBorderImage();
+void setBorderImage(String value);
+void clearBorderImage();
+String getBorderImageOutset();
+void setBorderImageOutset(String value);
+void clearBorderImageOutset();
+String getBorderImageRepeat();
+void setBorderImageRepeat(String value);
+void clearBorderImageRepeat();
+String getBorderImageSlice();
+void setBorderImageSlice(String value);
+void clearBorderImageSlice();
+String getBorderImageSource();
+void setBorderImageSource(String value);
+void clearBorderImageSource();
+String getBorderImageWidth();
+void setBorderImageWidth(String value);
+void clearBorderImageWidth();
+String getBorderLeft();
+void setBorderLeft(String value);
+void clearBorderLeft();
+String getBorderLeftColor();
+void setBorderLeftColor(String value);
+void clearBorderLeftColor();
+String getBorderLeftStyle();
+void setBorderLeftStyle(String value);
+void clearBorderLeftStyle();
+String getBorderLeftWidth();
+void setBorderLeftWidth(String value);
+void clearBorderLeftWidth();
+String getBorderRadius();
+void setBorderRadius(String value);
+void clearBorderRadius();
+String getBorderRight();
+void setBorderRight(String value);
+void clearBorderRight();
+String getBorderRightColor();
+void setBorderRightColor(String value);
+void clearBorderRightColor();
+String getBorderRightStyle();
+void setBorderRightStyle(String value);
+void clearBorderRightStyle();
+String getBorderRightWidth();
+void setBorderRightWidth(String value);
+void clearBorderRightWidth();
+String getBorderSpacing();
+void setBorderSpacing(String value);
+void clearBorderSpacing();
+
+public interface BorderStyle {
+  public static final String NONE = "none";
+  public static final String HIDDEN = "hidden";
+  public static final String DOTTED = "dotted";
+  public static final String DASHED = "dashed";
+  public static final String SOLID = "solid";
+}
+
+String getBorderStyle();
+void setBorderStyle(String value);
+void clearBorderStyle();
+String getBorderTop();
+void setBorderTop(String value);
+void clearBorderTop();
+String getBorderTopColor();
+void setBorderTopColor(String value);
+void clearBorderTopColor();
+String getBorderTopLeftRadius();
+void setBorderTopLeftRadius(String value);
+void clearBorderTopLeftRadius();
+String getBorderTopRightRadius();
+void setBorderTopRightRadius(String value);
+void clearBorderTopRightRadius();
+String getBorderTopStyle();
+void setBorderTopStyle(String value);
+void clearBorderTopStyle();
+String getBorderTopWidth();
+void setBorderTopWidth(String value);
+void clearBorderTopWidth();
+String getBorderWidth();
+void setBorderWidth(String value);
+void clearBorderWidth();
+void setBorderWidth(double value, String unit);
+String getBottom();
+void setBottom(String value);
+void clearBottom();
+void setBottom(double value, String unit);
+String getBoxShadow();
+void setBoxShadow(String value);
+void clearBoxShadow();
+String getBoxSizing();
+void setBoxSizing(String value);
+void clearBoxSizing();
+String getCaptionSide();
+void setCaptionSide(String value);
+void clearCaptionSide();
+String getClear();
+void setClear(String value);
+void clearClear();
+String getClip();
+void setClip(String value);
+void clearClip();
+String getContent();
+void setContent(String value);
+void clearContent();
+String getCounterIncrement();
+void setCounterIncrement(String value);
+void clearCounterIncrement();
+String getCounterReset();
+void setCounterReset(String value);
+void clearCounterReset();
+
+public interface Cursor {
+  public static final String DEFAULT = "default";
+  public static final String AUTO = "auto";
+  public static final String CROSSHAIR = "crosshair";
+  public static final String POINTER = "pointer";
+  public static final String MOVE = "move";
+  public static final String E_RESIZE = "e-resize";
+  public static final String NE_RESIZE = "ne-resize";
+  public static final String NW_RESIZE = "nw-resize";
+  public static final String N_RESIZE = "n-resize";
+  public static final String SE_RESIZE = "se-resize";
+  public static final String SW_RESIZE = "sw-resize";
+  public static final String S_RESIZE = "s-resize";
+  public static final String W_RESIZE = "w-resize";
+  public static final String TEXT = "text";
+  public static final String WAIT = "wait";
+  public static final String HELP = "help";
+  public static final String COL_RESIZE = "col-resize";
+  public static final String ROW_RESIZE = "row-resize";
+}
+
+String getCursor();
+void setCursor(String value);
+void clearCursor();
+String getEmptyCells();
+void setEmptyCells(String value);
+void clearEmptyCells();
+String getFloat();
+void setFloat(String value);
+void clearFloat();
+String getFontStretch();
+void setFontStretch(String value);
+void clearFontStretch();
+String getHeight();
+void setHeight(String value);
+void clearHeight();
+void setHeight(double value, String unit);
+String getImageRendering();
+void setImageRendering(String value);
+void clearImageRendering();
+String getLeft();
+void setLeft(String value);
+void clearLeft();
+void setLeft(double value, String unit);
+String getLetterSpacing();
+void setLetterSpacing(String value);
+void clearLetterSpacing();
+String getListStyle();
+void setListStyle(String value);
+void clearListStyle();
+
+public interface ListStyleType {
+  public static final String NONE = "none";
+  public static final String DISC = "disc";
+  public static final String CIRCLE = "circle";
+  public static final String SQUARE = "square";
+  public static final String DECIMAL = "decimal";
+  public static final String LOWER_ALPHA = "lower-alpha";
+  public static final String UPPER_ALPHA = "upper-alpha";
+  public static final String LOWER_ROMAN = "lower-roman";
+  public static final String UPPER_ROMAN = "upper-roman";
+}
+
+String getListStyleType();
+void setListStyleType(String value);
+void clearListStyleType();
+String getListStyleImage();
+void setListStyleImage(String value);
+void clearListStyleImage();
+String getListStylePosition();
+void setListStylePosition(String value);
+void clearListStylePosition();
+String getMargin();
+void setMargin(String value);
+void clearMargin();
+void setMargin(double value, String unit);
+String getMarginBottom();
+void setMarginBottom(String value);
+void clearMarginBottom();
+void setMarginBottom(double value, String unit);
+String getMarginLeft();
+void setMarginLeft(String value);
+void clearMarginLeft();
+void setMarginLeft(double value, String unit);
+String getMarginRight();
+void setMarginRight(String value);
+void clearMarginRight();
+void setMarginRight(double value, String unit);
+String getMarginTop();
+void setMarginTop(String value);
+void clearMarginTop();
+void setMarginTop(double value, String unit);
+String getMaxHeight();
+void setMaxHeight(String value);
+void clearMaxHeight();
+String getMaxWidth();
+void setMaxWidth(String value);
+void clearMaxWidth();
+String getMinHeight();
+void setMinHeight(String value);
+void clearMinHeight();
+String getMinWidth();
+void setMinWidth(String value);
+void clearMinWidth();
+double getOpacity();
+void setOpacity(double value);
+void clearOpacity();
+String getOrphans();
+void setOrphans(String value);
+void clearOrphans();
+String getOutline();
+void setOutline(String value);
+void clearOutline();
+String getOutlineColor();
+void setOutlineColor(String value);
+void clearOutlineColor();
+String getOutlineOffset();
+void setOutlineOffset(String value);
+void clearOutlineOffset();
+String getOutlineStyle();
+void setOutlineStyle(String value);
+void clearOutlineStyle();
+String getOutlineWidth();
+void setOutlineWidth(String value);
+void clearOutlineWidth();
+
+public interface Overflow {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String SCROLL = "scroll";
+  public static final String AUTO = "auto";
+}
+
+String getOverflow();
+void setOverflow(String value);
+void clearOverflow();
+
+public interface OverflowX {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String SCROLL = "scroll";
+  public static final String AUTO = "auto";
+}
+
+String getOverflowX();
+void setOverflowX(String value);
+void clearOverflowX();
+
+public interface OverflowY {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String SCROLL = "scroll";
+  public static final String AUTO = "auto";
+}
+
+String getOverflowY();
+void setOverflowY(String value);
+void clearOverflowY();
+String getPadding();
+void setPadding(String value);
+void clearPadding();
+void setPadding(double value, String unit);
+String getPaddingBottom();
+void setPaddingBottom(String value);
+void clearPaddingBottom();
+void setPaddingBottom(double value, String unit);
+String getPaddingLeft();
+void setPaddingLeft(String value);
+void clearPaddingLeft();
+void setPaddingLeft(double value, String unit);
+String getPaddingRight();
+void setPaddingRight(String value);
+void clearPaddingRight();
+void setPaddingRight(double value, String unit);
+String getPaddingTop();
+void setPaddingTop(String value);
+void clearPaddingTop();
+void setPaddingTop(double value, String unit);
+String getPage();
+void setPage(String value);
+void clearPage();
+String getPageBreakAfter();
+void setPageBreakAfter(String value);
+void clearPageBreakAfter();
+String getPageBreakBefore();
+void setPageBreakBefore(String value);
+void clearPageBreakBefore();
+String getPageBreakInside();
+void setPageBreakInside(String value);
+void clearPageBreakInside();
+String getPointerEvents();
+void setPointerEvents(String value);
+void clearPointerEvents();
+
+public interface Position {
+  public static final String STATIC = "static";
+  public static final String RELATIVE = "relative";
+  public static final String ABSOLUTE = "absolute";
+  public static final String FIXED = "fixed";
+}
+
+String getPosition();
+void setPosition(String value);
+void clearPosition();
+String getQuotes();
+void setQuotes(String value);
+void clearQuotes();
+String getResize();
+void setResize(String value);
+void clearResize();
+String getRight();
+void setRight(String value);
+void clearRight();
+void setRight(double value, String unit);
+String getSize();
+void setSize(String value);
+void clearSize();
+String getSrc();
+void setSrc(String value);
+void clearSrc();
+String getSpeak();
+void setSpeak(String value);
+void clearSpeak();
+String getTableLayout();
+void setTableLayout(String value);
+void clearTableLayout();
+String getTabSize();
+void setTabSize(String value);
+void clearTabSize();
+String getTextAlign();
+void setTextAlign(String value);
+void clearTextAlign();
+
+public interface TextDecoration {
+  public static final String NONE = "none";
+  public static final String UNDERLINE = "underline";
+  public static final String OVERLINE = "overline";
+  public static final String LINE_THROUGH = "line-through";
+}
+
+String getTextDecoration();
+void setTextDecoration(String value);
+void clearTextDecoration();
+String getTextIndent();
+void setTextIndent(String value);
+void clearTextIndent();
+String getTextLineThrough();
+void setTextLineThrough(String value);
+void clearTextLineThrough();
+String getTextLineThroughColor();
+void setTextLineThroughColor(String value);
+void clearTextLineThroughColor();
+String getTextLineThroughMode();
+void setTextLineThroughMode(String value);
+void clearTextLineThroughMode();
+String getTextLineThroughStyle();
+void setTextLineThroughStyle(String value);
+void clearTextLineThroughStyle();
+String getTextLineThroughWidth();
+void setTextLineThroughWidth(String value);
+void clearTextLineThroughWidth();
+String getTextOverflow();
+void setTextOverflow(String value);
+void clearTextOverflow();
+String getTextOverline();
+void setTextOverline(String value);
+void clearTextOverline();
+String getTextOverlineColor();
+void setTextOverlineColor(String value);
+void clearTextOverlineColor();
+String getTextOverlineMode();
+void setTextOverlineMode(String value);
+void clearTextOverlineMode();
+String getTextOverlineStyle();
+void setTextOverlineStyle(String value);
+void clearTextOverlineStyle();
+String getTextOverlineWidth();
+void setTextOverlineWidth(String value);
+void clearTextOverlineWidth();
+String getTextShadow();
+void setTextShadow(String value);
+void clearTextShadow();
+String getTextTransform();
+void setTextTransform(String value);
+void clearTextTransform();
+String getTextUnderline();
+void setTextUnderline(String value);
+void clearTextUnderline();
+String getTextUnderlineColor();
+void setTextUnderlineColor(String value);
+void clearTextUnderlineColor();
+String getTextUnderlineMode();
+void setTextUnderlineMode(String value);
+void clearTextUnderlineMode();
+String getTextUnderlineStyle();
+void setTextUnderlineStyle(String value);
+void clearTextUnderlineStyle();
+String getTextUnderlineWidth();
+void setTextUnderlineWidth(String value);
+void clearTextUnderlineWidth();
+String getTop();
+void setTop(String value);
+void clearTop();
+void setTop(double value, String unit);
+String getUnicodeBidi();
+void setUnicodeBidi(String value);
+void clearUnicodeBidi();
+String getUnicodeRange();
+void setUnicodeRange(String value);
+void clearUnicodeRange();
+String getVerticalAlign();
+void setVerticalAlign(String value);
+void clearVerticalAlign();
+
+public interface Visibility {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+}
+
+String getVisibility();
+void setVisibility(String value);
+void clearVisibility();
+
+public interface WhiteSpace {
+  public static final String PRE = "pre";
+  public static final String NOWRAP = "nowrap";
+  public static final String PRE_WRAP = "pre-wrap";
+  public static final String PRE_LINE = "pre-line";
+}
+
+String getWhiteSpace();
+void setWhiteSpace(String value);
+void clearWhiteSpace();
+String getWidows();
+void setWidows(String value);
+void clearWidows();
+String getWidth();
+void setWidth(String value);
+void clearWidth();
+void setWidth(double value, String unit);
+String getWordBreak();
+void setWordBreak(String value);
+void clearWordBreak();
+String getWordSpacing();
+void setWordSpacing(String value);
+void clearWordSpacing();
+String getWordWrap();
+void setWordWrap(String value);
+void clearWordWrap();
+int getZIndex();
+void setZIndex(int value);
+void clearZIndex();
+String getWebkitAnimation();
+void setWebkitAnimation(String value);
+void clearWebkitAnimation();
+String getWebkitAnimationDelay();
+void setWebkitAnimationDelay(String value);
+void clearWebkitAnimationDelay();
+String getWebkitAnimationDirection();
+void setWebkitAnimationDirection(String value);
+void clearWebkitAnimationDirection();
+String getWebkitAnimationDuration();
+void setWebkitAnimationDuration(String value);
+void clearWebkitAnimationDuration();
+String getWebkitAnimationFillMode();
+void setWebkitAnimationFillMode(String value);
+void clearWebkitAnimationFillMode();
+String getWebkitAnimationIterationCount();
+void setWebkitAnimationIterationCount(String value);
+void clearWebkitAnimationIterationCount();
+String getWebkitAnimationName();
+void setWebkitAnimationName(String value);
+void clearWebkitAnimationName();
+String getWebkitAnimationPlayState();
+void setWebkitAnimationPlayState(String value);
+void clearWebkitAnimationPlayState();
+String getWebkitAnimationTimingFunction();
+void setWebkitAnimationTimingFunction(String value);
+void clearWebkitAnimationTimingFunction();
+String getWebkitAppearance();
+void setWebkitAppearance(String value);
+void clearWebkitAppearance();
+String getWebkitAspectRatio();
+void setWebkitAspectRatio(String value);
+void clearWebkitAspectRatio();
+String getWebkitBackfaceVisibility();
+void setWebkitBackfaceVisibility(String value);
+void clearWebkitBackfaceVisibility();
+String getWebkitBackgroundClip();
+void setWebkitBackgroundClip(String value);
+void clearWebkitBackgroundClip();
+String getWebkitBackgroundComposite();
+void setWebkitBackgroundComposite(String value);
+void clearWebkitBackgroundComposite();
+String getWebkitBackgroundOrigin();
+void setWebkitBackgroundOrigin(String value);
+void clearWebkitBackgroundOrigin();
+String getWebkitBackgroundSize();
+void setWebkitBackgroundSize(String value);
+void clearWebkitBackgroundSize();
+String getWebkitBorderAfter();
+void setWebkitBorderAfter(String value);
+void clearWebkitBorderAfter();
+String getWebkitBorderAfterColor();
+void setWebkitBorderAfterColor(String value);
+void clearWebkitBorderAfterColor();
+String getWebkitBorderAfterStyle();
+void setWebkitBorderAfterStyle(String value);
+void clearWebkitBorderAfterStyle();
+String getWebkitBorderAfterWidth();
+void setWebkitBorderAfterWidth(String value);
+void clearWebkitBorderAfterWidth();
+String getWebkitBorderBefore();
+void setWebkitBorderBefore(String value);
+void clearWebkitBorderBefore();
+String getWebkitBorderBeforeColor();
+void setWebkitBorderBeforeColor(String value);
+void clearWebkitBorderBeforeColor();
+String getWebkitBorderBeforeStyle();
+void setWebkitBorderBeforeStyle(String value);
+void clearWebkitBorderBeforeStyle();
+String getWebkitBorderBeforeWidth();
+void setWebkitBorderBeforeWidth(String value);
+void clearWebkitBorderBeforeWidth();
+String getWebkitBorderEnd();
+void setWebkitBorderEnd(String value);
+void clearWebkitBorderEnd();
+String getWebkitBorderEndColor();
+void setWebkitBorderEndColor(String value);
+void clearWebkitBorderEndColor();
+String getWebkitBorderEndStyle();
+void setWebkitBorderEndStyle(String value);
+void clearWebkitBorderEndStyle();
+String getWebkitBorderEndWidth();
+void setWebkitBorderEndWidth(String value);
+void clearWebkitBorderEndWidth();
+String getWebkitBorderFit();
+void setWebkitBorderFit(String value);
+void clearWebkitBorderFit();
+String getWebkitBorderHorizontalSpacing();
+void setWebkitBorderHorizontalSpacing(String value);
+void clearWebkitBorderHorizontalSpacing();
+String getWebkitBorderImage();
+void setWebkitBorderImage(String value);
+void clearWebkitBorderImage();
+String getWebkitBorderRadius();
+void setWebkitBorderRadius(String value);
+void clearWebkitBorderRadius();
+String getWebkitBorderStart();
+void setWebkitBorderStart(String value);
+void clearWebkitBorderStart();
+String getWebkitBorderStartColor();
+void setWebkitBorderStartColor(String value);
+void clearWebkitBorderStartColor();
+String getWebkitBorderStartStyle();
+void setWebkitBorderStartStyle(String value);
+void clearWebkitBorderStartStyle();
+String getWebkitBorderStartWidth();
+void setWebkitBorderStartWidth(String value);
+void clearWebkitBorderStartWidth();
+String getWebkitBorderVerticalSpacing();
+void setWebkitBorderVerticalSpacing(String value);
+void clearWebkitBorderVerticalSpacing();
+String getWebkitBoxAlign();
+void setWebkitBoxAlign(String value);
+void clearWebkitBoxAlign();
+String getWebkitBoxDirection();
+void setWebkitBoxDirection(String value);
+void clearWebkitBoxDirection();
+String getWebkitBoxFlex();
+void setWebkitBoxFlex(String value);
+void clearWebkitBoxFlex();
+String getWebkitBoxFlexGroup();
+void setWebkitBoxFlexGroup(String value);
+void clearWebkitBoxFlexGroup();
+String getWebkitBoxLines();
+void setWebkitBoxLines(String value);
+void clearWebkitBoxLines();
+String getWebkitBoxOrdinalGroup();
+void setWebkitBoxOrdinalGroup(String value);
+void clearWebkitBoxOrdinalGroup();
+String getWebkitBoxOrient();
+void setWebkitBoxOrient(String value);
+void clearWebkitBoxOrient();
+String getWebkitBoxPack();
+void setWebkitBoxPack(String value);
+void clearWebkitBoxPack();
+String getWebkitBoxReflect();
+void setWebkitBoxReflect(String value);
+void clearWebkitBoxReflect();
+String getWebkitBoxShadow();
+void setWebkitBoxShadow(String value);
+void clearWebkitBoxShadow();
+String getWebkitColorCorrection();
+void setWebkitColorCorrection(String value);
+void clearWebkitColorCorrection();
+String getWebkitColumnAxis();
+void setWebkitColumnAxis(String value);
+void clearWebkitColumnAxis();
+String getWebkitColumnBreakAfter();
+void setWebkitColumnBreakAfter(String value);
+void clearWebkitColumnBreakAfter();
+String getWebkitColumnBreakBefore();
+void setWebkitColumnBreakBefore(String value);
+void clearWebkitColumnBreakBefore();
+String getWebkitColumnBreakInside();
+void setWebkitColumnBreakInside(String value);
+void clearWebkitColumnBreakInside();
+String getWebkitColumnCount();
+void setWebkitColumnCount(String value);
+void clearWebkitColumnCount();
+String getWebkitColumnGap();
+void setWebkitColumnGap(String value);
+void clearWebkitColumnGap();
+String getWebkitColumnRule();
+void setWebkitColumnRule(String value);
+void clearWebkitColumnRule();
+String getWebkitColumnRuleColor();
+void setWebkitColumnRuleColor(String value);
+void clearWebkitColumnRuleColor();
+String getWebkitColumnRuleStyle();
+void setWebkitColumnRuleStyle(String value);
+void clearWebkitColumnRuleStyle();
+String getWebkitColumnRuleWidth();
+void setWebkitColumnRuleWidth(String value);
+void clearWebkitColumnRuleWidth();
+String getWebkitColumnSpan();
+void setWebkitColumnSpan(String value);
+void clearWebkitColumnSpan();
+String getWebkitColumnWidth();
+void setWebkitColumnWidth(String value);
+void clearWebkitColumnWidth();
+String getWebkitColumns();
+void setWebkitColumns(String value);
+void clearWebkitColumns();
+String getWebkitFilter();
+void setWebkitFilter(String value);
+void clearWebkitFilter();
+String getWebkitFlex();
+void setWebkitFlex(String value);
+void clearWebkitFlex();
+String getWebkitFlexAlign();
+void setWebkitFlexAlign(String value);
+void clearWebkitFlexAlign();
+String getWebkitFlexDirection();
+void setWebkitFlexDirection(String value);
+void clearWebkitFlexDirection();
+String getWebkitFlexFlow();
+void setWebkitFlexFlow(String value);
+void clearWebkitFlexFlow();
+String getWebkitFlexItemAlign();
+void setWebkitFlexItemAlign(String value);
+void clearWebkitFlexItemAlign();
+String getWebkitFlexLinePack();
+void setWebkitFlexLinePack(String value);
+void clearWebkitFlexLinePack();
+String getWebkitFlexOrder();
+void setWebkitFlexOrder(String value);
+void clearWebkitFlexOrder();
+String getWebkitFlexPack();
+void setWebkitFlexPack(String value);
+void clearWebkitFlexPack();
+String getWebkitFlexWrap();
+void setWebkitFlexWrap(String value);
+void clearWebkitFlexWrap();
+String getWebkitFontSizeDelta();
+void setWebkitFontSizeDelta(String value);
+void clearWebkitFontSizeDelta();
+String getWebkitGridColumns();
+void setWebkitGridColumns(String value);
+void clearWebkitGridColumns();
+String getWebkitGridRows();
+void setWebkitGridRows(String value);
+void clearWebkitGridRows();
+String getWebkitGridColumn();
+void setWebkitGridColumn(String value);
+void clearWebkitGridColumn();
+String getWebkitGridRow();
+void setWebkitGridRow(String value);
+void clearWebkitGridRow();
+String getWebkitHighlight();
+void setWebkitHighlight(String value);
+void clearWebkitHighlight();
+String getWebkitHyphenateCharacter();
+void setWebkitHyphenateCharacter(String value);
+void clearWebkitHyphenateCharacter();
+String getWebkitHyphenateLimitAfter();
+void setWebkitHyphenateLimitAfter(String value);
+void clearWebkitHyphenateLimitAfter();
+String getWebkitHyphenateLimitBefore();
+void setWebkitHyphenateLimitBefore(String value);
+void clearWebkitHyphenateLimitBefore();
+String getWebkitHyphenateLimitLines();
+void setWebkitHyphenateLimitLines(String value);
+void clearWebkitHyphenateLimitLines();
+String getWebkitHyphens();
+void setWebkitHyphens(String value);
+void clearWebkitHyphens();
+String getWebkitLineBoxContain();
+void setWebkitLineBoxContain(String value);
+void clearWebkitLineBoxContain();
+String getWebkitLineAlign();
+void setWebkitLineAlign(String value);
+void clearWebkitLineAlign();
+String getWebkitLineBreak();
+void setWebkitLineBreak(String value);
+void clearWebkitLineBreak();
+String getWebkitLineClamp();
+void setWebkitLineClamp(String value);
+void clearWebkitLineClamp();
+String getWebkitLineGrid();
+void setWebkitLineGrid(String value);
+void clearWebkitLineGrid();
+String getWebkitLineSnap();
+void setWebkitLineSnap(String value);
+void clearWebkitLineSnap();
+String getWebkitLogicalWidth();
+void setWebkitLogicalWidth(String value);
+void clearWebkitLogicalWidth();
+String getWebkitLogicalHeight();
+void setWebkitLogicalHeight(String value);
+void clearWebkitLogicalHeight();
+String getWebkitMarginAfterCollapse();
+void setWebkitMarginAfterCollapse(String value);
+void clearWebkitMarginAfterCollapse();
+String getWebkitMarginBeforeCollapse();
+void setWebkitMarginBeforeCollapse(String value);
+void clearWebkitMarginBeforeCollapse();
+String getWebkitMarginBottomCollapse();
+void setWebkitMarginBottomCollapse(String value);
+void clearWebkitMarginBottomCollapse();
+String getWebkitMarginTopCollapse();
+void setWebkitMarginTopCollapse(String value);
+void clearWebkitMarginTopCollapse();
+String getWebkitMarginCollapse();
+void setWebkitMarginCollapse(String value);
+void clearWebkitMarginCollapse();
+String getWebkitMarginAfter();
+void setWebkitMarginAfter(String value);
+void clearWebkitMarginAfter();
+String getWebkitMarginBefore();
+void setWebkitMarginBefore(String value);
+void clearWebkitMarginBefore();
+String getWebkitMarginEnd();
+void setWebkitMarginEnd(String value);
+void clearWebkitMarginEnd();
+String getWebkitMarginStart();
+void setWebkitMarginStart(String value);
+void clearWebkitMarginStart();
+String getWebkitMarquee();
+void setWebkitMarquee(String value);
+void clearWebkitMarquee();
+String getWebkitMarqueeDirection();
+void setWebkitMarqueeDirection(String value);
+void clearWebkitMarqueeDirection();
+String getWebkitMarqueeIncrement();
+void setWebkitMarqueeIncrement(String value);
+void clearWebkitMarqueeIncrement();
+String getWebkitMarqueeRepetition();
+void setWebkitMarqueeRepetition(String value);
+void clearWebkitMarqueeRepetition();
+String getWebkitMarqueeSpeed();
+void setWebkitMarqueeSpeed(String value);
+void clearWebkitMarqueeSpeed();
+String getWebkitMarqueeStyle();
+void setWebkitMarqueeStyle(String value);
+void clearWebkitMarqueeStyle();
+String getWebkitMask();
+void setWebkitMask(String value);
+void clearWebkitMask();
+String getWebkitMaskAttachment();
+void setWebkitMaskAttachment(String value);
+void clearWebkitMaskAttachment();
+String getWebkitMaskBoxImage();
+void setWebkitMaskBoxImage(String value);
+void clearWebkitMaskBoxImage();
+String getWebkitMaskBoxImageOutset();
+void setWebkitMaskBoxImageOutset(String value);
+void clearWebkitMaskBoxImageOutset();
+String getWebkitMaskBoxImageRepeat();
+void setWebkitMaskBoxImageRepeat(String value);
+void clearWebkitMaskBoxImageRepeat();
+String getWebkitMaskBoxImageSlice();
+void setWebkitMaskBoxImageSlice(String value);
+void clearWebkitMaskBoxImageSlice();
+String getWebkitMaskBoxImageSource();
+void setWebkitMaskBoxImageSource(String value);
+void clearWebkitMaskBoxImageSource();
+String getWebkitMaskBoxImageWidth();
+void setWebkitMaskBoxImageWidth(String value);
+void clearWebkitMaskBoxImageWidth();
+String getWebkitMaskClip();
+void setWebkitMaskClip(String value);
+void clearWebkitMaskClip();
+String getWebkitMaskComposite();
+void setWebkitMaskComposite(String value);
+void clearWebkitMaskComposite();
+String getWebkitMaskImage();
+void setWebkitMaskImage(String value);
+void clearWebkitMaskImage();
+String getWebkitMaskOrigin();
+void setWebkitMaskOrigin(String value);
+void clearWebkitMaskOrigin();
+String getWebkitMaskPosition();
+void setWebkitMaskPosition(String value);
+void clearWebkitMaskPosition();
+String getWebkitMaskPositionX();
+void setWebkitMaskPositionX(String value);
+void clearWebkitMaskPositionX();
+String getWebkitMaskPositionY();
+void setWebkitMaskPositionY(String value);
+void clearWebkitMaskPositionY();
+String getWebkitMaskRepeat();
+void setWebkitMaskRepeat(String value);
+void clearWebkitMaskRepeat();
+String getWebkitMaskRepeatX();
+void setWebkitMaskRepeatX(String value);
+void clearWebkitMaskRepeatX();
+String getWebkitMaskRepeatY();
+void setWebkitMaskRepeatY(String value);
+void clearWebkitMaskRepeatY();
+String getWebkitMaskSize();
+void setWebkitMaskSize(String value);
+void clearWebkitMaskSize();
+String getWebkitMatchNearestMailBlockquoteColor();
+void setWebkitMatchNearestMailBlockquoteColor(String value);
+void clearWebkitMatchNearestMailBlockquoteColor();
+String getWebkitMaxLogicalWidth();
+void setWebkitMaxLogicalWidth(String value);
+void clearWebkitMaxLogicalWidth();
+String getWebkitMaxLogicalHeight();
+void setWebkitMaxLogicalHeight(String value);
+void clearWebkitMaxLogicalHeight();
+String getWebkitMinLogicalWidth();
+void setWebkitMinLogicalWidth(String value);
+void clearWebkitMinLogicalWidth();
+String getWebkitMinLogicalHeight();
+void setWebkitMinLogicalHeight(String value);
+void clearWebkitMinLogicalHeight();
+String getWebkitNbspMode();
+void setWebkitNbspMode(String value);
+void clearWebkitNbspMode();
+String getWebkitPaddingAfter();
+void setWebkitPaddingAfter(String value);
+void clearWebkitPaddingAfter();
+String getWebkitPaddingBefore();
+void setWebkitPaddingBefore(String value);
+void clearWebkitPaddingBefore();
+String getWebkitPaddingEnd();
+void setWebkitPaddingEnd(String value);
+void clearWebkitPaddingEnd();
+String getWebkitPaddingStart();
+void setWebkitPaddingStart(String value);
+void clearWebkitPaddingStart();
+String getWebkitPerspective();
+void setWebkitPerspective(String value);
+void clearWebkitPerspective();
+String getWebkitPerspectiveOrigin();
+void setWebkitPerspectiveOrigin(String value);
+void clearWebkitPerspectiveOrigin();
+String getWebkitPerspectiveOriginX();
+void setWebkitPerspectiveOriginX(String value);
+void clearWebkitPerspectiveOriginX();
+String getWebkitPerspectiveOriginY();
+void setWebkitPerspectiveOriginY(String value);
+void clearWebkitPerspectiveOriginY();
+String getWebkitPrintColorAdjust();
+void setWebkitPrintColorAdjust(String value);
+void clearWebkitPrintColorAdjust();
+String getWebkitRtlOrdering();
+void setWebkitRtlOrdering(String value);
+void clearWebkitRtlOrdering();
+String getWebkitTextCombine();
+void setWebkitTextCombine(String value);
+void clearWebkitTextCombine();
+String getWebkitTextDecorationsInEffect();
+void setWebkitTextDecorationsInEffect(String value);
+void clearWebkitTextDecorationsInEffect();
+String getWebkitTextEmphasis();
+void setWebkitTextEmphasis(String value);
+void clearWebkitTextEmphasis();
+String getWebkitTextEmphasisColor();
+void setWebkitTextEmphasisColor(String value);
+void clearWebkitTextEmphasisColor();
+String getWebkitTextEmphasisPosition();
+void setWebkitTextEmphasisPosition(String value);
+void clearWebkitTextEmphasisPosition();
+String getWebkitTextEmphasisStyle();
+void setWebkitTextEmphasisStyle(String value);
+void clearWebkitTextEmphasisStyle();
+String getWebkitTextFillColor();
+void setWebkitTextFillColor(String value);
+void clearWebkitTextFillColor();
+String getWebkitTextSecurity();
+void setWebkitTextSecurity(String value);
+void clearWebkitTextSecurity();
+String getWebkitTextStroke();
+void setWebkitTextStroke(String value);
+void clearWebkitTextStroke();
+String getWebkitTextStrokeColor();
+void setWebkitTextStrokeColor(String value);
+void clearWebkitTextStrokeColor();
+String getWebkitTextStrokeWidth();
+void setWebkitTextStrokeWidth(String value);
+void clearWebkitTextStrokeWidth();
+String getWebkitTransform();
+void setWebkitTransform(String value);
+void clearWebkitTransform();
+String getWebkitTransformOrigin();
+void setWebkitTransformOrigin(String value);
+void clearWebkitTransformOrigin();
+String getWebkitTransformOriginX();
+void setWebkitTransformOriginX(String value);
+void clearWebkitTransformOriginX();
+String getWebkitTransformOriginY();
+void setWebkitTransformOriginY(String value);
+void clearWebkitTransformOriginY();
+String getWebkitTransformOriginZ();
+void setWebkitTransformOriginZ(String value);
+void clearWebkitTransformOriginZ();
+String getWebkitTransformStyle();
+void setWebkitTransformStyle(String value);
+void clearWebkitTransformStyle();
+String getWebkitTransition();
+void setWebkitTransition(String value);
+void clearWebkitTransition();
+String getWebkitTransitionDelay();
+void setWebkitTransitionDelay(String value);
+void clearWebkitTransitionDelay();
+String getWebkitTransitionDuration();
+void setWebkitTransitionDuration(String value);
+void clearWebkitTransitionDuration();
+String getWebkitTransitionProperty();
+void setWebkitTransitionProperty(String value);
+void clearWebkitTransitionProperty();
+String getWebkitTransitionTimingFunction();
+void setWebkitTransitionTimingFunction(String value);
+void clearWebkitTransitionTimingFunction();
+String getWebkitUserDrag();
+void setWebkitUserDrag(String value);
+void clearWebkitUserDrag();
+String getWebkitUserModify();
+void setWebkitUserModify(String value);
+void clearWebkitUserModify();
+String getWebkitUserSelect();
+void setWebkitUserSelect(String value);
+void clearWebkitUserSelect();
+String getWebkitFlowInto();
+void setWebkitFlowInto(String value);
+void clearWebkitFlowInto();
+String getWebkitFlowFrom();
+void setWebkitFlowFrom(String value);
+void clearWebkitFlowFrom();
+String getWebkitRegionOverflow();
+void setWebkitRegionOverflow(String value);
+void clearWebkitRegionOverflow();
+String getWebkitShapeInside();
+void setWebkitShapeInside(String value);
+void clearWebkitShapeInside();
+String getWebkitShapeOutside();
+void setWebkitShapeOutside(String value);
+void clearWebkitShapeOutside();
+String getWebkitWrapMargin();
+void setWebkitWrapMargin(String value);
+void clearWebkitWrapMargin();
+String getWebkitWrapPadding();
+void setWebkitWrapPadding(String value);
+void clearWebkitWrapPadding();
+String getWebkitRegionBreakAfter();
+void setWebkitRegionBreakAfter(String value);
+void clearWebkitRegionBreakAfter();
+String getWebkitRegionBreakBefore();
+void setWebkitRegionBreakBefore(String value);
+void clearWebkitRegionBreakBefore();
+String getWebkitRegionBreakInside();
+void setWebkitRegionBreakInside(String value);
+void clearWebkitRegionBreakInside();
+String getWebkitWrapFlow();
+void setWebkitWrapFlow(String value);
+void clearWebkitWrapFlow();
+String getWebkitWrapThrough();
+void setWebkitWrapThrough(String value);
+void clearWebkitWrapThrough();
+String getWebkitWrap();
+void setWebkitWrap(String value);
+void clearWebkitWrap();
+String getWebkitTapHighlightColor();
+void setWebkitTapHighlightColor(String value);
+void clearWebkitTapHighlightColor();
+String getWebkitDashboardRegion();
+void setWebkitDashboardRegion(String value);
+void clearWebkitDashboardRegion();
+String getWebkitOverflowScrolling();
+void setWebkitOverflowScrolling(String value);
+void clearWebkitOverflowScrolling();
+}
\ No newline at end of file
diff --git a/elemental/idl/templates/java_interface.darttemplate b/elemental/idl/templates/java_interface.darttemplate
new file mode 100644
index 0000000..eb6564e
--- /dev/null
+++ b/elemental/idl/templates/java_interface.darttemplate
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * $CLASSJAVADOC
+  */
+public interface $ID$EXTENDS {
+$!MEMBERS}
diff --git a/elemental/idl/templates/java_interface_CSSStyleDeclaration.darttemplate b/elemental/idl/templates/java_interface_CSSStyleDeclaration.darttemplate
new file mode 100644
index 0000000..83ef31f
--- /dev/null
+++ b/elemental/idl/templates/java_interface_CSSStyleDeclaration.darttemplate
@@ -0,0 +1,1193 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * $CLASS_JAVADOC
+  */
+public interface $ID$EXTENDS {
+$!MEMBERS
+public interface Unit {
+  public static final String PX = "px";
+  public static final String PCT = "%";
+  public static final String EM = "em";
+  public static final String EX = "ex";
+  public static final String PT = "pt";
+  public static final String PC = "pc";
+  public static final String IN = "in";
+  public static final String CM = "cm";
+  public static final String MM = "mm";
+}
+
+String getColor();
+void setColor(String value);
+void clearColor();
+String getDirection();
+void setDirection(String value);
+void clearDirection();
+
+public interface Display {
+  public static final String NONE = "none";
+  public static final String BLOCK = "block";
+  public static final String INLINE = "inline";
+  public static final String INLINE_BLOCK = "inline-block";
+}
+
+String getDisplay();
+void setDisplay(String value);
+void clearDisplay();
+String getFont();
+void setFont(String value);
+void clearFont();
+String getFontFamily();
+void setFontFamily(String value);
+void clearFontFamily();
+String getFontSize();
+void setFontSize(String value);
+void clearFontSize();
+void setFontSize(double value, String unit);
+
+public interface FontStyle {
+  public static final String NORMAL = "normal";
+  public static final String ITALIC = "italic";
+  public static final String OBLIQUE = "oblique";
+}
+
+String getFontStyle();
+void setFontStyle(String value);
+void clearFontStyle();
+
+public interface FontWeight {
+  public static final String NORMAL = "normal";
+  public static final String BOLD = "bold";
+  public static final String BOLDER = "bolder";
+  public static final String LIGHTER = "lighter";
+}
+
+String getFontWeight();
+void setFontWeight(String value);
+void clearFontWeight();
+String getFontVariant();
+void setFontVariant(String value);
+void clearFontVariant();
+String getTextRendering();
+void setTextRendering(String value);
+void clearTextRendering();
+String getWebkitFontFeatureSettings();
+void setWebkitFontFeatureSettings(String value);
+void clearWebkitFontFeatureSettings();
+String getWebkitFontKerning();
+void setWebkitFontKerning(String value);
+void clearWebkitFontKerning();
+String getWebkitFontSmoothing();
+void setWebkitFontSmoothing(String value);
+void clearWebkitFontSmoothing();
+String getWebkitFontVariantLigatures();
+void setWebkitFontVariantLigatures(String value);
+void clearWebkitFontVariantLigatures();
+String getWebkitLocale();
+void setWebkitLocale(String value);
+void clearWebkitLocale();
+String getWebkitTextOrientation();
+void setWebkitTextOrientation(String value);
+void clearWebkitTextOrientation();
+String getWebkitTextSizeAdjust();
+void setWebkitTextSizeAdjust(String value);
+void clearWebkitTextSizeAdjust();
+String getWebkitWritingMode();
+void setWebkitWritingMode(String value);
+void clearWebkitWritingMode();
+String getZoom();
+void setZoom(String value);
+void clearZoom();
+String getLineHeight();
+void setLineHeight(String value);
+void clearLineHeight();
+String getBackground();
+void setBackground(String value);
+void clearBackground();
+String getBackgroundAttachment();
+void setBackgroundAttachment(String value);
+void clearBackgroundAttachment();
+String getBackgroundClip();
+void setBackgroundClip(String value);
+void clearBackgroundClip();
+String getBackgroundColor();
+void setBackgroundColor(String value);
+void clearBackgroundColor();
+String getBackgroundImage();
+void setBackgroundImage(String value);
+void clearBackgroundImage();
+String getBackgroundOrigin();
+void setBackgroundOrigin(String value);
+void clearBackgroundOrigin();
+String getBackgroundPosition();
+void setBackgroundPosition(String value);
+void clearBackgroundPosition();
+String getBackgroundPositionX();
+void setBackgroundPositionX(String value);
+void clearBackgroundPositionX();
+String getBackgroundPositionY();
+void setBackgroundPositionY(String value);
+void clearBackgroundPositionY();
+String getBackgroundRepeat();
+void setBackgroundRepeat(String value);
+void clearBackgroundRepeat();
+String getBackgroundRepeatX();
+void setBackgroundRepeatX(String value);
+void clearBackgroundRepeatX();
+String getBackgroundRepeatY();
+void setBackgroundRepeatY(String value);
+void clearBackgroundRepeatY();
+String getBackgroundSize();
+void setBackgroundSize(String value);
+void clearBackgroundSize();
+String getBorder();
+void setBorder(String value);
+void clearBorder();
+String getBorderBottom();
+void setBorderBottom(String value);
+void clearBorderBottom();
+String getBorderBottomColor();
+void setBorderBottomColor(String value);
+void clearBorderBottomColor();
+String getBorderBottomLeftRadius();
+void setBorderBottomLeftRadius(String value);
+void clearBorderBottomLeftRadius();
+String getBorderBottomRightRadius();
+void setBorderBottomRightRadius(String value);
+void clearBorderBottomRightRadius();
+String getBorderBottomStyle();
+void setBorderBottomStyle(String value);
+void clearBorderBottomStyle();
+String getBorderBottomWidth();
+void setBorderBottomWidth(String value);
+void clearBorderBottomWidth();
+String getBorderCollapse();
+void setBorderCollapse(String value);
+void clearBorderCollapse();
+String getBorderColor();
+void setBorderColor(String value);
+void clearBorderColor();
+String getBorderImage();
+void setBorderImage(String value);
+void clearBorderImage();
+String getBorderImageOutset();
+void setBorderImageOutset(String value);
+void clearBorderImageOutset();
+String getBorderImageRepeat();
+void setBorderImageRepeat(String value);
+void clearBorderImageRepeat();
+String getBorderImageSlice();
+void setBorderImageSlice(String value);
+void clearBorderImageSlice();
+String getBorderImageSource();
+void setBorderImageSource(String value);
+void clearBorderImageSource();
+String getBorderImageWidth();
+void setBorderImageWidth(String value);
+void clearBorderImageWidth();
+String getBorderLeft();
+void setBorderLeft(String value);
+void clearBorderLeft();
+String getBorderLeftColor();
+void setBorderLeftColor(String value);
+void clearBorderLeftColor();
+String getBorderLeftStyle();
+void setBorderLeftStyle(String value);
+void clearBorderLeftStyle();
+String getBorderLeftWidth();
+void setBorderLeftWidth(String value);
+void clearBorderLeftWidth();
+String getBorderRadius();
+void setBorderRadius(String value);
+void clearBorderRadius();
+String getBorderRight();
+void setBorderRight(String value);
+void clearBorderRight();
+String getBorderRightColor();
+void setBorderRightColor(String value);
+void clearBorderRightColor();
+String getBorderRightStyle();
+void setBorderRightStyle(String value);
+void clearBorderRightStyle();
+String getBorderRightWidth();
+void setBorderRightWidth(String value);
+void clearBorderRightWidth();
+String getBorderSpacing();
+void setBorderSpacing(String value);
+void clearBorderSpacing();
+
+public interface BorderStyle {
+  public static final String NONE = "none";
+  public static final String HIDDEN = "hidden";
+  public static final String DOTTED = "dotted";
+  public static final String DASHED = "dashed";
+  public static final String SOLID = "solid";
+}
+
+String getBorderStyle();
+void setBorderStyle(String value);
+void clearBorderStyle();
+String getBorderTop();
+void setBorderTop(String value);
+void clearBorderTop();
+String getBorderTopColor();
+void setBorderTopColor(String value);
+void clearBorderTopColor();
+String getBorderTopLeftRadius();
+void setBorderTopLeftRadius(String value);
+void clearBorderTopLeftRadius();
+String getBorderTopRightRadius();
+void setBorderTopRightRadius(String value);
+void clearBorderTopRightRadius();
+String getBorderTopStyle();
+void setBorderTopStyle(String value);
+void clearBorderTopStyle();
+String getBorderTopWidth();
+void setBorderTopWidth(String value);
+void clearBorderTopWidth();
+String getBorderWidth();
+void setBorderWidth(String value);
+void clearBorderWidth();
+void setBorderWidth(double value, String unit);
+String getBottom();
+void setBottom(String value);
+void clearBottom();
+void setBottom(double value, String unit);
+String getBoxShadow();
+void setBoxShadow(String value);
+void clearBoxShadow();
+String getBoxSizing();
+void setBoxSizing(String value);
+void clearBoxSizing();
+String getCaptionSide();
+void setCaptionSide(String value);
+void clearCaptionSide();
+String getClear();
+void setClear(String value);
+void clearClear();
+String getClip();
+void setClip(String value);
+void clearClip();
+String getContent();
+void setContent(String value);
+void clearContent();
+String getCounterIncrement();
+void setCounterIncrement(String value);
+void clearCounterIncrement();
+String getCounterReset();
+void setCounterReset(String value);
+void clearCounterReset();
+
+public interface Cursor {
+  public static final String DEFAULT = "default";
+  public static final String AUTO = "auto";
+  public static final String CROSSHAIR = "crosshair";
+  public static final String POINTER = "pointer";
+  public static final String MOVE = "move";
+  public static final String E_RESIZE = "e-resize";
+  public static final String NE_RESIZE = "ne-resize";
+  public static final String NW_RESIZE = "nw-resize";
+  public static final String N_RESIZE = "n-resize";
+  public static final String SE_RESIZE = "se-resize";
+  public static final String SW_RESIZE = "sw-resize";
+  public static final String S_RESIZE = "s-resize";
+  public static final String W_RESIZE = "w-resize";
+  public static final String TEXT = "text";
+  public static final String WAIT = "wait";
+  public static final String HELP = "help";
+  public static final String COL_RESIZE = "col-resize";
+  public static final String ROW_RESIZE = "row-resize";
+}
+
+String getCursor();
+void setCursor(String value);
+void clearCursor();
+String getEmptyCells();
+void setEmptyCells(String value);
+void clearEmptyCells();
+String getFloat();
+void setFloat(String value);
+void clearFloat();
+String getFontStretch();
+void setFontStretch(String value);
+void clearFontStretch();
+String getHeight();
+void setHeight(String value);
+void clearHeight();
+void setHeight(double value, String unit);
+String getImageRendering();
+void setImageRendering(String value);
+void clearImageRendering();
+String getLeft();
+void setLeft(String value);
+void clearLeft();
+void setLeft(double value, String unit);
+String getLetterSpacing();
+void setLetterSpacing(String value);
+void clearLetterSpacing();
+String getListStyle();
+void setListStyle(String value);
+void clearListStyle();
+
+public interface ListStyleType {
+  public static final String NONE = "none";
+  public static final String DISC = "disc";
+  public static final String CIRCLE = "circle";
+  public static final String SQUARE = "square";
+  public static final String DECIMAL = "decimal";
+  public static final String LOWER_ALPHA = "lower-alpha";
+  public static final String UPPER_ALPHA = "upper-alpha";
+  public static final String LOWER_ROMAN = "lower-roman";
+  public static final String UPPER_ROMAN = "upper-roman";
+}
+
+String getListStyleType();
+void setListStyleType(String value);
+void clearListStyleType();
+String getListStyleImage();
+void setListStyleImage(String value);
+void clearListStyleImage();
+String getListStylePosition();
+void setListStylePosition(String value);
+void clearListStylePosition();
+String getMargin();
+void setMargin(String value);
+void clearMargin();
+void setMargin(double value, String unit);
+String getMarginBottom();
+void setMarginBottom(String value);
+void clearMarginBottom();
+void setMarginBottom(double value, String unit);
+String getMarginLeft();
+void setMarginLeft(String value);
+void clearMarginLeft();
+void setMarginLeft(double value, String unit);
+String getMarginRight();
+void setMarginRight(String value);
+void clearMarginRight();
+void setMarginRight(double value, String unit);
+String getMarginTop();
+void setMarginTop(String value);
+void clearMarginTop();
+void setMarginTop(double value, String unit);
+String getMaxHeight();
+void setMaxHeight(String value);
+void clearMaxHeight();
+String getMaxWidth();
+void setMaxWidth(String value);
+void clearMaxWidth();
+String getMinHeight();
+void setMinHeight(String value);
+void clearMinHeight();
+String getMinWidth();
+void setMinWidth(String value);
+void clearMinWidth();
+double getOpacity();
+void setOpacity(double value);
+void clearOpacity();
+String getOrphans();
+void setOrphans(String value);
+void clearOrphans();
+String getOutline();
+void setOutline(String value);
+void clearOutline();
+String getOutlineColor();
+void setOutlineColor(String value);
+void clearOutlineColor();
+String getOutlineOffset();
+void setOutlineOffset(String value);
+void clearOutlineOffset();
+String getOutlineStyle();
+void setOutlineStyle(String value);
+void clearOutlineStyle();
+String getOutlineWidth();
+void setOutlineWidth(String value);
+void clearOutlineWidth();
+
+public interface Overflow {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String SCROLL = "scroll";
+  public static final String AUTO = "auto";
+}
+
+String getOverflow();
+void setOverflow(String value);
+void clearOverflow();
+
+public interface OverflowX {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String SCROLL = "scroll";
+  public static final String AUTO = "auto";
+}
+
+String getOverflowX();
+void setOverflowX(String value);
+void clearOverflowX();
+
+public interface OverflowY {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String SCROLL = "scroll";
+  public static final String AUTO = "auto";
+}
+
+String getOverflowY();
+void setOverflowY(String value);
+void clearOverflowY();
+String getPadding();
+void setPadding(String value);
+void clearPadding();
+void setPadding(double value, String unit);
+String getPaddingBottom();
+void setPaddingBottom(String value);
+void clearPaddingBottom();
+void setPaddingBottom(double value, String unit);
+String getPaddingLeft();
+void setPaddingLeft(String value);
+void clearPaddingLeft();
+void setPaddingLeft(double value, String unit);
+String getPaddingRight();
+void setPaddingRight(String value);
+void clearPaddingRight();
+void setPaddingRight(double value, String unit);
+String getPaddingTop();
+void setPaddingTop(String value);
+void clearPaddingTop();
+void setPaddingTop(double value, String unit);
+String getPage();
+void setPage(String value);
+void clearPage();
+String getPageBreakAfter();
+void setPageBreakAfter(String value);
+void clearPageBreakAfter();
+String getPageBreakBefore();
+void setPageBreakBefore(String value);
+void clearPageBreakBefore();
+String getPageBreakInside();
+void setPageBreakInside(String value);
+void clearPageBreakInside();
+String getPointerEvents();
+void setPointerEvents(String value);
+void clearPointerEvents();
+
+public interface Position {
+  public static final String STATIC = "static";
+  public static final String RELATIVE = "relative";
+  public static final String ABSOLUTE = "absolute";
+  public static final String FIXED = "fixed";
+}
+
+String getPosition();
+void setPosition(String value);
+void clearPosition();
+String getQuotes();
+void setQuotes(String value);
+void clearQuotes();
+String getResize();
+void setResize(String value);
+void clearResize();
+String getRight();
+void setRight(String value);
+void clearRight();
+void setRight(double value, String unit);
+String getSize();
+void setSize(String value);
+void clearSize();
+String getSrc();
+void setSrc(String value);
+void clearSrc();
+String getSpeak();
+void setSpeak(String value);
+void clearSpeak();
+String getTableLayout();
+void setTableLayout(String value);
+void clearTableLayout();
+String getTabSize();
+void setTabSize(String value);
+void clearTabSize();
+String getTextAlign();
+void setTextAlign(String value);
+void clearTextAlign();
+
+public interface TextDecoration {
+  public static final String NONE = "none";
+  public static final String UNDERLINE = "underline";
+  public static final String OVERLINE = "overline";
+  public static final String LINE_THROUGH = "line-through";
+}
+
+String getTextDecoration();
+void setTextDecoration(String value);
+void clearTextDecoration();
+String getTextIndent();
+void setTextIndent(String value);
+void clearTextIndent();
+String getTextLineThrough();
+void setTextLineThrough(String value);
+void clearTextLineThrough();
+String getTextLineThroughColor();
+void setTextLineThroughColor(String value);
+void clearTextLineThroughColor();
+String getTextLineThroughMode();
+void setTextLineThroughMode(String value);
+void clearTextLineThroughMode();
+String getTextLineThroughStyle();
+void setTextLineThroughStyle(String value);
+void clearTextLineThroughStyle();
+String getTextLineThroughWidth();
+void setTextLineThroughWidth(String value);
+void clearTextLineThroughWidth();
+String getTextOverflow();
+void setTextOverflow(String value);
+void clearTextOverflow();
+String getTextOverline();
+void setTextOverline(String value);
+void clearTextOverline();
+String getTextOverlineColor();
+void setTextOverlineColor(String value);
+void clearTextOverlineColor();
+String getTextOverlineMode();
+void setTextOverlineMode(String value);
+void clearTextOverlineMode();
+String getTextOverlineStyle();
+void setTextOverlineStyle(String value);
+void clearTextOverlineStyle();
+String getTextOverlineWidth();
+void setTextOverlineWidth(String value);
+void clearTextOverlineWidth();
+String getTextShadow();
+void setTextShadow(String value);
+void clearTextShadow();
+String getTextTransform();
+void setTextTransform(String value);
+void clearTextTransform();
+String getTextUnderline();
+void setTextUnderline(String value);
+void clearTextUnderline();
+String getTextUnderlineColor();
+void setTextUnderlineColor(String value);
+void clearTextUnderlineColor();
+String getTextUnderlineMode();
+void setTextUnderlineMode(String value);
+void clearTextUnderlineMode();
+String getTextUnderlineStyle();
+void setTextUnderlineStyle(String value);
+void clearTextUnderlineStyle();
+String getTextUnderlineWidth();
+void setTextUnderlineWidth(String value);
+void clearTextUnderlineWidth();
+String getTop();
+void setTop(String value);
+void clearTop();
+void setTop(double value, String unit);
+String getUnicodeBidi();
+void setUnicodeBidi(String value);
+void clearUnicodeBidi();
+String getUnicodeRange();
+void setUnicodeRange(String value);
+void clearUnicodeRange();
+String getVerticalAlign();
+void setVerticalAlign(String value);
+void clearVerticalAlign();
+
+public interface Visibility {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+}
+
+String getVisibility();
+void setVisibility(String value);
+void clearVisibility();
+
+public interface WhiteSpace {
+  public static final String PRE = "pre";
+  public static final String NOWRAP = "nowrap";
+  public static final String PRE_WRAP = "pre-wrap";
+  public static final String PRE_LINE = "pre-line";
+}
+
+String getWhiteSpace();
+void setWhiteSpace(String value);
+void clearWhiteSpace();
+String getWidows();
+void setWidows(String value);
+void clearWidows();
+String getWidth();
+void setWidth(String value);
+void clearWidth();
+void setWidth(double value, String unit);
+String getWordBreak();
+void setWordBreak(String value);
+void clearWordBreak();
+String getWordSpacing();
+void setWordSpacing(String value);
+void clearWordSpacing();
+String getWordWrap();
+void setWordWrap(String value);
+void clearWordWrap();
+int getZIndex();
+void setZIndex(int value);
+void clearZIndex();
+String getWebkitAnimation();
+void setWebkitAnimation(String value);
+void clearWebkitAnimation();
+String getWebkitAnimationDelay();
+void setWebkitAnimationDelay(String value);
+void clearWebkitAnimationDelay();
+String getWebkitAnimationDirection();
+void setWebkitAnimationDirection(String value);
+void clearWebkitAnimationDirection();
+String getWebkitAnimationDuration();
+void setWebkitAnimationDuration(String value);
+void clearWebkitAnimationDuration();
+String getWebkitAnimationFillMode();
+void setWebkitAnimationFillMode(String value);
+void clearWebkitAnimationFillMode();
+String getWebkitAnimationIterationCount();
+void setWebkitAnimationIterationCount(String value);
+void clearWebkitAnimationIterationCount();
+String getWebkitAnimationName();
+void setWebkitAnimationName(String value);
+void clearWebkitAnimationName();
+String getWebkitAnimationPlayState();
+void setWebkitAnimationPlayState(String value);
+void clearWebkitAnimationPlayState();
+String getWebkitAnimationTimingFunction();
+void setWebkitAnimationTimingFunction(String value);
+void clearWebkitAnimationTimingFunction();
+String getWebkitAppearance();
+void setWebkitAppearance(String value);
+void clearWebkitAppearance();
+String getWebkitAspectRatio();
+void setWebkitAspectRatio(String value);
+void clearWebkitAspectRatio();
+String getWebkitBackfaceVisibility();
+void setWebkitBackfaceVisibility(String value);
+void clearWebkitBackfaceVisibility();
+String getWebkitBackgroundClip();
+void setWebkitBackgroundClip(String value);
+void clearWebkitBackgroundClip();
+String getWebkitBackgroundComposite();
+void setWebkitBackgroundComposite(String value);
+void clearWebkitBackgroundComposite();
+String getWebkitBackgroundOrigin();
+void setWebkitBackgroundOrigin(String value);
+void clearWebkitBackgroundOrigin();
+String getWebkitBackgroundSize();
+void setWebkitBackgroundSize(String value);
+void clearWebkitBackgroundSize();
+String getWebkitBorderAfter();
+void setWebkitBorderAfter(String value);
+void clearWebkitBorderAfter();
+String getWebkitBorderAfterColor();
+void setWebkitBorderAfterColor(String value);
+void clearWebkitBorderAfterColor();
+String getWebkitBorderAfterStyle();
+void setWebkitBorderAfterStyle(String value);
+void clearWebkitBorderAfterStyle();
+String getWebkitBorderAfterWidth();
+void setWebkitBorderAfterWidth(String value);
+void clearWebkitBorderAfterWidth();
+String getWebkitBorderBefore();
+void setWebkitBorderBefore(String value);
+void clearWebkitBorderBefore();
+String getWebkitBorderBeforeColor();
+void setWebkitBorderBeforeColor(String value);
+void clearWebkitBorderBeforeColor();
+String getWebkitBorderBeforeStyle();
+void setWebkitBorderBeforeStyle(String value);
+void clearWebkitBorderBeforeStyle();
+String getWebkitBorderBeforeWidth();
+void setWebkitBorderBeforeWidth(String value);
+void clearWebkitBorderBeforeWidth();
+String getWebkitBorderEnd();
+void setWebkitBorderEnd(String value);
+void clearWebkitBorderEnd();
+String getWebkitBorderEndColor();
+void setWebkitBorderEndColor(String value);
+void clearWebkitBorderEndColor();
+String getWebkitBorderEndStyle();
+void setWebkitBorderEndStyle(String value);
+void clearWebkitBorderEndStyle();
+String getWebkitBorderEndWidth();
+void setWebkitBorderEndWidth(String value);
+void clearWebkitBorderEndWidth();
+String getWebkitBorderFit();
+void setWebkitBorderFit(String value);
+void clearWebkitBorderFit();
+String getWebkitBorderHorizontalSpacing();
+void setWebkitBorderHorizontalSpacing(String value);
+void clearWebkitBorderHorizontalSpacing();
+String getWebkitBorderImage();
+void setWebkitBorderImage(String value);
+void clearWebkitBorderImage();
+String getWebkitBorderRadius();
+void setWebkitBorderRadius(String value);
+void clearWebkitBorderRadius();
+String getWebkitBorderStart();
+void setWebkitBorderStart(String value);
+void clearWebkitBorderStart();
+String getWebkitBorderStartColor();
+void setWebkitBorderStartColor(String value);
+void clearWebkitBorderStartColor();
+String getWebkitBorderStartStyle();
+void setWebkitBorderStartStyle(String value);
+void clearWebkitBorderStartStyle();
+String getWebkitBorderStartWidth();
+void setWebkitBorderStartWidth(String value);
+void clearWebkitBorderStartWidth();
+String getWebkitBorderVerticalSpacing();
+void setWebkitBorderVerticalSpacing(String value);
+void clearWebkitBorderVerticalSpacing();
+String getWebkitBoxAlign();
+void setWebkitBoxAlign(String value);
+void clearWebkitBoxAlign();
+String getWebkitBoxDirection();
+void setWebkitBoxDirection(String value);
+void clearWebkitBoxDirection();
+String getWebkitBoxFlex();
+void setWebkitBoxFlex(String value);
+void clearWebkitBoxFlex();
+String getWebkitBoxFlexGroup();
+void setWebkitBoxFlexGroup(String value);
+void clearWebkitBoxFlexGroup();
+String getWebkitBoxLines();
+void setWebkitBoxLines(String value);
+void clearWebkitBoxLines();
+String getWebkitBoxOrdinalGroup();
+void setWebkitBoxOrdinalGroup(String value);
+void clearWebkitBoxOrdinalGroup();
+String getWebkitBoxOrient();
+void setWebkitBoxOrient(String value);
+void clearWebkitBoxOrient();
+String getWebkitBoxPack();
+void setWebkitBoxPack(String value);
+void clearWebkitBoxPack();
+String getWebkitBoxReflect();
+void setWebkitBoxReflect(String value);
+void clearWebkitBoxReflect();
+String getWebkitBoxShadow();
+void setWebkitBoxShadow(String value);
+void clearWebkitBoxShadow();
+String getWebkitColorCorrection();
+void setWebkitColorCorrection(String value);
+void clearWebkitColorCorrection();
+String getWebkitColumnAxis();
+void setWebkitColumnAxis(String value);
+void clearWebkitColumnAxis();
+String getWebkitColumnBreakAfter();
+void setWebkitColumnBreakAfter(String value);
+void clearWebkitColumnBreakAfter();
+String getWebkitColumnBreakBefore();
+void setWebkitColumnBreakBefore(String value);
+void clearWebkitColumnBreakBefore();
+String getWebkitColumnBreakInside();
+void setWebkitColumnBreakInside(String value);
+void clearWebkitColumnBreakInside();
+String getWebkitColumnCount();
+void setWebkitColumnCount(String value);
+void clearWebkitColumnCount();
+String getWebkitColumnGap();
+void setWebkitColumnGap(String value);
+void clearWebkitColumnGap();
+String getWebkitColumnRule();
+void setWebkitColumnRule(String value);
+void clearWebkitColumnRule();
+String getWebkitColumnRuleColor();
+void setWebkitColumnRuleColor(String value);
+void clearWebkitColumnRuleColor();
+String getWebkitColumnRuleStyle();
+void setWebkitColumnRuleStyle(String value);
+void clearWebkitColumnRuleStyle();
+String getWebkitColumnRuleWidth();
+void setWebkitColumnRuleWidth(String value);
+void clearWebkitColumnRuleWidth();
+String getWebkitColumnSpan();
+void setWebkitColumnSpan(String value);
+void clearWebkitColumnSpan();
+String getWebkitColumnWidth();
+void setWebkitColumnWidth(String value);
+void clearWebkitColumnWidth();
+String getWebkitColumns();
+void setWebkitColumns(String value);
+void clearWebkitColumns();
+String getWebkitFilter();
+void setWebkitFilter(String value);
+void clearWebkitFilter();
+String getWebkitFlex();
+void setWebkitFlex(String value);
+void clearWebkitFlex();
+String getWebkitFlexAlign();
+void setWebkitFlexAlign(String value);
+void clearWebkitFlexAlign();
+String getWebkitFlexDirection();
+void setWebkitFlexDirection(String value);
+void clearWebkitFlexDirection();
+String getWebkitFlexFlow();
+void setWebkitFlexFlow(String value);
+void clearWebkitFlexFlow();
+String getWebkitFlexItemAlign();
+void setWebkitFlexItemAlign(String value);
+void clearWebkitFlexItemAlign();
+String getWebkitFlexLinePack();
+void setWebkitFlexLinePack(String value);
+void clearWebkitFlexLinePack();
+String getWebkitFlexOrder();
+void setWebkitFlexOrder(String value);
+void clearWebkitFlexOrder();
+String getWebkitFlexPack();
+void setWebkitFlexPack(String value);
+void clearWebkitFlexPack();
+String getWebkitFlexWrap();
+void setWebkitFlexWrap(String value);
+void clearWebkitFlexWrap();
+String getWebkitFontSizeDelta();
+void setWebkitFontSizeDelta(String value);
+void clearWebkitFontSizeDelta();
+String getWebkitGridColumns();
+void setWebkitGridColumns(String value);
+void clearWebkitGridColumns();
+String getWebkitGridRows();
+void setWebkitGridRows(String value);
+void clearWebkitGridRows();
+String getWebkitGridColumn();
+void setWebkitGridColumn(String value);
+void clearWebkitGridColumn();
+String getWebkitGridRow();
+void setWebkitGridRow(String value);
+void clearWebkitGridRow();
+String getWebkitHighlight();
+void setWebkitHighlight(String value);
+void clearWebkitHighlight();
+String getWebkitHyphenateCharacter();
+void setWebkitHyphenateCharacter(String value);
+void clearWebkitHyphenateCharacter();
+String getWebkitHyphenateLimitAfter();
+void setWebkitHyphenateLimitAfter(String value);
+void clearWebkitHyphenateLimitAfter();
+String getWebkitHyphenateLimitBefore();
+void setWebkitHyphenateLimitBefore(String value);
+void clearWebkitHyphenateLimitBefore();
+String getWebkitHyphenateLimitLines();
+void setWebkitHyphenateLimitLines(String value);
+void clearWebkitHyphenateLimitLines();
+String getWebkitHyphens();
+void setWebkitHyphens(String value);
+void clearWebkitHyphens();
+String getWebkitLineBoxContain();
+void setWebkitLineBoxContain(String value);
+void clearWebkitLineBoxContain();
+String getWebkitLineAlign();
+void setWebkitLineAlign(String value);
+void clearWebkitLineAlign();
+String getWebkitLineBreak();
+void setWebkitLineBreak(String value);
+void clearWebkitLineBreak();
+String getWebkitLineClamp();
+void setWebkitLineClamp(String value);
+void clearWebkitLineClamp();
+String getWebkitLineGrid();
+void setWebkitLineGrid(String value);
+void clearWebkitLineGrid();
+String getWebkitLineSnap();
+void setWebkitLineSnap(String value);
+void clearWebkitLineSnap();
+String getWebkitLogicalWidth();
+void setWebkitLogicalWidth(String value);
+void clearWebkitLogicalWidth();
+String getWebkitLogicalHeight();
+void setWebkitLogicalHeight(String value);
+void clearWebkitLogicalHeight();
+String getWebkitMarginAfterCollapse();
+void setWebkitMarginAfterCollapse(String value);
+void clearWebkitMarginAfterCollapse();
+String getWebkitMarginBeforeCollapse();
+void setWebkitMarginBeforeCollapse(String value);
+void clearWebkitMarginBeforeCollapse();
+String getWebkitMarginBottomCollapse();
+void setWebkitMarginBottomCollapse(String value);
+void clearWebkitMarginBottomCollapse();
+String getWebkitMarginTopCollapse();
+void setWebkitMarginTopCollapse(String value);
+void clearWebkitMarginTopCollapse();
+String getWebkitMarginCollapse();
+void setWebkitMarginCollapse(String value);
+void clearWebkitMarginCollapse();
+String getWebkitMarginAfter();
+void setWebkitMarginAfter(String value);
+void clearWebkitMarginAfter();
+String getWebkitMarginBefore();
+void setWebkitMarginBefore(String value);
+void clearWebkitMarginBefore();
+String getWebkitMarginEnd();
+void setWebkitMarginEnd(String value);
+void clearWebkitMarginEnd();
+String getWebkitMarginStart();
+void setWebkitMarginStart(String value);
+void clearWebkitMarginStart();
+String getWebkitMarquee();
+void setWebkitMarquee(String value);
+void clearWebkitMarquee();
+String getWebkitMarqueeDirection();
+void setWebkitMarqueeDirection(String value);
+void clearWebkitMarqueeDirection();
+String getWebkitMarqueeIncrement();
+void setWebkitMarqueeIncrement(String value);
+void clearWebkitMarqueeIncrement();
+String getWebkitMarqueeRepetition();
+void setWebkitMarqueeRepetition(String value);
+void clearWebkitMarqueeRepetition();
+String getWebkitMarqueeSpeed();
+void setWebkitMarqueeSpeed(String value);
+void clearWebkitMarqueeSpeed();
+String getWebkitMarqueeStyle();
+void setWebkitMarqueeStyle(String value);
+void clearWebkitMarqueeStyle();
+String getWebkitMask();
+void setWebkitMask(String value);
+void clearWebkitMask();
+String getWebkitMaskAttachment();
+void setWebkitMaskAttachment(String value);
+void clearWebkitMaskAttachment();
+String getWebkitMaskBoxImage();
+void setWebkitMaskBoxImage(String value);
+void clearWebkitMaskBoxImage();
+String getWebkitMaskBoxImageOutset();
+void setWebkitMaskBoxImageOutset(String value);
+void clearWebkitMaskBoxImageOutset();
+String getWebkitMaskBoxImageRepeat();
+void setWebkitMaskBoxImageRepeat(String value);
+void clearWebkitMaskBoxImageRepeat();
+String getWebkitMaskBoxImageSlice();
+void setWebkitMaskBoxImageSlice(String value);
+void clearWebkitMaskBoxImageSlice();
+String getWebkitMaskBoxImageSource();
+void setWebkitMaskBoxImageSource(String value);
+void clearWebkitMaskBoxImageSource();
+String getWebkitMaskBoxImageWidth();
+void setWebkitMaskBoxImageWidth(String value);
+void clearWebkitMaskBoxImageWidth();
+String getWebkitMaskClip();
+void setWebkitMaskClip(String value);
+void clearWebkitMaskClip();
+String getWebkitMaskComposite();
+void setWebkitMaskComposite(String value);
+void clearWebkitMaskComposite();
+String getWebkitMaskImage();
+void setWebkitMaskImage(String value);
+void clearWebkitMaskImage();
+String getWebkitMaskOrigin();
+void setWebkitMaskOrigin(String value);
+void clearWebkitMaskOrigin();
+String getWebkitMaskPosition();
+void setWebkitMaskPosition(String value);
+void clearWebkitMaskPosition();
+String getWebkitMaskPositionX();
+void setWebkitMaskPositionX(String value);
+void clearWebkitMaskPositionX();
+String getWebkitMaskPositionY();
+void setWebkitMaskPositionY(String value);
+void clearWebkitMaskPositionY();
+String getWebkitMaskRepeat();
+void setWebkitMaskRepeat(String value);
+void clearWebkitMaskRepeat();
+String getWebkitMaskRepeatX();
+void setWebkitMaskRepeatX(String value);
+void clearWebkitMaskRepeatX();
+String getWebkitMaskRepeatY();
+void setWebkitMaskRepeatY(String value);
+void clearWebkitMaskRepeatY();
+String getWebkitMaskSize();
+void setWebkitMaskSize(String value);
+void clearWebkitMaskSize();
+String getWebkitMatchNearestMailBlockquoteColor();
+void setWebkitMatchNearestMailBlockquoteColor(String value);
+void clearWebkitMatchNearestMailBlockquoteColor();
+String getWebkitMaxLogicalWidth();
+void setWebkitMaxLogicalWidth(String value);
+void clearWebkitMaxLogicalWidth();
+String getWebkitMaxLogicalHeight();
+void setWebkitMaxLogicalHeight(String value);
+void clearWebkitMaxLogicalHeight();
+String getWebkitMinLogicalWidth();
+void setWebkitMinLogicalWidth(String value);
+void clearWebkitMinLogicalWidth();
+String getWebkitMinLogicalHeight();
+void setWebkitMinLogicalHeight(String value);
+void clearWebkitMinLogicalHeight();
+String getWebkitNbspMode();
+void setWebkitNbspMode(String value);
+void clearWebkitNbspMode();
+String getWebkitPaddingAfter();
+void setWebkitPaddingAfter(String value);
+void clearWebkitPaddingAfter();
+String getWebkitPaddingBefore();
+void setWebkitPaddingBefore(String value);
+void clearWebkitPaddingBefore();
+String getWebkitPaddingEnd();
+void setWebkitPaddingEnd(String value);
+void clearWebkitPaddingEnd();
+String getWebkitPaddingStart();
+void setWebkitPaddingStart(String value);
+void clearWebkitPaddingStart();
+String getWebkitPerspective();
+void setWebkitPerspective(String value);
+void clearWebkitPerspective();
+String getWebkitPerspectiveOrigin();
+void setWebkitPerspectiveOrigin(String value);
+void clearWebkitPerspectiveOrigin();
+String getWebkitPerspectiveOriginX();
+void setWebkitPerspectiveOriginX(String value);
+void clearWebkitPerspectiveOriginX();
+String getWebkitPerspectiveOriginY();
+void setWebkitPerspectiveOriginY(String value);
+void clearWebkitPerspectiveOriginY();
+String getWebkitPrintColorAdjust();
+void setWebkitPrintColorAdjust(String value);
+void clearWebkitPrintColorAdjust();
+String getWebkitRtlOrdering();
+void setWebkitRtlOrdering(String value);
+void clearWebkitRtlOrdering();
+String getWebkitTextCombine();
+void setWebkitTextCombine(String value);
+void clearWebkitTextCombine();
+String getWebkitTextDecorationsInEffect();
+void setWebkitTextDecorationsInEffect(String value);
+void clearWebkitTextDecorationsInEffect();
+String getWebkitTextEmphasis();
+void setWebkitTextEmphasis(String value);
+void clearWebkitTextEmphasis();
+String getWebkitTextEmphasisColor();
+void setWebkitTextEmphasisColor(String value);
+void clearWebkitTextEmphasisColor();
+String getWebkitTextEmphasisPosition();
+void setWebkitTextEmphasisPosition(String value);
+void clearWebkitTextEmphasisPosition();
+String getWebkitTextEmphasisStyle();
+void setWebkitTextEmphasisStyle(String value);
+void clearWebkitTextEmphasisStyle();
+String getWebkitTextFillColor();
+void setWebkitTextFillColor(String value);
+void clearWebkitTextFillColor();
+String getWebkitTextSecurity();
+void setWebkitTextSecurity(String value);
+void clearWebkitTextSecurity();
+String getWebkitTextStroke();
+void setWebkitTextStroke(String value);
+void clearWebkitTextStroke();
+String getWebkitTextStrokeColor();
+void setWebkitTextStrokeColor(String value);
+void clearWebkitTextStrokeColor();
+String getWebkitTextStrokeWidth();
+void setWebkitTextStrokeWidth(String value);
+void clearWebkitTextStrokeWidth();
+String getWebkitTransform();
+void setWebkitTransform(String value);
+void clearWebkitTransform();
+String getWebkitTransformOrigin();
+void setWebkitTransformOrigin(String value);
+void clearWebkitTransformOrigin();
+String getWebkitTransformOriginX();
+void setWebkitTransformOriginX(String value);
+void clearWebkitTransformOriginX();
+String getWebkitTransformOriginY();
+void setWebkitTransformOriginY(String value);
+void clearWebkitTransformOriginY();
+String getWebkitTransformOriginZ();
+void setWebkitTransformOriginZ(String value);
+void clearWebkitTransformOriginZ();
+String getWebkitTransformStyle();
+void setWebkitTransformStyle(String value);
+void clearWebkitTransformStyle();
+String getWebkitTransition();
+void setWebkitTransition(String value);
+void clearWebkitTransition();
+String getWebkitTransitionDelay();
+void setWebkitTransitionDelay(String value);
+void clearWebkitTransitionDelay();
+String getWebkitTransitionDuration();
+void setWebkitTransitionDuration(String value);
+void clearWebkitTransitionDuration();
+String getWebkitTransitionProperty();
+void setWebkitTransitionProperty(String value);
+void clearWebkitTransitionProperty();
+String getWebkitTransitionTimingFunction();
+void setWebkitTransitionTimingFunction(String value);
+void clearWebkitTransitionTimingFunction();
+String getWebkitUserDrag();
+void setWebkitUserDrag(String value);
+void clearWebkitUserDrag();
+String getWebkitUserModify();
+void setWebkitUserModify(String value);
+void clearWebkitUserModify();
+String getWebkitUserSelect();
+void setWebkitUserSelect(String value);
+void clearWebkitUserSelect();
+String getWebkitFlowInto();
+void setWebkitFlowInto(String value);
+void clearWebkitFlowInto();
+String getWebkitFlowFrom();
+void setWebkitFlowFrom(String value);
+void clearWebkitFlowFrom();
+String getWebkitRegionOverflow();
+void setWebkitRegionOverflow(String value);
+void clearWebkitRegionOverflow();
+String getWebkitShapeInside();
+void setWebkitShapeInside(String value);
+void clearWebkitShapeInside();
+String getWebkitShapeOutside();
+void setWebkitShapeOutside(String value);
+void clearWebkitShapeOutside();
+String getWebkitWrapMargin();
+void setWebkitWrapMargin(String value);
+void clearWebkitWrapMargin();
+String getWebkitWrapPadding();
+void setWebkitWrapPadding(String value);
+void clearWebkitWrapPadding();
+String getWebkitRegionBreakAfter();
+void setWebkitRegionBreakAfter(String value);
+void clearWebkitRegionBreakAfter();
+String getWebkitRegionBreakBefore();
+void setWebkitRegionBreakBefore(String value);
+void clearWebkitRegionBreakBefore();
+String getWebkitRegionBreakInside();
+void setWebkitRegionBreakInside(String value);
+void clearWebkitRegionBreakInside();
+String getWebkitWrapFlow();
+void setWebkitWrapFlow(String value);
+void clearWebkitWrapFlow();
+String getWebkitWrapThrough();
+void setWebkitWrapThrough(String value);
+void clearWebkitWrapThrough();
+String getWebkitWrap();
+void setWebkitWrap(String value);
+void clearWebkitWrap();
+String getWebkitTapHighlightColor();
+void setWebkitTapHighlightColor(String value);
+void clearWebkitTapHighlightColor();
+String getWebkitDashboardRegion();
+void setWebkitDashboardRegion(String value);
+void clearWebkitDashboardRegion();
+String getWebkitOverflowScrolling();
+void setWebkitOverflowScrolling(String value);
+void clearWebkitOverflowScrolling();
+}
diff --git a/elemental/idl/templates/java_interface_Document.darttemplate b/elemental/idl/templates/java_interface_Document.darttemplate
new file mode 100644
index 0000000..6fdc25e
--- /dev/null
+++ b/elemental/idl/templates/java_interface_Document.darttemplate
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+import elemental.svg.*;
+
+import java.util.Date;
+
+/**
+  * $CLASSJAVADOC
+  */
+public interface $ID$EXTENDS {
+
+/**
+ * Contains the set of standard values used with {@link #createEvent}.
+ */
+public interface Events {
+  public static final String CUSTOM = "CustomEvent";
+  public static final String KEYBOARD = "KeyboardEvent";
+  public static final String MESSAGE = "MessageEvent";
+  public static final String MOUSE = "MouseEvent";
+  public static final String MUTATION = "MutationEvent";
+  public static final String OVERFLOW = "OverflowEvent";
+  public static final String PAGE_TRANSITION = "PageTransitionEvent";
+  public static final String PROGRESS = "ProgressEvent";
+  public static final String STORAGE = "StorageEvent";
+  public static final String TEXT = "TextEvent";
+  public static final String UI = "UIEvent";
+  public static final String WEBKIT_ANIMATION = "WebKitAnimationEvent";
+  public static final String WEBKIT_TRANSITION = "WebKitTransitionEvent";
+  public static final String WHEEL = "WheelEvent";
+  public static final String SVGS = "SVGEvents";
+  public static final String SVG_ZOOMS = "SVGZoomEvents";
+  public static final String TOUCH = "TouchEvent";
+}
+
+/**
+ * Contains the set of standard values returned by {@link #readyState}.
+ */
+public interface ReadyState {
+
+  /**
+   * Indicates the document is still loading and parsing.
+   */
+  public static final String LOADING = "loading";
+
+  /**
+   * Indicates the document is finished parsing but is still loading
+   * subresources.
+   */
+  public static final String INTERACTIVE = "interactive";
+
+  /**
+   * Indicates the document and all subresources have been loaded.
+   */
+  public static final String COMPLETE = "complete";
+}
+$!MEMBERS}
diff --git a/elemental/idl/templates/java_interface_Event.darttemplate b/elemental/idl/templates/java_interface_Event.darttemplate
new file mode 100644
index 0000000..b550de3
--- /dev/null
+++ b/elemental/idl/templates/java_interface_Event.darttemplate
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+
+import java.util.Date;
+
+/**
+  * $CLASSJAVADOC
+  */
+public interface $ID$EXTENDS {
+public static final String CLICK = "click";
+public static final String CONTEXTMENU = "contextmenu";
+public static final String DBLCLICK = "dblclick";
+public static final String CHANGE = "change";
+public static final String MOUSEDOWN = "mousedown";
+public static final String MOUSEMOVE = "mousemove";
+public static final String MOUSEOUT = "mouseout";
+public static final String MOUSEOVER = "mouseover";
+public static final String MOUSEUP = "mouseup";
+public static final String MOUSEWHEEL = "mousewheel";
+public static final String FOCUS = "focus";
+public static final String FOCUSIN = "focusin";
+public static final String FOCUSOUT = "focusout";
+public static final String BLUR = "blur";
+public static final String KEYDOWN = "keydown";
+public static final String KEYPRESS = "keypress";
+public static final String KEYUP = "keyup";
+public static final String SCROLL = "scroll";
+public static final String BEFORECUT = "beforecut";
+public static final String CUT = "cut";
+public static final String BEFORECOPY = "beforecopy";
+public static final String COPY = "copy";
+public static final String BEFOREPASTE = "beforepaste";
+public static final String PASTE = "paste";
+public static final String DRAGENTER = "dragenter";
+public static final String DRAGOVER = "dragover";
+public static final String DRAGLEAVE = "dragleave";
+public static final String DROP = "drop";
+public static final String DRAGSTART = "dragstart";
+public static final String DRAG = "drag";
+public static final String DRAGEND = "dragend";
+public static final String RESIZE = "resize";
+public static final String SELECTSTART = "selectstart";
+public static final String SUBMIT = "submit";
+public static final String ERROR = "error";
+public static final String WEBKITANIMATIONSTART = "webkitAnimationStart";
+public static final String WEBKITANIMATIONITERATION = "webkitAnimationIteration";
+public static final String WEBKITANIMATIONEND = "webkitAnimationEnd";
+public static final String WEBKITTRANSITIONEND = "webkitTransitionEnd";
+public static final String INPUT = "input";
+public static final String INVALID = "invalid";
+public static final String TOUCHSTART = "touchstart";
+public static final String TOUCHMOVE = "touchmove";
+public static final String TOUCHEND = "touchend";
+public static final String TOUCHCANCEL = "touchcancel";
+
+$!MEMBERS}
diff --git a/elemental/idl/templates/java_interface_KeyboardEvent.darttemplate b/elemental/idl/templates/java_interface_KeyboardEvent.darttemplate
new file mode 100644
index 0000000..8962984
--- /dev/null
+++ b/elemental/idl/templates/java_interface_KeyboardEvent.darttemplate
@@ -0,0 +1,675 @@
+/*
+ * Copyright 2008 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+
+import java.util.Date;
+
+/**
+  * $CLASSJAVADOC
+  */
+public interface $ID$EXTENDS {
+/**
+ * Defines the standard key locations returned by {@link #getKeyLocation}.
+ */
+public interface KeyLocation {
+
+  /**
+   * The event key is not distinguished as the left or right version
+   * of the key, and did not originate from the numeric keypad (or did not
+   * originate with a virtual key corresponding to the numeric keypad).
+   */
+  public static final int STANDARD = 0;
+
+  /**
+   * The event key is in the left key location.
+   */
+  public static final int LEFT = 1;
+
+  /**
+   * The event key is in the right key location.
+   */
+  public static final int RIGHT = 2;
+
+  /**
+   * The event key originated on the numeric keypad or with a virtual key
+   * corresponding to the numeric keypad.
+   */
+  public static final int NUMPAD = 3;
+
+  /**
+   * The event key originated on a mobile device, either on a physical
+   * keypad or a virtual keyboard.
+   */
+  public static final int MOBILE = 4;
+
+  /**
+   * The event key originated on a game controller or a joystick on a mobile
+   * device.
+   */
+  public static final int JOYSTICK = 5;
+}
+
+/**
+ * Defines the expected key codes returned by {@link #getKeyCode}.
+ *
+ * @see "http://code.google.com/p/closure-library/source/browse/trunk/closure/goog/events/keycodes.js"
+ */
+public interface KeyCode {
+  public static final int BACKSPACE = 8;
+  public static final int TAB = 9;
+  public static final int NUM_CENTER = 12; // NUMLOCK on FF/Safari Mac
+  public static final int ENTER = 13;
+  public static final int SHIFT = 16;
+  public static final int CTRL = 17;
+  public static final int ALT = 18;
+  public static final int PAUSE = 19;
+  public static final int CAPS_LOCK = 20;
+  public static final int ESC = 27;
+  public static final int SPACE = 32;
+  public static final int PAGE_UP = 33; // also NUM_NORTH_EAST
+  public static final int PAGE_DOWN = 34; // also NUM_SOUTH_EAST
+  public static final int END = 35; // also NUM_SOUTH_WEST
+  public static final int HOME = 36; // also NUM_NORTH_WEST
+  public static final int LEFT = 37; // also NUM_WEST
+  public static final int UP = 38; // also NUM_NORTH
+  public static final int RIGHT = 39; // also NUM_EAST
+  public static final int DOWN = 40; // also NUM_SOUTH
+  public static final int PRINT_SCREEN = 44;
+  public static final int INSERT = 45; // also NUM_INSERT
+  public static final int DELETE = 46; // also NUM_DELETE
+  public static final int ZERO = 48;
+  public static final int ONE = 49;
+  public static final int TWO = 50;
+  public static final int THREE = 51;
+  public static final int FOUR = 52;
+  public static final int FIVE = 53;
+  public static final int SIX = 54;
+  public static final int SEVEN = 55;
+  public static final int EIGHT = 56;
+  public static final int NINE = 57;
+  public static final int QUESTION_MARK = 63; // needs localization
+  public static final int A = 65;
+  public static final int B = 66;
+  public static final int C = 67;
+  public static final int D = 68;
+  public static final int E = 69;
+  public static final int F = 70;
+  public static final int G = 71;
+  public static final int H = 72;
+  public static final int I = 73;
+  public static final int J = 74;
+  public static final int K = 75;
+  public static final int L = 76;
+  public static final int M = 77;
+  public static final int N = 78;
+  public static final int O = 79;
+  public static final int P = 80;
+  public static final int Q = 81;
+  public static final int R = 82;
+  public static final int S = 83;
+  public static final int T = 84;
+  public static final int U = 85;
+  public static final int V = 86;
+  public static final int W = 87;
+  public static final int X = 88;
+  public static final int Y = 89;
+  public static final int Z = 90;
+  public static final int META = 91;
+  public static final int CONTEXT_MENU = 93;
+  public static final int NUM_ZERO = 96;
+  public static final int NUM_ONE = 97;
+  public static final int NUM_TWO = 98;
+  public static final int NUM_THREE = 99;
+  public static final int NUM_FOUR = 100;
+  public static final int NUM_FIVE = 101;
+  public static final int NUM_SIX = 102;
+  public static final int NUM_SEVEN = 103;
+  public static final int NUM_EIGHT = 104;
+  public static final int NUM_NINE = 105;
+  public static final int NUM_MULTIPLY = 106;
+  public static final int NUM_PLUS = 107;
+  public static final int NUM_MINUS = 109;
+  public static final int NUM_PERIOD = 110;
+  public static final int NUM_DIVISION = 111;
+  public static final int F1 = 112;
+  public static final int F2 = 113;
+  public static final int F3 = 114;
+  public static final int F4 = 115;
+  public static final int F5 = 116;
+  public static final int F6 = 117;
+  public static final int F7 = 118;
+  public static final int F8 = 119;
+  public static final int F9 = 120;
+  public static final int F10 = 121;
+  public static final int F11 = 122;
+  public static final int F12 = 123;
+  public static final int NUMLOCK = 144;
+  public static final int SEMICOLON = 186; // needs localization
+  public static final int DASH = 189; // needs localization
+  public static final int EQUALS = 187; // needs localization
+  public static final int COMMA = 188; // needs localization
+  public static final int PERIOD = 190; // needs localization
+  public static final int SLASH = 191; // needs localization
+  public static final int APOSTROPHE = 192; // needs localization
+  public static final int SINGLE_QUOTE = 222; // needs localization
+  public static final int OPEN_SQUARE_BRACKET = 219; // needs localization
+  public static final int BACKSLASH = 220;
+  public static final int CLOSE_SQUARE_BRACKET = 221;
+  public static final int WIN_KEY = 224;
+  public static final int WIN_IME = 229;
+}
+
+/**
+ * Defines the standard keyboard identifier names for keys that are returned
+ * by {@link #getKeyboardIdentifier} when the key does not have a direct
+ * unicode mapping.
+ */
+public interface KeyName {
+
+  /** The Accept (Commit, OK) key */
+  public static final String ACCEPT = "Accept";
+
+  /** The Add key */
+  public static final String ADD = "Add";
+
+  /** The Again key */
+  public static final String AGAIN = "Again";
+
+  /** The All Candidates key */
+  public static final String ALL_CANDIDATES = "AllCandidates";
+
+  /** The Alphanumeric key */
+  public static final String ALPHANUMERIC = "Alphanumeric";
+
+  /** The Alt (Menu) key */
+  public static final String ALT = "Alt";
+
+  /** The Alt-Graph key */
+  public static final String ALT_GRAPH = "AltGraph";
+
+  /** The Application key */
+  public static final String APPS = "Apps";
+
+  /** The ATTN key */
+  public static final String ATTN = "Attn";
+
+  /** The Browser Back key */
+  public static final String BROWSER_BACK = "BrowserBack";
+
+  /** The Browser Favorites key */
+  public static final String BROWSER_FAVORTIES = "BrowserFavorites";
+
+  /** The Browser Forward key */
+  public static final String BROWSER_FORWARD = "BrowserForward";
+
+  /** The Browser Home key */
+  public static final String BROWSER_NAME = "BrowserHome";
+
+  /** The Browser Refresh key */
+  public static final String BROWSER_REFRESH = "BrowserRefresh";
+
+  /** The Browser Search key */
+  public static final String BROWSER_SEARCH = "BrowserSearch";
+
+  /** The Browser Stop key */
+  public static final String BROWSER_STOP = "BrowserStop";
+
+  /** The Camera key */
+  public static final String CAMERA = "Camera";
+
+  /** The Caps Lock (Capital) key */
+  public static final String CAPS_LOCK = "CapsLock";
+
+  /** The Clear key */
+  public static final String CLEAR = "Clear";
+
+  /** The Code Input key */
+  public static final String CODE_INPUT = "CodeInput";
+
+  /** The Compose key */
+  public static final String COMPOSE = "Compose";
+
+  /** The Control (Ctrl) key */
+  public static final String CONTROL = "Control";
+
+  /** The Crsel key */
+  public static final String CRSEL = "Crsel";
+
+  /** The Convert key */
+  public static final String CONVERT = "Convert";
+
+  /** The Copy key */
+  public static final String COPY = "Copy";
+
+  /** The Cut key */
+  public static final String CUT = "Cut";
+
+  /** The Decimal key */
+  public static final String DECIMAL = "Decimal";
+
+  /** The Divide key */
+  public static final String DIVIDE = "Divide";
+
+  /** The Down Arrow key */
+  public static final String DOWN = "Down";
+
+  /** The diagonal Down-Left Arrow key */
+  public static final String DOWN_LEFT = "DownLeft";
+
+  /** The diagonal Down-Right Arrow key */
+  public static final String DOWN_RIGHT = "DownRight";
+
+  /** The Eject key */
+  public static final String EJECT = "Eject";
+
+  /** The End key */
+  public static final String END = "End";
+
+  /**
+   * The Enter key. Note: This key value must also be used for the Return
+   *  (Macintosh numpad) key
+   */
+  public static final String ENTER = "Enter";
+
+  /** The Erase EOF key */
+  public static final String ERASE_EOF= "EraseEof";
+
+  /** The Execute key */
+  public static final String EXECUTE = "Execute";
+
+  /** The Exsel key */
+  public static final String EXSEL = "Exsel";
+
+  /** The Function switch key */
+  public static final String FN = "Fn";
+
+  /** The F1 key */
+  public static final String F1 = "F1";
+
+  /** The F2 key */
+  public static final String F2 = "F2";
+
+  /** The F3 key */
+  public static final String F3 = "F3";
+
+  /** The F4 key */
+  public static final String F4 = "F4";
+
+  /** The F5 key */
+  public static final String F5 = "F5";
+
+  /** The F6 key */
+  public static final String F6 = "F6";
+
+  /** The F7 key */
+  public static final String F7 = "F7";
+
+  /** The F8 key */
+  public static final String F8 = "F8";
+
+  /** The F9 key */
+  public static final String F9 = "F9";
+
+  /** The F10 key */
+  public static final String F10 = "F10";
+
+  /** The F11 key */
+  public static final String F11 = "F11";
+
+  /** The F12 key */
+  public static final String F12 = "F12";
+
+  /** The F13 key */
+  public static final String F13 = "F13";
+
+  /** The F14 key */
+  public static final String F14 = "F14";
+
+  /** The F15 key */
+  public static final String F15 = "F15";
+
+  /** The F16 key */
+  public static final String F16 = "F16";
+
+  /** The F17 key */
+  public static final String F17 = "F17";
+
+  /** The F18 key */
+  public static final String F18 = "F18";
+
+  /** The F19 key */
+  public static final String F19 = "F19";
+
+  /** The F20 key */
+  public static final String F20 = "F20";
+
+  /** The F21 key */
+  public static final String F21 = "F21";
+
+  /** The F22 key */
+  public static final String F22 = "F22";
+
+  /** The F23 key */
+  public static final String F23 = "F23";
+
+  /** The F24 key */
+  public static final String F24 = "F24";
+
+  /** The Final Mode (Final) key used on some asian keyboards */
+  public static final String FINAL_MODE = "FinalMode";
+
+  /** The Find key */
+  public static final String FIND = "Find";
+
+  /** The Full-Width Characters key */
+  public static final String FULL_WIDTH = "FullWidth";
+
+  /** The Half-Width Characters key */
+  public static final String HALF_WIDTH = "HalfWidth";
+
+  /** The Hangul (Korean characters) Mode key */
+  public static final String HANGUL_MODE = "HangulMode";
+
+  /** The Hanja (Korean characters) Mode key */
+  public static final String HANJA_MODE = "HanjaMode";
+
+  /** The Help key */
+  public static final String HELP = "Help";
+
+  /** The Hiragana (Japanese Kana characters) key */
+  public static final String HIRAGANA = "Hiragana";
+
+  /** The Home key */
+  public static final String HOME = "Home";
+
+  /** The Insert (Ins) key */
+  public static final String INSERT = "Insert";
+
+  /** The Japanese-Hiragana key */
+  public static final String JAPANESE_HIRAGANA = "JapaneseHiragana";
+
+  /** The Japanese-Katakana key */
+  public static final String JAPANESE_KATAKANA = "JapaneseKatakana";
+
+  /** The Japanese-Romaji key */
+  public static final String JAPANESE_ROMAJI = "JapaneseRomaji";
+
+  /** The Junja Mode key */
+  public static final String JUNJA_MODE = "JunjaMode";
+
+  /** The Kana Mode (Kana Lock) key */
+  public static final String KANA_MODE = "KanaMode";
+
+  /**
+   * The Kanji (Japanese name for ideographic characters of Chinese origin)
+   * Mode key
+   */
+  public static final String KANJI_MODE = "KanjiMode";
+
+  /** The Katakana (Japanese Kana characters) key */
+  public static final String KATAKANA = "Katakana";
+
+  /** The Start Application One key */
+  public static final String LAUNCH_APPLICATION_1 = "LaunchApplication1";
+
+  /** The Start Application Two key */
+  public static final String LAUNCH_APPLICATION_2 = "LaunchApplication2";
+
+  /** The Start Mail key */
+  public static final String LAUNCH_MAIL = "LaunchMail";
+
+  /** The Left Arrow key */
+  public static final String LEFT = "Left";
+
+  /** The Menu key */
+  public static final String MENU = "Menu";
+
+  /**
+   * The Meta key. Note: This key value shall be also used for the Apple
+   * Command key
+   */
+  public static final String META = "Meta";
+
+  /** The Media Next Track key */
+  public static final String MEDIA_NEXT_TRACK = "MediaNextTrack";
+
+  /** The Media Play Pause key */
+  public static final String MEDIA_PAUSE_PLAY = "MediaPlayPause";
+
+  /** The Media Previous Track key */
+  public static final String MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
+
+  /** The Media Stop key */
+  public static final String MEDIA_STOP = "MediaStop";
+
+  /** The Mode Change key */
+  public static final String MODE_CHANGE = "ModeChange";
+
+  /** The Next Candidate function key */
+  public static final String NEXT_CANDIDATE = "NextCandidate";
+
+  /** The Nonconvert (Don't Convert) key */
+  public static final String NON_CONVERT = "Nonconvert";
+
+  /** The Number Lock key */
+  public static final String NUM_LOCK = "NumLock";
+
+  /** The Page Down (Next) key */
+  public static final String PAGE_DOWN = "PageDown";
+
+  /** The Page Up key */
+  public static final String PAGE_UP = "PageUp";
+
+  /** The Paste key */
+  public static final String PASTE = "Paste";
+
+  /** The Pause key */
+  public static final String PAUSE = "Pause";
+
+  /** The Play key */
+  public static final String PLAY = "Play";
+
+  /**
+   * The Power key. Note: Some devices may not expose this key to the
+   * operating environment
+   */
+  public static final String POWER = "Power";
+
+  /** The Previous Candidate function key */
+  public static final String PREVIOUS_CANDIDATE = "PreviousCandidate";
+
+  /** The Print Screen (PrintScrn, SnapShot) key */
+  public static final String PRINT_SCREEN = "PrintScreen";
+
+  /** The Process key */
+  public static final String PROCESS = "Process";
+
+  /** The Props key */
+  public static final String PROPS = "Props";
+
+  /** The Right Arrow key */
+  public static final String RIGHT = "Right";
+
+  /** The Roman Characters function key */
+  public static final String ROMAN_CHARACTERS = "RomanCharacters";
+
+  /** The Scroll Lock key */
+  public static final String SCROLL = "Scroll";
+
+  /** The Select key */
+  public static final String SELECT = "Select";
+
+  /** The Select Media key */
+  public static final String SELECT_MEDIA = "SelectMedia";
+
+  /** The Separator key */
+  public static final String SEPARATOR = "Separator";
+
+  /** The Shift key */
+  public static final String SHIFT = "Shift";
+
+  /** The Soft1 key */
+  public static final String SOFT_1 = "Soft1";
+
+  /** The Soft2 key */
+  public static final String SOFT_2 = "Soft2";
+
+  /** The Soft3 key */
+  public static final String SOFT_3 = "Soft3";
+
+  /** The Soft4 key */
+  public static final String SOFT_4 = "Soft4";
+
+  /** The Stop key */
+  public static final String STOP = "Stop";
+
+  /** The Subtract key */
+  public static final String SUBTRACT = "Subtract";
+
+  /** The Symbol Lock key */
+  public static final String SYMBOL_LOCK = "SymbolLock";
+
+  /** The Up Arrow key */
+  public static final String UP = "Up";
+
+  /** The diagonal Up-Left Arrow key */
+  public static final String UP_LEFT = "UpLeft";
+
+  /** The diagonal Up-Right Arrow key */
+  public static final String UP_RIGHT = "UpRight";
+
+  /** The Undo key */
+  public static final String UNDO = "Undo";
+
+  /** The Volume Down key */
+  public static final String VOLUME_DOWN = "VolumeDown";
+
+  /** The Volume Mute key */
+  public static final String VOLUMN_MUTE = "VolumeMute";
+
+  /** The Volume Up key */
+  public static final String VOLUMN_UP = "VolumeUp";
+
+  /** The Windows Logo key */
+  public static final String WIN = "Win";
+
+  /** The Zoom key */
+  public static final String ZOOM = "Zoom";
+
+  /**
+   * The Backspace (Back) key. Note: This key value shall be also used for the
+   * key labeled 'delete' MacOS keyboards when not modified by the 'Fn' key
+   */
+  public static final String BACKSPACE = "Backspace";
+
+  /** The Horizontal Tabulation (Tab) key */
+  public static final String TAB = "Tab";
+
+  /** The Cancel key */
+  public static final String CANCEL = "Cancel";
+
+  /** The Escape (Esc) key */
+  public static final String ESC = "Esc";
+
+  /** The Space (Spacebar) key:   */
+  public static final String SPACEBAR = "Spacebar";
+
+  /**
+   * The Delete (Del) Key. Note: This key value shall be also used for the key
+   * labeled 'delete' MacOS keyboards when modified by the 'Fn' key
+   */
+  public static final String DEL = "Del";
+
+  /** The Combining Grave Accent (Greek Varia, Dead Grave) key */
+  public static final String DEAD_GRAVE = "DeadGrave";
+
+  /**
+   * The Combining Acute Accent (Stress Mark, Greek Oxia, Tonos, Dead Eacute)
+   * key
+   */
+  public static final String DEAD_EACUTE = "DeadEacute";
+
+  /** The Combining Circumflex Accent (Hat, Dead Circumflex) key */
+  public static final String DEAD_CIRCUMFLEX = "DeadCircumflex";
+
+  /** The Combining Tilde (Dead Tilde) key */
+  public static final String DEAD_TILDE = "DeadTilde";
+
+  /** The Combining Macron (Long, Dead Macron) key */
+  public static final String DEAD_MACRON = "DeadMacron";
+
+  /** The Combining Breve (Short, Dead Breve) key */
+  public static final String DEAD_BREVE = "DeadBreve";
+
+  /** The Combining Dot Above (Derivative, Dead Above Dot) key */
+  public static final String DEAD_ABOVE_DOT = "DeadAboveDot";
+
+  /**
+   * The Combining Diaeresis (Double Dot Abode, Umlaut, Greek Dialytika,
+   * Double Derivative, Dead Diaeresis) key
+   */
+  public static final String DEAD_UMLAUT = "DeadUmlaut";
+
+  /** The Combining Ring Above (Dead Above Ring) key */
+  public static final String DEAD_ABOVE_RING = "DeadAboveRing";
+
+  /** The Combining Double Acute Accent (Dead Doubleacute) key */
+  public static final String DEAD_DOUBLEACUTE = "DeadDoubleacute";
+
+  /** The Combining Caron (Hacek, V Above, Dead Caron) key */
+  public static final String DEAD_CARON = "DeadCaron";
+
+  /** The Combining Cedilla (Dead Cedilla) key */
+  public static final String DEAD_CEDILLA = "DeadCedilla";
+
+  /** The Combining Ogonek (Nasal Hook, Dead Ogonek) key */
+  public static final String DEAD_OGONEK = "DeadOgonek";
+
+  /**
+   * The Combining Greek Ypogegrammeni (Greek Non-Spacing Iota Below, Iota
+   * Subscript, Dead Iota) key
+   */
+  public static final String DEAD_IOTA = "DeadIota";
+
+  /**
+   * The Combining Katakana-Hiragana Voiced Sound Mark (Dead Voiced Sound) key
+   */
+  public static final String DEAD_VOICED_SOUND = "DeadVoicedSound";
+
+  /**
+   * The Combining Katakana-Hiragana Semi-Voiced Sound Mark (Dead Semivoiced
+   * Sound) key
+   */
+  public static final String DEC_SEMIVOICED_SOUND= "DeadSemivoicedSound";
+
+  /**
+   * Key value used when an implementation is unable to identify another key
+   * value, due to either hardware, platform, or software constraints
+   */
+  public static final String UNIDENTIFIED = "Unidentified";
+  }
+
+  int getKeyCode();
+    
+$!MEMBERS}
diff --git a/elemental/idl/templates/java_interface_MouseEvent.darttemplate b/elemental/idl/templates/java_interface_MouseEvent.darttemplate
new file mode 100644
index 0000000..cdbc7f9
--- /dev/null
+++ b/elemental/idl/templates/java_interface_MouseEvent.darttemplate
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+
+import java.util.Date;
+
+/**
+  * $CLASSJAVADOC
+  */
+public interface $ID$EXTENDS {
+  /**
+   * Contains the set of standard values returned by {@link #button}.
+   */
+  public interface Button {
+    public static final short PRIMARY = 0;
+    public static final short AUXILIARY = 1;
+    public static final short SECONDARY = 2;
+  }
+$!MEMBERS}
diff --git a/elemental/idl/templates/java_interface_Window.darttemplate b/elemental/idl/templates/java_interface_Window.darttemplate
new file mode 100644
index 0000000..e049366
--- /dev/null
+++ b/elemental/idl/templates/java_interface_Window.darttemplate
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+import elemental.xpath.*;
+import elemental.xml.*;
+
+
+import java.util.Date;
+
+/**
+  * $CLASSJAVADOC
+  */
+public interface $ID$EXTENDS {
+  void clearOpener();
+$!MEMBERS}
diff --git a/elemental/idl/templates/javacallback.darttemplate b/elemental/idl/templates/javacallback.darttemplate
new file mode 100644
index 0000000..35ffd5f
--- /dev/null
+++ b/elemental/idl/templates/javacallback.darttemplate
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * $CLASSJAVADOC
+  */
+public interface $NAME {
+  $TYPE on$NAME($PARAMS);
+}
diff --git a/elemental/idl/templates/jso_impl.darttemplate b/elemental/idl/templates/jso_impl.darttemplate
new file mode 100644
index 0000000..b25fb0d
--- /dev/null
+++ b/elemental/idl/templates/jso_impl.darttemplate
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class $ID$EXTENDS $IMPLEMENTS {
+  protected $ID() {}
+$!MEMBERS}
diff --git a/elemental/idl/templates/jso_impl_CSSStyleDeclaration.darttemplate b/elemental/idl/templates/jso_impl_CSSStyleDeclaration.darttemplate
new file mode 100644
index 0000000..3797151
--- /dev/null
+++ b/elemental/idl/templates/jso_impl_CSSStyleDeclaration.darttemplate
@@ -0,0 +1,1074 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class $ID$EXTENDS $IMPLEMENTS {
+  protected $ID() {}
+$!MEMBERS
+public final native String getColor() /*-{ return this.color; }-*/;
+public final native void setColor(String value) /*-{ this.color = value; }-*/;
+public final native void clearColor() /*-{ this.color = ""; }-*/;
+public final native String getDirection() /*-{ return this.direction; }-*/;
+public final native void setDirection(String value) /*-{ this.direction = value; }-*/;
+public final native void clearDirection() /*-{ this.direction = ""; }-*/;
+public final native String getDisplay() /*-{ return this.display; }-*/;
+public final native void setDisplay(String value) /*-{ this.display = value; }-*/;
+public final native void clearDisplay() /*-{ this.display = ""; }-*/;
+public final native String getFont() /*-{ return this.font; }-*/;
+public final native void setFont(String value) /*-{ this.font = value; }-*/;
+public final native void clearFont() /*-{ this.font = ""; }-*/;
+public final native String getFontFamily() /*-{ return this.fontFamily; }-*/;
+public final native void setFontFamily(String value) /*-{ this.fontFamily = value; }-*/;
+public final native void clearFontFamily() /*-{ this.fontFamily = ""; }-*/;
+public final native String getFontSize() /*-{ return this.fontSize; }-*/;
+public final native void setFontSize(String value) /*-{ this.fontSize = value; }-*/;
+public final native void clearFontSize() /*-{ this.fontSize = ""; }-*/;
+public final native void setFontSize(double value, String unit) /*-{ this.fontSize = value + unit; }-*/;
+public final native String getFontStyle() /*-{ return this.fontStyle; }-*/;
+public final native void setFontStyle(String value) /*-{ this.fontStyle = value; }-*/;
+public final native void clearFontStyle() /*-{ this.fontStyle = ""; }-*/;
+public final native String getFontWeight() /*-{ return this.fontWeight; }-*/;
+public final native void setFontWeight(String value) /*-{ this.fontWeight = value; }-*/;
+public final native void clearFontWeight() /*-{ this.fontWeight = ""; }-*/;
+public final native String getFontVariant() /*-{ return this.fontVariant; }-*/;
+public final native void setFontVariant(String value) /*-{ this.fontVariant = value; }-*/;
+public final native void clearFontVariant() /*-{ this.fontVariant = ""; }-*/;
+public final native String getTextRendering() /*-{ return this.textRendering; }-*/;
+public final native void setTextRendering(String value) /*-{ this.textRendering = value; }-*/;
+public final native void clearTextRendering() /*-{ this.textRendering = ""; }-*/;
+public final native String getWebkitFontFeatureSettings() /*-{ return this.webkitFontFeatureSettings; }-*/;
+public final native void setWebkitFontFeatureSettings(String value) /*-{ this.webkitFontFeatureSettings = value; }-*/;
+public final native void clearWebkitFontFeatureSettings() /*-{ this.webkitFontFeatureSettings = ""; }-*/;
+public final native String getWebkitFontKerning() /*-{ return this.webkitFontKerning; }-*/;
+public final native void setWebkitFontKerning(String value) /*-{ this.webkitFontKerning = value; }-*/;
+public final native void clearWebkitFontKerning() /*-{ this.webkitFontKerning = ""; }-*/;
+public final native String getWebkitFontSmoothing() /*-{ return this.webkitFontSmoothing; }-*/;
+public final native void setWebkitFontSmoothing(String value) /*-{ this.webkitFontSmoothing = value; }-*/;
+public final native void clearWebkitFontSmoothing() /*-{ this.webkitFontSmoothing = ""; }-*/;
+public final native String getWebkitFontVariantLigatures() /*-{ return this.webkitFontVariantLigatures; }-*/;
+public final native void setWebkitFontVariantLigatures(String value) /*-{ this.webkitFontVariantLigatures = value; }-*/;
+public final native void clearWebkitFontVariantLigatures() /*-{ this.webkitFontVariantLigatures = ""; }-*/;
+public final native String getWebkitLocale() /*-{ return this.webkitLocale; }-*/;
+public final native void setWebkitLocale(String value) /*-{ this.webkitLocale = value; }-*/;
+public final native void clearWebkitLocale() /*-{ this.webkitLocale = ""; }-*/;
+public final native String getWebkitTextOrientation() /*-{ return this.webkitTextOrientation; }-*/;
+public final native void setWebkitTextOrientation(String value) /*-{ this.webkitTextOrientation = value; }-*/;
+public final native void clearWebkitTextOrientation() /*-{ this.webkitTextOrientation = ""; }-*/;
+public final native String getWebkitTextSizeAdjust() /*-{ return this.webkitTextSizeAdjust; }-*/;
+public final native void setWebkitTextSizeAdjust(String value) /*-{ this.webkitTextSizeAdjust = value; }-*/;
+public final native void clearWebkitTextSizeAdjust() /*-{ this.webkitTextSizeAdjust = ""; }-*/;
+public final native String getWebkitWritingMode() /*-{ return this.webkitWritingMode; }-*/;
+public final native void setWebkitWritingMode(String value) /*-{ this.webkitWritingMode = value; }-*/;
+public final native void clearWebkitWritingMode() /*-{ this.webkitWritingMode = ""; }-*/;
+public final native String getZoom() /*-{ return this.zoom; }-*/;
+public final native void setZoom(String value) /*-{ this.zoom = value; }-*/;
+public final native void clearZoom() /*-{ this.zoom = ""; }-*/;
+public final native String getLineHeight() /*-{ return this.lineHeight; }-*/;
+public final native void setLineHeight(String value) /*-{ this.lineHeight = value; }-*/;
+public final native void clearLineHeight() /*-{ this.lineHeight = ""; }-*/;
+public final native String getBackground() /*-{ return this.background; }-*/;
+public final native void setBackground(String value) /*-{ this.background = value; }-*/;
+public final native void clearBackground() /*-{ this.background = ""; }-*/;
+public final native String getBackgroundAttachment() /*-{ return this.backgroundAttachment; }-*/;
+public final native void setBackgroundAttachment(String value) /*-{ this.backgroundAttachment = value; }-*/;
+public final native void clearBackgroundAttachment() /*-{ this.backgroundAttachment = ""; }-*/;
+public final native String getBackgroundClip() /*-{ return this.backgroundClip; }-*/;
+public final native void setBackgroundClip(String value) /*-{ this.backgroundClip = value; }-*/;
+public final native void clearBackgroundClip() /*-{ this.backgroundClip = ""; }-*/;
+public final native String getBackgroundColor() /*-{ return this.backgroundColor; }-*/;
+public final native void setBackgroundColor(String value) /*-{ this.backgroundColor = value; }-*/;
+public final native void clearBackgroundColor() /*-{ this.backgroundColor = ""; }-*/;
+public final native String getBackgroundImage() /*-{ return this.backgroundImage; }-*/;
+public final native void setBackgroundImage(String value) /*-{ this.backgroundImage = value; }-*/;
+public final native void clearBackgroundImage() /*-{ this.backgroundImage = ""; }-*/;
+public final native String getBackgroundOrigin() /*-{ return this.backgroundOrigin; }-*/;
+public final native void setBackgroundOrigin(String value) /*-{ this.backgroundOrigin = value; }-*/;
+public final native void clearBackgroundOrigin() /*-{ this.backgroundOrigin = ""; }-*/;
+public final native String getBackgroundPosition() /*-{ return this.backgroundPosition; }-*/;
+public final native void setBackgroundPosition(String value) /*-{ this.backgroundPosition = value; }-*/;
+public final native void clearBackgroundPosition() /*-{ this.backgroundPosition = ""; }-*/;
+public final native String getBackgroundPositionX() /*-{ return this.backgroundPositionX; }-*/;
+public final native void setBackgroundPositionX(String value) /*-{ this.backgroundPositionX = value; }-*/;
+public final native void clearBackgroundPositionX() /*-{ this.backgroundPositionX = ""; }-*/;
+public final native String getBackgroundPositionY() /*-{ return this.backgroundPositionY; }-*/;
+public final native void setBackgroundPositionY(String value) /*-{ this.backgroundPositionY = value; }-*/;
+public final native void clearBackgroundPositionY() /*-{ this.backgroundPositionY = ""; }-*/;
+public final native String getBackgroundRepeat() /*-{ return this.backgroundRepeat; }-*/;
+public final native void setBackgroundRepeat(String value) /*-{ this.backgroundRepeat = value; }-*/;
+public final native void clearBackgroundRepeat() /*-{ this.backgroundRepeat = ""; }-*/;
+public final native String getBackgroundRepeatX() /*-{ return this.backgroundRepeatX; }-*/;
+public final native void setBackgroundRepeatX(String value) /*-{ this.backgroundRepeatX = value; }-*/;
+public final native void clearBackgroundRepeatX() /*-{ this.backgroundRepeatX = ""; }-*/;
+public final native String getBackgroundRepeatY() /*-{ return this.backgroundRepeatY; }-*/;
+public final native void setBackgroundRepeatY(String value) /*-{ this.backgroundRepeatY = value; }-*/;
+public final native void clearBackgroundRepeatY() /*-{ this.backgroundRepeatY = ""; }-*/;
+public final native String getBackgroundSize() /*-{ return this.backgroundSize; }-*/;
+public final native void setBackgroundSize(String value) /*-{ this.backgroundSize = value; }-*/;
+public final native void clearBackgroundSize() /*-{ this.backgroundSize = ""; }-*/;
+public final native String getBorder() /*-{ return this.border; }-*/;
+public final native void setBorder(String value) /*-{ this.border = value; }-*/;
+public final native void clearBorder() /*-{ this.border = ""; }-*/;
+public final native String getBorderBottom() /*-{ return this.borderBottom; }-*/;
+public final native void setBorderBottom(String value) /*-{ this.borderBottom = value; }-*/;
+public final native void clearBorderBottom() /*-{ this.borderBottom = ""; }-*/;
+public final native String getBorderBottomColor() /*-{ return this.borderBottomColor; }-*/;
+public final native void setBorderBottomColor(String value) /*-{ this.borderBottomColor = value; }-*/;
+public final native void clearBorderBottomColor() /*-{ this.borderBottomColor = ""; }-*/;
+public final native String getBorderBottomLeftRadius() /*-{ return this.borderBottomLeftRadius; }-*/;
+public final native void setBorderBottomLeftRadius(String value) /*-{ this.borderBottomLeftRadius = value; }-*/;
+public final native void clearBorderBottomLeftRadius() /*-{ this.borderBottomLeftRadius = ""; }-*/;
+public final native String getBorderBottomRightRadius() /*-{ return this.borderBottomRightRadius; }-*/;
+public final native void setBorderBottomRightRadius(String value) /*-{ this.borderBottomRightRadius = value; }-*/;
+public final native void clearBorderBottomRightRadius() /*-{ this.borderBottomRightRadius = ""; }-*/;
+public final native String getBorderBottomStyle() /*-{ return this.borderBottomStyle; }-*/;
+public final native void setBorderBottomStyle(String value) /*-{ this.borderBottomStyle = value; }-*/;
+public final native void clearBorderBottomStyle() /*-{ this.borderBottomStyle = ""; }-*/;
+public final native String getBorderBottomWidth() /*-{ return this.borderBottomWidth; }-*/;
+public final native void setBorderBottomWidth(String value) /*-{ this.borderBottomWidth = value; }-*/;
+public final native void clearBorderBottomWidth() /*-{ this.borderBottomWidth = ""; }-*/;
+public final native String getBorderCollapse() /*-{ return this.borderCollapse; }-*/;
+public final native void setBorderCollapse(String value) /*-{ this.borderCollapse = value; }-*/;
+public final native void clearBorderCollapse() /*-{ this.borderCollapse = ""; }-*/;
+public final native String getBorderColor() /*-{ return this.borderColor; }-*/;
+public final native void setBorderColor(String value) /*-{ this.borderColor = value; }-*/;
+public final native void clearBorderColor() /*-{ this.borderColor = ""; }-*/;
+public final native String getBorderImage() /*-{ return this.borderImage; }-*/;
+public final native void setBorderImage(String value) /*-{ this.borderImage = value; }-*/;
+public final native void clearBorderImage() /*-{ this.borderImage = ""; }-*/;
+public final native String getBorderImageOutset() /*-{ return this.borderImageOutset; }-*/;
+public final native void setBorderImageOutset(String value) /*-{ this.borderImageOutset = value; }-*/;
+public final native void clearBorderImageOutset() /*-{ this.borderImageOutset = ""; }-*/;
+public final native String getBorderImageRepeat() /*-{ return this.borderImageRepeat; }-*/;
+public final native void setBorderImageRepeat(String value) /*-{ this.borderImageRepeat = value; }-*/;
+public final native void clearBorderImageRepeat() /*-{ this.borderImageRepeat = ""; }-*/;
+public final native String getBorderImageSlice() /*-{ return this.borderImageSlice; }-*/;
+public final native void setBorderImageSlice(String value) /*-{ this.borderImageSlice = value; }-*/;
+public final native void clearBorderImageSlice() /*-{ this.borderImageSlice = ""; }-*/;
+public final native String getBorderImageSource() /*-{ return this.borderImageSource; }-*/;
+public final native void setBorderImageSource(String value) /*-{ this.borderImageSource = value; }-*/;
+public final native void clearBorderImageSource() /*-{ this.borderImageSource = ""; }-*/;
+public final native String getBorderImageWidth() /*-{ return this.borderImageWidth; }-*/;
+public final native void setBorderImageWidth(String value) /*-{ this.borderImageWidth = value; }-*/;
+public final native void clearBorderImageWidth() /*-{ this.borderImageWidth = ""; }-*/;
+public final native String getBorderLeft() /*-{ return this.borderLeft; }-*/;
+public final native void setBorderLeft(String value) /*-{ this.borderLeft = value; }-*/;
+public final native void clearBorderLeft() /*-{ this.borderLeft = ""; }-*/;
+public final native String getBorderLeftColor() /*-{ return this.borderLeftColor; }-*/;
+public final native void setBorderLeftColor(String value) /*-{ this.borderLeftColor = value; }-*/;
+public final native void clearBorderLeftColor() /*-{ this.borderLeftColor = ""; }-*/;
+public final native String getBorderLeftStyle() /*-{ return this.borderLeftStyle; }-*/;
+public final native void setBorderLeftStyle(String value) /*-{ this.borderLeftStyle = value; }-*/;
+public final native void clearBorderLeftStyle() /*-{ this.borderLeftStyle = ""; }-*/;
+public final native String getBorderLeftWidth() /*-{ return this.borderLeftWidth; }-*/;
+public final native void setBorderLeftWidth(String value) /*-{ this.borderLeftWidth = value; }-*/;
+public final native void clearBorderLeftWidth() /*-{ this.borderLeftWidth = ""; }-*/;
+public final native String getBorderRadius() /*-{ return this.borderRadius; }-*/;
+public final native void setBorderRadius(String value) /*-{ this.borderRadius = value; }-*/;
+public final native void clearBorderRadius() /*-{ this.borderRadius = ""; }-*/;
+public final native String getBorderRight() /*-{ return this.borderRight; }-*/;
+public final native void setBorderRight(String value) /*-{ this.borderRight = value; }-*/;
+public final native void clearBorderRight() /*-{ this.borderRight = ""; }-*/;
+public final native String getBorderRightColor() /*-{ return this.borderRightColor; }-*/;
+public final native void setBorderRightColor(String value) /*-{ this.borderRightColor = value; }-*/;
+public final native void clearBorderRightColor() /*-{ this.borderRightColor = ""; }-*/;
+public final native String getBorderRightStyle() /*-{ return this.borderRightStyle; }-*/;
+public final native void setBorderRightStyle(String value) /*-{ this.borderRightStyle = value; }-*/;
+public final native void clearBorderRightStyle() /*-{ this.borderRightStyle = ""; }-*/;
+public final native String getBorderRightWidth() /*-{ return this.borderRightWidth; }-*/;
+public final native void setBorderRightWidth(String value) /*-{ this.borderRightWidth = value; }-*/;
+public final native void clearBorderRightWidth() /*-{ this.borderRightWidth = ""; }-*/;
+public final native String getBorderSpacing() /*-{ return this.borderSpacing; }-*/;
+public final native void setBorderSpacing(String value) /*-{ this.borderSpacing = value; }-*/;
+public final native void clearBorderSpacing() /*-{ this.borderSpacing = ""; }-*/;
+public final native String getBorderStyle() /*-{ return this.borderStyle; }-*/;
+public final native void setBorderStyle(String value) /*-{ this.borderStyle = value; }-*/;
+public final native void clearBorderStyle() /*-{ this.borderStyle = ""; }-*/;
+public final native String getBorderTop() /*-{ return this.borderTop; }-*/;
+public final native void setBorderTop(String value) /*-{ this.borderTop = value; }-*/;
+public final native void clearBorderTop() /*-{ this.borderTop = ""; }-*/;
+public final native String getBorderTopColor() /*-{ return this.borderTopColor; }-*/;
+public final native void setBorderTopColor(String value) /*-{ this.borderTopColor = value; }-*/;
+public final native void clearBorderTopColor() /*-{ this.borderTopColor = ""; }-*/;
+public final native String getBorderTopLeftRadius() /*-{ return this.borderTopLeftRadius; }-*/;
+public final native void setBorderTopLeftRadius(String value) /*-{ this.borderTopLeftRadius = value; }-*/;
+public final native void clearBorderTopLeftRadius() /*-{ this.borderTopLeftRadius = ""; }-*/;
+public final native String getBorderTopRightRadius() /*-{ return this.borderTopRightRadius; }-*/;
+public final native void setBorderTopRightRadius(String value) /*-{ this.borderTopRightRadius = value; }-*/;
+public final native void clearBorderTopRightRadius() /*-{ this.borderTopRightRadius = ""; }-*/;
+public final native String getBorderTopStyle() /*-{ return this.borderTopStyle; }-*/;
+public final native void setBorderTopStyle(String value) /*-{ this.borderTopStyle = value; }-*/;
+public final native void clearBorderTopStyle() /*-{ this.borderTopStyle = ""; }-*/;
+public final native String getBorderTopWidth() /*-{ return this.borderTopWidth; }-*/;
+public final native void setBorderTopWidth(String value) /*-{ this.borderTopWidth = value; }-*/;
+public final native void clearBorderTopWidth() /*-{ this.borderTopWidth = ""; }-*/;
+public final native String getBorderWidth() /*-{ return this.borderWidth; }-*/;
+public final native void setBorderWidth(String value) /*-{ this.borderWidth = value; }-*/;
+public final native void clearBorderWidth() /*-{ this.borderWidth = ""; }-*/;
+public final native void setBorderWidth(double value, String unit) /*-{ this.borderWidth = value + unit; }-*/;
+public final native String getBottom() /*-{ return this.bottom; }-*/;
+public final native void setBottom(String value) /*-{ this.bottom = value; }-*/;
+public final native void clearBottom() /*-{ this.bottom = ""; }-*/;
+public final native void setBottom(double value, String unit) /*-{ this.bottom = value + unit; }-*/;
+public final native String getBoxShadow() /*-{ return this.boxShadow; }-*/;
+public final native void setBoxShadow(String value) /*-{ this.boxShadow = value; }-*/;
+public final native void clearBoxShadow() /*-{ this.boxShadow = ""; }-*/;
+public final native String getBoxSizing() /*-{ return this.boxSizing; }-*/;
+public final native void setBoxSizing(String value) /*-{ this.boxSizing = value; }-*/;
+public final native void clearBoxSizing() /*-{ this.boxSizing = ""; }-*/;
+public final native String getCaptionSide() /*-{ return this.captionSide; }-*/;
+public final native void setCaptionSide(String value) /*-{ this.captionSide = value; }-*/;
+public final native void clearCaptionSide() /*-{ this.captionSide = ""; }-*/;
+public final native String getClear() /*-{ return this.clear; }-*/;
+public final native void setClear(String value) /*-{ this.clear = value; }-*/;
+public final native void clearClear() /*-{ this.clear = ""; }-*/;
+public final native String getClip() /*-{ return this.clip; }-*/;
+public final native void setClip(String value) /*-{ this.clip = value; }-*/;
+public final native void clearClip() /*-{ this.clip = ""; }-*/;
+public final native String getContent() /*-{ return this.content; }-*/;
+public final native void setContent(String value) /*-{ this.content = value; }-*/;
+public final native void clearContent() /*-{ this.content = ""; }-*/;
+public final native String getCounterIncrement() /*-{ return this.counterIncrement; }-*/;
+public final native void setCounterIncrement(String value) /*-{ this.counterIncrement = value; }-*/;
+public final native void clearCounterIncrement() /*-{ this.counterIncrement = ""; }-*/;
+public final native String getCounterReset() /*-{ return this.counterReset; }-*/;
+public final native void setCounterReset(String value) /*-{ this.counterReset = value; }-*/;
+public final native void clearCounterReset() /*-{ this.counterReset = ""; }-*/;
+public final native String getCursor() /*-{ return this.cursor; }-*/;
+public final native void setCursor(String value) /*-{ this.cursor = value; }-*/;
+public final native void clearCursor() /*-{ this.cursor = ""; }-*/;
+public final native String getEmptyCells() /*-{ return this.emptyCells; }-*/;
+public final native void setEmptyCells(String value) /*-{ this.emptyCells = value; }-*/;
+public final native void clearEmptyCells() /*-{ this.emptyCells = ""; }-*/;
+public final native String getFloat() /*-{ return this['float']; }-*/;
+public final native void setFloat(String value) /*-{ this['float'] = value; }-*/;
+public final native void clearFloat() /*-{ this['float'] = ""; }-*/;
+public final native String getFontStretch() /*-{ return this.fontStretch; }-*/;
+public final native void setFontStretch(String value) /*-{ this.fontStretch = value; }-*/;
+public final native void clearFontStretch() /*-{ this.fontStretch = ""; }-*/;
+public final native String getHeight() /*-{ return this.height; }-*/;
+public final native void setHeight(String value) /*-{ this.height = value; }-*/;
+public final native void clearHeight() /*-{ this.height = ""; }-*/;
+public final native void setHeight(double value, String unit) /*-{ this.height = value + unit; }-*/;
+public final native String getImageRendering() /*-{ return this.imageRendering; }-*/;
+public final native void setImageRendering(String value) /*-{ this.imageRendering = value; }-*/;
+public final native void clearImageRendering() /*-{ this.imageRendering = ""; }-*/;
+public final native String getLeft() /*-{ return this.left; }-*/;
+public final native void setLeft(String value) /*-{ this.left = value; }-*/;
+public final native void clearLeft() /*-{ this.left = ""; }-*/;
+public final native void setLeft(double value, String unit) /*-{ this.left = value + unit; }-*/;
+public final native String getLetterSpacing() /*-{ return this.letterSpacing; }-*/;
+public final native void setLetterSpacing(String value) /*-{ this.letterSpacing = value; }-*/;
+public final native void clearLetterSpacing() /*-{ this.letterSpacing = ""; }-*/;
+public final native String getListStyle() /*-{ return this.listStyle; }-*/;
+public final native void setListStyle(String value) /*-{ this.listStyle = value; }-*/;
+public final native void clearListStyle() /*-{ this.listStyle = ""; }-*/;
+public final native String getListStyleType() /*-{ return this.listStyleType; }-*/;
+public final native void setListStyleType(String value) /*-{ this.listStyleType = value; }-*/;
+public final native void clearListStyleType() /*-{ this.listStyleType = ""; }-*/;
+public final native String getListStyleImage() /*-{ return this.listStyleImage; }-*/;
+public final native void setListStyleImage(String value) /*-{ this.listStyleImage = value; }-*/;
+public final native void clearListStyleImage() /*-{ this.listStyleImage = ""; }-*/;
+public final native String getListStylePosition() /*-{ return this.listStylePosition; }-*/;
+public final native void setListStylePosition(String value) /*-{ this.listStylePosition = value; }-*/;
+public final native void clearListStylePosition() /*-{ this.listStylePosition = ""; }-*/;
+public final native String getMargin() /*-{ return this.margin; }-*/;
+public final native void setMargin(String value) /*-{ this.margin = value; }-*/;
+public final native void clearMargin() /*-{ this.margin = ""; }-*/;
+public final native void setMargin(double value, String unit) /*-{ this.margin = value + unit; }-*/;
+public final native String getMarginBottom() /*-{ return this.marginBottom; }-*/;
+public final native void setMarginBottom(String value) /*-{ this.marginBottom = value; }-*/;
+public final native void clearMarginBottom() /*-{ this.marginBottom = ""; }-*/;
+public final native void setMarginBottom(double value, String unit) /*-{ this.marginBottom = value + unit; }-*/;
+public final native String getMarginLeft() /*-{ return this.marginLeft; }-*/;
+public final native void setMarginLeft(String value) /*-{ this.marginLeft = value; }-*/;
+public final native void clearMarginLeft() /*-{ this.marginLeft = ""; }-*/;
+public final native void setMarginLeft(double value, String unit) /*-{ this.marginLeft = value + unit; }-*/;
+public final native String getMarginRight() /*-{ return this.marginRight; }-*/;
+public final native void setMarginRight(String value) /*-{ this.marginRight = value; }-*/;
+public final native void clearMarginRight() /*-{ this.marginRight = ""; }-*/;
+public final native void setMarginRight(double value, String unit) /*-{ this.marginRight = value + unit; }-*/;
+public final native String getMarginTop() /*-{ return this.marginTop; }-*/;
+public final native void setMarginTop(String value) /*-{ this.marginTop = value; }-*/;
+public final native void clearMarginTop() /*-{ this.marginTop = ""; }-*/;
+public final native void setMarginTop(double value, String unit) /*-{ this.marginTop = value + unit; }-*/;
+public final native String getMaxHeight() /*-{ return this.maxHeight; }-*/;
+public final native void setMaxHeight(String value) /*-{ this.maxHeight = value; }-*/;
+public final native void clearMaxHeight() /*-{ this.maxHeight = ""; }-*/;
+public final native String getMaxWidth() /*-{ return this.maxWidth; }-*/;
+public final native void setMaxWidth(String value) /*-{ this.maxWidth = value; }-*/;
+public final native void clearMaxWidth() /*-{ this.maxWidth = ""; }-*/;
+public final native String getMinHeight() /*-{ return this.minHeight; }-*/;
+public final native void setMinHeight(String value) /*-{ this.minHeight = value; }-*/;
+public final native void clearMinHeight() /*-{ this.minHeight = ""; }-*/;
+public final native String getMinWidth() /*-{ return this.minWidth; }-*/;
+public final native void setMinWidth(String value) /*-{ this.minWidth = value; }-*/;
+public final native void clearMinWidth() /*-{ this.minWidth = ""; }-*/;
+public final native double getOpacity() /*-{ return this.opacity; }-*/;
+public final native void setOpacity(double value) /*-{ this.opacity = value; }-*/;
+public final native void clearOpacity() /*-{ this.opacity = ""; }-*/;
+public final native String getOrphans() /*-{ return this.orphans; }-*/;
+public final native void setOrphans(String value) /*-{ this.orphans = value; }-*/;
+public final native void clearOrphans() /*-{ this.orphans = ""; }-*/;
+public final native String getOutline() /*-{ return this.outline; }-*/;
+public final native void setOutline(String value) /*-{ this.outline = value; }-*/;
+public final native void clearOutline() /*-{ this.outline = ""; }-*/;
+public final native String getOutlineColor() /*-{ return this.outlineColor; }-*/;
+public final native void setOutlineColor(String value) /*-{ this.outlineColor = value; }-*/;
+public final native void clearOutlineColor() /*-{ this.outlineColor = ""; }-*/;
+public final native String getOutlineOffset() /*-{ return this.outlineOffset; }-*/;
+public final native void setOutlineOffset(String value) /*-{ this.outlineOffset = value; }-*/;
+public final native void clearOutlineOffset() /*-{ this.outlineOffset = ""; }-*/;
+public final native String getOutlineStyle() /*-{ return this.outlineStyle; }-*/;
+public final native void setOutlineStyle(String value) /*-{ this.outlineStyle = value; }-*/;
+public final native void clearOutlineStyle() /*-{ this.outlineStyle = ""; }-*/;
+public final native String getOutlineWidth() /*-{ return this.outlineWidth; }-*/;
+public final native void setOutlineWidth(String value) /*-{ this.outlineWidth = value; }-*/;
+public final native void clearOutlineWidth() /*-{ this.outlineWidth = ""; }-*/;
+public final native String getOverflow() /*-{ return this.overflow; }-*/;
+public final native void setOverflow(String value) /*-{ this.overflow = value; }-*/;
+public final native void clearOverflow() /*-{ this.overflow = ""; }-*/;
+public final native String getOverflowX() /*-{ return this.overflowX; }-*/;
+public final native void setOverflowX(String value) /*-{ this.overflowX = value; }-*/;
+public final native void clearOverflowX() /*-{ this.overflowX = ""; }-*/;
+public final native String getOverflowY() /*-{ return this.overflowY; }-*/;
+public final native void setOverflowY(String value) /*-{ this.overflowY = value; }-*/;
+public final native void clearOverflowY() /*-{ this.overflowY = ""; }-*/;
+public final native String getPadding() /*-{ return this.padding; }-*/;
+public final native void setPadding(String value) /*-{ this.padding = value; }-*/;
+public final native void clearPadding() /*-{ this.padding = ""; }-*/;
+public final native void setPadding(double value, String unit) /*-{ this.padding = value + unit; }-*/;
+public final native String getPaddingBottom() /*-{ return this.paddingBottom; }-*/;
+public final native void setPaddingBottom(String value) /*-{ this.paddingBottom = value; }-*/;
+public final native void clearPaddingBottom() /*-{ this.paddingBottom = ""; }-*/;
+public final native void setPaddingBottom(double value, String unit) /*-{ this.paddingBottom = value + unit; }-*/;
+public final native String getPaddingLeft() /*-{ return this.paddingLeft; }-*/;
+public final native void setPaddingLeft(String value) /*-{ this.paddingLeft = value; }-*/;
+public final native void clearPaddingLeft() /*-{ this.paddingLeft = ""; }-*/;
+public final native void setPaddingLeft(double value, String unit) /*-{ this.paddingLeft = value + unit; }-*/;
+public final native String getPaddingRight() /*-{ return this.paddingRight; }-*/;
+public final native void setPaddingRight(String value) /*-{ this.paddingRight = value; }-*/;
+public final native void clearPaddingRight() /*-{ this.paddingRight = ""; }-*/;
+public final native void setPaddingRight(double value, String unit) /*-{ this.paddingRight = value + unit; }-*/;
+public final native String getPaddingTop() /*-{ return this.paddingTop; }-*/;
+public final native void setPaddingTop(String value) /*-{ this.paddingTop = value; }-*/;
+public final native void clearPaddingTop() /*-{ this.paddingTop = ""; }-*/;
+public final native void setPaddingTop(double value, String unit) /*-{ this.paddingTop = value + unit; }-*/;
+public final native String getPage() /*-{ return this.page; }-*/;
+public final native void setPage(String value) /*-{ this.page = value; }-*/;
+public final native void clearPage() /*-{ this.page = ""; }-*/;
+public final native String getPageBreakAfter() /*-{ return this.pageBreakAfter; }-*/;
+public final native void setPageBreakAfter(String value) /*-{ this.pageBreakAfter = value; }-*/;
+public final native void clearPageBreakAfter() /*-{ this.pageBreakAfter = ""; }-*/;
+public final native String getPageBreakBefore() /*-{ return this.pageBreakBefore; }-*/;
+public final native void setPageBreakBefore(String value) /*-{ this.pageBreakBefore = value; }-*/;
+public final native void clearPageBreakBefore() /*-{ this.pageBreakBefore = ""; }-*/;
+public final native String getPageBreakInside() /*-{ return this.pageBreakInside; }-*/;
+public final native void setPageBreakInside(String value) /*-{ this.pageBreakInside = value; }-*/;
+public final native void clearPageBreakInside() /*-{ this.pageBreakInside = ""; }-*/;
+public final native String getPointerEvents() /*-{ return this.pointerEvents; }-*/;
+public final native void setPointerEvents(String value) /*-{ this.pointerEvents = value; }-*/;
+public final native void clearPointerEvents() /*-{ this.pointerEvents = ""; }-*/;
+public final native String getPosition() /*-{ return this.position; }-*/;
+public final native void setPosition(String value) /*-{ this.position = value; }-*/;
+public final native void clearPosition() /*-{ this.position = ""; }-*/;
+public final native String getQuotes() /*-{ return this.quotes; }-*/;
+public final native void setQuotes(String value) /*-{ this.quotes = value; }-*/;
+public final native void clearQuotes() /*-{ this.quotes = ""; }-*/;
+public final native String getResize() /*-{ return this.resize; }-*/;
+public final native void setResize(String value) /*-{ this.resize = value; }-*/;
+public final native void clearResize() /*-{ this.resize = ""; }-*/;
+public final native String getRight() /*-{ return this.right; }-*/;
+public final native void setRight(String value) /*-{ this.right = value; }-*/;
+public final native void clearRight() /*-{ this.right = ""; }-*/;
+public final native void setRight(double value, String unit) /*-{ this.right = value + unit; }-*/;
+public final native String getSize() /*-{ return this.size; }-*/;
+public final native void setSize(String value) /*-{ this.size = value; }-*/;
+public final native void clearSize() /*-{ this.size = ""; }-*/;
+public final native String getSrc() /*-{ return this.src; }-*/;
+public final native void setSrc(String value) /*-{ this.src = value; }-*/;
+public final native void clearSrc() /*-{ this.src = ""; }-*/;
+public final native String getSpeak() /*-{ return this.speak; }-*/;
+public final native void setSpeak(String value) /*-{ this.speak = value; }-*/;
+public final native void clearSpeak() /*-{ this.speak = ""; }-*/;
+public final native String getTableLayout() /*-{ return this.tableLayout; }-*/;
+public final native void setTableLayout(String value) /*-{ this.tableLayout = value; }-*/;
+public final native void clearTableLayout() /*-{ this.tableLayout = ""; }-*/;
+public final native String getTabSize() /*-{ return this.tabSize; }-*/;
+public final native void setTabSize(String value) /*-{ this.tabSize = value; }-*/;
+public final native void clearTabSize() /*-{ this.tabSize = ""; }-*/;
+public final native String getTextAlign() /*-{ return this.textAlign; }-*/;
+public final native void setTextAlign(String value) /*-{ this.textAlign = value; }-*/;
+public final native void clearTextAlign() /*-{ this.textAlign = ""; }-*/;
+public final native String getTextDecoration() /*-{ return this.textDecoration; }-*/;
+public final native void setTextDecoration(String value) /*-{ this.textDecoration = value; }-*/;
+public final native void clearTextDecoration() /*-{ this.textDecoration = ""; }-*/;
+public final native String getTextIndent() /*-{ return this.textIndent; }-*/;
+public final native void setTextIndent(String value) /*-{ this.textIndent = value; }-*/;
+public final native void clearTextIndent() /*-{ this.textIndent = ""; }-*/;
+public final native String getTextLineThrough() /*-{ return this.textLineThrough; }-*/;
+public final native void setTextLineThrough(String value) /*-{ this.textLineThrough = value; }-*/;
+public final native void clearTextLineThrough() /*-{ this.textLineThrough = ""; }-*/;
+public final native String getTextLineThroughColor() /*-{ return this.textLineThroughColor; }-*/;
+public final native void setTextLineThroughColor(String value) /*-{ this.textLineThroughColor = value; }-*/;
+public final native void clearTextLineThroughColor() /*-{ this.textLineThroughColor = ""; }-*/;
+public final native String getTextLineThroughMode() /*-{ return this.textLineThroughMode; }-*/;
+public final native void setTextLineThroughMode(String value) /*-{ this.textLineThroughMode = value; }-*/;
+public final native void clearTextLineThroughMode() /*-{ this.textLineThroughMode = ""; }-*/;
+public final native String getTextLineThroughStyle() /*-{ return this.textLineThroughStyle; }-*/;
+public final native void setTextLineThroughStyle(String value) /*-{ this.textLineThroughStyle = value; }-*/;
+public final native void clearTextLineThroughStyle() /*-{ this.textLineThroughStyle = ""; }-*/;
+public final native String getTextLineThroughWidth() /*-{ return this.textLineThroughWidth; }-*/;
+public final native void setTextLineThroughWidth(String value) /*-{ this.textLineThroughWidth = value; }-*/;
+public final native void clearTextLineThroughWidth() /*-{ this.textLineThroughWidth = ""; }-*/;
+public final native String getTextOverflow() /*-{ return this.textOverflow; }-*/;
+public final native void setTextOverflow(String value) /*-{ this.textOverflow = value; }-*/;
+public final native void clearTextOverflow() /*-{ this.textOverflow = ""; }-*/;
+public final native String getTextOverline() /*-{ return this.textOverline; }-*/;
+public final native void setTextOverline(String value) /*-{ this.textOverline = value; }-*/;
+public final native void clearTextOverline() /*-{ this.textOverline = ""; }-*/;
+public final native String getTextOverlineColor() /*-{ return this.textOverlineColor; }-*/;
+public final native void setTextOverlineColor(String value) /*-{ this.textOverlineColor = value; }-*/;
+public final native void clearTextOverlineColor() /*-{ this.textOverlineColor = ""; }-*/;
+public final native String getTextOverlineMode() /*-{ return this.textOverlineMode; }-*/;
+public final native void setTextOverlineMode(String value) /*-{ this.textOverlineMode = value; }-*/;
+public final native void clearTextOverlineMode() /*-{ this.textOverlineMode = ""; }-*/;
+public final native String getTextOverlineStyle() /*-{ return this.textOverlineStyle; }-*/;
+public final native void setTextOverlineStyle(String value) /*-{ this.textOverlineStyle = value; }-*/;
+public final native void clearTextOverlineStyle() /*-{ this.textOverlineStyle = ""; }-*/;
+public final native String getTextOverlineWidth() /*-{ return this.textOverlineWidth; }-*/;
+public final native void setTextOverlineWidth(String value) /*-{ this.textOverlineWidth = value; }-*/;
+public final native void clearTextOverlineWidth() /*-{ this.textOverlineWidth = ""; }-*/;
+public final native String getTextShadow() /*-{ return this.textShadow; }-*/;
+public final native void setTextShadow(String value) /*-{ this.textShadow = value; }-*/;
+public final native void clearTextShadow() /*-{ this.textShadow = ""; }-*/;
+public final native String getTextTransform() /*-{ return this.textTransform; }-*/;
+public final native void setTextTransform(String value) /*-{ this.textTransform = value; }-*/;
+public final native void clearTextTransform() /*-{ this.textTransform = ""; }-*/;
+public final native String getTextUnderline() /*-{ return this.textUnderline; }-*/;
+public final native void setTextUnderline(String value) /*-{ this.textUnderline = value; }-*/;
+public final native void clearTextUnderline() /*-{ this.textUnderline = ""; }-*/;
+public final native String getTextUnderlineColor() /*-{ return this.textUnderlineColor; }-*/;
+public final native void setTextUnderlineColor(String value) /*-{ this.textUnderlineColor = value; }-*/;
+public final native void clearTextUnderlineColor() /*-{ this.textUnderlineColor = ""; }-*/;
+public final native String getTextUnderlineMode() /*-{ return this.textUnderlineMode; }-*/;
+public final native void setTextUnderlineMode(String value) /*-{ this.textUnderlineMode = value; }-*/;
+public final native void clearTextUnderlineMode() /*-{ this.textUnderlineMode = ""; }-*/;
+public final native String getTextUnderlineStyle() /*-{ return this.textUnderlineStyle; }-*/;
+public final native void setTextUnderlineStyle(String value) /*-{ this.textUnderlineStyle = value; }-*/;
+public final native void clearTextUnderlineStyle() /*-{ this.textUnderlineStyle = ""; }-*/;
+public final native String getTextUnderlineWidth() /*-{ return this.textUnderlineWidth; }-*/;
+public final native void setTextUnderlineWidth(String value) /*-{ this.textUnderlineWidth = value; }-*/;
+public final native void clearTextUnderlineWidth() /*-{ this.textUnderlineWidth = ""; }-*/;
+public final native String getTop() /*-{ return this.top; }-*/;
+public final native void setTop(String value) /*-{ this.top = value; }-*/;
+public final native void clearTop() /*-{ this.top = ""; }-*/;
+public final native void setTop(double value, String unit) /*-{ this.top = value + unit; }-*/;
+public final native String getUnicodeBidi() /*-{ return this.unicodeBidi; }-*/;
+public final native void setUnicodeBidi(String value) /*-{ this.unicodeBidi = value; }-*/;
+public final native void clearUnicodeBidi() /*-{ this.unicodeBidi = ""; }-*/;
+public final native String getUnicodeRange() /*-{ return this.unicodeRange; }-*/;
+public final native void setUnicodeRange(String value) /*-{ this.unicodeRange = value; }-*/;
+public final native void clearUnicodeRange() /*-{ this.unicodeRange = ""; }-*/;
+public final native String getVerticalAlign() /*-{ return this.verticalAlign; }-*/;
+public final native void setVerticalAlign(String value) /*-{ this.verticalAlign = value; }-*/;
+public final native void clearVerticalAlign() /*-{ this.verticalAlign = ""; }-*/;
+public final native String getVisibility() /*-{ return this.visibility; }-*/;
+public final native void setVisibility(String value) /*-{ this.visibility = value; }-*/;
+public final native void clearVisibility() /*-{ this.visibility = ""; }-*/;
+public final native String getWhiteSpace() /*-{ return this.whiteSpace; }-*/;
+public final native void setWhiteSpace(String value) /*-{ this.whiteSpace = value; }-*/;
+public final native void clearWhiteSpace() /*-{ this.whiteSpace = ""; }-*/;
+public final native String getWidows() /*-{ return this.widows; }-*/;
+public final native void setWidows(String value) /*-{ this.widows = value; }-*/;
+public final native void clearWidows() /*-{ this.widows = ""; }-*/;
+public final native String getWidth() /*-{ return this.width; }-*/;
+public final native void setWidth(String value) /*-{ this.width = value; }-*/;
+public final native void clearWidth() /*-{ this.width = ""; }-*/;
+public final native void setWidth(double value, String unit) /*-{ this.width = value + unit; }-*/;
+public final native String getWordBreak() /*-{ return this.wordBreak; }-*/;
+public final native void setWordBreak(String value) /*-{ this.wordBreak = value; }-*/;
+public final native void clearWordBreak() /*-{ this.wordBreak = ""; }-*/;
+public final native String getWordSpacing() /*-{ return this.wordSpacing; }-*/;
+public final native void setWordSpacing(String value) /*-{ this.wordSpacing = value; }-*/;
+public final native void clearWordSpacing() /*-{ this.wordSpacing = ""; }-*/;
+public final native String getWordWrap() /*-{ return this.wordWrap; }-*/;
+public final native void setWordWrap(String value) /*-{ this.wordWrap = value; }-*/;
+public final native void clearWordWrap() /*-{ this.wordWrap = ""; }-*/;
+public final native int getZIndex() /*-{ return this.zIndex; }-*/;
+public final native void setZIndex(int value) /*-{ this.zIndex = value; }-*/;
+public final native void clearZIndex() /*-{ this.zIndex = ""; }-*/;
+public final native String getWebkitAnimation() /*-{ return this.webkitAnimation; }-*/;
+public final native void setWebkitAnimation(String value) /*-{ this.webkitAnimation = value; }-*/;
+public final native void clearWebkitAnimation() /*-{ this.webkitAnimation = ""; }-*/;
+public final native String getWebkitAnimationDelay() /*-{ return this.webkitAnimationDelay; }-*/;
+public final native void setWebkitAnimationDelay(String value) /*-{ this.webkitAnimationDelay = value; }-*/;
+public final native void clearWebkitAnimationDelay() /*-{ this.webkitAnimationDelay = ""; }-*/;
+public final native String getWebkitAnimationDirection() /*-{ return this.webkitAnimationDirection; }-*/;
+public final native void setWebkitAnimationDirection(String value) /*-{ this.webkitAnimationDirection = value; }-*/;
+public final native void clearWebkitAnimationDirection() /*-{ this.webkitAnimationDirection = ""; }-*/;
+public final native String getWebkitAnimationDuration() /*-{ return this.webkitAnimationDuration; }-*/;
+public final native void setWebkitAnimationDuration(String value) /*-{ this.webkitAnimationDuration = value; }-*/;
+public final native void clearWebkitAnimationDuration() /*-{ this.webkitAnimationDuration = ""; }-*/;
+public final native String getWebkitAnimationFillMode() /*-{ return this.webkitAnimationFillMode; }-*/;
+public final native void setWebkitAnimationFillMode(String value) /*-{ this.webkitAnimationFillMode = value; }-*/;
+public final native void clearWebkitAnimationFillMode() /*-{ this.webkitAnimationFillMode = ""; }-*/;
+public final native String getWebkitAnimationIterationCount() /*-{ return this.webkitAnimationIterationCount; }-*/;
+public final native void setWebkitAnimationIterationCount(String value) /*-{ this.webkitAnimationIterationCount = value; }-*/;
+public final native void clearWebkitAnimationIterationCount() /*-{ this.webkitAnimationIterationCount = ""; }-*/;
+public final native String getWebkitAnimationName() /*-{ return this.webkitAnimationName; }-*/;
+public final native void setWebkitAnimationName(String value) /*-{ this.webkitAnimationName = value; }-*/;
+public final native void clearWebkitAnimationName() /*-{ this.webkitAnimationName = ""; }-*/;
+public final native String getWebkitAnimationPlayState() /*-{ return this.webkitAnimationPlayState; }-*/;
+public final native void setWebkitAnimationPlayState(String value) /*-{ this.webkitAnimationPlayState = value; }-*/;
+public final native void clearWebkitAnimationPlayState() /*-{ this.webkitAnimationPlayState = ""; }-*/;
+public final native String getWebkitAnimationTimingFunction() /*-{ return this.webkitAnimationTimingFunction; }-*/;
+public final native void setWebkitAnimationTimingFunction(String value) /*-{ this.webkitAnimationTimingFunction = value; }-*/;
+public final native void clearWebkitAnimationTimingFunction() /*-{ this.webkitAnimationTimingFunction = ""; }-*/;
+public final native String getWebkitAppearance() /*-{ return this.webkitAppearance; }-*/;
+public final native void setWebkitAppearance(String value) /*-{ this.webkitAppearance = value; }-*/;
+public final native void clearWebkitAppearance() /*-{ this.webkitAppearance = ""; }-*/;
+public final native String getWebkitAspectRatio() /*-{ return this.webkitAspectRatio; }-*/;
+public final native void setWebkitAspectRatio(String value) /*-{ this.webkitAspectRatio = value; }-*/;
+public final native void clearWebkitAspectRatio() /*-{ this.webkitAspectRatio = ""; }-*/;
+public final native String getWebkitBackfaceVisibility() /*-{ return this.webkitBackfaceVisibility; }-*/;
+public final native void setWebkitBackfaceVisibility(String value) /*-{ this.webkitBackfaceVisibility = value; }-*/;
+public final native void clearWebkitBackfaceVisibility() /*-{ this.webkitBackfaceVisibility = ""; }-*/;
+public final native String getWebkitBackgroundClip() /*-{ return this.webkitBackgroundClip; }-*/;
+public final native void setWebkitBackgroundClip(String value) /*-{ this.webkitBackgroundClip = value; }-*/;
+public final native void clearWebkitBackgroundClip() /*-{ this.webkitBackgroundClip = ""; }-*/;
+public final native String getWebkitBackgroundComposite() /*-{ return this.webkitBackgroundComposite; }-*/;
+public final native void setWebkitBackgroundComposite(String value) /*-{ this.webkitBackgroundComposite = value; }-*/;
+public final native void clearWebkitBackgroundComposite() /*-{ this.webkitBackgroundComposite = ""; }-*/;
+public final native String getWebkitBackgroundOrigin() /*-{ return this.webkitBackgroundOrigin; }-*/;
+public final native void setWebkitBackgroundOrigin(String value) /*-{ this.webkitBackgroundOrigin = value; }-*/;
+public final native void clearWebkitBackgroundOrigin() /*-{ this.webkitBackgroundOrigin = ""; }-*/;
+public final native String getWebkitBackgroundSize() /*-{ return this.webkitBackgroundSize; }-*/;
+public final native void setWebkitBackgroundSize(String value) /*-{ this.webkitBackgroundSize = value; }-*/;
+public final native void clearWebkitBackgroundSize() /*-{ this.webkitBackgroundSize = ""; }-*/;
+public final native String getWebkitBorderAfter() /*-{ return this.webkitBorderAfter; }-*/;
+public final native void setWebkitBorderAfter(String value) /*-{ this.webkitBorderAfter = value; }-*/;
+public final native void clearWebkitBorderAfter() /*-{ this.webkitBorderAfter = ""; }-*/;
+public final native String getWebkitBorderAfterColor() /*-{ return this.webkitBorderAfterColor; }-*/;
+public final native void setWebkitBorderAfterColor(String value) /*-{ this.webkitBorderAfterColor = value; }-*/;
+public final native void clearWebkitBorderAfterColor() /*-{ this.webkitBorderAfterColor = ""; }-*/;
+public final native String getWebkitBorderAfterStyle() /*-{ return this.webkitBorderAfterStyle; }-*/;
+public final native void setWebkitBorderAfterStyle(String value) /*-{ this.webkitBorderAfterStyle = value; }-*/;
+public final native void clearWebkitBorderAfterStyle() /*-{ this.webkitBorderAfterStyle = ""; }-*/;
+public final native String getWebkitBorderAfterWidth() /*-{ return this.webkitBorderAfterWidth; }-*/;
+public final native void setWebkitBorderAfterWidth(String value) /*-{ this.webkitBorderAfterWidth = value; }-*/;
+public final native void clearWebkitBorderAfterWidth() /*-{ this.webkitBorderAfterWidth = ""; }-*/;
+public final native String getWebkitBorderBefore() /*-{ return this.webkitBorderBefore; }-*/;
+public final native void setWebkitBorderBefore(String value) /*-{ this.webkitBorderBefore = value; }-*/;
+public final native void clearWebkitBorderBefore() /*-{ this.webkitBorderBefore = ""; }-*/;
+public final native String getWebkitBorderBeforeColor() /*-{ return this.webkitBorderBeforeColor; }-*/;
+public final native void setWebkitBorderBeforeColor(String value) /*-{ this.webkitBorderBeforeColor = value; }-*/;
+public final native void clearWebkitBorderBeforeColor() /*-{ this.webkitBorderBeforeColor = ""; }-*/;
+public final native String getWebkitBorderBeforeStyle() /*-{ return this.webkitBorderBeforeStyle; }-*/;
+public final native void setWebkitBorderBeforeStyle(String value) /*-{ this.webkitBorderBeforeStyle = value; }-*/;
+public final native void clearWebkitBorderBeforeStyle() /*-{ this.webkitBorderBeforeStyle = ""; }-*/;
+public final native String getWebkitBorderBeforeWidth() /*-{ return this.webkitBorderBeforeWidth; }-*/;
+public final native void setWebkitBorderBeforeWidth(String value) /*-{ this.webkitBorderBeforeWidth = value; }-*/;
+public final native void clearWebkitBorderBeforeWidth() /*-{ this.webkitBorderBeforeWidth = ""; }-*/;
+public final native String getWebkitBorderEnd() /*-{ return this.webkitBorderEnd; }-*/;
+public final native void setWebkitBorderEnd(String value) /*-{ this.webkitBorderEnd = value; }-*/;
+public final native void clearWebkitBorderEnd() /*-{ this.webkitBorderEnd = ""; }-*/;
+public final native String getWebkitBorderEndColor() /*-{ return this.webkitBorderEndColor; }-*/;
+public final native void setWebkitBorderEndColor(String value) /*-{ this.webkitBorderEndColor = value; }-*/;
+public final native void clearWebkitBorderEndColor() /*-{ this.webkitBorderEndColor = ""; }-*/;
+public final native String getWebkitBorderEndStyle() /*-{ return this.webkitBorderEndStyle; }-*/;
+public final native void setWebkitBorderEndStyle(String value) /*-{ this.webkitBorderEndStyle = value; }-*/;
+public final native void clearWebkitBorderEndStyle() /*-{ this.webkitBorderEndStyle = ""; }-*/;
+public final native String getWebkitBorderEndWidth() /*-{ return this.webkitBorderEndWidth; }-*/;
+public final native void setWebkitBorderEndWidth(String value) /*-{ this.webkitBorderEndWidth = value; }-*/;
+public final native void clearWebkitBorderEndWidth() /*-{ this.webkitBorderEndWidth = ""; }-*/;
+public final native String getWebkitBorderFit() /*-{ return this.webkitBorderFit; }-*/;
+public final native void setWebkitBorderFit(String value) /*-{ this.webkitBorderFit = value; }-*/;
+public final native void clearWebkitBorderFit() /*-{ this.webkitBorderFit = ""; }-*/;
+public final native String getWebkitBorderHorizontalSpacing() /*-{ return this.webkitBorderHorizontalSpacing; }-*/;
+public final native void setWebkitBorderHorizontalSpacing(String value) /*-{ this.webkitBorderHorizontalSpacing = value; }-*/;
+public final native void clearWebkitBorderHorizontalSpacing() /*-{ this.webkitBorderHorizontalSpacing = ""; }-*/;
+public final native String getWebkitBorderImage() /*-{ return this.webkitBorderImage; }-*/;
+public final native void setWebkitBorderImage(String value) /*-{ this.webkitBorderImage = value; }-*/;
+public final native void clearWebkitBorderImage() /*-{ this.webkitBorderImage = ""; }-*/;
+public final native String getWebkitBorderRadius() /*-{ return this.webkitBorderRadius; }-*/;
+public final native void setWebkitBorderRadius(String value) /*-{ this.webkitBorderRadius = value; }-*/;
+public final native void clearWebkitBorderRadius() /*-{ this.webkitBorderRadius = ""; }-*/;
+public final native String getWebkitBorderStart() /*-{ return this.webkitBorderStart; }-*/;
+public final native void setWebkitBorderStart(String value) /*-{ this.webkitBorderStart = value; }-*/;
+public final native void clearWebkitBorderStart() /*-{ this.webkitBorderStart = ""; }-*/;
+public final native String getWebkitBorderStartColor() /*-{ return this.webkitBorderStartColor; }-*/;
+public final native void setWebkitBorderStartColor(String value) /*-{ this.webkitBorderStartColor = value; }-*/;
+public final native void clearWebkitBorderStartColor() /*-{ this.webkitBorderStartColor = ""; }-*/;
+public final native String getWebkitBorderStartStyle() /*-{ return this.webkitBorderStartStyle; }-*/;
+public final native void setWebkitBorderStartStyle(String value) /*-{ this.webkitBorderStartStyle = value; }-*/;
+public final native void clearWebkitBorderStartStyle() /*-{ this.webkitBorderStartStyle = ""; }-*/;
+public final native String getWebkitBorderStartWidth() /*-{ return this.webkitBorderStartWidth; }-*/;
+public final native void setWebkitBorderStartWidth(String value) /*-{ this.webkitBorderStartWidth = value; }-*/;
+public final native void clearWebkitBorderStartWidth() /*-{ this.webkitBorderStartWidth = ""; }-*/;
+public final native String getWebkitBorderVerticalSpacing() /*-{ return this.webkitBorderVerticalSpacing; }-*/;
+public final native void setWebkitBorderVerticalSpacing(String value) /*-{ this.webkitBorderVerticalSpacing = value; }-*/;
+public final native void clearWebkitBorderVerticalSpacing() /*-{ this.webkitBorderVerticalSpacing = ""; }-*/;
+public final native String getWebkitBoxAlign() /*-{ return this.webkitBoxAlign; }-*/;
+public final native void setWebkitBoxAlign(String value) /*-{ this.webkitBoxAlign = value; }-*/;
+public final native void clearWebkitBoxAlign() /*-{ this.webkitBoxAlign = ""; }-*/;
+public final native String getWebkitBoxDirection() /*-{ return this.webkitBoxDirection; }-*/;
+public final native void setWebkitBoxDirection(String value) /*-{ this.webkitBoxDirection = value; }-*/;
+public final native void clearWebkitBoxDirection() /*-{ this.webkitBoxDirection = ""; }-*/;
+public final native String getWebkitBoxFlex() /*-{ return this.webkitBoxFlex; }-*/;
+public final native void setWebkitBoxFlex(String value) /*-{ this.webkitBoxFlex = value; }-*/;
+public final native void clearWebkitBoxFlex() /*-{ this.webkitBoxFlex = ""; }-*/;
+public final native String getWebkitBoxFlexGroup() /*-{ return this.webkitBoxFlexGroup; }-*/;
+public final native void setWebkitBoxFlexGroup(String value) /*-{ this.webkitBoxFlexGroup = value; }-*/;
+public final native void clearWebkitBoxFlexGroup() /*-{ this.webkitBoxFlexGroup = ""; }-*/;
+public final native String getWebkitBoxLines() /*-{ return this.webkitBoxLines; }-*/;
+public final native void setWebkitBoxLines(String value) /*-{ this.webkitBoxLines = value; }-*/;
+public final native void clearWebkitBoxLines() /*-{ this.webkitBoxLines = ""; }-*/;
+public final native String getWebkitBoxOrdinalGroup() /*-{ return this.webkitBoxOrdinalGroup; }-*/;
+public final native void setWebkitBoxOrdinalGroup(String value) /*-{ this.webkitBoxOrdinalGroup = value; }-*/;
+public final native void clearWebkitBoxOrdinalGroup() /*-{ this.webkitBoxOrdinalGroup = ""; }-*/;
+public final native String getWebkitBoxOrient() /*-{ return this.webkitBoxOrient; }-*/;
+public final native void setWebkitBoxOrient(String value) /*-{ this.webkitBoxOrient = value; }-*/;
+public final native void clearWebkitBoxOrient() /*-{ this.webkitBoxOrient = ""; }-*/;
+public final native String getWebkitBoxPack() /*-{ return this.webkitBoxPack; }-*/;
+public final native void setWebkitBoxPack(String value) /*-{ this.webkitBoxPack = value; }-*/;
+public final native void clearWebkitBoxPack() /*-{ this.webkitBoxPack = ""; }-*/;
+public final native String getWebkitBoxReflect() /*-{ return this.webkitBoxReflect; }-*/;
+public final native void setWebkitBoxReflect(String value) /*-{ this.webkitBoxReflect = value; }-*/;
+public final native void clearWebkitBoxReflect() /*-{ this.webkitBoxReflect = ""; }-*/;
+public final native String getWebkitBoxShadow() /*-{ return this.webkitBoxShadow; }-*/;
+public final native void setWebkitBoxShadow(String value) /*-{ this.webkitBoxShadow = value; }-*/;
+public final native void clearWebkitBoxShadow() /*-{ this.webkitBoxShadow = ""; }-*/;
+public final native String getWebkitColorCorrection() /*-{ return this.webkitColorCorrection; }-*/;
+public final native void setWebkitColorCorrection(String value) /*-{ this.webkitColorCorrection = value; }-*/;
+public final native void clearWebkitColorCorrection() /*-{ this.webkitColorCorrection = ""; }-*/;
+public final native String getWebkitColumnAxis() /*-{ return this.webkitColumnAxis; }-*/;
+public final native void setWebkitColumnAxis(String value) /*-{ this.webkitColumnAxis = value; }-*/;
+public final native void clearWebkitColumnAxis() /*-{ this.webkitColumnAxis = ""; }-*/;
+public final native String getWebkitColumnBreakAfter() /*-{ return this.webkitColumnBreakAfter; }-*/;
+public final native void setWebkitColumnBreakAfter(String value) /*-{ this.webkitColumnBreakAfter = value; }-*/;
+public final native void clearWebkitColumnBreakAfter() /*-{ this.webkitColumnBreakAfter = ""; }-*/;
+public final native String getWebkitColumnBreakBefore() /*-{ return this.webkitColumnBreakBefore; }-*/;
+public final native void setWebkitColumnBreakBefore(String value) /*-{ this.webkitColumnBreakBefore = value; }-*/;
+public final native void clearWebkitColumnBreakBefore() /*-{ this.webkitColumnBreakBefore = ""; }-*/;
+public final native String getWebkitColumnBreakInside() /*-{ return this.webkitColumnBreakInside; }-*/;
+public final native void setWebkitColumnBreakInside(String value) /*-{ this.webkitColumnBreakInside = value; }-*/;
+public final native void clearWebkitColumnBreakInside() /*-{ this.webkitColumnBreakInside = ""; }-*/;
+public final native String getWebkitColumnCount() /*-{ return this.webkitColumnCount; }-*/;
+public final native void setWebkitColumnCount(String value) /*-{ this.webkitColumnCount = value; }-*/;
+public final native void clearWebkitColumnCount() /*-{ this.webkitColumnCount = ""; }-*/;
+public final native String getWebkitColumnGap() /*-{ return this.webkitColumnGap; }-*/;
+public final native void setWebkitColumnGap(String value) /*-{ this.webkitColumnGap = value; }-*/;
+public final native void clearWebkitColumnGap() /*-{ this.webkitColumnGap = ""; }-*/;
+public final native String getWebkitColumnRule() /*-{ return this.webkitColumnRule; }-*/;
+public final native void setWebkitColumnRule(String value) /*-{ this.webkitColumnRule = value; }-*/;
+public final native void clearWebkitColumnRule() /*-{ this.webkitColumnRule = ""; }-*/;
+public final native String getWebkitColumnRuleColor() /*-{ return this.webkitColumnRuleColor; }-*/;
+public final native void setWebkitColumnRuleColor(String value) /*-{ this.webkitColumnRuleColor = value; }-*/;
+public final native void clearWebkitColumnRuleColor() /*-{ this.webkitColumnRuleColor = ""; }-*/;
+public final native String getWebkitColumnRuleStyle() /*-{ return this.webkitColumnRuleStyle; }-*/;
+public final native void setWebkitColumnRuleStyle(String value) /*-{ this.webkitColumnRuleStyle = value; }-*/;
+public final native void clearWebkitColumnRuleStyle() /*-{ this.webkitColumnRuleStyle = ""; }-*/;
+public final native String getWebkitColumnRuleWidth() /*-{ return this.webkitColumnRuleWidth; }-*/;
+public final native void setWebkitColumnRuleWidth(String value) /*-{ this.webkitColumnRuleWidth = value; }-*/;
+public final native void clearWebkitColumnRuleWidth() /*-{ this.webkitColumnRuleWidth = ""; }-*/;
+public final native String getWebkitColumnSpan() /*-{ return this.webkitColumnSpan; }-*/;
+public final native void setWebkitColumnSpan(String value) /*-{ this.webkitColumnSpan = value; }-*/;
+public final native void clearWebkitColumnSpan() /*-{ this.webkitColumnSpan = ""; }-*/;
+public final native String getWebkitColumnWidth() /*-{ return this.webkitColumnWidth; }-*/;
+public final native void setWebkitColumnWidth(String value) /*-{ this.webkitColumnWidth = value; }-*/;
+public final native void clearWebkitColumnWidth() /*-{ this.webkitColumnWidth = ""; }-*/;
+public final native String getWebkitColumns() /*-{ return this.webkitColumns; }-*/;
+public final native void setWebkitColumns(String value) /*-{ this.webkitColumns = value; }-*/;
+public final native void clearWebkitColumns() /*-{ this.webkitColumns = ""; }-*/;
+public final native String getWebkitFilter() /*-{ return this.webkitFilter; }-*/;
+public final native void setWebkitFilter(String value) /*-{ this.webkitFilter = value; }-*/;
+public final native void clearWebkitFilter() /*-{ this.webkitFilter = ""; }-*/;
+public final native String getWebkitFlex() /*-{ return this.webkitFlex; }-*/;
+public final native void setWebkitFlex(String value) /*-{ this.webkitFlex = value; }-*/;
+public final native void clearWebkitFlex() /*-{ this.webkitFlex = ""; }-*/;
+public final native String getWebkitFlexAlign() /*-{ return this.webkitFlexAlign; }-*/;
+public final native void setWebkitFlexAlign(String value) /*-{ this.webkitFlexAlign = value; }-*/;
+public final native void clearWebkitFlexAlign() /*-{ this.webkitFlexAlign = ""; }-*/;
+public final native String getWebkitFlexDirection() /*-{ return this.webkitFlexDirection; }-*/;
+public final native void setWebkitFlexDirection(String value) /*-{ this.webkitFlexDirection = value; }-*/;
+public final native void clearWebkitFlexDirection() /*-{ this.webkitFlexDirection = ""; }-*/;
+public final native String getWebkitFlexFlow() /*-{ return this.webkitFlexFlow; }-*/;
+public final native void setWebkitFlexFlow(String value) /*-{ this.webkitFlexFlow = value; }-*/;
+public final native void clearWebkitFlexFlow() /*-{ this.webkitFlexFlow = ""; }-*/;
+public final native String getWebkitFlexItemAlign() /*-{ return this.webkitFlexItemAlign; }-*/;
+public final native void setWebkitFlexItemAlign(String value) /*-{ this.webkitFlexItemAlign = value; }-*/;
+public final native void clearWebkitFlexItemAlign() /*-{ this.webkitFlexItemAlign = ""; }-*/;
+public final native String getWebkitFlexLinePack() /*-{ return this.webkitFlexLinePack; }-*/;
+public final native void setWebkitFlexLinePack(String value) /*-{ this.webkitFlexLinePack = value; }-*/;
+public final native void clearWebkitFlexLinePack() /*-{ this.webkitFlexLinePack = ""; }-*/;
+public final native String getWebkitFlexOrder() /*-{ return this.webkitFlexOrder; }-*/;
+public final native void setWebkitFlexOrder(String value) /*-{ this.webkitFlexOrder = value; }-*/;
+public final native void clearWebkitFlexOrder() /*-{ this.webkitFlexOrder = ""; }-*/;
+public final native String getWebkitFlexPack() /*-{ return this.webkitFlexPack; }-*/;
+public final native void setWebkitFlexPack(String value) /*-{ this.webkitFlexPack = value; }-*/;
+public final native void clearWebkitFlexPack() /*-{ this.webkitFlexPack = ""; }-*/;
+public final native String getWebkitFlexWrap() /*-{ return this.webkitFlexWrap; }-*/;
+public final native void setWebkitFlexWrap(String value) /*-{ this.webkitFlexWrap = value; }-*/;
+public final native void clearWebkitFlexWrap() /*-{ this.webkitFlexWrap = ""; }-*/;
+public final native String getWebkitFontSizeDelta() /*-{ return this.webkitFontSizeDelta; }-*/;
+public final native void setWebkitFontSizeDelta(String value) /*-{ this.webkitFontSizeDelta = value; }-*/;
+public final native void clearWebkitFontSizeDelta() /*-{ this.webkitFontSizeDelta = ""; }-*/;
+public final native String getWebkitGridColumns() /*-{ return this.webkitGridColumns; }-*/;
+public final native void setWebkitGridColumns(String value) /*-{ this.webkitGridColumns = value; }-*/;
+public final native void clearWebkitGridColumns() /*-{ this.webkitGridColumns = ""; }-*/;
+public final native String getWebkitGridRows() /*-{ return this.webkitGridRows; }-*/;
+public final native void setWebkitGridRows(String value) /*-{ this.webkitGridRows = value; }-*/;
+public final native void clearWebkitGridRows() /*-{ this.webkitGridRows = ""; }-*/;
+public final native String getWebkitGridColumn() /*-{ return this.webkitGridColumn; }-*/;
+public final native void setWebkitGridColumn(String value) /*-{ this.webkitGridColumn = value; }-*/;
+public final native void clearWebkitGridColumn() /*-{ this.webkitGridColumn = ""; }-*/;
+public final native String getWebkitGridRow() /*-{ return this.webkitGridRow; }-*/;
+public final native void setWebkitGridRow(String value) /*-{ this.webkitGridRow = value; }-*/;
+public final native void clearWebkitGridRow() /*-{ this.webkitGridRow = ""; }-*/;
+public final native String getWebkitHighlight() /*-{ return this.webkitHighlight; }-*/;
+public final native void setWebkitHighlight(String value) /*-{ this.webkitHighlight = value; }-*/;
+public final native void clearWebkitHighlight() /*-{ this.webkitHighlight = ""; }-*/;
+public final native String getWebkitHyphenateCharacter() /*-{ return this.webkitHyphenateCharacter; }-*/;
+public final native void setWebkitHyphenateCharacter(String value) /*-{ this.webkitHyphenateCharacter = value; }-*/;
+public final native void clearWebkitHyphenateCharacter() /*-{ this.webkitHyphenateCharacter = ""; }-*/;
+public final native String getWebkitHyphenateLimitAfter() /*-{ return this.webkitHyphenateLimitAfter; }-*/;
+public final native void setWebkitHyphenateLimitAfter(String value) /*-{ this.webkitHyphenateLimitAfter = value; }-*/;
+public final native void clearWebkitHyphenateLimitAfter() /*-{ this.webkitHyphenateLimitAfter = ""; }-*/;
+public final native String getWebkitHyphenateLimitBefore() /*-{ return this.webkitHyphenateLimitBefore; }-*/;
+public final native void setWebkitHyphenateLimitBefore(String value) /*-{ this.webkitHyphenateLimitBefore = value; }-*/;
+public final native void clearWebkitHyphenateLimitBefore() /*-{ this.webkitHyphenateLimitBefore = ""; }-*/;
+public final native String getWebkitHyphenateLimitLines() /*-{ return this.webkitHyphenateLimitLines; }-*/;
+public final native void setWebkitHyphenateLimitLines(String value) /*-{ this.webkitHyphenateLimitLines = value; }-*/;
+public final native void clearWebkitHyphenateLimitLines() /*-{ this.webkitHyphenateLimitLines = ""; }-*/;
+public final native String getWebkitHyphens() /*-{ return this.webkitHyphens; }-*/;
+public final native void setWebkitHyphens(String value) /*-{ this.webkitHyphens = value; }-*/;
+public final native void clearWebkitHyphens() /*-{ this.webkitHyphens = ""; }-*/;
+public final native String getWebkitLineBoxContain() /*-{ return this.webkitLineBoxContain; }-*/;
+public final native void setWebkitLineBoxContain(String value) /*-{ this.webkitLineBoxContain = value; }-*/;
+public final native void clearWebkitLineBoxContain() /*-{ this.webkitLineBoxContain = ""; }-*/;
+public final native String getWebkitLineAlign() /*-{ return this.webkitLineAlign; }-*/;
+public final native void setWebkitLineAlign(String value) /*-{ this.webkitLineAlign = value; }-*/;
+public final native void clearWebkitLineAlign() /*-{ this.webkitLineAlign = ""; }-*/;
+public final native String getWebkitLineBreak() /*-{ return this.webkitLineBreak; }-*/;
+public final native void setWebkitLineBreak(String value) /*-{ this.webkitLineBreak = value; }-*/;
+public final native void clearWebkitLineBreak() /*-{ this.webkitLineBreak = ""; }-*/;
+public final native String getWebkitLineClamp() /*-{ return this.webkitLineClamp; }-*/;
+public final native void setWebkitLineClamp(String value) /*-{ this.webkitLineClamp = value; }-*/;
+public final native void clearWebkitLineClamp() /*-{ this.webkitLineClamp = ""; }-*/;
+public final native String getWebkitLineGrid() /*-{ return this.webkitLineGrid; }-*/;
+public final native void setWebkitLineGrid(String value) /*-{ this.webkitLineGrid = value; }-*/;
+public final native void clearWebkitLineGrid() /*-{ this.webkitLineGrid = ""; }-*/;
+public final native String getWebkitLineSnap() /*-{ return this.webkitLineSnap; }-*/;
+public final native void setWebkitLineSnap(String value) /*-{ this.webkitLineSnap = value; }-*/;
+public final native void clearWebkitLineSnap() /*-{ this.webkitLineSnap = ""; }-*/;
+public final native String getWebkitLogicalWidth() /*-{ return this.webkitLogicalWidth; }-*/;
+public final native void setWebkitLogicalWidth(String value) /*-{ this.webkitLogicalWidth = value; }-*/;
+public final native void clearWebkitLogicalWidth() /*-{ this.webkitLogicalWidth = ""; }-*/;
+public final native String getWebkitLogicalHeight() /*-{ return this.webkitLogicalHeight; }-*/;
+public final native void setWebkitLogicalHeight(String value) /*-{ this.webkitLogicalHeight = value; }-*/;
+public final native void clearWebkitLogicalHeight() /*-{ this.webkitLogicalHeight = ""; }-*/;
+public final native String getWebkitMarginAfterCollapse() /*-{ return this.webkitMarginAfterCollapse; }-*/;
+public final native void setWebkitMarginAfterCollapse(String value) /*-{ this.webkitMarginAfterCollapse = value; }-*/;
+public final native void clearWebkitMarginAfterCollapse() /*-{ this.webkitMarginAfterCollapse = ""; }-*/;
+public final native String getWebkitMarginBeforeCollapse() /*-{ return this.webkitMarginBeforeCollapse; }-*/;
+public final native void setWebkitMarginBeforeCollapse(String value) /*-{ this.webkitMarginBeforeCollapse = value; }-*/;
+public final native void clearWebkitMarginBeforeCollapse() /*-{ this.webkitMarginBeforeCollapse = ""; }-*/;
+public final native String getWebkitMarginBottomCollapse() /*-{ return this.webkitMarginBottomCollapse; }-*/;
+public final native void setWebkitMarginBottomCollapse(String value) /*-{ this.webkitMarginBottomCollapse = value; }-*/;
+public final native void clearWebkitMarginBottomCollapse() /*-{ this.webkitMarginBottomCollapse = ""; }-*/;
+public final native String getWebkitMarginTopCollapse() /*-{ return this.webkitMarginTopCollapse; }-*/;
+public final native void setWebkitMarginTopCollapse(String value) /*-{ this.webkitMarginTopCollapse = value; }-*/;
+public final native void clearWebkitMarginTopCollapse() /*-{ this.webkitMarginTopCollapse = ""; }-*/;
+public final native String getWebkitMarginCollapse() /*-{ return this.webkitMarginCollapse; }-*/;
+public final native void setWebkitMarginCollapse(String value) /*-{ this.webkitMarginCollapse = value; }-*/;
+public final native void clearWebkitMarginCollapse() /*-{ this.webkitMarginCollapse = ""; }-*/;
+public final native String getWebkitMarginAfter() /*-{ return this.webkitMarginAfter; }-*/;
+public final native void setWebkitMarginAfter(String value) /*-{ this.webkitMarginAfter = value; }-*/;
+public final native void clearWebkitMarginAfter() /*-{ this.webkitMarginAfter = ""; }-*/;
+public final native String getWebkitMarginBefore() /*-{ return this.webkitMarginBefore; }-*/;
+public final native void setWebkitMarginBefore(String value) /*-{ this.webkitMarginBefore = value; }-*/;
+public final native void clearWebkitMarginBefore() /*-{ this.webkitMarginBefore = ""; }-*/;
+public final native String getWebkitMarginEnd() /*-{ return this.webkitMarginEnd; }-*/;
+public final native void setWebkitMarginEnd(String value) /*-{ this.webkitMarginEnd = value; }-*/;
+public final native void clearWebkitMarginEnd() /*-{ this.webkitMarginEnd = ""; }-*/;
+public final native String getWebkitMarginStart() /*-{ return this.webkitMarginStart; }-*/;
+public final native void setWebkitMarginStart(String value) /*-{ this.webkitMarginStart = value; }-*/;
+public final native void clearWebkitMarginStart() /*-{ this.webkitMarginStart = ""; }-*/;
+public final native String getWebkitMarquee() /*-{ return this.webkitMarquee; }-*/;
+public final native void setWebkitMarquee(String value) /*-{ this.webkitMarquee = value; }-*/;
+public final native void clearWebkitMarquee() /*-{ this.webkitMarquee = ""; }-*/;
+public final native String getWebkitMarqueeDirection() /*-{ return this.webkitMarqueeDirection; }-*/;
+public final native void setWebkitMarqueeDirection(String value) /*-{ this.webkitMarqueeDirection = value; }-*/;
+public final native void clearWebkitMarqueeDirection() /*-{ this.webkitMarqueeDirection = ""; }-*/;
+public final native String getWebkitMarqueeIncrement() /*-{ return this.webkitMarqueeIncrement; }-*/;
+public final native void setWebkitMarqueeIncrement(String value) /*-{ this.webkitMarqueeIncrement = value; }-*/;
+public final native void clearWebkitMarqueeIncrement() /*-{ this.webkitMarqueeIncrement = ""; }-*/;
+public final native String getWebkitMarqueeRepetition() /*-{ return this.webkitMarqueeRepetition; }-*/;
+public final native void setWebkitMarqueeRepetition(String value) /*-{ this.webkitMarqueeRepetition = value; }-*/;
+public final native void clearWebkitMarqueeRepetition() /*-{ this.webkitMarqueeRepetition = ""; }-*/;
+public final native String getWebkitMarqueeSpeed() /*-{ return this.webkitMarqueeSpeed; }-*/;
+public final native void setWebkitMarqueeSpeed(String value) /*-{ this.webkitMarqueeSpeed = value; }-*/;
+public final native void clearWebkitMarqueeSpeed() /*-{ this.webkitMarqueeSpeed = ""; }-*/;
+public final native String getWebkitMarqueeStyle() /*-{ return this.webkitMarqueeStyle; }-*/;
+public final native void setWebkitMarqueeStyle(String value) /*-{ this.webkitMarqueeStyle = value; }-*/;
+public final native void clearWebkitMarqueeStyle() /*-{ this.webkitMarqueeStyle = ""; }-*/;
+public final native String getWebkitMask() /*-{ return this.webkitMask; }-*/;
+public final native void setWebkitMask(String value) /*-{ this.webkitMask = value; }-*/;
+public final native void clearWebkitMask() /*-{ this.webkitMask = ""; }-*/;
+public final native String getWebkitMaskAttachment() /*-{ return this.webkitMaskAttachment; }-*/;
+public final native void setWebkitMaskAttachment(String value) /*-{ this.webkitMaskAttachment = value; }-*/;
+public final native void clearWebkitMaskAttachment() /*-{ this.webkitMaskAttachment = ""; }-*/;
+public final native String getWebkitMaskBoxImage() /*-{ return this.webkitMaskBoxImage; }-*/;
+public final native void setWebkitMaskBoxImage(String value) /*-{ this.webkitMaskBoxImage = value; }-*/;
+public final native void clearWebkitMaskBoxImage() /*-{ this.webkitMaskBoxImage = ""; }-*/;
+public final native String getWebkitMaskBoxImageOutset() /*-{ return this.webkitMaskBoxImageOutset; }-*/;
+public final native void setWebkitMaskBoxImageOutset(String value) /*-{ this.webkitMaskBoxImageOutset = value; }-*/;
+public final native void clearWebkitMaskBoxImageOutset() /*-{ this.webkitMaskBoxImageOutset = ""; }-*/;
+public final native String getWebkitMaskBoxImageRepeat() /*-{ return this.webkitMaskBoxImageRepeat; }-*/;
+public final native void setWebkitMaskBoxImageRepeat(String value) /*-{ this.webkitMaskBoxImageRepeat = value; }-*/;
+public final native void clearWebkitMaskBoxImageRepeat() /*-{ this.webkitMaskBoxImageRepeat = ""; }-*/;
+public final native String getWebkitMaskBoxImageSlice() /*-{ return this.webkitMaskBoxImageSlice; }-*/;
+public final native void setWebkitMaskBoxImageSlice(String value) /*-{ this.webkitMaskBoxImageSlice = value; }-*/;
+public final native void clearWebkitMaskBoxImageSlice() /*-{ this.webkitMaskBoxImageSlice = ""; }-*/;
+public final native String getWebkitMaskBoxImageSource() /*-{ return this.webkitMaskBoxImageSource; }-*/;
+public final native void setWebkitMaskBoxImageSource(String value) /*-{ this.webkitMaskBoxImageSource = value; }-*/;
+public final native void clearWebkitMaskBoxImageSource() /*-{ this.webkitMaskBoxImageSource = ""; }-*/;
+public final native String getWebkitMaskBoxImageWidth() /*-{ return this.webkitMaskBoxImageWidth; }-*/;
+public final native void setWebkitMaskBoxImageWidth(String value) /*-{ this.webkitMaskBoxImageWidth = value; }-*/;
+public final native void clearWebkitMaskBoxImageWidth() /*-{ this.webkitMaskBoxImageWidth = ""; }-*/;
+public final native String getWebkitMaskClip() /*-{ return this.webkitMaskClip; }-*/;
+public final native void setWebkitMaskClip(String value) /*-{ this.webkitMaskClip = value; }-*/;
+public final native void clearWebkitMaskClip() /*-{ this.webkitMaskClip = ""; }-*/;
+public final native String getWebkitMaskComposite() /*-{ return this.webkitMaskComposite; }-*/;
+public final native void setWebkitMaskComposite(String value) /*-{ this.webkitMaskComposite = value; }-*/;
+public final native void clearWebkitMaskComposite() /*-{ this.webkitMaskComposite = ""; }-*/;
+public final native String getWebkitMaskImage() /*-{ return this.webkitMaskImage; }-*/;
+public final native void setWebkitMaskImage(String value) /*-{ this.webkitMaskImage = value; }-*/;
+public final native void clearWebkitMaskImage() /*-{ this.webkitMaskImage = ""; }-*/;
+public final native String getWebkitMaskOrigin() /*-{ return this.webkitMaskOrigin; }-*/;
+public final native void setWebkitMaskOrigin(String value) /*-{ this.webkitMaskOrigin = value; }-*/;
+public final native void clearWebkitMaskOrigin() /*-{ this.webkitMaskOrigin = ""; }-*/;
+public final native String getWebkitMaskPosition() /*-{ return this.webkitMaskPosition; }-*/;
+public final native void setWebkitMaskPosition(String value) /*-{ this.webkitMaskPosition = value; }-*/;
+public final native void clearWebkitMaskPosition() /*-{ this.webkitMaskPosition = ""; }-*/;
+public final native String getWebkitMaskPositionX() /*-{ return this.webkitMaskPositionX; }-*/;
+public final native void setWebkitMaskPositionX(String value) /*-{ this.webkitMaskPositionX = value; }-*/;
+public final native void clearWebkitMaskPositionX() /*-{ this.webkitMaskPositionX = ""; }-*/;
+public final native String getWebkitMaskPositionY() /*-{ return this.webkitMaskPositionY; }-*/;
+public final native void setWebkitMaskPositionY(String value) /*-{ this.webkitMaskPositionY = value; }-*/;
+public final native void clearWebkitMaskPositionY() /*-{ this.webkitMaskPositionY = ""; }-*/;
+public final native String getWebkitMaskRepeat() /*-{ return this.webkitMaskRepeat; }-*/;
+public final native void setWebkitMaskRepeat(String value) /*-{ this.webkitMaskRepeat = value; }-*/;
+public final native void clearWebkitMaskRepeat() /*-{ this.webkitMaskRepeat = ""; }-*/;
+public final native String getWebkitMaskRepeatX() /*-{ return this.webkitMaskRepeatX; }-*/;
+public final native void setWebkitMaskRepeatX(String value) /*-{ this.webkitMaskRepeatX = value; }-*/;
+public final native void clearWebkitMaskRepeatX() /*-{ this.webkitMaskRepeatX = ""; }-*/;
+public final native String getWebkitMaskRepeatY() /*-{ return this.webkitMaskRepeatY; }-*/;
+public final native void setWebkitMaskRepeatY(String value) /*-{ this.webkitMaskRepeatY = value; }-*/;
+public final native void clearWebkitMaskRepeatY() /*-{ this.webkitMaskRepeatY = ""; }-*/;
+public final native String getWebkitMaskSize() /*-{ return this.webkitMaskSize; }-*/;
+public final native void setWebkitMaskSize(String value) /*-{ this.webkitMaskSize = value; }-*/;
+public final native void clearWebkitMaskSize() /*-{ this.webkitMaskSize = ""; }-*/;
+public final native String getWebkitMatchNearestMailBlockquoteColor() /*-{ return this.webkitMatchNearestMailBlockquoteColor; }-*/;
+public final native void setWebkitMatchNearestMailBlockquoteColor(String value) /*-{ this.webkitMatchNearestMailBlockquoteColor = value; }-*/;
+public final native void clearWebkitMatchNearestMailBlockquoteColor() /*-{ this.webkitMatchNearestMailBlockquoteColor = ""; }-*/;
+public final native String getWebkitMaxLogicalWidth() /*-{ return this.webkitMaxLogicalWidth; }-*/;
+public final native void setWebkitMaxLogicalWidth(String value) /*-{ this.webkitMaxLogicalWidth = value; }-*/;
+public final native void clearWebkitMaxLogicalWidth() /*-{ this.webkitMaxLogicalWidth = ""; }-*/;
+public final native String getWebkitMaxLogicalHeight() /*-{ return this.webkitMaxLogicalHeight; }-*/;
+public final native void setWebkitMaxLogicalHeight(String value) /*-{ this.webkitMaxLogicalHeight = value; }-*/;
+public final native void clearWebkitMaxLogicalHeight() /*-{ this.webkitMaxLogicalHeight = ""; }-*/;
+public final native String getWebkitMinLogicalWidth() /*-{ return this.webkitMinLogicalWidth; }-*/;
+public final native void setWebkitMinLogicalWidth(String value) /*-{ this.webkitMinLogicalWidth = value; }-*/;
+public final native void clearWebkitMinLogicalWidth() /*-{ this.webkitMinLogicalWidth = ""; }-*/;
+public final native String getWebkitMinLogicalHeight() /*-{ return this.webkitMinLogicalHeight; }-*/;
+public final native void setWebkitMinLogicalHeight(String value) /*-{ this.webkitMinLogicalHeight = value; }-*/;
+public final native void clearWebkitMinLogicalHeight() /*-{ this.webkitMinLogicalHeight = ""; }-*/;
+public final native String getWebkitNbspMode() /*-{ return this.webkitNbspMode; }-*/;
+public final native void setWebkitNbspMode(String value) /*-{ this.webkitNbspMode = value; }-*/;
+public final native void clearWebkitNbspMode() /*-{ this.webkitNbspMode = ""; }-*/;
+public final native String getWebkitPaddingAfter() /*-{ return this.webkitPaddingAfter; }-*/;
+public final native void setWebkitPaddingAfter(String value) /*-{ this.webkitPaddingAfter = value; }-*/;
+public final native void clearWebkitPaddingAfter() /*-{ this.webkitPaddingAfter = ""; }-*/;
+public final native String getWebkitPaddingBefore() /*-{ return this.webkitPaddingBefore; }-*/;
+public final native void setWebkitPaddingBefore(String value) /*-{ this.webkitPaddingBefore = value; }-*/;
+public final native void clearWebkitPaddingBefore() /*-{ this.webkitPaddingBefore = ""; }-*/;
+public final native String getWebkitPaddingEnd() /*-{ return this.webkitPaddingEnd; }-*/;
+public final native void setWebkitPaddingEnd(String value) /*-{ this.webkitPaddingEnd = value; }-*/;
+public final native void clearWebkitPaddingEnd() /*-{ this.webkitPaddingEnd = ""; }-*/;
+public final native String getWebkitPaddingStart() /*-{ return this.webkitPaddingStart; }-*/;
+public final native void setWebkitPaddingStart(String value) /*-{ this.webkitPaddingStart = value; }-*/;
+public final native void clearWebkitPaddingStart() /*-{ this.webkitPaddingStart = ""; }-*/;
+public final native String getWebkitPerspective() /*-{ return this.webkitPerspective; }-*/;
+public final native void setWebkitPerspective(String value) /*-{ this.webkitPerspective = value; }-*/;
+public final native void clearWebkitPerspective() /*-{ this.webkitPerspective = ""; }-*/;
+public final native String getWebkitPerspectiveOrigin() /*-{ return this.webkitPerspectiveOrigin; }-*/;
+public final native void setWebkitPerspectiveOrigin(String value) /*-{ this.webkitPerspectiveOrigin = value; }-*/;
+public final native void clearWebkitPerspectiveOrigin() /*-{ this.webkitPerspectiveOrigin = ""; }-*/;
+public final native String getWebkitPerspectiveOriginX() /*-{ return this.webkitPerspectiveOriginX; }-*/;
+public final native void setWebkitPerspectiveOriginX(String value) /*-{ this.webkitPerspectiveOriginX = value; }-*/;
+public final native void clearWebkitPerspectiveOriginX() /*-{ this.webkitPerspectiveOriginX = ""; }-*/;
+public final native String getWebkitPerspectiveOriginY() /*-{ return this.webkitPerspectiveOriginY; }-*/;
+public final native void setWebkitPerspectiveOriginY(String value) /*-{ this.webkitPerspectiveOriginY = value; }-*/;
+public final native void clearWebkitPerspectiveOriginY() /*-{ this.webkitPerspectiveOriginY = ""; }-*/;
+public final native String getWebkitPrintColorAdjust() /*-{ return this.webkitPrintColorAdjust; }-*/;
+public final native void setWebkitPrintColorAdjust(String value) /*-{ this.webkitPrintColorAdjust = value; }-*/;
+public final native void clearWebkitPrintColorAdjust() /*-{ this.webkitPrintColorAdjust = ""; }-*/;
+public final native String getWebkitRtlOrdering() /*-{ return this.webkitRtlOrdering; }-*/;
+public final native void setWebkitRtlOrdering(String value) /*-{ this.webkitRtlOrdering = value; }-*/;
+public final native void clearWebkitRtlOrdering() /*-{ this.webkitRtlOrdering = ""; }-*/;
+public final native String getWebkitTextCombine() /*-{ return this.webkitTextCombine; }-*/;
+public final native void setWebkitTextCombine(String value) /*-{ this.webkitTextCombine = value; }-*/;
+public final native void clearWebkitTextCombine() /*-{ this.webkitTextCombine = ""; }-*/;
+public final native String getWebkitTextDecorationsInEffect() /*-{ return this.webkitTextDecorationsInEffect; }-*/;
+public final native void setWebkitTextDecorationsInEffect(String value) /*-{ this.webkitTextDecorationsInEffect = value; }-*/;
+public final native void clearWebkitTextDecorationsInEffect() /*-{ this.webkitTextDecorationsInEffect = ""; }-*/;
+public final native String getWebkitTextEmphasis() /*-{ return this.webkitTextEmphasis; }-*/;
+public final native void setWebkitTextEmphasis(String value) /*-{ this.webkitTextEmphasis = value; }-*/;
+public final native void clearWebkitTextEmphasis() /*-{ this.webkitTextEmphasis = ""; }-*/;
+public final native String getWebkitTextEmphasisColor() /*-{ return this.webkitTextEmphasisColor; }-*/;
+public final native void setWebkitTextEmphasisColor(String value) /*-{ this.webkitTextEmphasisColor = value; }-*/;
+public final native void clearWebkitTextEmphasisColor() /*-{ this.webkitTextEmphasisColor = ""; }-*/;
+public final native String getWebkitTextEmphasisPosition() /*-{ return this.webkitTextEmphasisPosition; }-*/;
+public final native void setWebkitTextEmphasisPosition(String value) /*-{ this.webkitTextEmphasisPosition = value; }-*/;
+public final native void clearWebkitTextEmphasisPosition() /*-{ this.webkitTextEmphasisPosition = ""; }-*/;
+public final native String getWebkitTextEmphasisStyle() /*-{ return this.webkitTextEmphasisStyle; }-*/;
+public final native void setWebkitTextEmphasisStyle(String value) /*-{ this.webkitTextEmphasisStyle = value; }-*/;
+public final native void clearWebkitTextEmphasisStyle() /*-{ this.webkitTextEmphasisStyle = ""; }-*/;
+public final native String getWebkitTextFillColor() /*-{ return this.webkitTextFillColor; }-*/;
+public final native void setWebkitTextFillColor(String value) /*-{ this.webkitTextFillColor = value; }-*/;
+public final native void clearWebkitTextFillColor() /*-{ this.webkitTextFillColor = ""; }-*/;
+public final native String getWebkitTextSecurity() /*-{ return this.webkitTextSecurity; }-*/;
+public final native void setWebkitTextSecurity(String value) /*-{ this.webkitTextSecurity = value; }-*/;
+public final native void clearWebkitTextSecurity() /*-{ this.webkitTextSecurity = ""; }-*/;
+public final native String getWebkitTextStroke() /*-{ return this.webkitTextStroke; }-*/;
+public final native void setWebkitTextStroke(String value) /*-{ this.webkitTextStroke = value; }-*/;
+public final native void clearWebkitTextStroke() /*-{ this.webkitTextStroke = ""; }-*/;
+public final native String getWebkitTextStrokeColor() /*-{ return this.webkitTextStrokeColor; }-*/;
+public final native void setWebkitTextStrokeColor(String value) /*-{ this.webkitTextStrokeColor = value; }-*/;
+public final native void clearWebkitTextStrokeColor() /*-{ this.webkitTextStrokeColor = ""; }-*/;
+public final native String getWebkitTextStrokeWidth() /*-{ return this.webkitTextStrokeWidth; }-*/;
+public final native void setWebkitTextStrokeWidth(String value) /*-{ this.webkitTextStrokeWidth = value; }-*/;
+public final native void clearWebkitTextStrokeWidth() /*-{ this.webkitTextStrokeWidth = ""; }-*/;
+public final native String getWebkitTransform() /*-{ return this.webkitTransform; }-*/;
+public final native void setWebkitTransform(String value) /*-{ this.webkitTransform = value; }-*/;
+public final native void clearWebkitTransform() /*-{ this.webkitTransform = ""; }-*/;
+public final native String getWebkitTransformOrigin() /*-{ return this.webkitTransformOrigin; }-*/;
+public final native void setWebkitTransformOrigin(String value) /*-{ this.webkitTransformOrigin = value; }-*/;
+public final native void clearWebkitTransformOrigin() /*-{ this.webkitTransformOrigin = ""; }-*/;
+public final native String getWebkitTransformOriginX() /*-{ return this.webkitTransformOriginX; }-*/;
+public final native void setWebkitTransformOriginX(String value) /*-{ this.webkitTransformOriginX = value; }-*/;
+public final native void clearWebkitTransformOriginX() /*-{ this.webkitTransformOriginX = ""; }-*/;
+public final native String getWebkitTransformOriginY() /*-{ return this.webkitTransformOriginY; }-*/;
+public final native void setWebkitTransformOriginY(String value) /*-{ this.webkitTransformOriginY = value; }-*/;
+public final native void clearWebkitTransformOriginY() /*-{ this.webkitTransformOriginY = ""; }-*/;
+public final native String getWebkitTransformOriginZ() /*-{ return this.webkitTransformOriginZ; }-*/;
+public final native void setWebkitTransformOriginZ(String value) /*-{ this.webkitTransformOriginZ = value; }-*/;
+public final native void clearWebkitTransformOriginZ() /*-{ this.webkitTransformOriginZ = ""; }-*/;
+public final native String getWebkitTransformStyle() /*-{ return this.webkitTransformStyle; }-*/;
+public final native void setWebkitTransformStyle(String value) /*-{ this.webkitTransformStyle = value; }-*/;
+public final native void clearWebkitTransformStyle() /*-{ this.webkitTransformStyle = ""; }-*/;
+public final native String getWebkitTransition() /*-{ return this.webkitTransition; }-*/;
+public final native void setWebkitTransition(String value) /*-{ this.webkitTransition = value; }-*/;
+public final native void clearWebkitTransition() /*-{ this.webkitTransition = ""; }-*/;
+public final native String getWebkitTransitionDelay() /*-{ return this.webkitTransitionDelay; }-*/;
+public final native void setWebkitTransitionDelay(String value) /*-{ this.webkitTransitionDelay = value; }-*/;
+public final native void clearWebkitTransitionDelay() /*-{ this.webkitTransitionDelay = ""; }-*/;
+public final native String getWebkitTransitionDuration() /*-{ return this.webkitTransitionDuration; }-*/;
+public final native void setWebkitTransitionDuration(String value) /*-{ this.webkitTransitionDuration = value; }-*/;
+public final native void clearWebkitTransitionDuration() /*-{ this.webkitTransitionDuration = ""; }-*/;
+public final native String getWebkitTransitionProperty() /*-{ return this.webkitTransitionProperty; }-*/;
+public final native void setWebkitTransitionProperty(String value) /*-{ this.webkitTransitionProperty = value; }-*/;
+public final native void clearWebkitTransitionProperty() /*-{ this.webkitTransitionProperty = ""; }-*/;
+public final native String getWebkitTransitionTimingFunction() /*-{ return this.webkitTransitionTimingFunction; }-*/;
+public final native void setWebkitTransitionTimingFunction(String value) /*-{ this.webkitTransitionTimingFunction = value; }-*/;
+public final native void clearWebkitTransitionTimingFunction() /*-{ this.webkitTransitionTimingFunction = ""; }-*/;
+public final native String getWebkitUserDrag() /*-{ return this.webkitUserDrag; }-*/;
+public final native void setWebkitUserDrag(String value) /*-{ this.webkitUserDrag = value; }-*/;
+public final native void clearWebkitUserDrag() /*-{ this.webkitUserDrag = ""; }-*/;
+public final native String getWebkitUserModify() /*-{ return this.webkitUserModify; }-*/;
+public final native void setWebkitUserModify(String value) /*-{ this.webkitUserModify = value; }-*/;
+public final native void clearWebkitUserModify() /*-{ this.webkitUserModify = ""; }-*/;
+public final native String getWebkitUserSelect() /*-{ return this.webkitUserSelect; }-*/;
+public final native void setWebkitUserSelect(String value) /*-{ this.webkitUserSelect = value; }-*/;
+public final native void clearWebkitUserSelect() /*-{ this.webkitUserSelect = ""; }-*/;
+public final native String getWebkitFlowInto() /*-{ return this.webkitFlowInto; }-*/;
+public final native void setWebkitFlowInto(String value) /*-{ this.webkitFlowInto = value; }-*/;
+public final native void clearWebkitFlowInto() /*-{ this.webkitFlowInto = ""; }-*/;
+public final native String getWebkitFlowFrom() /*-{ return this.webkitFlowFrom; }-*/;
+public final native void setWebkitFlowFrom(String value) /*-{ this.webkitFlowFrom = value; }-*/;
+public final native void clearWebkitFlowFrom() /*-{ this.webkitFlowFrom = ""; }-*/;
+public final native String getWebkitRegionOverflow() /*-{ return this.webkitRegionOverflow; }-*/;
+public final native void setWebkitRegionOverflow(String value) /*-{ this.webkitRegionOverflow = value; }-*/;
+public final native void clearWebkitRegionOverflow() /*-{ this.webkitRegionOverflow = ""; }-*/;
+public final native String getWebkitShapeInside() /*-{ return this.webkitShapeInside; }-*/;
+public final native void setWebkitShapeInside(String value) /*-{ this.webkitShapeInside = value; }-*/;
+public final native void clearWebkitShapeInside() /*-{ this.webkitShapeInside = ""; }-*/;
+public final native String getWebkitShapeOutside() /*-{ return this.webkitShapeOutside; }-*/;
+public final native void setWebkitShapeOutside(String value) /*-{ this.webkitShapeOutside = value; }-*/;
+public final native void clearWebkitShapeOutside() /*-{ this.webkitShapeOutside = ""; }-*/;
+public final native String getWebkitWrapMargin() /*-{ return this.webkitWrapMargin; }-*/;
+public final native void setWebkitWrapMargin(String value) /*-{ this.webkitWrapMargin = value; }-*/;
+public final native void clearWebkitWrapMargin() /*-{ this.webkitWrapMargin = ""; }-*/;
+public final native String getWebkitWrapPadding() /*-{ return this.webkitWrapPadding; }-*/;
+public final native void setWebkitWrapPadding(String value) /*-{ this.webkitWrapPadding = value; }-*/;
+public final native void clearWebkitWrapPadding() /*-{ this.webkitWrapPadding = ""; }-*/;
+public final native String getWebkitRegionBreakAfter() /*-{ return this.webkitRegionBreakAfter; }-*/;
+public final native void setWebkitRegionBreakAfter(String value) /*-{ this.webkitRegionBreakAfter = value; }-*/;
+public final native void clearWebkitRegionBreakAfter() /*-{ this.webkitRegionBreakAfter = ""; }-*/;
+public final native String getWebkitRegionBreakBefore() /*-{ return this.webkitRegionBreakBefore; }-*/;
+public final native void setWebkitRegionBreakBefore(String value) /*-{ this.webkitRegionBreakBefore = value; }-*/;
+public final native void clearWebkitRegionBreakBefore() /*-{ this.webkitRegionBreakBefore = ""; }-*/;
+public final native String getWebkitRegionBreakInside() /*-{ return this.webkitRegionBreakInside; }-*/;
+public final native void setWebkitRegionBreakInside(String value) /*-{ this.webkitRegionBreakInside = value; }-*/;
+public final native void clearWebkitRegionBreakInside() /*-{ this.webkitRegionBreakInside = ""; }-*/;
+public final native String getWebkitWrapFlow() /*-{ return this.webkitWrapFlow; }-*/;
+public final native void setWebkitWrapFlow(String value) /*-{ this.webkitWrapFlow = value; }-*/;
+public final native void clearWebkitWrapFlow() /*-{ this.webkitWrapFlow = ""; }-*/;
+public final native String getWebkitWrapThrough() /*-{ return this.webkitWrapThrough; }-*/;
+public final native void setWebkitWrapThrough(String value) /*-{ this.webkitWrapThrough = value; }-*/;
+public final native void clearWebkitWrapThrough() /*-{ this.webkitWrapThrough = ""; }-*/;
+public final native String getWebkitWrap() /*-{ return this.webkitWrap; }-*/;
+public final native void setWebkitWrap(String value) /*-{ this.webkitWrap = value; }-*/;
+public final native void clearWebkitWrap() /*-{ this.webkitWrap = ""; }-*/;
+public final native String getWebkitTapHighlightColor() /*-{ return this.webkitTapHighlightColor; }-*/;
+public final native void setWebkitTapHighlightColor(String value) /*-{ this.webkitTapHighlightColor = value; }-*/;
+public final native void clearWebkitTapHighlightColor() /*-{ this.webkitTapHighlightColor = ""; }-*/;
+public final native String getWebkitDashboardRegion() /*-{ return this.webkitDashboardRegion; }-*/;
+public final native void setWebkitDashboardRegion(String value) /*-{ this.webkitDashboardRegion = value; }-*/;
+public final native void clearWebkitDashboardRegion() /*-{ this.webkitDashboardRegion = ""; }-*/;
+public final native String getWebkitOverflowScrolling() /*-{ return this.webkitOverflowScrolling; }-*/;
+public final native void setWebkitOverflowScrolling(String value) /*-{ this.webkitOverflowScrolling = value; }-*/;
+public final native void clearWebkitOverflowScrolling() /*-{ this.webkitOverflowScrolling = ""; }-*/;
+}
diff --git a/elemental/idl/templates/jso_impl_Document.darttemplate b/elemental/idl/templates/jso_impl_Document.darttemplate
new file mode 100644
index 0000000..2e5f7ac
--- /dev/null
+++ b/elemental/idl/templates/jso_impl_Document.darttemplate
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.svg.*;
+import elemental.svg.*;
+
+import java.util.Date;
+
+public class $ID$EXTENDS $IMPLEMENTS {
+  protected $ID() {}
+
+  public final native void clearOpener() /*-{
+    this.opener = null;
+  }-*/;
+
+  public final JsElement createSvgElement(String tag) {
+    return createElementNS("http://www.w3.org/2000/svg", tag).cast();
+  }
+
+$!MEMBERS}
diff --git a/elemental/idl/templates/jso_impl_ElementalMixinBase.darttemplate b/elemental/idl/templates/jso_impl_ElementalMixinBase.darttemplate
new file mode 100644
index 0000000..b3e199a
--- /dev/null
+++ b/elemental/idl/templates/jso_impl_ElementalMixinBase.darttemplate
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.svg.*;
+import elemental.js.util.JsElementalBase;
+
+import java.util.Date;
+
+/**
+  * A base class containing all of the IDL interfaces which are shared
+  * between disjoint type hierarchies. Because of the GWT compiler
+  * SingleJsoImpl restriction that only a single JavaScriptObject
+  * may implement a given interface, we hoist all of the explicit
+  * mixin classes into a base JSO used by all of elemental.
+  */
+public class JsElementalMixinBase $EXTENDS $IMPLEMENTS {
+  protected JsElementalMixinBase() {}
+$!MEMBERS
+
+private static class Remover implements EventRemover {
+  private final EventTarget target;
+  private final String type;
+  private final JavaScriptObject handler;
+  private final boolean useCapture;
+
+  private Remover(EventTarget target, String type, JavaScriptObject handler,
+      boolean useCapture) {
+    this.target = target;
+    this.type = type;
+    this.handler = handler;
+    this.useCapture = useCapture;
+  }
+
+  @Override
+  public void remove() {
+    removeEventListener(target, type, handler, useCapture);
+  }
+
+  private static Remover create(EventTarget target, String type, JavaScriptObject handler,
+      boolean useCapture) {
+    return new Remover(target, type, handler, useCapture);
+  }
+}
+
+// NOTES:
+// - This handler/listener structure is currently the same in DevMode and ProdMode but it is
+//   subject to change. In fact, I would like to use:
+//     { listener : listener, handleEvent : function() }
+//   but Firefox doesn't properly support that form of handler for onEvent type events.
+// - The handler property on listener can be removed when removeEventListener is removed.
+private native static JavaScriptObject createHandler(EventListener listener) /*-{
+  var handler = listener.handler;
+  if (!handler) {
+    handler = $entry(function(event) {
+      @elemental.js.dom.JsElementalMixinBase::handleEvent(Lelemental/events/EventListener;Lelemental/events/Event;)(listener, event);
+    });
+    handler.listener = listener;
+    // TODO(knorton): Remove at Christmas when removeEventListener is removed.
+    listener.handler = handler;
+  }
+  return handler;
+}-*/;
+
+private static class ForDevMode {
+  private static java.util.Map<EventListener, JavaScriptObject> handlers;
+
+  static {
+    if (!com.google.gwt.core.client.GWT.isScript()) {
+      handlers = new java.util.HashMap<EventListener, JavaScriptObject>();
+    }
+  }
+
+  private static JavaScriptObject getHandlerFor(EventListener listener) {
+    if (listener == null) {
+      return null;
+    }
+
+    JavaScriptObject handler = handlers.get(listener);
+    if (handler == null) {
+      handler = createHandler(listener);
+      handlers.put(listener, handler);
+    }
+    return handler;
+  }
+
+  private native static JavaScriptObject createHandler(EventListener listener) /*-{
+    var handler = $entry(function(event) {
+      @elemental.js.dom.JsElementalMixinBase::handleEvent(Lelemental/events/EventListener;Lelemental/events/Event;)(listener, event);
+    });
+    handler.listener = listener;
+    return handler;
+  }-*/;
+
+  private native static EventListener getListenerFor(JavaScriptObject handler) /*-{
+    return handler && handler.listener;
+  }-*/;
+}
+
+private static class ForProdMode {
+  private static JavaScriptObject getHandlerFor(EventListener listener) {
+    return listener == null ? null : createHandler(listener);
+  }
+
+  private native static EventListener getListenerFor(JavaScriptObject handler) /*-{
+    return handler && handler.listener;
+  }-*/;
+}
+
+private static void handleEvent(EventListener listener, Event event) {
+  listener.handleEvent(event);
+}
+
+private static EventListener getListenerFor(JavaScriptObject handler) {
+  return com.google.gwt.core.client.GWT.isScript()
+    ? ForProdMode.getListenerFor(handler)
+    : ForDevMode.getListenerFor(handler);
+}
+
+private static JavaScriptObject getHandlerFor(EventListener listener) {
+  return com.google.gwt.core.client.GWT.isScript()
+    ? ForProdMode.getHandlerFor(listener)
+    : ForDevMode.getHandlerFor(listener);
+}
+ 
+public native final EventRemover addEventListener(String type, EventListener listener, boolean useCapture) /*-{
+  var handler = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  this.addEventListener(type, handler, useCapture);
+  return @elemental.js.dom.JsElementalMixinBase.Remover::create(Lelemental/events/EventTarget;Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;Z)
+      (this, type, handler, useCapture);
+}-*/;
+
+public native final EventRemover addEventListener(String type, EventListener listener) /*-{
+  var handler = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  this.addEventListener(type, handler);
+  return @elemental.js.dom.JsElementalMixinBase.Remover::create(Lelemental/events/EventTarget;Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;Z)
+      (this, type, handler, useCapture);
+}-*/;
+
+@Deprecated
+public final void removeEventListener(String type, EventListener listener, boolean useCapture) {
+  final JavaScriptObject handler = getHandlerFor(listener);
+  if (handler != null) {
+    removeEventListener(this, type, handler, useCapture);
+  }
+}
+
+@Deprecated
+public final void removeEventListener(String type, EventListener listener) {
+  final JavaScriptObject handler = getHandlerFor(listener);
+  if (handler != null) {
+    removeEventListener(this, type, handler);
+  }
+}
+
+private static native void removeEventListener(EventTarget target, String type,
+    JavaScriptObject handler, boolean useCapture) /*-{
+  target.removeEventListener(type, handler, useCapture);
+}-*/;
+
+private static native void removeEventListener(EventTarget target, String type,
+    JavaScriptObject handler) /*-{
+  target.removeEventListener(type, handler);
+}-*/;
+
+}
diff --git a/elemental/idl/templates/jso_impl_Window.darttemplate b/elemental/idl/templates/jso_impl_Window.darttemplate
new file mode 100644
index 0000000..9eb300b
--- /dev/null
+++ b/elemental/idl/templates/jso_impl_Window.darttemplate
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package $PACKAGE;
+$IMPORTS
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+import elemental.xpath.*;
+import elemental.xml.*;
+import elemental.js.xpath.*;
+import elemental.js.xml.*;
+
+import java.util.Date;
+
+public class $ID$EXTENDS $IMPLEMENTS {
+  protected $ID() {}
+
+  public final native void clearOpener() /*-{
+    this.opener = null;
+  }-*/;
+
+$!MEMBERS}
diff --git a/elemental/idl/third_party/WebCore/LICENSE-APPLE b/elemental/idl/third_party/WebCore/LICENSE-APPLE
new file mode 100644
index 0000000..f29b41c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/LICENSE-APPLE
@@ -0,0 +1,21 @@
+Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1.  Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+2.  Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/elemental/idl/third_party/WebCore/LICENSE-LGPL-2 b/elemental/idl/third_party/WebCore/LICENSE-LGPL-2
new file mode 100644
index 0000000..0e1187b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/LICENSE-LGPL-2
@@ -0,0 +1,481 @@
+                  GNU LIBRARY GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+                  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/elemental/idl/third_party/WebCore/LICENSE-LGPL-2.1 b/elemental/idl/third_party/WebCore/LICENSE-LGPL-2.1
new file mode 100644
index 0000000..b2787a6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/LICENSE-LGPL-2.1
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/elemental/idl/third_party/WebCore/Modules/battery/BatteryManager.idl b/elemental/idl/third_party/WebCore/Modules/battery/BatteryManager.idl
new file mode 100644
index 0000000..e552df3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/battery/BatteryManager.idl
@@ -0,0 +1,50 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public License
+ *  along with this library; see the file COPYING.LIB.  If not, write to
+ *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+module window {
+
+    // http://dev.w3.org/2009/dap/system-info/battery-status.html
+    interface [
+        Conditional=BATTERY_STATUS,
+        ActiveDOMObject,
+        EventTarget
+     ] BatteryManager {
+        readonly attribute boolean charging;
+        readonly attribute double chargingTime;
+        readonly attribute double dischargingTime;
+        readonly attribute double level;
+
+        attribute EventListener onchargingchange;
+        attribute EventListener onchargingtimechange;
+        attribute EventListener ondischargingtimechange;
+        attribute EventListener onlevelchange;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/Modules/battery/NavigatorBattery.idl b/elemental/idl/third_party/WebCore/Modules/battery/NavigatorBattery.idl
new file mode 100644
index 0000000..5c21472
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/battery/NavigatorBattery.idl
@@ -0,0 +1,30 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public License
+ *  along with this library; see the file COPYING.LIB.  If not, write to
+ *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+module window {
+
+    interface [
+        Conditional=BATTERY_STATUS,
+        Supplemental=Navigator
+    ] NavigatorBattery {
+        readonly attribute BatteryManager webkitBattery;
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/DOMFileSystem.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/DOMFileSystem.idl
new file mode 100644
index 0000000..2e98fbf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/DOMFileSystem.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        ActiveDOMObject,
+        JSNoStaticTables
+    ] DOMFileSystem {
+        readonly attribute DOMString name;
+        readonly attribute DirectoryEntry root;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/DOMFileSystemSync.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/DOMFileSystemSync.idl
new file mode 100644
index 0000000..706aa50
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/DOMFileSystemSync.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        JSNoStaticTables
+    ] DOMFileSystemSync {
+        readonly attribute DOMString name;
+        readonly attribute DirectoryEntrySync root;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/DOMWindowFileSystem.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/DOMWindowFileSystem.idl
new file mode 100644
index 0000000..b6ef513
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/DOMWindowFileSystem.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        Conditional=FILE_SYSTEM,
+        Supplemental=DOMWindow
+    ] DOMWindowFileSystem {
+        const unsigned short TEMPORARY = 0;
+        const unsigned short PERSISTENT = 1;
+
+        [V8EnabledAtRuntime=FileSystem] void webkitRequestFileSystem(in unsigned short type, in long long size,
+                in [Callback] FileSystemCallback successCallback, in [Callback, Optional] ErrorCallback errorCallback);
+        [V8EnabledAtRuntime=FileSystem] void webkitResolveLocalFileSystemURL(in DOMString url,
+                in [Callback, Optional] EntryCallback successCallback, in [Callback, Optional] ErrorCallback errorCallback);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/DataTransferItemFileSystem.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/DataTransferItemFileSystem.idl
new file mode 100644
index 0000000..35291dd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/DataTransferItemFileSystem.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=DATA_TRANSFER_ITEMS&FILE_SYSTEM,
+        Supplemental=DataTransferItem
+    ] DataTransferItemFileSystem {
+        // FIXME: add webkitGetAsEntry()
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryEntry.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryEntry.idl
new file mode 100644
index 0000000..c6c9ae9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryEntry.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject,
+        JSNoStaticTables
+    ] DirectoryEntry : Entry {
+        DirectoryReader createReader();
+        [Custom] void getFile(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString path, in [Optional] WebKitFlags flags, in [Optional, Callback] EntryCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+        [Custom] void getDirectory(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString path, in [Optional] WebKitFlags flags, in [Optional, Callback] EntryCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+        void removeRecursively(in [Callback] VoidCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryEntrySync.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryEntrySync.idl
new file mode 100644
index 0000000..66c288f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryEntrySync.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject,
+        JSNoStaticTables
+    ] DirectoryEntrySync : EntrySync {
+        DirectoryReaderSync createReader() raises (FileException);
+        [Custom] FileEntrySync getFile(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString path, in WebKitFlags flags) raises (FileException);
+        [Custom] DirectoryEntrySync getDirectory(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString path, in WebKitFlags flags) raises (FileException);
+        void removeRecursively() raises (FileException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryReader.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryReader.idl
new file mode 100644
index 0000000..87ce852
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryReader.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        JSNoStaticTables
+    ] DirectoryReader {
+        void readEntries(in [Callback] EntriesCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryReaderSync.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryReaderSync.idl
new file mode 100644
index 0000000..a8ff685
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/DirectoryReaderSync.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        JSNoStaticTables
+    ] DirectoryReaderSync {
+        EntryArraySync readEntries() raises (FileException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/EntriesCallback.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/EntriesCallback.idl
new file mode 100644
index 0000000..73b374d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/EntriesCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        Callback
+    ] EntriesCallback {
+        boolean handleEvent(in EntryArray entries);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/Entry.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/Entry.idl
new file mode 100644
index 0000000..c6cdba5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/Entry.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        CustomToJSObject,
+        JSNoStaticTables
+    ] Entry {
+        readonly attribute boolean isFile;
+        readonly attribute boolean isDirectory;
+        readonly attribute DOMString name;
+        readonly attribute DOMString fullPath;
+        readonly attribute DOMFileSystem filesystem;
+
+        void getMetadata(in [Callback] MetadataCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+        void moveTo(in DirectoryEntry parent, in [Optional, TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString name, in [Optional, Callback] EntryCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+        void copyTo(in DirectoryEntry parent, in [Optional, TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString name, in [Optional, Callback] EntryCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+        DOMString toURL();
+        void remove(in [Callback] VoidCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+        void getParent(in [Optional, Callback] EntryCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/EntryArray.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/EntryArray.idl
new file mode 100644
index 0000000..324dbc6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/EntryArray.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        IndexedGetter,
+        JSNoStaticTables
+    ] EntryArray {
+        readonly attribute unsigned long length;
+        Entry item(in [IsIndex] unsigned long index);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/EntryArraySync.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/EntryArraySync.idl
new file mode 100644
index 0000000..224a68a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/EntryArraySync.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        IndexedGetter,
+        JSNoStaticTables
+    ] EntryArraySync {
+        readonly attribute unsigned long length;
+        EntrySync item(in [IsIndex] unsigned long index);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/EntryCallback.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/EntryCallback.idl
new file mode 100644
index 0000000..bea3fd1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/EntryCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        Callback
+    ] EntryCallback {
+        boolean handleEvent(in Entry entry);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/EntrySync.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/EntrySync.idl
new file mode 100644
index 0000000..cd4bae7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/EntrySync.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        CustomToJSObject,
+        JSNoStaticTables
+    ] EntrySync {
+        readonly attribute boolean isFile;
+        readonly attribute boolean isDirectory;
+        readonly attribute DOMString name;
+        readonly attribute DOMString fullPath;
+        readonly attribute DOMFileSystemSync filesystem;
+
+        Metadata getMetadata() raises (FileException);
+        EntrySync moveTo(in DirectoryEntrySync parent, in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString name) raises (FileException);
+        EntrySync copyTo(in DirectoryEntrySync parent, in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString name) raises (FileException);
+        DOMString toURL();
+        void remove() raises (FileException);
+        DirectoryEntrySync getParent();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/ErrorCallback.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/ErrorCallback.idl
new file mode 100644
index 0000000..fc7fa85
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/ErrorCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        Callback
+    ] ErrorCallback {
+        boolean handleEvent(in FileError error);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/FileCallback.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/FileCallback.idl
new file mode 100644
index 0000000..0ab814f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/FileCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module fileapi {
+    interface [
+        Conditional=FILE_SYSTEM,
+        Callback
+    ] FileCallback {
+        boolean handleEvent(in File file);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/FileEntry.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/FileEntry.idl
new file mode 100644
index 0000000..63b0040
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/FileEntry.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject,
+        JSNoStaticTables
+    ] FileEntry : Entry {
+        void createWriter(in [Callback] FileWriterCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+        void file(in [Callback] FileCallback successCallback, in [Optional, Callback] ErrorCallback errorCallback);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/FileEntrySync.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/FileEntrySync.idl
new file mode 100644
index 0000000..8ac40ba
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/FileEntrySync.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject,
+        JSNoStaticTables
+    ] FileEntrySync : EntrySync {
+        File file() raises (FileException);
+        FileWriterSync createWriter() raises (FileException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/FileSystemCallback.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/FileSystemCallback.idl
new file mode 100644
index 0000000..cf686ff
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/FileSystemCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        Callback
+    ] FileSystemCallback {
+        boolean handleEvent(in DOMFileSystem fileSystem);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/FileWriter.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/FileWriter.idl
new file mode 100644
index 0000000..754fa0f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/FileWriter.idl
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2010 Google Inc.  All rights reserved.
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=FILE_SYSTEM,
+        ActiveDOMObject,
+        CallWith=ScriptExecutionContext,
+        EventTarget,
+        JSNoStaticTables
+    ] FileWriter {
+        // ready states
+        const unsigned short INIT = 0;
+        const unsigned short WRITING = 1;
+        const unsigned short DONE = 2;
+        readonly attribute unsigned short readyState;
+
+        // async write/modify methods
+        void write(in Blob data) raises (FileException);
+        void seek(in long long position) raises (FileException);
+        void truncate(in long long size) raises (FileException);
+
+        void abort() raises (FileException);
+
+        readonly attribute FileError error;
+        readonly attribute long long position;
+        readonly attribute long long length;
+
+                 attribute EventListener onwritestart;
+                 attribute EventListener onprogress;
+                 attribute EventListener onwrite;
+                 attribute EventListener onabort;
+                 attribute EventListener onerror;
+                 attribute EventListener onwriteend;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/FileWriterCallback.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/FileWriterCallback.idl
new file mode 100644
index 0000000..df82fed
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/FileWriterCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module fileapi {
+    interface [
+        Conditional=FILE_SYSTEM,
+        Callback
+    ] FileWriterCallback {
+        boolean handleEvent(in FileWriter fileWriter);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/FileWriterSync.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/FileWriterSync.idl
new file mode 100644
index 0000000..57cd256
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/FileWriterSync.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2010 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=FILE_SYSTEM,
+        JSNoStaticTables
+    ] FileWriterSync {
+        // synchronous write/modify methods
+        void write(in Blob data) raises (FileException);
+        void seek(in long long position) raises (FileException);
+        void truncate(in long long size) raises (FileException);
+
+        readonly attribute long long position;
+        readonly attribute long long length;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/Metadata.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/Metadata.idl
new file mode 100644
index 0000000..ceaf21b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/Metadata.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        JSNoStaticTables
+    ] Metadata {
+        readonly attribute Date modificationTime;
+        readonly attribute unsigned long long size;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/MetadataCallback.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/MetadataCallback.idl
new file mode 100644
index 0000000..44ca180
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/MetadataCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=FILE_SYSTEM,
+        Callback
+    ] MetadataCallback {
+        boolean handleEvent(in Metadata metadata);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/filesystem/WorkerContextFileSystem.idl b/elemental/idl/third_party/WebCore/Modules/filesystem/WorkerContextFileSystem.idl
new file mode 100644
index 0000000..cb9c328
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/filesystem/WorkerContextFileSystem.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module threads {
+
+    interface [
+        Conditional=FILE_SYSTEM,
+        Supplemental=WorkerContext
+    ] WorkerContextFileSystem {
+        const unsigned short TEMPORARY = 0;
+        const unsigned short PERSISTENT = 1;
+
+        [V8EnabledAtRuntime=FileSystem] void webkitRequestFileSystem(in unsigned short type, in long long size, in [Callback, Optional] FileSystemCallback successCallback, in [Callback, Optional] ErrorCallback errorCallback);
+        [V8EnabledAtRuntime=FileSystem] DOMFileSystemSync webkitRequestFileSystemSync(in unsigned short type, in long long size) raises (FileException);
+        [V8EnabledAtRuntime=FileSystem] void webkitResolveLocalFileSystemURL(in DOMString url, in [Callback, Optional] EntryCallback successCallback, in [Callback, Optional] ErrorCallback errorCallback);
+        [V8EnabledAtRuntime=FileSystem] EntrySync webkitResolveLocalFileSystemSyncURL(in DOMString url) raises (FileException);
+
+        attribute [V8EnabledAtRuntime=FileSystem] FileErrorConstructor FileError;
+        attribute [V8EnabledAtRuntime=FileSystem] FileExceptionConstructor FileException;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/gamepad/Gamepad.idl b/elemental/idl/third_party/WebCore/Modules/gamepad/Gamepad.idl
new file mode 100644
index 0000000..e00e2dc
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/gamepad/Gamepad.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+module dom {
+
+    interface [
+        Conditional=GAMEPAD
+    ] Gamepad {
+        readonly attribute DOMString id;
+        readonly attribute unsigned long index;
+        readonly attribute unsigned long long timestamp;
+        readonly attribute float[] axes;
+        readonly attribute float[] buttons;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/gamepad/GamepadList.idl b/elemental/idl/third_party/WebCore/Modules/gamepad/GamepadList.idl
new file mode 100644
index 0000000..4f1e1df
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/gamepad/GamepadList.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+module dom {
+
+    interface [
+        Conditional=GAMEPAD,
+        IndexedGetter
+    ] GamepadList {
+        readonly attribute unsigned long length;
+        Gamepad item(in [Optional=DefaultIsUndefined] unsigned long index);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/gamepad/NavigatorGamepad.idl b/elemental/idl/third_party/WebCore/Modules/gamepad/NavigatorGamepad.idl
new file mode 100644
index 0000000..e8a945d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/gamepad/NavigatorGamepad.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module window {
+
+    interface [
+        Conditional=GAMEPAD,
+        Supplemental=Navigator
+    ] NavigatorGamepad {
+        readonly attribute [V8EnabledAtRuntime] GamepadList webkitGamepads;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/geolocation/Geolocation.idl b/elemental/idl/third_party/WebCore/Modules/geolocation/Geolocation.idl
new file mode 100644
index 0000000..4f159bc
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/geolocation/Geolocation.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module core {
+
+    // http://www.w3.org/TR/geolocation-API/#geolocation_interface
+    interface [
+        Conditional=GEOLOCATION, 
+        JSGenerateIsReachable=ImplFrame,
+        OmitConstructor
+    ] Geolocation {
+        [Custom] void getCurrentPosition(in PositionCallback successCallback,
+                                         in [Optional] PositionErrorCallback errorCallback,
+                                         in [Optional] PositionOptions options);
+
+        [Custom] long watchPosition(in PositionCallback successCallback,
+                                    in [Optional] PositionErrorCallback errorCallback,
+                                    in [Optional] PositionOptions options);
+
+        void clearWatch(in long watchId);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/geolocation/Geoposition.idl b/elemental/idl/third_party/WebCore/Modules/geolocation/Geoposition.idl
new file mode 100644
index 0000000..cbe728a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/geolocation/Geoposition.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module core {
+
+    interface [
+        Conditional=GEOLOCATION,
+        OmitConstructor
+    ] Geoposition {
+        readonly attribute Coordinates coords;
+        readonly attribute DOMTimeStamp timestamp;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/geolocation/NavigatorGeolocation.idl b/elemental/idl/third_party/WebCore/Modules/geolocation/NavigatorGeolocation.idl
new file mode 100644
index 0000000..e0b8f0e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/geolocation/NavigatorGeolocation.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module window {
+
+    interface [
+        Conditional=GEOLOCATION,
+        Supplemental=Navigator
+    ] NavigatorGeolocation {
+        readonly attribute [V8EnabledAtRuntime] Geolocation geolocation;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/geolocation/PositionCallback.idl b/elemental/idl/third_party/WebCore/Modules/geolocation/PositionCallback.idl
new file mode 100644
index 0000000..39cfa34
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/geolocation/PositionCallback.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=GEOLOCATION,
+        Callback
+    ] PositionCallback {
+        boolean handleEvent(in Geoposition position);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/geolocation/PositionError.idl b/elemental/idl/third_party/WebCore/Modules/geolocation/PositionError.idl
new file mode 100644
index 0000000..98e036f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/geolocation/PositionError.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module core {
+
+    interface [
+        Conditional=GEOLOCATION
+    ] PositionError {
+        readonly attribute unsigned short code;
+        readonly attribute DOMString message;
+
+        const unsigned short PERMISSION_DENIED = 1;
+        const unsigned short POSITION_UNAVAILABLE = 2;
+        const unsigned short TIMEOUT = 3;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/geolocation/PositionErrorCallback.idl b/elemental/idl/third_party/WebCore/Modules/geolocation/PositionErrorCallback.idl
new file mode 100644
index 0000000..a7dc932
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/geolocation/PositionErrorCallback.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=GEOLOCATION,
+        Callback
+    ] PositionErrorCallback {
+        boolean handleEvent(in PositionError error);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/DOMWindowIndexedDatabase.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/DOMWindowIndexedDatabase.idl
new file mode 100644
index 0000000..ad3998b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/DOMWindowIndexedDatabase.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        Conditional=INDEXED_DATABASE,
+        Supplemental=DOMWindow
+    ] DOMWindowIndexedDatabase {
+        readonly attribute IDBFactory webkitIndexedDB;
+
+        attribute IDBCursorConstructor webkitIDBCursor;
+        attribute IDBDatabaseConstructor webkitIDBDatabase;
+        attribute IDBDatabaseExceptionConstructor webkitIDBDatabaseException;
+        attribute IDBFactoryConstructor webkitIDBFactory;
+        attribute IDBIndexConstructor webkitIDBIndex;
+        attribute IDBKeyRangeConstructor webkitIDBKeyRange;
+        attribute IDBObjectStoreConstructor webkitIDBObjectStore;
+        attribute IDBRequestConstructor webkitIDBRequest;
+        attribute IDBTransactionConstructor webkitIDBTransaction;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBAny.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBAny.idl
new file mode 100644
index 0000000..dd51c4d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBAny.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE,
+        CustomToJSObject
+    ] IDBAny {
+        // This space is intentionally left blank.
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBCursor.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBCursor.idl
new file mode 100644
index 0000000..d73d146
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBCursor.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE,
+    ] IDBCursor {
+        // FIXME: Eventually remove legacy enum constants, see https://bugs.webkit.org/show_bug.cgi?id=85315
+        const unsigned short NEXT = 0;
+        const unsigned short NEXT_NO_DUPLICATE = 1;
+        const unsigned short PREV = 2;
+        const unsigned short PREV_NO_DUPLICATE = 3;
+
+        readonly attribute DOMString direction;
+        readonly attribute IDBKey key;
+        readonly attribute IDBKey primaryKey;
+        readonly attribute IDBAny source;
+
+        [CallWith=ScriptExecutionContext] IDBRequest update(in SerializedScriptValue value)
+            raises (IDBDatabaseException);
+        void advance(in unsigned long count)
+            raises (IDBDatabaseException);
+        [ImplementedAs=continueFunction] void continue(in [Optional] IDBKey key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext, ImplementedAs=deleteFunction] IDBRequest delete()
+            raises (IDBDatabaseException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBCursorWithValue.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBCursorWithValue.idl
new file mode 100644
index 0000000..6ffc5b5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBCursorWithValue.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE
+    ] IDBCursorWithValue : IDBCursor {
+        readonly attribute IDBAny value;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBDatabase.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBDatabase.idl
new file mode 100644
index 0000000..95f6c23
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBDatabase.idl
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE,
+        ActiveDOMObject,
+        EventTarget
+    ] IDBDatabase {
+        readonly attribute DOMString name;
+        readonly attribute DOMString version;
+        readonly attribute DOMStringList objectStoreNames;
+
+        attribute EventListener onabort;
+        attribute EventListener onerror;
+        attribute EventListener onversionchange;
+
+        IDBObjectStore createObjectStore(in DOMString name, in [Optional] Dictionary options)
+            raises (IDBDatabaseException);
+        void deleteObjectStore(in DOMString name)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBVersionChangeRequest setVersion(in DOMString version)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBTransaction transaction(in DOMStringList storeNames, in [Optional=DefaultIsNullString] DOMString mode)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBTransaction transaction(in DOMString[] storeNames, in [Optional=DefaultIsNullString] DOMString mode)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBTransaction transaction(in DOMString storeName, in [Optional=DefaultIsNullString] DOMString mode)
+            raises (IDBDatabaseException);
+
+        // FIXME: remove these when https://bugs.webkit.org/show_bug.cgi?id=85326 is fixed.
+        [CallWith=ScriptExecutionContext] IDBTransaction transaction(in DOMStringList storeNames, in unsigned short mode)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBTransaction transaction(in DOMString[] storeNames, in unsigned short mode)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBTransaction transaction(in DOMString storeName, in unsigned short mode)
+            raises (IDBDatabaseException);
+
+        void close();
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBDatabaseException.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBDatabaseException.idl
new file mode 100644
index 0000000..67d811c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBDatabaseException.idl
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    exception [
+        Conditional=INDEXED_DATABASE,
+        DoNotCheckConstants
+    ] IDBDatabaseException {
+
+        readonly attribute unsigned short   code;
+        readonly attribute DOMString        name;
+        readonly attribute DOMString        message;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // Override in a Mozilla compatible format
+        [NotEnumerable] DOMString toString();
+#endif
+
+        const unsigned short NO_ERR = 0;
+        const unsigned short UNKNOWN_ERR = 1;
+        const unsigned short NON_TRANSIENT_ERR = 2;
+        const unsigned short CONSTRAINT_ERR = 4;
+        const unsigned short DATA_ERR = 5;
+        const unsigned short NOT_ALLOWED_ERR = 6;
+        const unsigned short TRANSACTION_INACTIVE_ERR = 7;
+        const unsigned short READ_ONLY_ERR = 9;
+        const unsigned short VER_ERR = 12;
+
+        const unsigned short NOT_FOUND_ERR = 8;
+        const unsigned short ABORT_ERR = 20;
+        const unsigned short TIMEOUT_ERR = 23;
+        const unsigned short QUOTA_ERR = 22;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBFactory.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBFactory.idl
new file mode 100644
index 0000000..c44996b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBFactory.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE
+    ] IDBFactory {
+        [CallWith=ScriptExecutionContext] IDBRequest getDatabaseNames();
+
+        [CallWith=ScriptExecutionContext] IDBRequest open(in DOMString name)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBVersionChangeRequest deleteDatabase(in DOMString name)
+            raises (IDBDatabaseException);
+
+        short cmp(in IDBKey first, in IDBKey second)
+            raises (IDBDatabaseException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBIndex.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBIndex.idl
new file mode 100644
index 0000000..4c3d732
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBIndex.idl
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE
+    ] IDBIndex {
+        readonly attribute DOMString name;
+        readonly attribute IDBObjectStore objectStore;
+        readonly attribute IDBAny keyPath;
+        readonly attribute boolean unique;
+        readonly attribute boolean multiEntry;
+
+        [CallWith=ScriptExecutionContext] IDBRequest openCursor(in [Optional] IDBKeyRange range, in [Optional] DOMString direction)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest openCursor(in IDBKey key, in [Optional] DOMString direction)
+            raises (IDBDatabaseException);
+        
+        [CallWith=ScriptExecutionContext] IDBRequest openKeyCursor(in [Optional] IDBKeyRange range, in [Optional] DOMString  direction)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest openKeyCursor(in IDBKey key, in [Optional] DOMString direction)
+            raises (IDBDatabaseException);
+
+        // FIXME: remove these when
+        // https://bugs.webkit.org/show_bug.cgi?id=85326 is fixed.
+        [CallWith=ScriptExecutionContext] IDBRequest openCursor(in IDBKeyRange range, in unsigned short direction)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest openCursor(in IDBKey key, in unsigned short direction)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest openKeyCursor(in IDBKeyRange range, in unsigned short direction)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest openKeyCursor(in IDBKey key, in unsigned short direction)
+            raises (IDBDatabaseException);
+        
+        [CallWith=ScriptExecutionContext] IDBRequest get(in IDBKeyRange key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest get(in IDBKey key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest getKey(in IDBKeyRange key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest getKey(in IDBKey key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest count(in [Optional] IDBKeyRange range)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest count(in IDBKey key)
+            raises (IDBDatabaseException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBKey.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBKey.idl
new file mode 100644
index 0000000..1464d9f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBKey.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE,
+        CustomToJSObject
+    ] IDBKey {
+        // This space is intentionally left blank.
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBKeyRange.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBKeyRange.idl
new file mode 100644
index 0000000..161cb9c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBKeyRange.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE
+    ] IDBKeyRange {
+        readonly attribute IDBKey lower;
+        readonly attribute IDBKey upper;
+        readonly attribute boolean lowerOpen;
+        readonly attribute boolean upperOpen;
+
+        static IDBKeyRange only(in IDBKey value)
+            raises (IDBDatabaseException);
+        static IDBKeyRange lowerBound(in IDBKey bound, in [Optional] boolean open)
+            raises (IDBDatabaseException);
+        static IDBKeyRange upperBound(in IDBKey bound, in [Optional] boolean open)
+            raises (IDBDatabaseException);
+        static IDBKeyRange bound(in IDBKey lower, in IDBKey upper, in [Optional] boolean lowerOpen, in [Optional] boolean upperOpen)
+            raises (IDBDatabaseException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBObjectStore.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBObjectStore.idl
new file mode 100644
index 0000000..489f678
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBObjectStore.idl
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE
+    ] IDBObjectStore {
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString name;
+        readonly attribute IDBAny keyPath;
+        readonly attribute DOMStringList indexNames;
+        readonly attribute IDBTransaction transaction;
+        readonly attribute boolean autoIncrement;
+
+        [CallWith=ScriptExecutionContext] IDBRequest put(in SerializedScriptValue value, in [Optional] IDBKey key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest add(in SerializedScriptValue value, in [Optional] IDBKey key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext, ImplementedAs=deleteFunction] IDBRequest delete(in IDBKeyRange keyRange)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext, ImplementedAs=deleteFunction] IDBRequest delete(in IDBKey key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest clear()
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest get(in IDBKeyRange key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest get(in IDBKey key)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest openCursor(in [Optional] IDBKeyRange range, in [Optional] DOMString direction)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest openCursor(in IDBKey key, in [Optional] DOMString direction)
+            raises (IDBDatabaseException);
+
+        // FIXME: remove these when https://bugs.webkit.org/show_bug.cgi?id=85326 is fixed.
+        [CallWith=ScriptExecutionContext] IDBRequest openCursor(in IDBKeyRange range, in unsigned short direction)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest openCursor(in IDBKey key, in unsigned short direction)
+            raises (IDBDatabaseException);
+
+        IDBIndex createIndex(in DOMString name, in DOMString[] keyPath, in [Optional] Dictionary options)
+            raises (IDBDatabaseException);
+        IDBIndex createIndex(in DOMString name, in DOMString keyPath, in [Optional] Dictionary options)
+            raises (IDBDatabaseException);
+        IDBIndex index(in DOMString name)
+            raises (IDBDatabaseException);
+        void deleteIndex(in DOMString name)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest count(in [Optional] IDBKeyRange range)
+            raises (IDBDatabaseException);
+        [CallWith=ScriptExecutionContext] IDBRequest count(in IDBKey key)
+            raises (IDBDatabaseException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBRequest.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBRequest.idl
new file mode 100644
index 0000000..1e49415
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBRequest.idl
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE,
+        ActiveDOMObject,
+        EventTarget
+    ] IDBRequest {
+        readonly attribute IDBAny result
+            getter raises (IDBDatabaseException);
+        readonly attribute unsigned short errorCode
+            getter raises (IDBDatabaseException);
+        readonly attribute DOMError error
+            getter raises (IDBDatabaseException);
+        readonly attribute [TreatReturnedNullStringAs=Undefined] DOMString webkitErrorMessage
+            getter raises (IDBDatabaseException);
+
+        readonly attribute IDBAny source;
+        readonly attribute IDBTransaction transaction;
+
+        // States
+        readonly attribute DOMString readyState;
+
+        // Events
+        attribute EventListener onsuccess;
+        attribute EventListener onerror;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBTransaction.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBTransaction.idl
new file mode 100644
index 0000000..a0e54c0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBTransaction.idl
@@ -0,0 +1,63 @@
+ /*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE,
+        ActiveDOMObject,
+        EventTarget
+    ] IDBTransaction {
+        // FIXME: Eventually remove legacy enum constants, see https://bugs.webkit.org/show_bug.cgi?id=85315
+        const unsigned short READ_ONLY = 0;
+        const unsigned short READ_WRITE = 1;
+        const unsigned short VERSION_CHANGE = 2;
+
+        // Properties
+        readonly attribute DOMString mode;
+        readonly attribute IDBDatabase db;
+        readonly attribute DOMError error 
+            getter raises (IDBDatabaseException);
+
+        // Methods
+        IDBObjectStore objectStore (in DOMString name)
+            raises (IDBDatabaseException);
+        void abort ();
+        // Events
+        attribute EventListener onabort;
+        attribute EventListener oncomplete;
+        attribute EventListener onerror;
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt) 
+            raises(EventException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBVersionChangeEvent.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBVersionChangeEvent.idl
new file mode 100644
index 0000000..c6a4171
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBVersionChangeEvent.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE
+    ] IDBVersionChangeEvent : Event {
+        readonly attribute DOMString version;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBVersionChangeRequest.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBVersionChangeRequest.idl
new file mode 100644
index 0000000..2aa238a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/IDBVersionChangeRequest.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE,
+        ActiveDOMObject,
+        EventTarget
+    ] IDBVersionChangeRequest : IDBRequest {
+        attribute EventListener onblocked;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/indexeddb/WorkerContextIndexedDatabase.idl b/elemental/idl/third_party/WebCore/Modules/indexeddb/WorkerContextIndexedDatabase.idl
new file mode 100644
index 0000000..c336c57
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/indexeddb/WorkerContextIndexedDatabase.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module threads {
+
+    interface [
+        Conditional=INDEXED_DATABASE,
+        Supplemental=WorkerContext
+    ] WorkerContextIndexedDatabase {
+        readonly attribute [V8EnabledAtRuntime] IDBFactory webkitIndexedDB;
+
+        attribute [V8EnabledAtRuntime] IDBCursorConstructor webkitIDBCursor;
+        attribute [V8EnabledAtRuntime] IDBDatabaseConstructor webkitIDBDatabase;
+        attribute [V8EnabledAtRuntime] IDBDatabaseExceptionConstructor webkitIDBDatabaseException;
+        attribute [V8EnabledAtRuntime] IDBFactoryConstructor webkitIDBFactory;
+        attribute [V8EnabledAtRuntime] IDBIndexConstructor webkitIDBIndex;
+        attribute [V8EnabledAtRuntime] IDBKeyRangeConstructor webkitIDBKeyRange;
+        attribute [V8EnabledAtRuntime] IDBObjectStoreConstructor webkitIDBObjectStore;
+        attribute [V8EnabledAtRuntime] IDBRequestConstructor webkitIDBRequest;
+        attribute [V8EnabledAtRuntime] IDBTransactionConstructor webkitIDBTransaction;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/intents/DOMWindowIntents.idl b/elemental/idl/third_party/WebCore/Modules/intents/DOMWindowIntents.idl
new file mode 100644
index 0000000..d345209
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/intents/DOMWindowIntents.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        Conditional=WEB_INTENTS,
+        Supplemental=DOMWindow
+    ] DOMWindowIntents {
+        attribute IntentConstructor WebKitIntent;
+
+        attribute [Replaceable] DeliveredIntent webkitIntent;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/intents/DeliveredIntent.idl b/elemental/idl/third_party/WebCore/Modules/intents/DeliveredIntent.idl
new file mode 100644
index 0000000..25e978d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/intents/DeliveredIntent.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+    interface [
+        Conditional=WEB_INTENTS,
+    ] DeliveredIntent : Intent {
+        readonly attribute MessagePortArray ports;
+
+        [TreatReturnedNullStringAs=Null] DOMString getExtra(in DOMString key);
+        void postResult(in SerializedScriptValue result);
+        void postFailure(in SerializedScriptValue result);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/intents/Intent.idl b/elemental/idl/third_party/WebCore/Modules/intents/Intent.idl
new file mode 100644
index 0000000..92657b4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/intents/Intent.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+  interface [
+      Conditional=WEB_INTENTS,
+      CustomConstructor,
+      Constructor(in DOMString action, in DOMString type, in [Optional=DefaultIsNullString, TransferList=transferList] SerializedScriptValue data, in [Optional=DefaultIsUndefined] Array transferList),
+      ConstructorRaisesException
+  ] Intent {
+        readonly attribute DOMString action;
+        readonly attribute DOMString type;
+        readonly attribute SerializedScriptValue data;
+  };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/intents/IntentResultCallback.idl b/elemental/idl/third_party/WebCore/Modules/intents/IntentResultCallback.idl
new file mode 100644
index 0000000..0afa2ad
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/intents/IntentResultCallback.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+  interface [
+      Conditional=WEB_INTENTS,
+      Callback
+  ] IntentResultCallback {
+      boolean handleEvent(in SerializedScriptValue result);
+  };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/intents/NavigatorIntents.idl b/elemental/idl/third_party/WebCore/Modules/intents/NavigatorIntents.idl
new file mode 100644
index 0000000..206337a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/intents/NavigatorIntents.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module window {
+
+    interface [
+        Conditional=WEB_INTENTS,
+        Supplemental=Navigator
+    ] NavigatorIntents {
+        void webkitStartActivity(in Intent intent,
+                                 in [Callback, Optional] IntentResultCallback successCallback,
+                                 in [Callback, Optional] IntentResultCallback failureCallback)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/DOMWindowMediaStream.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/DOMWindowMediaStream.idl
new file mode 100644
index 0000000..970d106
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/DOMWindowMediaStream.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        Supplemental=DOMWindow
+    ] DOMWindowMediaStream {
+        attribute [V8EnabledAtRuntime] DeprecatedPeerConnectionConstructor webkitDeprecatedPeerConnection;
+        attribute [V8EnabledAtRuntime] MediaStreamConstructor webkitMediaStream;
+        attribute [V8EnabledAtRuntime] PeerConnection00Constructor webkitPeerConnection00;
+        attribute SessionDescriptionConstructor SessionDescription;
+        attribute IceCandidateConstructor IceCandidate;
+        attribute MediaStreamEventConstructor MediaStreamEvent;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/DeprecatedPeerConnection.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/DeprecatedPeerConnection.idl
new file mode 100644
index 0000000..01d9d51
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/DeprecatedPeerConnection.idl
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module p2p {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        ActiveDOMObject,
+        ConstructorParameters=2,
+        Constructor(in DOMString serverConfiguration, in [Callback] SignalingCallback signalingCallback),
+        CallWith=ScriptExecutionContext,
+        JSCustomConstructor,
+        EventTarget
+    ] DeprecatedPeerConnection {
+        void processSignalingMessage(in DOMString message)
+            raises(DOMException);
+
+        const unsigned short NEW = 0;
+        const unsigned short NEGOTIATING = 1;
+        const unsigned short ACTIVE = 2;
+        const unsigned short CLOSED = 3;
+        readonly attribute unsigned short readyState;
+
+        void send(in DOMString text)
+            raises(DOMException);
+        [StrictTypeChecking] void addStream(in MediaStream stream)
+            raises(DOMException);
+        [StrictTypeChecking] void removeStream(in MediaStream stream)
+            raises(DOMException);
+
+        readonly attribute MediaStreamList localStreams;
+        readonly attribute MediaStreamList remoteStreams;
+
+        void close()
+            raises(DOMException);
+
+        attribute EventListener onconnecting;
+        attribute EventListener onopen;
+        attribute EventListener onmessage;
+        attribute EventListener onstatechange;
+        attribute EventListener onaddstream;
+        attribute EventListener onremovestream;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event event)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/IceCallback.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/IceCallback.idl
new file mode 100644
index 0000000..69d646f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/IceCallback.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Google Inc. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module p2p {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        Callback
+    ] IceCallback {
+        boolean handleEvent(in IceCandidate candidate, in boolean moreToFollow, in PeerConnection00 source);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/IceCandidate.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/IceCandidate.idl
new file mode 100644
index 0000000..e1c42fa
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/IceCandidate.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Google Inc. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module p2p {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        Constructor(in DOMString label, in DOMString candidateLine)
+    ] IceCandidate {
+        readonly attribute DOMString label;
+
+        DOMString toSdp();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/LocalMediaStream.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/LocalMediaStream.idl
new file mode 100644
index 0000000..5e769af
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/LocalMediaStream.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        EventTarget,
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject
+    ] LocalMediaStream : MediaStream {
+        void stop();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStream.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStream.idl
new file mode 100644
index 0000000..65a1833
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStream.idl
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        EventTarget,
+        Constructor(in MediaStreamTrackList audioTracks, in MediaStreamTrackList videoTracks),
+        CallWith=ScriptExecutionContext,
+        ConstructorRaisesException
+   ] MediaStream {
+        readonly attribute DOMString label;
+        readonly attribute MediaStreamTrackList audioTracks;
+        readonly attribute MediaStreamTrackList videoTracks;
+
+        // FIXME: implement the record method when MediaStreamRecorder is available.
+
+        const unsigned short LIVE = 1;
+        const unsigned short ENDED = 2;
+        readonly attribute unsigned short readyState;
+                 attribute EventListener onended;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event event)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamEvent.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamEvent.idl
new file mode 100644
index 0000000..a1930a4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamEvent.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    // According to the WHATWG specification:
+    // http://www.whatwg.org/specs/web-apps/current-work/multipage/video-conferencing-and-peer-to-peer-communication.html#mediastreamevent
+    interface [
+        Conditional=MEDIA_STREAM,
+    ] MediaStreamEvent : Event {
+       readonly attribute MediaStream stream;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamList.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamList.idl
new file mode 100644
index 0000000..d182e6f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamList.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        IndexedGetter
+    ] MediaStreamList {
+        MediaStream item(in [IsIndex] unsigned long index);
+
+        readonly attribute unsigned long length;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamTrack.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamTrack.idl
new file mode 100644
index 0000000..7987597
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamTrack.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+    ] MediaStreamTrack {
+        readonly attribute DOMString kind;
+        readonly attribute DOMString label;
+                 attribute boolean enabled;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamTrackList.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamTrackList.idl
new file mode 100644
index 0000000..4dd9c29
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/MediaStreamTrackList.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        IndexedGetter
+    ] MediaStreamTrackList {
+        MediaStreamTrack item(in [IsIndex] unsigned long index);
+
+        readonly attribute unsigned long length;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorMediaStream.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorMediaStream.idl
new file mode 100644
index 0000000..40f8f0d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorMediaStream.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module window {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        Supplemental=Navigator
+    ] NavigatorMediaStream {
+        [V8EnabledAtRuntime] void webkitGetUserMedia(in Dictionary options,
+                                                     in [Callback] NavigatorUserMediaSuccessCallback successCallback,
+                                                     in [Callback, Optional] NavigatorUserMediaErrorCallback errorCallback)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorUserMediaError.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorUserMediaError.idl
new file mode 100644
index 0000000..293450b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorUserMediaError.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+    interface [
+        Conditional=MEDIA_STREAM
+    ] NavigatorUserMediaError {
+        const unsigned short PERMISSION_DENIED = 1;
+        readonly attribute unsigned short code;
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorUserMediaErrorCallback.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorUserMediaErrorCallback.idl
new file mode 100644
index 0000000..44928f8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorUserMediaErrorCallback.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+    interface [
+        Conditional=MEDIA_STREAM,
+        Callback
+    ] NavigatorUserMediaErrorCallback {
+        boolean handleEvent(in NavigatorUserMediaError error);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorUserMediaSuccessCallback.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorUserMediaSuccessCallback.idl
new file mode 100644
index 0000000..0a66180
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/NavigatorUserMediaSuccessCallback.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+    interface [
+        Conditional=MEDIA_STREAM,
+        Callback
+    ] NavigatorUserMediaSuccessCallback {
+        boolean handleEvent(in LocalMediaStream stream);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/PeerConnection00.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/PeerConnection00.idl
new file mode 100644
index 0000000..bd56c87
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/PeerConnection00.idl
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Google Inc. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module p2p {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        ActiveDOMObject,
+        Constructor(in DOMString serverConfiguration, in [Callback] IceCallback iceCallback),
+        CallWith=ScriptExecutionContext,
+        ConstructorRaisesException,
+        EventTarget
+    ] PeerConnection00 {
+        SessionDescription createOffer(in [Optional] Dictionary mediaHints)
+            raises(DOMException);
+        SessionDescription createAnswer(in DOMString offer, in [Optional] Dictionary mediaHints)
+            raises(DOMException);
+
+        // Actions, for setLocalDescription/setRemoteDescription.
+        const unsigned short SDP_OFFER = 0x100;
+        const unsigned short SDP_PRANSWER = 0x200;
+        const unsigned short SDP_ANSWER = 0x300;
+
+        void setLocalDescription(in unsigned short action, in SessionDescription desc)
+            raises(DOMException);
+        void setRemoteDescription(in unsigned short action, in SessionDescription desc)
+            raises(DOMException);
+
+        readonly attribute SessionDescription localDescription;
+        readonly attribute SessionDescription remoteDescription;
+
+        const unsigned short NEW = 0;
+        const unsigned short OPENING = 1;
+        const unsigned short ACTIVE = 2;
+        const unsigned short CLOSED = 3;
+        readonly attribute unsigned short readyState;
+
+        void startIce(in [Optional] Dictionary iceOptions)
+            raises(DOMException);
+
+        void processIceMessage(in IceCandidate candidate)
+            raises(DOMException);
+
+        const unsigned short ICE_GATHERING = 0x100;
+        const unsigned short ICE_WAITING = 0x200;
+        const unsigned short ICE_CHECKING = 0x300;
+        const unsigned short ICE_CONNECTED = 0x400;
+        const unsigned short ICE_COMPLETED = 0x500;
+        const unsigned short ICE_FAILED = 0x600;
+        const unsigned short ICE_CLOSED = 0x700;
+        readonly attribute unsigned short iceState;
+
+        [StrictTypeChecking] void addStream(in MediaStream stream, in [Optional] Dictionary mediaStreamHints)
+            raises(DOMException);
+        [StrictTypeChecking] void removeStream(in MediaStream stream)
+            raises(DOMException);
+
+        readonly attribute MediaStreamList localStreams;
+        readonly attribute MediaStreamList remoteStreams;
+
+        void close()
+            raises(DOMException);
+
+        attribute EventListener onconnecting;
+        attribute EventListener onopen;
+        attribute EventListener onstatechange;
+        attribute EventListener onaddstream;
+        attribute EventListener onremovestream;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event event)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/SessionDescription.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/SessionDescription.idl
new file mode 100644
index 0000000..d4afeda
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/SessionDescription.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Google Inc. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module p2p {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        Constructor(in DOMString sdp)
+    ] SessionDescription {
+        [StrictTypeChecking] void addCandidate(in IceCandidate candidate)
+            raises(DOMException);
+
+        DOMString toSdp();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/mediastream/SignalingCallback.idl b/elemental/idl/third_party/WebCore/Modules/mediastream/SignalingCallback.idl
new file mode 100644
index 0000000..69e4b92
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/mediastream/SignalingCallback.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module p2p {
+
+    interface [
+        Conditional=MEDIA_STREAM,
+        Callback
+    ] SignalingCallback {
+        boolean handleEvent(in DOMString message, in DeprecatedPeerConnection source);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/networkinfo/NavigatorNetworkInfoConnection.idl b/elemental/idl/third_party/WebCore/Modules/networkinfo/NavigatorNetworkInfoConnection.idl
new file mode 100644
index 0000000..f61d0f3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/networkinfo/NavigatorNetworkInfoConnection.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module window {
+
+    interface [
+        Conditional=NETWORK_INFO,
+        Supplemental=Navigator
+    ] NavigatorNetworkInfoConnection {
+        readonly attribute NetworkInfoConnection webkitConnection;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/networkinfo/NetworkInfoConnection.idl b/elemental/idl/third_party/WebCore/Modules/networkinfo/NetworkInfoConnection.idl
new file mode 100644
index 0000000..8e56efa
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/networkinfo/NetworkInfoConnection.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2012 Samsung Electronics. All Rights Reserved.
+ *
+ * All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module window {
+
+    // http://dvcs.w3.org/hg/dap/raw-file/tip/network-api/index.html
+    interface [
+        Conditional=NETWORK_INFO,
+        ActiveDOMObject,
+        EventTarget
+    ] NetworkInfoConnection {
+        readonly attribute double bandwidth;
+        readonly attribute boolean metered;
+
+        attribute EventListener onwebkitnetworkinfochange;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/speech/DOMWindowSpeech.idl b/elemental/idl/third_party/WebCore/Modules/speech/DOMWindowSpeech.idl
new file mode 100644
index 0000000..0c26f03
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/speech/DOMWindowSpeech.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+    interface [
+        Conditional=SCRIPTED_SPEECH,
+        Supplemental=DOMWindow
+    ] DOMWindowSpeech {
+        attribute [V8EnabledAtRuntime] SpeechRecognitionConstructor webkitSpeechRecognition;
+        attribute [V8EnabledAtRuntime] SpeechRecognitionErrorConstructor webkitSpeechRecognitionError;
+        attribute [V8EnabledAtRuntime] SpeechRecognitionEventConstructor webkitSpeechRecognitionEvent;
+        attribute [V8EnabledAtRuntime] SpeechGrammarConstructor webkitSpeechGrammar;
+        attribute [V8EnabledAtRuntime] SpeechGrammarListConstructor webkitSpeechGrammarList;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/speech/SpeechGrammar.idl b/elemental/idl/third_party/WebCore/Modules/speech/SpeechGrammar.idl
new file mode 100644
index 0000000..b793ac3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/speech/SpeechGrammar.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=SCRIPTED_SPEECH,
+        Constructor
+    ] SpeechGrammar {
+        attribute [URL,CallWith=ScriptExecutionContext] DOMString src;
+        attribute float weight;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/speech/SpeechGrammarList.idl b/elemental/idl/third_party/WebCore/Modules/speech/SpeechGrammarList.idl
new file mode 100644
index 0000000..bf4d7c6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/speech/SpeechGrammarList.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=SCRIPTED_SPEECH,
+        IndexedGetter,
+        Constructor,
+    ] SpeechGrammarList {
+        readonly attribute unsigned long length;
+        SpeechGrammar item(in [IsIndex] unsigned long index);
+        [CallWith=ScriptExecutionContext] void addFromUri(in DOMString src, in [Optional] float weight);
+        void addFromString(in DOMString string, in [Optional] float weight);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognition.idl b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognition.idl
new file mode 100644
index 0000000..5fea70d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognition.idl
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=SCRIPTED_SPEECH,
+        ActiveDOMObject,
+        Constructor,
+        CallWith=ScriptExecutionContext,
+        EventTarget,
+    ] SpeechRecognition {
+        attribute SpeechGrammarList grammars;
+        attribute DOMString lang;
+        attribute boolean continuous;
+
+        void start();
+        [ImplementedAs=stopFunction] void stop();
+        void abort();
+
+        attribute EventListener onaudiostart;
+        attribute EventListener onsoundstart;
+        attribute EventListener onspeechstart;
+        attribute EventListener onspeechend;
+        attribute EventListener onsoundend;
+        attribute EventListener onaudioend;
+        attribute EventListener onresult;
+        attribute EventListener onnomatch;
+        attribute EventListener onresultdeleted;
+        attribute EventListener onerror;
+        attribute EventListener onstart;
+        attribute EventListener onend;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionAlternative.idl b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionAlternative.idl
new file mode 100644
index 0000000..a9d4dec
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionAlternative.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=SCRIPTED_SPEECH
+    ] SpeechRecognitionAlternative {
+        readonly attribute DOMString transcript;
+        readonly attribute float confidence;
+    };
+}
+
diff --git a/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionError.idl b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionError.idl
new file mode 100644
index 0000000..39ecb1d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionError.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=SCRIPTED_SPEECH
+    ] SpeechRecognitionError {
+        const unsigned short OTHER = 0;
+        const unsigned short NO_SPEECH = 1;
+        const unsigned short ABORTED = 2;
+        const unsigned short AUDIO_CAPTURE = 3;
+        const unsigned short NETWORK = 4;
+        const unsigned short NOT_ALLOWED = 5;
+        const unsigned short SERVICE_NOT_ALLOWED = 6;
+        const unsigned short BAD_GRAMMAR = 7;
+        const unsigned short LANGUAGE_NOT_SUPPORTED = 8;
+
+        readonly attribute unsigned short code;
+        readonly attribute DOMString message;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionEvent.idl b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionEvent.idl
new file mode 100644
index 0000000..4900081
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionEvent.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+    interface [
+        Conditional=SCRIPTED_SPEECH,
+        ConstructorTemplate=Event
+    ] SpeechRecognitionEvent : Event {
+        readonly attribute [InitializedByEventConstructor] SpeechRecognitionResult result;
+        readonly attribute [InitializedByEventConstructor] SpeechRecognitionError error;
+        readonly attribute [InitializedByEventConstructor] short resultIndex;
+        readonly attribute [InitializedByEventConstructor] SpeechRecognitionResultList resultHistory;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionResult.idl b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionResult.idl
new file mode 100644
index 0000000..3f91262
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionResult.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=SCRIPTED_SPEECH,
+        IndexedGetter
+    ] SpeechRecognitionResult {
+        readonly attribute unsigned long length;
+        SpeechRecognitionAlternative item(in [IsIndex] unsigned long index);
+        readonly attribute boolean final;
+    };
+}
+
diff --git a/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionResultList.idl b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionResultList.idl
new file mode 100644
index 0000000..fd7be4f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/speech/SpeechRecognitionResultList.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=SCRIPTED_SPEECH,
+        IndexedGetter
+    ] SpeechRecognitionResultList {
+        readonly attribute unsigned long length;
+        SpeechRecognitionResult item(in [IsIndex] unsigned long index);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/vibration/NavigatorVibration.idl b/elemental/idl/third_party/WebCore/Modules/vibration/NavigatorVibration.idl
new file mode 100644
index 0000000..624845d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/vibration/NavigatorVibration.idl
@@ -0,0 +1,30 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public License
+ *  along with this library; see the file COPYING.LIB.  If not, write to
+ *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+module window {
+
+    interface [
+        Conditional=VIBRATION,
+        Supplemental=Navigator
+    ] NavigatorVibration {
+        void webkitVibrate(in unsigned long[] pattern) raises(DOMException);
+        void webkitVibrate(in unsigned long time) raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioBuffer.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioBuffer.idl
new file mode 100644
index 0000000..8a734e2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioBuffer.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO
+    ] AudioBuffer {
+        readonly attribute long length; // in sample-frames
+        readonly attribute float duration; // in seconds
+        readonly attribute float sampleRate; // in sample-frames per second
+
+        attribute float gain; // linear gain (default 1.0)
+
+        // Channel access
+        readonly attribute unsigned long numberOfChannels;
+        Float32Array getChannelData(in unsigned long channelIndex);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioBufferCallback.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioBufferCallback.idl
new file mode 100644
index 0000000..9b35477
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioBufferCallback.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject,
+        Callback
+    ] AudioBufferCallback {
+        boolean handleEvent(in AudioBuffer audioBuffer);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioBufferSourceNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioBufferSourceNode.idl
new file mode 100644
index 0000000..ae6af93
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioBufferSourceNode.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    // A cached (non-streamed), memory-resident audio source
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] AudioBufferSourceNode : AudioSourceNode {
+        attribute [CustomSetter] AudioBuffer buffer
+            setter raises (DOMException);
+
+        const unsigned short UNSCHEDULED_STATE = 0;
+        const unsigned short SCHEDULED_STATE = 1;
+        const unsigned short PLAYING_STATE = 2;
+        const unsigned short FINISHED_STATE = 3;
+
+        readonly attribute unsigned short playbackState;
+
+        readonly attribute AudioGain gain;
+        readonly attribute AudioParam playbackRate;
+
+        attribute boolean loop; // This is the proper attribute name from the specification.
+        attribute boolean looping; // This is an alias for the .loop attribute for backwards compatibility.
+
+        void noteOn(in double when);
+        void noteGrainOn(in double when, in double grainOffset, in double grainDuration);
+        void noteOff(in double when);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioChannelMerger.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioChannelMerger.idl
new file mode 100644
index 0000000..3862af9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioChannelMerger.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO
+    ] AudioChannelMerger : AudioNode {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioChannelSplitter.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioChannelSplitter.idl
new file mode 100644
index 0000000..076c051
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioChannelSplitter.idl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO
+    ] AudioChannelSplitter : AudioNode {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioContext.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioContext.idl
new file mode 100644
index 0000000..1d02288
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioContext.idl
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module webaudio {
+    interface [
+        Conditional=WEB_AUDIO,
+        ActiveDOMObject,
+        CustomConstructor,
+        ConstructorParameters=0,
+        JSCustomMarkFunction,
+        EventTarget
+    ] AudioContext {
+        // All rendered audio ultimately connects to destination, which represents the audio hardware.
+        readonly attribute AudioDestinationNode destination;
+
+        // All scheduled times are relative to this time in seconds.
+        readonly attribute float currentTime;
+
+        // All AudioNodes in the context run at this sample-rate (in sample-frames per second).
+        readonly attribute float sampleRate;
+
+        // All panning is relative to this listener.
+        readonly attribute AudioListener listener;
+
+        // Number of AudioBufferSourceNodes that are currently playing.
+        readonly attribute unsigned long activeSourceCount;
+        
+        AudioBuffer createBuffer(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate)
+            raises(DOMException);
+        AudioBuffer createBuffer(in ArrayBuffer buffer, in boolean mixToMono)
+            raises(DOMException);
+
+        // Asynchronous audio file data decoding.
+        void decodeAudioData(in ArrayBuffer audioData, in [Callback] AudioBufferCallback successCallback, in [Optional, Callback] AudioBufferCallback errorCallback)
+            raises(DOMException);
+
+        // Sources
+        AudioBufferSourceNode createBufferSource();
+#if defined(ENABLE_VIDEO) && ENABLE_VIDEO
+        MediaElementAudioSourceNode createMediaElementSource(in HTMLMediaElement mediaElement)
+            raises(DOMException);
+#endif
+        // Processing nodes
+        AudioGainNode createGainNode();
+        DelayNode createDelayNode(in [Optional] double maxDelayTime);
+        BiquadFilterNode createBiquadFilter();
+        WaveShaperNode createWaveShaper();
+        AudioPannerNode createPanner();
+        ConvolverNode createConvolver();
+        DynamicsCompressorNode createDynamicsCompressor();
+        RealtimeAnalyserNode createAnalyser();
+        JavaScriptAudioNode createJavaScriptNode(in unsigned long bufferSize, in [Optional] unsigned long numberOfInputChannels, in [Optional] unsigned long numberOfOutputChannels)
+            raises(DOMException);
+        Oscillator createOscillator();
+        WaveTable createWaveTable(in Float32Array real, in Float32Array imag)
+            raises(DOMException);
+
+        // Channel splitting and merging
+        AudioChannelSplitter createChannelSplitter(in [Optional] unsigned long numberOfOutputs)
+            raises(DOMException);
+        AudioChannelMerger createChannelMerger(in [Optional] unsigned long numberOfInputs)
+            raises(DOMException);
+
+        // Offline rendering
+        // void prepareOfflineBufferRendering(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate);
+        attribute EventListener oncomplete;
+        void startRendering();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioDestinationNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioDestinationNode.idl
new file mode 100644
index 0000000..7ce4043
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioDestinationNode.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] AudioDestinationNode : AudioNode {
+        readonly attribute long numberOfChannels;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioGain.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioGain.idl
new file mode 100644
index 0000000..7597427
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioGain.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] AudioGain : AudioParam {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioGainNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioGainNode.idl
new file mode 100644
index 0000000..ba3163f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioGainNode.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] AudioGainNode : AudioNode {
+        // FIXME: eventually it will be interesting to remove the readonly restriction, but need to properly deal with thread safety here.
+        readonly attribute AudioGain gain;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioListener.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioListener.idl
new file mode 100644
index 0000000..cf6d8cf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioListener.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO
+    ] AudioListener {
+        attribute float dopplerFactor;  // same as OpenAL (default 1.0)
+        attribute float speedOfSound;   // in meters / second (default 343.3)
+
+        void setPosition(in float x, in float y, in float z);
+        void setOrientation(in float x, in float y, in float z, in float xUp, in float yUp, in float zUp);
+        void setVelocity(in float x, in float y, in float z);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioNode.idl
new file mode 100644
index 0000000..13bdc75
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioNode.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO
+    ] AudioNode {
+        readonly attribute AudioContext context;
+        readonly attribute unsigned long numberOfInputs;
+        readonly attribute unsigned long numberOfOutputs;
+
+        void connect(in AudioNode destination, in [Optional=DefaultIsUndefined] unsigned long output, in [Optional=DefaultIsUndefined] unsigned long input)
+            raises(DOMException);
+
+        void connect(in AudioParam destination, in [Optional=DefaultIsUndefined] unsigned long output)
+            raises(DOMException);
+
+        void disconnect(in [Optional=DefaultIsUndefined] unsigned long output)
+            raises(DOMException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioPannerNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioPannerNode.idl
new file mode 100644
index 0000000..5061e78
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioPannerNode.idl
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] AudioPannerNode : AudioNode {
+        // Panning model
+        const unsigned short EQUALPOWER = 0;
+        const unsigned short HRTF = 1;
+        const unsigned short SOUNDFIELD = 2;
+
+        // Distance model
+        const unsigned short LINEAR_DISTANCE = 0;
+        const unsigned short INVERSE_DISTANCE = 1;
+        const unsigned short EXPONENTIAL_DISTANCE = 2;
+
+        // Default model for stereo is HRTF 
+        // FIXME: use unsigned short when glue generation supports it
+        attribute unsigned long panningModel
+            setter raises(DOMException);
+
+        // Uses a 3D cartesian coordinate system 
+        void setPosition(in float x, in float y, in float z);
+        void setOrientation(in float x, in float y, in float z);
+        void setVelocity(in float x, in float y, in float z);
+
+        // Distance model
+        attribute unsigned long distanceModel; // FIXME: use unsigned short when glue generation supports it
+        attribute float refDistance;
+        attribute float maxDistance;
+        attribute float rolloffFactor;
+
+        // Directional sound cone
+        attribute float coneInnerAngle;
+        attribute float coneOuterAngle;
+        attribute float coneOuterGain;
+
+        // Dynamically calculated gain values          
+        readonly attribute AudioGain coneGain;
+        readonly attribute AudioGain distanceGain;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioParam.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioParam.idl
new file mode 100644
index 0000000..d9946f8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioParam.idl
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module webaudio {
+    interface [
+        Conditional=WEB_AUDIO
+    ] AudioParam {
+        attribute float value;
+        readonly attribute float minValue;
+        readonly attribute float maxValue;
+        readonly attribute float defaultValue;
+
+        readonly attribute DOMString name;
+
+        // FIXME: Could define units constants here (seconds, decibels, cents, etc.)...
+        readonly attribute unsigned short units;
+
+        // Parameter automation.
+        void setValueAtTime(in float value, in float time);
+        void linearRampToValueAtTime(in float value, in float time);
+        void exponentialRampToValueAtTime(in float value, in float time);
+
+        // Exponentially approach the target value with a rate having the given time constant.
+        void setTargetValueAtTime(in float targetValue, in float time, in float timeConstant);
+
+        // Sets an array of arbitrary parameter values starting at time for the given duration.
+        // The number of values will be scaled to fit into the desired duration.
+        void setValueCurveAtTime(in Float32Array values, in float time, in float duration);
+
+        // Cancels all scheduled parameter changes with times greater than or equal to startTime.
+        void cancelScheduledValues(in float startTime);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioProcessingEvent.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioProcessingEvent.idl
new file mode 100644
index 0000000..b6995f7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioProcessingEvent.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] AudioProcessingEvent : Event {
+        readonly attribute AudioBuffer inputBuffer;
+        readonly attribute AudioBuffer outputBuffer; 
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/AudioSourceNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioSourceNode.idl
new file mode 100644
index 0000000..ec3c356
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/AudioSourceNode.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO
+    ] AudioSourceNode : AudioNode {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/BiquadFilterNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/BiquadFilterNode.idl
new file mode 100644
index 0000000..d143065
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/BiquadFilterNode.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] BiquadFilterNode : AudioNode {
+        // Filter type.
+        const unsigned short LOWPASS = 0;
+        const unsigned short HIGHPASS = 1;
+        const unsigned short BANDPASS = 2;
+        const unsigned short LOWSHELF = 3;
+        const unsigned short HIGHSHELF = 4;
+        const unsigned short PEAKING = 5;
+        const unsigned short NOTCH = 6;
+        const unsigned short ALLPASS = 7;
+
+        attribute unsigned short type
+            setter raises(DOMException);
+        
+        readonly attribute AudioParam frequency; // in Hertz
+        readonly attribute AudioParam Q; // Quality factor
+        readonly attribute AudioParam gain; // in Decibels
+
+        void getFrequencyResponse(in Float32Array frequencyHz,
+                                  in Float32Array magResponse,
+                                  in Float32Array phaseResponse);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/ConvolverNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/ConvolverNode.idl
new file mode 100644
index 0000000..0f561f0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/ConvolverNode.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    // A linear convolution effect
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] ConvolverNode : AudioNode {
+        attribute [JSCustomSetter] AudioBuffer buffer;
+        attribute boolean normalize;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/DOMWindowWebAudio.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/DOMWindowWebAudio.idl
new file mode 100644
index 0000000..ca8e50e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/DOMWindowWebAudio.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        Conditional=WEB_AUDIO,
+        Supplemental=DOMWindow
+    ] DOMWindowWebAudio {
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+        attribute [JSCustomGetter, V8EnabledAtRuntime] AudioContextConstructor webkitAudioContext;
+        attribute AudioPannerNodeConstructor webkitAudioPannerNode;
+        attribute AudioProcessingEventConstructor AudioProcessingEvent;
+        attribute OfflineAudioCompletionEventConstructor OfflineAudioCompletionEvent;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/DelayNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/DelayNode.idl
new file mode 100644
index 0000000..a21ac30
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/DelayNode.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] DelayNode : AudioNode {
+        readonly attribute AudioParam delayTime;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/DynamicsCompressorNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/DynamicsCompressorNode.idl
new file mode 100644
index 0000000..a2e3565
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/DynamicsCompressorNode.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] DynamicsCompressorNode : AudioNode {
+        readonly attribute AudioParam threshold; // in Decibels
+        readonly attribute AudioParam knee; // in Decibels
+        readonly attribute AudioParam ratio; // unit-less
+        readonly attribute AudioParam reduction; // in Decibels
+        readonly attribute AudioParam attack; // in Seconds
+        readonly attribute AudioParam release; // in Seconds
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/JavaScriptAudioNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/JavaScriptAudioNode.idl
new file mode 100644
index 0000000..97da0c1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/JavaScriptAudioNode.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    // For real-time audio stream synthesis/processing in JavaScript 
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject,
+        JSCustomMarkFunction,
+        EventTarget
+    ] JavaScriptAudioNode : AudioNode {
+        // Rendering callback
+        attribute EventListener onaudioprocess;
+        
+        readonly attribute long bufferSize;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/MediaElementAudioSourceNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/MediaElementAudioSourceNode.idl
new file mode 100644
index 0000000..f09e98f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/MediaElementAudioSourceNode.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO&VIDEO,
+        JSGenerateToJSObject
+    ] MediaElementAudioSourceNode : AudioSourceNode {
+        readonly attribute HTMLMediaElement mediaElement;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/OfflineAudioCompletionEvent.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/OfflineAudioCompletionEvent.idl
new file mode 100644
index 0000000..4ef6939
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/OfflineAudioCompletionEvent.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] OfflineAudioCompletionEvent : Event {
+        readonly attribute AudioBuffer renderedBuffer;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/Oscillator.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/Oscillator.idl
new file mode 100644
index 0000000..fb68e40
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/Oscillator.idl
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2012, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    // Oscillator is an audio generator of periodic waveforms.
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] Oscillator : AudioSourceNode {
+
+        // Type constants.
+        const unsigned short SINE = 0;
+        const unsigned short SQUARE = 1;
+        const unsigned short SAWTOOTH = 2;
+        const unsigned short TRIANGLE = 3;
+        const unsigned short CUSTOM = 4;
+
+        attribute unsigned short type;
+
+        // Playback state constants.
+        const unsigned short UNSCHEDULED_STATE = 0;
+        const unsigned short SCHEDULED_STATE = 1;
+        const unsigned short PLAYING_STATE = 2;
+        const unsigned short FINISHED_STATE = 3;
+
+        readonly attribute unsigned short playbackState;
+
+        readonly attribute AudioParam frequency; // in Hertz
+        readonly attribute AudioParam detune; // in Cents
+
+        void noteOn(in double when);
+        void noteOff(in double when);
+        void setWaveTable(in WaveTable waveTable);
+
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/RealtimeAnalyserNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/RealtimeAnalyserNode.idl
new file mode 100644
index 0000000..dc2db80
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/RealtimeAnalyserNode.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] RealtimeAnalyserNode : AudioNode {
+        attribute unsigned long fftSize
+            setter raises(DOMException);
+        readonly attribute unsigned long frequencyBinCount;
+
+        // minDecibels / maxDecibels represent the range to scale the FFT analysis data for conversion to unsigned byte values.
+        attribute float minDecibels;
+        attribute float maxDecibels;
+
+        // A value from 0.0 -> 1.0 where 0.0 represents no time averaging with the last analysis frame.
+        attribute float smoothingTimeConstant;
+
+        // Copies the current frequency data into the passed array.
+        // If the array has fewer elements than the frequencyBinCount, the excess elements will be dropped.
+        void getFloatFrequencyData(in Float32Array array);
+        void getByteFrequencyData(in Uint8Array array);
+
+        // Real-time waveform data
+        void getByteTimeDomainData(in Uint8Array array);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/WaveShaperNode.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/WaveShaperNode.idl
new file mode 100644
index 0000000..16a4acf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/WaveShaperNode.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    interface [
+        Conditional=WEB_AUDIO,
+        JSGenerateToJSObject
+    ] WaveShaperNode : AudioNode {
+        attribute [JSCustomSetter] Float32Array curve;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webaudio/WaveTable.idl b/elemental/idl/third_party/WebCore/Modules/webaudio/WaveTable.idl
new file mode 100644
index 0000000..22403c3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webaudio/WaveTable.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2012, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module audio {
+    // WaveTable represents a periodic audio waveform given by its Fourier coefficients.
+    interface [
+        Conditional=WEB_AUDIO
+    ] WaveTable {
+
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/DOMWindowWebDatabase.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/DOMWindowWebDatabase.idl
new file mode 100644
index 0000000..d85aad7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/DOMWindowWebDatabase.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        Conditional=SQL_DATABASE,
+        Supplemental=DOMWindow
+    ] DOMWindowWebDatabase {
+        [V8EnabledAtRuntime] Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in [Callback, Optional] DatabaseCallback creationCallback)
+            raises(DOMException);
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+        attribute SQLExceptionConstructor SQLException;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/Database.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/Database.idl
new file mode 100644
index 0000000..ddc544a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/Database.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=SQL_DATABASE,
+        OmitConstructor,
+        JSNoStaticTables
+    ] Database {
+        readonly attribute DOMString version;
+        void changeVersion(in DOMString oldVersion, in DOMString newVersion, in [Callback, Optional] SQLTransactionCallback callback, in [Callback, Optional] SQLTransactionErrorCallback errorCallback, in [Callback, Optional] VoidCallback successCallback);
+        void transaction(in [Callback] SQLTransactionCallback callback, in [Callback, Optional] SQLTransactionErrorCallback errorCallback, in [Callback, Optional] VoidCallback successCallback);
+        void readTransaction(in [Callback] SQLTransactionCallback callback, in [Callback, Optional] SQLTransactionErrorCallback errorCallback, in [Callback, Optional] VoidCallback successCallback);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/DatabaseCallback.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/DatabaseCallback.idl
new file mode 100644
index 0000000..8d31648
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/DatabaseCallback.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=SQL_DATABASE,
+        Callback
+    ] DatabaseCallback {
+        boolean handleEvent(in Database database);
+        boolean handleEvent(in DatabaseSync database);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/DatabaseSync.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/DatabaseSync.idl
new file mode 100644
index 0000000..cfb0b59
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/DatabaseSync.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=SQL_DATABASE,
+        OmitConstructor,
+        JSNoStaticTables
+    ] DatabaseSync {
+        readonly attribute DOMString version;
+        readonly attribute DOMString lastErrorMessage;
+        void changeVersion(in DOMString oldVersion, in DOMString newVersion, in [Callback, Optional] SQLTransactionSyncCallback callback) raises(DOMException);
+        void transaction(in [Callback] SQLTransactionSyncCallback callback) raises(DOMException);
+        void readTransaction(in [Callback] SQLTransactionSyncCallback callback) raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLError.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLError.idl
new file mode 100644
index 0000000..ad84759
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLError.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=SQL_DATABASE,
+        OmitConstructor,
+        JSNoStaticTables
+    ] SQLError {
+        readonly attribute unsigned long code;
+        readonly attribute DOMString message;
+
+        // SQLErrorCode: used only in the async DB API
+        const unsigned short UNKNOWN_ERR = 0;
+        const unsigned short DATABASE_ERR = 1;
+        const unsigned short VERSION_ERR = 2;
+        const unsigned short TOO_LARGE_ERR = 3;
+        const unsigned short QUOTA_ERR = 4;
+        const unsigned short SYNTAX_ERR = 5;
+        const unsigned short CONSTRAINT_ERR = 6;
+        const unsigned short TIMEOUT_ERR = 7;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLException.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLException.idl
new file mode 100644
index 0000000..856e5cd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLException.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    exception [
+        Conditional=SQL_DATABASE,
+        JSNoStaticTables,
+        DoNotCheckConstants
+    ] SQLException {
+        readonly attribute unsigned long code;
+        readonly attribute DOMString message;
+
+        // SQLExceptionCode: used only in the sync DB API
+        const unsigned short UNKNOWN_ERR = 0;
+        const unsigned short DATABASE_ERR = 1;
+        const unsigned short VERSION_ERR = 2;
+        const unsigned short TOO_LARGE_ERR = 3;
+        const unsigned short QUOTA_ERR = 4;
+        const unsigned short SYNTAX_ERR = 5;
+        const unsigned short CONSTRAINT_ERR = 6;
+        const unsigned short TIMEOUT_ERR = 7;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLResultSet.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLResultSet.idl
new file mode 100644
index 0000000..60692cb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLResultSet.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=SQL_DATABASE,
+        OmitConstructor,
+        JSNoStaticTables
+    ] SQLResultSet {
+        readonly attribute SQLResultSetRowList rows;
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+        readonly attribute long insertId
+            getter raises(DOMException);
+#else
+        // Explicitely choose 'long long' here to avoid a 64bit->32bit shortening warning for us.
+        readonly attribute long long insertId
+            getter raises(DOMException);
+#endif
+        readonly attribute long rowsAffected;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLResultSetRowList.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLResultSetRowList.idl
new file mode 100644
index 0000000..ba0cb4c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLResultSetRowList.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=SQL_DATABASE,
+        OmitConstructor,
+        JSNoStaticTables
+    ] SQLResultSetRowList {
+        readonly attribute unsigned long length;
+        [Custom] DOMObject item(in unsigned long index);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLStatementCallback.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLStatementCallback.idl
new file mode 100644
index 0000000..c3053c0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLStatementCallback.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=SQL_DATABASE,
+        Callback
+    ] SQLStatementCallback {
+        boolean handleEvent(in SQLTransaction transaction, in SQLResultSet resultSet);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLStatementErrorCallback.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLStatementErrorCallback.idl
new file mode 100644
index 0000000..1fc96cb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLStatementErrorCallback.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=SQL_DATABASE,
+        Callback
+    ] SQLStatementErrorCallback {
+        [Custom] boolean handleEvent(in SQLTransaction transaction, in SQLError error);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransaction.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransaction.idl
new file mode 100644
index 0000000..f0994a1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransaction.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=SQL_DATABASE,
+        OmitConstructor,
+        JSNoStaticTables
+    ] SQLTransaction {
+        [Custom] void executeSql(in DOMString sqlStatement,
+                                 in ObjectArray arguments,
+                                 in [Optional, Callback] SQLStatementCallback callback,
+                                 in [Optional, Callback] SQLStatementErrorCallback errorCallback);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionCallback.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionCallback.idl
new file mode 100644
index 0000000..1b50bee
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionCallback.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=SQL_DATABASE,
+        Callback
+    ] SQLTransactionCallback {
+        boolean handleEvent(in SQLTransaction transaction);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionErrorCallback.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionErrorCallback.idl
new file mode 100644
index 0000000..f6ec156
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionErrorCallback.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=SQL_DATABASE,
+        Callback
+    ] SQLTransactionErrorCallback {
+        boolean handleEvent(in SQLError error);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionSync.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionSync.idl
new file mode 100644
index 0000000..e5bdedf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionSync.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=SQL_DATABASE,
+        OmitConstructor,
+        JSNoStaticTables
+    ] SQLTransactionSync {
+        [Custom] SQLResultSet executeSql(in DOMString sqlStatement, in ObjectArray arguments);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionSyncCallback.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionSyncCallback.idl
new file mode 100644
index 0000000..ea22e5f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/SQLTransactionSyncCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=SQL_DATABASE,
+        Callback
+    ] SQLTransactionSyncCallback {
+        boolean handleEvent(in SQLTransactionSync transaction);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/webdatabase/WorkerContextWebDatabase.idl b/elemental/idl/third_party/WebCore/Modules/webdatabase/WorkerContextWebDatabase.idl
new file mode 100644
index 0000000..80eb942
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/webdatabase/WorkerContextWebDatabase.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module window {
+
+    interface [
+        Conditional=SQL_DATABASE,
+        Supplemental=WorkerContext
+    ] WorkerContextWebDatabase {
+        [V8EnabledAtRuntime] Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in [Callback, Optional] DatabaseCallback creationCallback)
+            raises(DOMException);
+
+        [V8EnabledAtRuntime] DatabaseSync openDatabaseSync(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in [Callback, Optional] DatabaseCallback creationCallback)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/websockets/CloseEvent.idl b/elemental/idl/third_party/WebCore/Modules/websockets/CloseEvent.idl
new file mode 100644
index 0000000..ea75111
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/websockets/CloseEvent.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2011 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    interface [
+        JSNoStaticTables,
+        ConstructorTemplate=Event
+    ] CloseEvent : Event {
+        readonly attribute [InitializedByEventConstructor] boolean wasClean;
+        readonly attribute [InitializedByEventConstructor] unsigned short code;
+        readonly attribute [InitializedByEventConstructor] DOMString reason;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/websockets/DOMWindowWebSocket.idl b/elemental/idl/third_party/WebCore/Modules/websockets/DOMWindowWebSocket.idl
new file mode 100644
index 0000000..2b5fca8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/websockets/DOMWindowWebSocket.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        Conditional=WEB_SOCKETS,
+        Supplemental=DOMWindow
+    ] DOMWindowWebSocket {
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+        attribute CloseEventConstructor CloseEvent;
+        attribute [JSCustomGetter, V8EnabledAtRuntime] WebSocketConstructor WebSocket; // Usable with the new operator
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/websockets/WebSocket.idl b/elemental/idl/third_party/WebCore/Modules/websockets/WebSocket.idl
new file mode 100644
index 0000000..92835ae
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/websockets/WebSocket.idl
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2009 Google Inc.  All rights reserved.
+ * Copyright (C) 2010, 2011 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module websockets {
+
+    interface [
+        Conditional=WEB_SOCKETS,
+        ActiveDOMObject,
+        CustomConstructor,
+        ConstructorParameters=1,
+        EventTarget,
+        JSNoStaticTables
+    ] WebSocket {
+        readonly attribute DOMString URL; // Lowercased .url is the one in the spec, but leaving .URL for compatibility reasons.
+        readonly attribute DOMString url;
+
+        // ready state
+        const unsigned short CONNECTING = 0;
+        const unsigned short OPEN = 1;
+        const unsigned short CLOSING = 2;
+        const unsigned short CLOSED = 3;
+        readonly attribute unsigned short readyState;
+
+        readonly attribute unsigned long bufferedAmount;
+
+        // networking
+        attribute EventListener onopen;
+        attribute EventListener onmessage;
+        attribute EventListener onerror;
+        attribute EventListener onclose;
+
+        readonly attribute [TreatReturnedNullStringAs=Undefined] DOMString protocol;
+        readonly attribute [TreatReturnedNullStringAs=Undefined] DOMString extensions;
+
+        attribute [TreatReturnedNullStringAs=Undefined] DOMString binaryType
+            setter raises(DOMException);
+
+        // FIXME: Use overloading provided by our IDL code generator.
+        // According to Web IDL specification, overloaded function with DOMString argument
+        // should accept anything that can be converted to a string (including numbers,
+        // booleans, null, undefined and objects except ArrayBuffer and Blob). Current code
+        // generator does not handle this rule correctly.
+        // boolean send(in ArrayBuffer data) raises(DOMException);
+        // boolean send(in Blob data) raises(DOMException);
+        // boolean send(in DOMString data) raises(DOMException);
+        [Custom] boolean send(in DOMString data) raises(DOMException);
+
+        // FIXME: Implement and apply [Clamp] attribute instead of [Custom].
+        [Custom] void close(in [Optional] unsigned short code, in [Optional] DOMString reason) raises(DOMException);
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/Modules/websockets/WorkerContextWebSocket.idl b/elemental/idl/third_party/WebCore/Modules/websockets/WorkerContextWebSocket.idl
new file mode 100644
index 0000000..9cd2524
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/Modules/websockets/WorkerContextWebSocket.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module window {
+
+    interface [
+        Conditional=WEB_SOCKETS,
+        Supplemental=WorkerContext
+    ] WorkerContextWebSocket {
+        attribute [JSCustomGetter,V8EnabledAtRuntime] WebSocketConstructor WebSocket; // Usable with the new operator
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/README b/elemental/idl/third_party/WebCore/README
new file mode 100644
index 0000000..a4996d5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/README
@@ -0,0 +1,9 @@
+This directory contains a copy of WebKit/WebCore IDL files.
+See the attached LICENSE-* files in this directory.
+
+Please do not modify the files here.  They are periodically copied
+using the script: $DART_ROOT/lib/dom/scripts/idlsync.py
+
+The current version corresponds to:
+URL: http://src.chromium.org/multivm/trunk/webkit
+Current revision: 576
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestCallback.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestCallback.idl
new file mode 100644
index 0000000..354859a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestCallback.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This IDL file is for testing the bindings code generator with an interface
+// that has the "Callback" attribute and for tracking changes in its ouput.
+module test {
+    interface [
+        Conditional=SQL_DATABASE,
+        Callback
+    ] TestCallback {
+      boolean callbackWithNoParam();
+      boolean callbackWithClass1Param(in Class1 class1Param);
+      boolean callbackWithClass2Param(in Class2 class2Param, in DOMString strArg);
+      long callbackWithNonBoolReturnType(in Class3 class3Param);
+      [Custom] long customCallback(in Class5 class5Param, in Class6 class6Param);
+      boolean callbackWithStringList(in DOMStringList listParam);
+      boolean callbackWithBoolean(in boolean boolParam);
+      [PassThisToCallback=ThisClass] boolean callbackRequiresThisToPass(in Class8 class8Param, in ThisClass thisClassParam);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestCustomNamedGetter.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestCustomNamedGetter.idl
new file mode 100644
index 0000000..329fa5d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestCustomNamedGetter.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    interface [
+        CustomNamedGetter
+    ] TestCustomNamedGetter {
+        void anotherFunction(in DOMString str);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestDomainSecurity.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestDomainSecurity.idl
new file mode 100644
index 0000000..bbd46e0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestDomainSecurity.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module test {
+    interface [
+        CheckSecurity
+    ] TestActiveDOMObject {
+        readonly attribute long excitingAttr;
+        void excitingFunction(in Node nextChild);
+        [DoNotCheckSecurity] void postMessage(in DOMString message);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestEventConstructor.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestEventConstructor.idl
new file mode 100644
index 0000000..706f1e2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestEventConstructor.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This IDL file is for testing the bindings code generator and for tracking
+// changes in its ouput.
+module test {
+    interface [
+        ConstructorTemplate=Event
+    ] TestEventConstructor {
+        // Attributes
+        readonly attribute DOMString attr1;
+        readonly attribute [InitializedByEventConstructor] DOMString attr2;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestEventTarget.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestEventTarget.idl
new file mode 100644
index 0000000..22e5b96
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestEventTarget.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    interface [
+        EventTarget,
+        IndexedGetter,
+        NamedGetter,
+        MasqueradesAsUndefined
+    ] TestEventTarget {
+
+        Node item(in [IsIndex] unsigned long index);
+
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestException.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestException.idl
new file mode 100644
index 0000000..f34af00
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestException.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+module test {
+    exception TestException {
+       readonly attribute DOMString name;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestInterface.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestInterface.idl
new file mode 100644
index 0000000..a058f1a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestInterface.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This IDL file is for testing the bindings code generator and for tracking
+// changes in its ouput.
+module test {
+    interface [
+        ActiveDOMObject,
+        CustomNamedSetter,
+        Conditional=Condition1|Condition2,
+        CallWith=ScriptExecutionContext,
+        Constructor(in DOMString str1, in [Optional=DefaultIsUndefined] DOMString str2),
+        ConstructorRaisesException
+    ] TestInterface {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestMediaQueryListListener.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestMediaQueryListListener.idl
new file mode 100644
index 0000000..536393b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestMediaQueryListListener.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This IDL file is for testing the bindings code generator with an interface
+// that has methods receiving a parameter of the type MediaQueryListListener.
+module test {
+    interface TestMediaQueryListListener {
+        void method(in MediaQueryListListener listener);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestNamedConstructor.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestNamedConstructor.idl
new file mode 100644
index 0000000..e0f8539
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestNamedConstructor.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This IDL file is for testing the bindings code generator and for tracking
+// changes in its ouput.
+module test {
+    interface [
+        ActiveDOMObject,
+        NamedConstructor=Audio(in DOMString str1, in [Optional=DefaultIsUndefined] DOMString str2, in [Optional=DefaultIsNullString] DOMString str3),
+        ConstructorRaisesException
+    ] TestNamedConstructor {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestNode.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestNode.idl
new file mode 100644
index 0000000..321621c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestNode.idl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module test {
+
+    interface [
+        EventTarget,
+        Constructor,
+        V8DependentLifetime
+    ] TestNode : Node {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestObj.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestObj.idl
new file mode 100644
index 0000000..08b9856
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestObj.idl
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This IDL file is for testing the bindings code generator and for tracking
+// changes in its ouput.
+module test {
+    interface [
+        Constructor(in [Callback] TestCallback testCallback),
+        InterfaceName=TestObject
+    ] TestObj {
+        // Attributes
+        readonly attribute long            readOnlyIntAttr;
+        readonly attribute DOMString       readOnlyStringAttr;
+        readonly attribute TestObj         readOnlyTestObjAttr;
+        attribute short                    shortAttr;
+        attribute unsigned short           unsignedShortAttr;
+        attribute long                     intAttr;
+        attribute long long                longLongAttr;
+        attribute unsigned long long       unsignedLongLongAttr;
+        attribute DOMString                stringAttr;
+        attribute TestObj                  testObjAttr;
+
+        // Sequence Attributes
+        attribute sequence<ScriptProfile>  sequenceAttr;
+        attribute sequence<int> intSequenceAttr;
+        attribute sequence<short> shortSequenceAttr;
+        attribute sequence<long> longSequenceAttr;
+        attribute sequence<long long> longLongSequenceAttr;
+        attribute sequence<unsigned int> unsignedIntSequenceAttr;
+        attribute sequence<unsigned short> unsignedShortSequenceAttr;
+        attribute sequence<unsigned long> unsignedLongSequenceAttr;
+        attribute sequence<unsigned long long> unsignedLongLongSequenceAttr;
+        attribute sequence<float> floatSequenceAttr;
+        attribute sequence<double> doubleSequenceAttr;
+        attribute sequence<boolean> booleanSequenceAttr;
+        attribute sequence<void> voidSequenceAttr;
+        attribute sequence<Date> dateSequenceAttr;
+
+        JS, V8
+        // WK_ucfirst, WK_lcfirst exceptional cases.
+        attribute TestObj                  XMLObjAttr;
+        attribute boolean                  create;
+
+        // Reflected DOM attributes
+        attribute [Reflect] DOMString reflectedStringAttr;
+        attribute [Reflect] long reflectedIntegralAttr;
+        attribute [Reflect] unsigned long reflectedUnsignedIntegralAttr;
+        attribute [Reflect] boolean reflectedBooleanAttr;
+        attribute [Reflect, URL] DOMString reflectedURLAttr;
+        attribute [Reflect=customContentStringAttr] DOMString reflectedStringAttr;
+        attribute [Reflect=customContentIntegralAttr] long reflectedCustomIntegralAttr;
+        attribute [Reflect=customContentBooleanAttr] boolean reflectedCustomBooleanAttr;
+        attribute [Reflect=customContentURLAttr, URL] DOMString reflectedCustomURLAttr;
+
+        // Methods
+        void    voidMethod();
+        void    voidMethodWithArgs(in long intArg, in DOMString strArg, in TestObj objArg);
+        long    intMethod();
+        long    intMethodWithArgs(in long intArg, in DOMString strArg, in TestObj objArg);
+        TestObj objMethod();
+        TestObj objMethodWithArgs(in long intArg, in DOMString strArg, in TestObj objArg);
+
+        void methodWithSequenceArg(in sequence<ScriptProfile> sequenceArg);
+        sequence<ScriptProfile> methodReturningSequence(in long intArg);
+
+        TestObj methodThatRequiresAllArgsAndThrows(in DOMString strArg, in TestObj objArg)
+            raises(DOMException);
+
+        void serializedValue(in SerializedScriptValue serializedArg);
+        void idbKey(in IDBKey key);
+        void optionsObject(in Dictionary oo, in [Optional] Dictionary ooo);
+
+        // Exceptions
+        void methodWithException() raises(DOMException);
+        attribute long attrWithGetterException getter raises(DOMException);
+        attribute long attrWithSetterException setter raises(DOMException);
+        attribute DOMString stringAttrWithGetterException getter raises(DOMException);
+        attribute DOMString stringAttrWithSetterException setter raises(DOMException);
+
+        // 'Custom' extended attribute
+        attribute [Custom] long            customAttr;
+        [Custom] void customMethod();
+        [Custom] void customMethodWithArgs(in long intArg, in DOMString strArg, in TestObj objArg);
+
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+
+        // 'CallWith' extended attribute
+        [CallWith=ScriptState] void withScriptStateVoid();
+        [CallWith=ScriptState] TestObj withScriptStateObj();
+        [CallWith=ScriptState] void withScriptStateVoidException()
+            raises(DOMException);
+        [CallWith=ScriptState] TestObj withScriptStateObjException()
+            raises(DOMException);
+        [CallWith=ScriptExecutionContext] void withScriptExecutionContext();
+        [CallWith=ScriptExecutionContext|ScriptState] void withScriptExecutionContextAndScriptState();
+        [CallWith=ScriptExecutionContext|ScriptState] TestObj withScriptExecutionContextAndScriptStateObjException()
+            raises(DOMException);
+        [CallWith=  ScriptExecutionContext  |  ScriptState  ] TestObj withScriptExecutionContextAndScriptStateWithSpaces();
+        [CallWith=ScriptArguments|CallStack] void withScriptArgumentsAndCallStack();
+
+        attribute [CallWith=ScriptState] long withScriptStateAttribute;
+        attribute [CallWith=ScriptExecutionContext] TestObj withScriptExecutionContextAttribute;
+        attribute [CallWith=ScriptState] TestObj withScriptStateAttributeRaises
+            getter raises(DOMException);
+        attribute [CallWith=ScriptExecutionContext] TestObj withScriptExecutionContextAttributeRaises
+            getter raises(DOMException);
+        attribute [CallWith=ScriptExecutionContext|ScriptState] TestObj withScriptExecutionContextAndScriptStateAttribute;
+        attribute [CallWith=ScriptExecutionContext|ScriptState] TestObj withScriptExecutionContextAndScriptStateAttributeRaises
+            getter raises(DOMException);
+        attribute [CallWith=  ScriptExecutionContext  |  ScriptState  ] TestObj withScriptExecutionContextAndScriptStateWithSpacesAttribute;
+        attribute [CallWith=ScriptArguments|CallStack] TestObj withScriptArgumentsAndCallStackAttribute;
+
+        // 'Optional' extended attribute
+        void    methodWithOptionalArg(in [Optional] long opt);
+        void    methodWithNonOptionalArgAndOptionalArg(in long nonOpt, in [Optional] long opt);
+        void    methodWithNonOptionalArgAndTwoOptionalArgs(in long nonOpt, in [Optional] long opt1, in [Optional] long opt2);
+        void    methodWithOptionalString(in [Optional] DOMString str);
+        void    methodWithOptionalStringIsUndefined(in [Optional=DefaultIsUndefined] DOMString str);
+        void    methodWithOptionalStringIsNullString(in [Optional=DefaultIsNullString] DOMString str);
+
+#if defined(TESTING_V8) || defined(TESTING_JS)
+        // 'Callback' extended attribute
+        void    methodWithCallbackArg(in [Callback] TestCallback callback);
+        void    methodWithNonCallbackArgAndCallbackArg(in long nonCallback, in [Callback] TestCallback callback);
+        void    methodWithCallbackAndOptionalArg(in [Callback, Optional] TestCallback callback);
+#endif
+
+        // 'Conditional' extended attribute
+        attribute [Conditional=Condition1] long conditionalAttr1;
+        attribute [Conditional=Condition1&Condition2] long conditionalAttr2;
+        attribute [Conditional=Condition1|Condition2] long conditionalAttr3;
+
+        // 'Conditional' extended method
+        [Conditional=Condition1] DOMString conditionalMethod1();
+        [Conditional=Condition1&Condition2] void conditionalMethod2();
+        [Conditional=Condition1|Condition2] void conditionalMethod3();
+
+        attribute [Conditional=Condition1] TestObjectAConstructor conditionalAttr4;
+        attribute [Conditional=Condition1&Condition2] TestObjectBConstructor conditionalAttr5;
+        attribute [Conditional=Condition1|Condition2] TestObjectCConstructor conditionalAttr6;
+
+        [Conditional=Condition1] const unsigned short CONDITIONAL_CONST = 0;
+
+#if defined(TESTING_V8) || defined(TESTING_JS)
+        readonly attribute [CachedAttribute] any cachedAttribute1;
+        readonly attribute [CachedAttribute] any cachedAttribute2;
+#endif
+
+#if defined(TESTING_V8) || defined(TESTING_JS)
+        // Overloads
+        void    overloadedMethod(in TestObj objArg, in DOMString strArg);
+        void    overloadedMethod(in TestObj objArg, in [Optional] long intArg);
+        void    overloadedMethod(in DOMString strArg);
+        void    overloadedMethod(in long intArg);
+        void    overloadedMethod(in [Callback] TestCallback callback);
+        void    overloadedMethod(in DOMStringList listArg);
+        void    overloadedMethod(in DOMString[] arrayArg);
+#endif
+
+        // Class methods within JavaScript (like what's used for IDBKeyRange).
+        static void classMethod();
+        static long classMethodWithOptional(in [Optional] long arg);
+        [Custom] static void classMethod2(in long arg);
+
+        // Static method with conditional on overloaded methods
+        [Conditional=Condition1] static void overloadedMethod1(in long arg);
+        [Conditional=Condition1] static void overloadedMethod1(in DOMString type);
+
+#if defined(TESTING_V8)
+        // 'V8EnabledAtRuntime' methods and attributes.
+        [V8EnabledAtRuntime] void enabledAtRuntimeMethod1(in int intArg);
+        [V8EnabledAtRuntime=FeatureName] void enabledAtRuntimeMethod2(in int intArg);
+        attribute [V8EnabledAtRuntime] long enabledAtRuntimeAttr1;
+        attribute [V8EnabledAtRuntime=FeatureName] long enabledAtRuntimeAttr2;
+        // V8EnabledPerContext currently only supports attributes.
+        attribute [V8EnabledPerContext] long enabledAtContextAttr1;
+        attribute [V8EnabledPerContext=FeatureName] long enabledAtContextAttr2;
+#endif
+
+
+#if defined(TESTING_V8)
+        attribute float[]                   floatArray;
+        attribute double[]                  doubleArray;
+#endif
+
+#if defined(TESTING_JS)
+        void methodWithUnsignedLongArray(in unsigned long[] unsignedLongArray);
+#endif
+
+        readonly attribute [CheckSecurityForNode] Document contentDocument;
+        [CheckSecurityForNode] SVGDocument getSVGDocument()
+            raises(DOMException);
+
+        void convert1(in [TreatReturnedNullStringAs=Null] a);
+        void convert2(in [TreatReturnedNullStringAs=Undefined] b);
+        void convert3(in [TreatReturnedNullStringAs=False] c);
+        void convert4(in [TreatNullAs=NullString] d);
+        void convert5(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] e);
+
+        attribute SVGPoint mutablePoint;
+        attribute [Immutable] SVGPoint immutablePoint;
+        SVGPoint mutablePointFunction();
+        [Immutable] SVGPoint immutablePointFunction();
+
+        [ImplementedAs=banana] void orange();
+        attribute [ImplementedAs=blueberry] int strawberry;
+
+        attribute [StrictTypeChecking] float strictFloat;
+        [StrictTypeChecking] bool strictFunction(in DOMString str, in float a, in int b)
+            raises(DOMException);
+
+        // ObjectiveC reserved words.
+        readonly attribute long      description;
+        attribute long               id;
+        readonly attribute DOMString hash;
+
+        // Check constants and enums.
+        const unsigned short CONST_VALUE_0 = 0;
+        const unsigned short CONST_VALUE_1 = 1;
+        const unsigned short CONST_VALUE_2 = 2;
+        const unsigned short CONST_VALUE_4 = 4;
+        const unsigned short CONST_VALUE_8 = 8;
+        const short CONST_VALUE_9 = -1;
+        const DOMString CONST_VALUE_10 = "my constant string";
+        const unsigned short CONST_VALUE_11 = 0xffffffff;
+        const unsigned short CONST_VALUE_12 = 0x01;
+        const unsigned short CONST_VALUE_13 = 0X20;
+        const unsigned short CONST_VALUE_14 = 0x1abc;
+        [Reflect=CONST_IMPL] const unsigned short CONST_JAVASCRIPT = 15;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestSerializedScriptValueInterface.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestSerializedScriptValueInterface.idl
new file mode 100644
index 0000000..facf7cb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestSerializedScriptValueInterface.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This IDL file is for testing the bindings code generator and for tracking
+// changes in its ouput.
+module test {
+    interface [
+        Conditional=Condition1|Condition2,
+        Constructor(in DOMString hello, in SerializedScriptValue value),
+        Constructor(in DOMString hello, in [TransferList=transferList] SerializedScriptValue data, in [Optional=DefaultIsUndefined] Array transferList),
+    ] TestSerializedScriptValueInterface {
+        attribute SerializedScriptValue value;
+        readonly attribute SerializedScriptValue readonlyValue;
+        attribute [CachedAttribute] SerializedScriptValue cachedValue;
+        readonly attribute MessagePortArray ports;
+        readonly attribute [CachedAttribute] SerializedScriptValue cachedReadonlyValue;
+        void acceptTransferList(in [TransferList=transferList] SerializedScriptValue data, in [Optional] Array transferList);
+        void multiTransferList(in [Optional, TransferList=tx] SerializedScriptValue first, in [Optional] Array tx, in [Optional, TransferList=txx] SerializedScriptValue second, in [Optional] Array txx);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestSupplemental.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestSupplemental.idl
new file mode 100644
index 0000000..6051412
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestSupplemental.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary formstrArg, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIEstrArg, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// This IDL file is for testing the bindings code generator and for tracking
+// changes in its ouput.
+module test {
+    interface [
+        Conditional=Condition11|Condition12,
+        Supplemental=TestInterface
+    ] TestSupplemental {
+        readonly attribute DOMString supplementalStr1;
+        attribute DOMString supplementalStr2;
+        attribute [CustomGetter, CustomSetter] DOMString supplementalStr3;
+        attribute Node supplementalNode;
+
+        void supplementalMethod1();
+        [CallWith=ScriptExecutionContext] TestObj supplementalMethod2(in DOMString strArg, in TestObj objArg) raises(DOMException);
+        [Custom] void supplementalMethod3();
+        static void supplementalMethod4();
+
+        const unsigned short SUPPLEMENTALCONSTANT1 = 1;
+        [Reflect=CONST_IMPL] const unsigned short SUPPLEMENTALCONSTANT2 = 2;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/bindings/scripts/test/TestTypedArray.idl b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestTypedArray.idl
new file mode 100644
index 0000000..e816b38
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/bindings/scripts/test/TestTypedArray.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=123,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Float64Array : ArrayBufferView {
+        Int32Array foo(in Float32Array array);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSCharsetRule.idl b/elemental/idl/third_party/WebCore/css/CSSCharsetRule.idl
new file mode 100644
index 0000000..3cdaf4a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSCharsetRule.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface CSSCharsetRule : CSSRule {
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString encoding;
+#else
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString encoding
+                     setter raises(DOMException);
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSFontFaceRule.idl b/elemental/idl/third_party/WebCore/css/CSSFontFaceRule.idl
new file mode 100644
index 0000000..bd38a61
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSFontFaceRule.idl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface CSSFontFaceRule : CSSRule {
+        readonly attribute CSSStyleDeclaration style;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSImportRule.idl b/elemental/idl/third_party/WebCore/css/CSSImportRule.idl
new file mode 100644
index 0000000..ddd0a8b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSImportRule.idl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface CSSImportRule : CSSRule {
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString href;
+        readonly attribute MediaList media;
+        readonly attribute CSSStyleSheet styleSheet;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSMediaRule.idl b/elemental/idl/third_party/WebCore/css/CSSMediaRule.idl
new file mode 100644
index 0000000..f52a6ce
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSMediaRule.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface CSSMediaRule : CSSRule {
+        readonly attribute MediaList media;
+        readonly attribute CSSRuleList cssRules;
+        
+        [ObjCLegacyUnnamedParameters] unsigned long      insertRule(in [Optional=DefaultIsUndefined] DOMString rule, 
+                                                     in [Optional=DefaultIsUndefined] unsigned long index)
+            raises(DOMException);
+        void               deleteRule(in [Optional=DefaultIsUndefined] unsigned long index)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSPageRule.idl b/elemental/idl/third_party/WebCore/css/CSSPageRule.idl
new file mode 100644
index 0000000..b3ea228
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSPageRule.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface CSSPageRule : CSSRule {
+
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString selectorText;
+
+        readonly attribute CSSStyleDeclaration style;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSPrimitiveValue.idl b/elemental/idl/third_party/WebCore/css/CSSPrimitiveValue.idl
new file mode 100644
index 0000000..6c637c9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSPrimitiveValue.idl
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    interface CSSPrimitiveValue : CSSValue {
+
+        // UnitTypes
+        const unsigned short CSS_UNKNOWN    = 0;
+        const unsigned short CSS_NUMBER     = 1;
+        const unsigned short CSS_PERCENTAGE = 2;
+        const unsigned short CSS_EMS        = 3;
+        const unsigned short CSS_EXS        = 4;
+        const unsigned short CSS_PX         = 5;
+        const unsigned short CSS_CM         = 6;
+        const unsigned short CSS_MM         = 7;
+        const unsigned short CSS_IN         = 8;
+        const unsigned short CSS_PT         = 9;
+        const unsigned short CSS_PC         = 10;
+        const unsigned short CSS_DEG        = 11;
+        const unsigned short CSS_RAD        = 12;
+        const unsigned short CSS_GRAD       = 13;
+        const unsigned short CSS_MS         = 14;
+        const unsigned short CSS_S          = 15;
+        const unsigned short CSS_HZ         = 16;
+        const unsigned short CSS_KHZ        = 17;
+        const unsigned short CSS_DIMENSION  = 18;
+        const unsigned short CSS_STRING     = 19;
+        const unsigned short CSS_URI        = 20;
+        const unsigned short CSS_IDENT      = 21;
+        const unsigned short CSS_ATTR       = 22;
+        const unsigned short CSS_COUNTER    = 23;
+        const unsigned short CSS_RECT       = 24;
+        const unsigned short CSS_RGBCOLOR   = 25;
+        const unsigned short CSS_VW         = 26;
+        const unsigned short CSS_VH         = 27;
+        const unsigned short CSS_VMIN       = 28;
+        
+        readonly attribute unsigned short primitiveType;
+
+        [ObjCLegacyUnnamedParameters] void setFloatValue(in [Optional=DefaultIsUndefined] unsigned short unitType,
+                                          in [Optional=DefaultIsUndefined] float floatValue)
+            raises(DOMException);
+        float getFloatValue(in [Optional=DefaultIsUndefined] unsigned short unitType)
+            raises(DOMException);
+        [ObjCLegacyUnnamedParameters] void setStringValue(in [Optional=DefaultIsUndefined] unsigned short stringType, 
+                                           in [Optional=DefaultIsUndefined] DOMString stringValue)
+            raises(DOMException);
+        DOMString getStringValue()
+            raises(DOMException);
+        Counter getCounterValue()
+            raises(DOMException);
+        Rect getRectValue()
+            raises(DOMException);
+        RGBColor getRGBColorValue()
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSRule.idl b/elemental/idl/third_party/WebCore/css/CSSRule.idl
new file mode 100644
index 0000000..05854a2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSRule.idl
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSCustomMarkFunction,
+        JSGenerateIsReachable,
+        CustomToJSObject,
+        ObjCPolymorphic,
+        V8DependentLifetime
+    ] CSSRule {
+
+        // RuleType
+        const unsigned short UNKNOWN_RULE = 0;
+        const unsigned short STYLE_RULE = 1;
+        const unsigned short CHARSET_RULE = 2;
+        const unsigned short IMPORT_RULE = 3;
+        const unsigned short MEDIA_RULE = 4;
+        const unsigned short FONT_FACE_RULE = 5;
+        const unsigned short PAGE_RULE = 6;
+        const unsigned short WEBKIT_KEYFRAMES_RULE = 7;
+        const unsigned short WEBKIT_KEYFRAME_RULE = 8;
+#if defined(ENABLE_CSS_REGIONS) && ENABLE_CSS_REGIONS
+        const unsigned short WEBKIT_REGION_RULE = 10;
+#endif
+
+        readonly attribute unsigned short   type;
+
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString        cssText
+                     setter raises (DOMException);
+
+        readonly attribute CSSStyleSheet    parentStyleSheet;
+        readonly attribute CSSRule          parentRule;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSRuleList.idl b/elemental/idl/third_party/WebCore/css/CSSRuleList.idl
new file mode 100644
index 0000000..7ac533b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSRuleList.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSCustomIsReachable,
+        IndexedGetter,
+        V8DependentLifetime
+    ] CSSRuleList {
+        readonly attribute unsigned long    length;
+        CSSRule           item(in [Optional=DefaultIsUndefined] unsigned long index);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSStyleDeclaration.idl b/elemental/idl/third_party/WebCore/css/CSSStyleDeclaration.idl
new file mode 100644
index 0000000..9846c54
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSStyleDeclaration.idl
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSCustomMarkFunction,
+        JSGenerateIsReachable,
+        JSCustomGetOwnPropertySlotAndDescriptor,
+        CustomNamedSetter,
+#if defined(V8_BINDING) && V8_BINDING
+        NamedGetter,
+#endif
+        IndexedGetter,
+        CustomEnumerateProperty,
+        V8DependentLifetime
+    ] CSSStyleDeclaration {
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString        cssText
+                     setter raises(DOMException);
+
+        [TreatReturnedNullStringAs=Null] DOMString          getPropertyValue(in [Optional=DefaultIsUndefined] DOMString propertyName);
+        [JSCustom] CSSValue           getPropertyCSSValue(in [Optional=DefaultIsUndefined] DOMString propertyName);
+        [TreatReturnedNullStringAs=Null] DOMString          removeProperty(in [Optional=DefaultIsUndefined] DOMString propertyName)
+            raises(DOMException);
+        [TreatReturnedNullStringAs=Null] DOMString          getPropertyPriority(in [Optional=DefaultIsUndefined] DOMString propertyName);
+        [ObjCLegacyUnnamedParameters] void setProperty(in [Optional=DefaultIsUndefined] DOMString propertyName, 
+                                        in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString value, 
+                                        in [Optional=DefaultIsUndefined] DOMString priority)
+            raises(DOMException);
+
+        readonly attribute unsigned long    length;
+        DOMString          item(in [Optional=DefaultIsUndefined] unsigned long index);
+        readonly attribute CSSRule          parentRule;
+
+        // Extensions
+        [TreatReturnedNullStringAs=Null] DOMString          getPropertyShorthand(in [Optional=DefaultIsUndefined] DOMString propertyName);
+        boolean            isPropertyImplicit(in [Optional=DefaultIsUndefined] DOMString propertyName);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSStyleRule.idl b/elemental/idl/third_party/WebCore/css/CSSStyleRule.idl
new file mode 100644
index 0000000..c576329
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSStyleRule.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface CSSStyleRule : CSSRule {
+
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString selectorText;
+
+        readonly attribute CSSStyleDeclaration style;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSStyleSheet.idl b/elemental/idl/third_party/WebCore/css/CSSStyleSheet.idl
new file mode 100644
index 0000000..962c9db
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSStyleSheet.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface [
+        V8CustomToJSObject
+    ] CSSStyleSheet : StyleSheet {
+        readonly attribute CSSRule          ownerRule;
+        readonly attribute CSSRuleList      cssRules;
+
+        [ObjCLegacyUnnamedParameters] unsigned long insertRule(in [Optional=DefaultIsUndefined] DOMString rule, 
+                                                in [Optional=DefaultIsUndefined] unsigned long index)
+            raises(DOMException);
+        void               deleteRule(in [Optional=DefaultIsUndefined] unsigned long index)
+            raises(DOMException);
+
+        // IE Extensions
+        readonly attribute CSSRuleList      rules;
+
+        long addRule(in [Optional=DefaultIsUndefined] DOMString selector,
+                     in [Optional=DefaultIsUndefined] DOMString style,
+                     in [Optional] unsigned long index)
+            raises(DOMException);
+        void removeRule(in [Optional=DefaultIsUndefined] unsigned long index)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSUnknownRule.idl b/elemental/idl/third_party/WebCore/css/CSSUnknownRule.idl
new file mode 100644
index 0000000..b62ceb8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSUnknownRule.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface [
+        OmitConstructor
+    ] CSSUnknownRule : CSSRule {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSValue.idl b/elemental/idl/third_party/WebCore/css/CSSValue.idl
new file mode 100644
index 0000000..2b0ceb3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSValue.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    interface [
+        CustomToJSObject,
+        JSCustomIsReachable,
+        JSCustomFinalize,
+        ObjCPolymorphic,
+        V8DependentLifetime
+    ] CSSValue {
+
+        // UnitTypes
+        const unsigned short CSS_INHERIT         = 0;
+        const unsigned short CSS_PRIMITIVE_VALUE = 1;
+        const unsigned short CSS_VALUE_LIST      = 2;
+        const unsigned short CSS_CUSTOM          = 3;
+
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString cssText
+                     setter raises(DOMException);
+
+        readonly attribute unsigned short cssValueType;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/CSSValueList.idl b/elemental/idl/third_party/WebCore/css/CSSValueList.idl
new file mode 100644
index 0000000..23e27ec
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/CSSValueList.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface [
+        IndexedGetter
+    ] CSSValueList : CSSValue {
+        readonly attribute unsigned long    length;
+        CSSValue           item(in [Optional=DefaultIsUndefined] unsigned long index);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/Counter.idl b/elemental/idl/third_party/WebCore/css/Counter.idl
new file mode 100644
index 0000000..6236c45
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/Counter.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface Counter {
+        readonly attribute DOMString identifier;
+        readonly attribute DOMString listStyle;
+        readonly attribute DOMString separator;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/MediaList.idl b/elemental/idl/third_party/WebCore/css/MediaList.idl
new file mode 100644
index 0000000..35445a3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/MediaList.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module stylesheets {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSGenerateIsReachable,
+        IndexedGetter
+    ] MediaList {
+
+                 attribute [TreatNullAs=NullString, TreatReturnedNullStringAs=Null] DOMString mediaText
+                     setter raises(DOMException);
+        readonly attribute unsigned long length;
+
+        [TreatReturnedNullStringAs=Null] DOMString item(in [Optional=DefaultIsUndefined] unsigned long index);
+        void deleteMedium(in [Optional=DefaultIsUndefined] DOMString oldMedium)
+            raises(DOMException);
+        void appendMedium(in [Optional=DefaultIsUndefined] DOMString newMedium)
+            raises(DOMException);
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/MediaQueryList.idl b/elemental/idl/third_party/WebCore/css/MediaQueryList.idl
new file mode 100644
index 0000000..b4f7b95
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/MediaQueryList.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public License
+ *  along with this library; see the file COPYING.LIB.  If not, write to
+ *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+module view {
+    interface MediaQueryList {
+        readonly attribute DOMString media;
+        readonly attribute boolean matches;
+        void addListener(in [Optional=DefaultIsUndefined] MediaQueryListListener listener);
+        void removeListener(in [Optional=DefaultIsUndefined] MediaQueryListListener listener);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/css/MediaQueryListListener.idl b/elemental/idl/third_party/WebCore/css/MediaQueryListListener.idl
new file mode 100644
index 0000000..d8f383a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/MediaQueryListListener.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public License
+ *  along with this library; see the file COPYING.LIB.  If not, write to
+ *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+module view {
+    interface [
+        JSNoStaticTables,
+        ObjCProtocol,
+        CPPPureInterface,
+        OmitConstructor
+    ] MediaQueryListListener {
+        void queryChanged(in [Optional=DefaultIsUndefined] MediaQueryList list);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/css/RGBColor.idl b/elemental/idl/third_party/WebCore/css/RGBColor.idl
new file mode 100644
index 0000000..1dc87bc
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/RGBColor.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    // Introduced in DOM Level 2:
+    interface RGBColor {
+        readonly attribute CSSPrimitiveValue  red;
+        readonly attribute CSSPrimitiveValue  green;
+        readonly attribute CSSPrimitiveValue  blue;
+
+        // WebKit extensions
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
+        readonly attribute CSSPrimitiveValue  alpha;
+#endif
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        readonly attribute Color              color;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/Rect.idl b/elemental/idl/third_party/WebCore/css/Rect.idl
new file mode 100644
index 0000000..60eb70e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/Rect.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module css {
+
+    interface Rect {
+        readonly attribute CSSPrimitiveValue  top;
+        readonly attribute CSSPrimitiveValue  right;
+        readonly attribute CSSPrimitiveValue  bottom;
+        readonly attribute CSSPrimitiveValue  left;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/StyleMedia.idl b/elemental/idl/third_party/WebCore/css/StyleMedia.idl
new file mode 100644
index 0000000..5dd58da
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/StyleMedia.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module view {
+    interface [
+        JSGenerateIsReachable=ImplFrame
+    ] StyleMedia {
+        readonly attribute DOMString type;
+        boolean matchMedium(in [Optional=DefaultIsUndefined] DOMString mediaquery);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/css/StyleSheet.idl b/elemental/idl/third_party/WebCore/css/StyleSheet.idl
new file mode 100644
index 0000000..9e20d84
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/StyleSheet.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module stylesheets {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSCustomMarkFunction,
+        JSGenerateIsReachable,
+        CustomToJSObject,
+        ObjCPolymorphic,
+        V8DependentLifetime
+    ] StyleSheet {
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString        type;
+                 attribute boolean          disabled;
+        readonly attribute Node             ownerNode;
+        readonly attribute StyleSheet       parentStyleSheet;
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString        href;
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString        title;
+        readonly attribute MediaList        media;
+
+#if defined(LANGUAGE_CPP) && LANGUAGE_CPP
+        // Extra WebCore methods exposed to allowe compile-time casting in C++
+        boolean isCSSStyleSheet();
+#endif
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/StyleSheetList.idl b/elemental/idl/third_party/WebCore/css/StyleSheetList.idl
new file mode 100644
index 0000000..3a7b185
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/StyleSheetList.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module stylesheets {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSGenerateIsReachable=ImplDocument,
+        IndexedGetter,
+        NamedGetter,
+        V8DependentLifetime
+    ] StyleSheetList {
+        readonly attribute unsigned long    length;
+        StyleSheet         item(in [Optional=DefaultIsUndefined] unsigned long index);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/WebKitCSSFilterValue.idl b/elemental/idl/third_party/WebCore/css/WebKitCSSFilterValue.idl
new file mode 100644
index 0000000..3f21913
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/WebKitCSSFilterValue.idl
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module css {
+
+    interface [
+            Conditional=CSS_FILTERS,
+            IndexedGetter,
+            DoNotCheckConstants
+    ] WebKitCSSFilterValue : CSSValueList {
+
+        // OperationTypes
+
+        const unsigned short CSS_FILTER_REFERENCE = 1;
+        const unsigned short CSS_FILTER_GRAYSCALE = 2;
+        const unsigned short CSS_FILTER_SEPIA = 3;
+        const unsigned short CSS_FILTER_SATURATE = 4;
+        const unsigned short CSS_FILTER_HUE_ROTATE = 5;
+        const unsigned short CSS_FILTER_INVERT = 6;
+        const unsigned short CSS_FILTER_OPACITY = 7;
+        const unsigned short CSS_FILTER_BRIGHTNESS = 8;
+        const unsigned short CSS_FILTER_CONTRAST = 9;
+        const unsigned short CSS_FILTER_BLUR = 10;
+        const unsigned short CSS_FILTER_DROP_SHADOW = 11;
+
+#if defined(ENABLE_CSS_SHADERS) && ENABLE_CSS_SHADERS
+        const unsigned short CSS_FILTER_CUSTOM = 12;
+#endif
+
+        readonly attribute unsigned short operationType;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/css/WebKitCSSKeyframeRule.idl b/elemental/idl/third_party/WebCore/css/WebKitCSSKeyframeRule.idl
new file mode 100644
index 0000000..f6eac77
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/WebKitCSSKeyframeRule.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module css {
+
+    // Introduced in DOM Level ?:
+    interface WebKitCSSKeyframeRule : CSSRule {
+
+        attribute DOMString keyText;
+        readonly attribute CSSStyleDeclaration style;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/WebKitCSSKeyframesRule.idl b/elemental/idl/third_party/WebCore/css/WebKitCSSKeyframesRule.idl
new file mode 100644
index 0000000..fa0ea2a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/WebKitCSSKeyframesRule.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module css {
+
+    // Introduced in DOM Level ?:
+    interface [
+        IndexedGetter
+    ] WebKitCSSKeyframesRule : CSSRule {
+
+        attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString name;
+        readonly attribute CSSRuleList cssRules;
+        
+        void insertRule(in [Optional=DefaultIsUndefined] DOMString rule);
+        void deleteRule(in [Optional=DefaultIsUndefined] DOMString key);
+        WebKitCSSKeyframeRule findRule(in [Optional=DefaultIsUndefined] DOMString key);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/WebKitCSSMatrix.idl b/elemental/idl/third_party/WebCore/css/WebKitCSSMatrix.idl
new file mode 100644
index 0000000..08c41aa
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/WebKitCSSMatrix.idl
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2008, 2010 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module css {
+
+    // Introduced in DOM Level ?:
+    interface [
+        Constructor(in [Optional=DefaultIsNullString] DOMString cssValue),
+        ConstructorRaisesException,
+    ] WebKitCSSMatrix {
+
+        // These attributes are simple aliases for certain elements of the 4x4 matrix
+        attribute double a; // alias for m11
+        attribute double b; // alias for m12
+        attribute double c; // alias for m21
+        attribute double d; // alias for m22
+        attribute double e; // alias for m41
+        attribute double f; // alias for m42
+
+        attribute double m11;
+        attribute double m12;
+        attribute double m13;
+        attribute double m14;
+        attribute double m21;
+        attribute double m22;
+        attribute double m23;
+        attribute double m24;
+        attribute double m31;
+        attribute double m32;
+        attribute double m33;
+        attribute double m34;
+        attribute double m41;
+        attribute double m42;
+        attribute double m43;
+        attribute double m44;
+
+        void setMatrixValue(in [Optional=DefaultIsUndefined] DOMString string) raises (DOMException);
+        
+        // Multiply this matrix by secondMatrix, on the right (result = this * secondMatrix)
+        [Immutable] WebKitCSSMatrix multiply(in [Optional=DefaultIsUndefined] WebKitCSSMatrix secondMatrix);
+        
+        // Return the inverse of this matrix. Throw an exception if the matrix is not invertible
+        [Immutable] WebKitCSSMatrix inverse() raises (DOMException);
+        
+        // Return this matrix translated by the passed values.
+        // Passing a NaN will use a value of 0. This allows the 3D form to used for 2D operations    
+        [Immutable] WebKitCSSMatrix translate(in [Optional=DefaultIsUndefined] double x, 
+                                              in [Optional=DefaultIsUndefined] double y, 
+                                              in [Optional=DefaultIsUndefined] double z);
+        
+        // Returns this matrix scaled by the passed values.
+        // Passing scaleX or scaleZ as NaN uses a value of 1, but passing scaleY of NaN 
+        // makes it the same as scaleX. This allows the 3D form to used for 2D operations
+        [Immutable] WebKitCSSMatrix scale(in [Optional=DefaultIsUndefined] double scaleX, 
+                                          in [Optional=DefaultIsUndefined] double scaleY, 
+                                          in [Optional=DefaultIsUndefined] double scaleZ);
+        
+        // Returns this matrix rotated by the passed values.
+        // If rotY and rotZ are NaN, rotate about Z (rotX=0, rotateY=0, rotateZ=rotX).
+        // Otherwise use a rotation value of 0 for any passed NaN.    
+        [Immutable] WebKitCSSMatrix rotate(in [Optional=DefaultIsUndefined] double rotX, 
+                                           in [Optional=DefaultIsUndefined] double rotY, 
+                                           in [Optional=DefaultIsUndefined] double rotZ);
+        
+        // Returns this matrix rotated about the passed axis by the passed angle.
+        // Passing a NaN will use a value of 0. If the axis is (0,0,0) use a value
+        // of (0,0,1).
+        [Immutable] WebKitCSSMatrix rotateAxisAngle(in [Optional=DefaultIsUndefined] double x, 
+                                                    in [Optional=DefaultIsUndefined] double y, 
+                                                    in [Optional=DefaultIsUndefined] double z, 
+                                                    in [Optional=DefaultIsUndefined] double angle);
+
+        // Returns this matrix skewed along the X axis by the passed values.
+        // Passing a NaN will use a value of 0.
+        [Immutable] WebKitCSSMatrix skewX(in [Optional=DefaultIsUndefined] double angle);
+
+        // Returns this matrix skewed along the Y axis by the passed values.
+        // Passing a NaN will use a value of 0.
+        [Immutable] WebKitCSSMatrix skewY(in [Optional=DefaultIsUndefined] double angle);
+
+        [NotEnumerable] DOMString toString();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/WebKitCSSRegionRule.idl b/elemental/idl/third_party/WebCore/css/WebKitCSSRegionRule.idl
new file mode 100644
index 0000000..ec3e6d5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/WebKitCSSRegionRule.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+module css {
+
+    interface [
+        Conditional=CSS_REGIONS,
+    ] WebKitCSSRegionRule : CSSRule {
+        readonly attribute CSSRuleList cssRules;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/css/WebKitCSSTransformValue.idl b/elemental/idl/third_party/WebCore/css/WebKitCSSTransformValue.idl
new file mode 100644
index 0000000..92fde1d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/css/WebKitCSSTransformValue.idl
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module css {
+
+    interface [
+            IndexedGetter,
+            DoNotCheckConstants
+    ] WebKitCSSTransformValue : CSSValueList {
+
+        // OperationTypes
+
+        const unsigned short CSS_TRANSLATE   = 1;
+        const unsigned short CSS_TRANSLATEX  = 2;
+        const unsigned short CSS_TRANSLATEY  = 3;
+        const unsigned short CSS_ROTATE      = 4;
+        const unsigned short CSS_SCALE       = 5;
+        const unsigned short CSS_SCALEX      = 6;
+        const unsigned short CSS_SCALEY      = 7;
+        const unsigned short CSS_SKEW        = 8;
+        const unsigned short CSS_SKEWX       = 9;
+        const unsigned short CSS_SKEWY       = 10;
+        const unsigned short CSS_MATRIX      = 11;
+        const unsigned short CSS_TRANSLATEZ  = 12;
+        const unsigned short CSS_TRANSLATE3D = 13;
+        const unsigned short CSS_ROTATEX     = 14;
+        const unsigned short CSS_ROTATEY     = 15;
+        const unsigned short CSS_ROTATEZ     = 16;
+        const unsigned short CSS_ROTATE3D    = 17;
+        const unsigned short CSS_SCALEZ      = 18;
+        const unsigned short CSS_SCALE3D     = 19;
+        const unsigned short CSS_PERSPECTIVE = 20;
+        const unsigned short CSS_MATRIX3D    = 21;
+
+        readonly attribute unsigned short operationType;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Attr.idl b/elemental/idl/third_party/WebCore/dom/Attr.idl
new file mode 100644
index 0000000..3008967
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Attr.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface [
+        JSCustomMarkFunction,
+        JSGenerateToNativeObject
+    ] Attr : Node {
+
+        // DOM Level 1
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString name;
+
+        readonly attribute boolean specified;
+
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString value 
+                     setter raises(DOMException);
+
+        // DOM Level 2
+
+        readonly attribute Element ownerElement;
+
+        // DOM Level 3
+
+        readonly attribute boolean isId;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // This extension is no longer needed, but it has to remain available in Objective C, as it's public API.
+        readonly attribute CSSStyleDeclaration style;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/BeforeLoadEvent.idl b/elemental/idl/third_party/WebCore/dom/BeforeLoadEvent.idl
new file mode 100644
index 0000000..08dfbbb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/BeforeLoadEvent.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module events {
+
+    interface [
+        ConstructorTemplate=Event
+    ] BeforeLoadEvent : Event {
+        readonly attribute [InitializedByEventConstructor] DOMString url;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/CDATASection.idl b/elemental/idl/third_party/WebCore/dom/CDATASection.idl
new file mode 100644
index 0000000..70a4f55
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/CDATASection.idl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface CDATASection : Text {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/CharacterData.idl b/elemental/idl/third_party/WebCore/dom/CharacterData.idl
new file mode 100644
index 0000000..2bb3d4e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/CharacterData.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface CharacterData : Node {
+
+        attribute [TreatNullAs=NullString] DOMString data
+            setter raises(DOMException);
+
+        readonly attribute unsigned long length;
+        
+        [TreatReturnedNullStringAs=Null, ObjCLegacyUnnamedParameters] DOMString substringData(in [IsIndex,Optional=DefaultIsUndefined] unsigned long offset, 
+                                                                         in [IsIndex,Optional=DefaultIsUndefined] unsigned long length)
+            raises(DOMException);
+
+        void appendData(in [Optional=DefaultIsUndefined] DOMString data)
+            raises(DOMException);
+
+        [ObjCLegacyUnnamedParameters] void insertData(in [IsIndex,Optional=DefaultIsUndefined] unsigned long offset, 
+                                       in [Optional=DefaultIsUndefined] DOMString data)
+            raises(DOMException);
+
+        [ObjCLegacyUnnamedParameters] void deleteData(in [IsIndex,Optional=DefaultIsUndefined] unsigned long offset, 
+                                       in [IsIndex,Optional=DefaultIsUndefined] unsigned long length)
+            raises(DOMException);
+
+        [ObjCLegacyUnnamedParameters] void replaceData(in [IsIndex,Optional=DefaultIsUndefined] unsigned long offset, 
+                                        in [IsIndex,Optional=DefaultIsUndefined] unsigned long length,
+                                        in [Optional=DefaultIsUndefined] DOMString data)
+            raises(DOMException);
+    
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/ClientRect.idl b/elemental/idl/third_party/WebCore/dom/ClientRect.idl
new file mode 100644
index 0000000..7dbdd68
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/ClientRect.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module view {
+
+    interface ClientRect {
+        readonly attribute float top;
+        readonly attribute float right;
+        readonly attribute float bottom;
+        readonly attribute float left;
+        readonly attribute float width;
+        readonly attribute float height;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/ClientRectList.idl b/elemental/idl/third_party/WebCore/dom/ClientRectList.idl
new file mode 100644
index 0000000..02f055e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/ClientRectList.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module view {
+
+    interface [
+        IndexedGetter
+    ] ClientRectList {
+        readonly attribute unsigned long length;
+        ClientRect item(in [IsIndex,Optional=DefaultIsUndefined] unsigned long index);
+        // FIXME: Fix list behavior to allow custom exceptions to be thrown.
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Clipboard.idl b/elemental/idl/third_party/WebCore/dom/Clipboard.idl
new file mode 100644
index 0000000..c94621b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Clipboard.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface Clipboard {
+                 attribute [TreatReturnedNullStringAs=Undefined] DOMString dropEffect;
+                 attribute [TreatReturnedNullStringAs=Undefined] DOMString effectAllowed;
+        readonly attribute [CustomGetter] Array types;
+        readonly attribute FileList files;
+
+        [Custom] void clearData(in [Optional] DOMString type)
+            raises(DOMException);
+        DOMString getData(in DOMString type);
+        boolean setData(in DOMString type, in DOMString data);
+        [Custom] void setDragImage(in HTMLImageElement image, in long x, in long y)
+            raises(DOMException);
+
+        readonly attribute [Conditional=DATA_TRANSFER_ITEMS, V8EnabledAtRuntime=DataTransferItems] DataTransferItemList items;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Comment.idl b/elemental/idl/third_party/WebCore/dom/Comment.idl
new file mode 100644
index 0000000..b9f4e31
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Comment.idl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface Comment : CharacterData {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/CompositionEvent.idl b/elemental/idl/third_party/WebCore/dom/CompositionEvent.idl
new file mode 100644
index 0000000..f66ed5a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/CompositionEvent.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module events {
+
+    // Introduced in DOM Level 3:
+    interface CompositionEvent : UIEvent {
+
+        readonly attribute DOMString data;
+
+        void initCompositionEvent(in [Optional=DefaultIsUndefined] DOMString typeArg, 
+                                  in [Optional=DefaultIsUndefined] boolean canBubbleArg, 
+                                  in [Optional=DefaultIsUndefined] boolean cancelableArg, 
+                                  in [Optional=DefaultIsUndefined] DOMWindow viewArg, 
+                                  in [Optional=DefaultIsUndefined] DOMString dataArg);
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/CustomEvent.idl b/elemental/idl/third_party/WebCore/dom/CustomEvent.idl
new file mode 100644
index 0000000..9158d58
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/CustomEvent.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module events {
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+    // Introduced in DOM Level 3:
+    interface [
+        ConstructorTemplate=Event
+    ] CustomEvent : Event {
+        readonly attribute [InitializedByEventConstructor] DOMObject detail;
+
+        void initCustomEvent(in [Optional=DefaultIsUndefined] DOMString typeArg, 
+                             in [Optional=DefaultIsUndefined] boolean canBubbleArg, 
+                             in [Optional=DefaultIsUndefined] boolean cancelableArg, 
+                             in [Optional=DefaultIsUndefined] DOMObject detailArg);
+    };
+#endif
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DOMCoreException.idl b/elemental/idl/third_party/WebCore/dom/DOMCoreException.idl
new file mode 100644
index 0000000..387bb6b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DOMCoreException.idl
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    exception [
+        JSNoStaticTables,
+        DoNotCheckConstants,
+        InterfaceName=DOMException
+    ] DOMCoreException {
+
+        readonly attribute unsigned short   code;
+        readonly attribute DOMString        name;
+        readonly attribute DOMString        message;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // Override in a Mozilla compatible format
+        [NotEnumerable] DOMString toString();
+#endif
+
+        // ExceptionCode
+        const unsigned short      INDEX_SIZE_ERR                 = 1;
+        const unsigned short      DOMSTRING_SIZE_ERR             = 2;
+        const unsigned short      HIERARCHY_REQUEST_ERR          = 3;
+        const unsigned short      WRONG_DOCUMENT_ERR             = 4;
+        const unsigned short      INVALID_CHARACTER_ERR          = 5;
+        const unsigned short      NO_DATA_ALLOWED_ERR            = 6;
+        const unsigned short      NO_MODIFICATION_ALLOWED_ERR    = 7;
+        const unsigned short      NOT_FOUND_ERR                  = 8;
+        const unsigned short      NOT_SUPPORTED_ERR              = 9;
+        const unsigned short      INUSE_ATTRIBUTE_ERR            = 10;
+        // Introduced in DOM Level 2:
+        const unsigned short      INVALID_STATE_ERR              = 11;
+        // Introduced in DOM Level 2:
+        const unsigned short      SYNTAX_ERR                     = 12;
+        // Introduced in DOM Level 2:
+        const unsigned short      INVALID_MODIFICATION_ERR       = 13;
+        // Introduced in DOM Level 2:
+        const unsigned short      NAMESPACE_ERR                  = 14;
+        // Introduced in DOM Level 2:
+        const unsigned short      INVALID_ACCESS_ERR             = 15;
+        // Introduced in DOM Level 3:
+        const unsigned short      VALIDATION_ERR                 = 16;
+        // Introduced in DOM Level 3:
+        const unsigned short      TYPE_MISMATCH_ERR              = 17;
+        // Introduced as an XHR extension:
+        const unsigned short      SECURITY_ERR                   = 18;
+        // Introduced in HTML5:
+        const unsigned short      NETWORK_ERR                    = 19;
+        const unsigned short      ABORT_ERR                      = 20;
+        const unsigned short      URL_MISMATCH_ERR               = 21;
+        const unsigned short      QUOTA_EXCEEDED_ERR             = 22;
+        // TIMEOUT_ERR is currently unused but was added for completeness.
+        const unsigned short      TIMEOUT_ERR                    = 23;
+        // INVALID_NODE_TYPE_ERR is currently unused but was added for completeness.
+        const unsigned short      INVALID_NODE_TYPE_ERR          = 24;
+        const unsigned short      DATA_CLONE_ERR                 = 25;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DOMError.idl b/elemental/idl/third_party/WebCore/dom/DOMError.idl
new file mode 100644
index 0000000..ee059d4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DOMError.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+  interface [
+    ] DOMError {
+        readonly attribute DOMString name;
+  };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DOMImplementation.idl b/elemental/idl/third_party/WebCore/dom/DOMImplementation.idl
new file mode 100644
index 0000000..cd57099
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DOMImplementation.idl
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface [
+        JSGenerateIsReachable=ImplDocument,
+        V8DependentLifetime
+    ] DOMImplementation {
+
+        // DOM Level 1
+
+        [ObjCLegacyUnnamedParameters] boolean hasFeature(in [Optional=DefaultIsUndefined] DOMString feature, 
+                                          in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString version);
+
+        // DOM Level 2
+
+        [ObjCLegacyUnnamedParameters] DocumentType createDocumentType(in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString qualifiedName,
+                                                       in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString publicId,
+                                                       in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString systemId)
+            raises(DOMException);
+        [ObjCLegacyUnnamedParameters] Document createDocument(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI, 
+                                               in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString qualifiedName, 
+                                               in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DocumentType doctype)
+            raises(DOMException);
+
+        // DOMImplementationCSS interface from DOM Level 2 CSS
+
+        [ObjCLegacyUnnamedParameters] CSSStyleSheet createCSSStyleSheet(in [Optional=DefaultIsUndefined] DOMString title,
+                                                         in [Optional=DefaultIsUndefined] DOMString media)
+            raises(DOMException);
+
+        // HTMLDOMImplementation interface from DOM Level 2 HTML
+
+        HTMLDocument createHTMLDocument(in [Optional=DefaultIsUndefined] DOMString title);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DOMStringList.idl b/elemental/idl/third_party/WebCore/dom/DOMStringList.idl
new file mode 100644
index 0000000..8f059ae
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DOMStringList.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2010 Google Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        IndexedGetter
+    ] DOMStringList {
+        readonly attribute unsigned long length;
+        [TreatReturnedNullStringAs=Null] DOMString item(in [IsIndex,Optional=DefaultIsUndefined] unsigned long index);
+        boolean contains(in [Optional=DefaultIsUndefined] DOMString string);
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/dom/DOMStringMap.idl b/elemental/idl/third_party/WebCore/dom/DOMStringMap.idl
new file mode 100644
index 0000000..980d044
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DOMStringMap.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        JSGenerateIsReachable=ImplElementRoot,
+        NamedGetter,
+        CustomDeleteProperty,
+        CustomEnumerateProperty,
+        CustomNamedSetter,
+        V8CustomToJSObject
+    ] DOMStringMap {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DataTransferItem.idl b/elemental/idl/third_party/WebCore/dom/DataTransferItem.idl
new file mode 100644
index 0000000..0dad338
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DataTransferItem.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=DATA_TRANSFER_ITEMS,
+    ] DataTransferItem {
+        readonly attribute DOMString kind;
+        readonly attribute DOMString type;
+
+        void getAsString(in [Callback,Optional=DefaultIsUndefined] StringCallback callback);
+        Blob getAsFile();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DataTransferItemList.idl b/elemental/idl/third_party/WebCore/dom/DataTransferItemList.idl
new file mode 100644
index 0000000..d1de50e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DataTransferItemList.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=DATA_TRANSFER_ITEMS,
+        IndexedGetter,
+        JSGenerateToNativeObject,
+#if defined(V8_BINDING) && V8_BINDING
+        CustomDeleteProperty,
+#endif
+    ] DataTransferItemList {
+        readonly attribute long length;
+        DataTransferItem item(in [Optional=DefaultIsUndefined] unsigned long index);
+
+        void clear();
+        void add(in File file);
+        void add(in [Optional=DefaultIsUndefined] DOMString data, 
+                 in [Optional=DefaultIsUndefined] DOMString type) raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DeviceMotionEvent.idl b/elemental/idl/third_party/WebCore/dom/DeviceMotionEvent.idl
new file mode 100644
index 0000000..bb55f7c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DeviceMotionEvent.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module core {
+
+    interface [
+        Conditional=DEVICE_ORIENTATION,
+    ] DeviceMotionEvent : Event {
+        readonly attribute [Custom] Acceleration acceleration;
+        readonly attribute [Custom] Acceleration accelerationIncludingGravity;
+        readonly attribute [Custom] RotationRate rotationRate;
+        readonly attribute [Custom] double interval;
+        [Custom] void initDeviceMotionEvent(in [Optional=DefaultIsUndefined] DOMString type, 
+                                            in [Optional=DefaultIsUndefined] boolean bubbles, 
+                                            in [Optional=DefaultIsUndefined] boolean cancelable, 
+                                            in [Optional=DefaultIsUndefined] Acceleration acceleration, 
+                                            in [Optional=DefaultIsUndefined] Acceleration accelerationIncludingGravity, 
+                                            in [Optional=DefaultIsUndefined] RotationRate rotationRate, 
+                                            in [Optional=DefaultIsUndefined] double interval);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DeviceOrientationEvent.idl b/elemental/idl/third_party/WebCore/dom/DeviceOrientationEvent.idl
new file mode 100644
index 0000000..aed38ff
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DeviceOrientationEvent.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=DEVICE_ORIENTATION,
+    ] DeviceOrientationEvent : Event {
+        readonly attribute [Custom] double alpha;
+        readonly attribute [Custom] double beta;
+        readonly attribute [Custom] double gamma;
+        readonly attribute [Custom] boolean absolute;
+        [Custom] void initDeviceOrientationEvent(in [Optional=DefaultIsUndefined] DOMString type, 
+                                                 in [Optional=DefaultIsUndefined] boolean bubbles, 
+                                                 in [Optional=DefaultIsUndefined] boolean cancelable, 
+                                                 in [Optional=DefaultIsUndefined] double alpha, 
+                                                 in [Optional=DefaultIsUndefined] double beta, 
+                                                 in [Optional=DefaultIsUndefined] double gamma,
+                                                 in [Optional=DefaultIsUndefined] boolean absolute);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Document.idl b/elemental/idl/third_party/WebCore/dom/Document.idl
new file mode 100644
index 0000000..b922ca6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Document.idl
@@ -0,0 +1,363 @@
+/*
+ * Copyright (C) 2006, 2007, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007 Samuel Weinig <sam@webkit.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface [
+        CustomToJSObject,
+        JSGenerateToNativeObject,
+        JSInlineGetOwnPropertySlot
+    ] Document : Node {
+
+        // DOM Level 1 Core
+        readonly attribute DocumentType doctype;
+        readonly attribute DOMImplementation implementation;
+        readonly attribute Element documentElement;
+
+        [ReturnNewObject] Element createElement(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString tagName)
+            raises (DOMException);
+        DocumentFragment   createDocumentFragment();
+        [ReturnNewObject] Text createTextNode(in [Optional=DefaultIsUndefined] DOMString data);
+        [ReturnNewObject] Comment createComment(in [Optional=DefaultIsUndefined] DOMString data);
+        [ReturnNewObject] CDATASection createCDATASection(in [Optional=DefaultIsUndefined] DOMString data)
+            raises(DOMException);
+        [ObjCLegacyUnnamedParameters, ReturnNewObject] ProcessingInstruction createProcessingInstruction(in [Optional=DefaultIsUndefined] DOMString target,
+                                                                                     in [Optional=DefaultIsUndefined] DOMString data)
+            raises (DOMException);
+        [ReturnNewObject] Attr createAttribute(in [Optional=DefaultIsUndefined] DOMString name)
+            raises (DOMException);
+        [ReturnNewObject] EntityReference createEntityReference(in [Optional=DefaultIsUndefined] DOMString name)
+            raises(DOMException);
+        NodeList           getElementsByTagName(in [Optional=DefaultIsUndefined] DOMString tagname);
+
+        // Introduced in DOM Level 2:
+
+        [ObjCLegacyUnnamedParameters, ReturnNewObject] Node importNode(in [Optional=DefaultIsUndefined] Node importedNode,
+                                                   in [Optional] boolean deep)
+            raises (DOMException);
+        [ObjCLegacyUnnamedParameters, ReturnNewObject] Element createElementNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
+                                                           in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString qualifiedName)
+            raises (DOMException);
+        [ObjCLegacyUnnamedParameters, ReturnNewObject] Attr createAttributeNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
+                                                          in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString qualifiedName)
+            raises (DOMException);
+        [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
+                                                       in [Optional=DefaultIsUndefined] DOMString localName);
+        Element            getElementById(in [Optional=DefaultIsUndefined] DOMString elementId);
+
+        // DOM Level 3 Core
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString inputEncoding;
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString xmlEncoding;
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString xmlVersion
+                    setter raises (DOMException);
+                 attribute boolean xmlStandalone
+                    setter raises (DOMException);
+
+        Node               adoptNode(in [Optional=DefaultIsUndefined] Node source)
+            raises (DOMException);
+
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString documentURI;
+
+        // DOM Level 2 Events (DocumentEvents interface)
+
+        Event              createEvent(in [Optional=DefaultIsUndefined] DOMString eventType)
+            raises(DOMException);
+
+        // DOM Level 2 Tranversal and Range (DocumentRange interface)
+
+        Range              createRange();
+
+        // DOM Level 2 Tranversal and Range (DocumentTraversal interface)
+
+        [ObjCLegacyUnnamedParameters] NodeIterator createNodeIterator(in [Optional=DefaultIsUndefined] Node root,
+                                                       in [Optional=DefaultIsUndefined] unsigned long whatToShow,
+                                                       in [Optional=DefaultIsUndefined] NodeFilter filter,
+                                                       in [Optional=DefaultIsUndefined] boolean expandEntityReferences)
+            raises(DOMException);
+        [ObjCLegacyUnnamedParameters] TreeWalker createTreeWalker(in [Optional=DefaultIsUndefined] Node root,
+                                                   in [Optional=DefaultIsUndefined] unsigned long whatToShow,
+                                                   in [Optional=DefaultIsUndefined] NodeFilter filter,
+                                                   in [Optional=DefaultIsUndefined] boolean expandEntityReferences)
+            raises(DOMException);
+
+        // DOM Level 2 Abstract Views (DocumentView interface)
+
+        readonly attribute DOMWindow defaultView;
+
+        // DOM Level 2 Style (DocumentStyle interface)
+
+        readonly attribute StyleSheetList styleSheets;
+
+        // DOM Level 2 Style (DocumentCSS interface)
+
+        [ObjCLegacyUnnamedParameters] CSSStyleDeclaration getOverrideStyle(in [Optional=DefaultIsUndefined] Element element,
+                                                            in [Optional=DefaultIsUndefined] DOMString pseudoElement);
+
+        // DOM Level 3 XPath (XPathEvaluator interface)
+        [ObjCLegacyUnnamedParameters] XPathExpression createExpression(in [Optional=DefaultIsUndefined] DOMString expression,
+                                                        in [Optional=DefaultIsUndefined] XPathNSResolver resolver)
+            raises(DOMException);
+        XPathNSResolver    createNSResolver(in Node nodeResolver);
+        [ObjCLegacyUnnamedParameters, V8Custom] XPathResult evaluate(in [Optional=DefaultIsUndefined] DOMString expression,
+                                                      in [Optional=DefaultIsUndefined] Node contextNode,
+                                                      in [Optional=DefaultIsUndefined] XPathNSResolver resolver,
+                                                      in [Optional=DefaultIsUndefined] unsigned short type,
+                                                      in [Optional=DefaultIsUndefined] XPathResult inResult)
+            raises(DOMException);
+
+        // Common extensions
+
+        boolean            execCommand(in [Optional=DefaultIsUndefined] DOMString command,
+                                       in [Optional=DefaultIsUndefined] boolean userInterface,
+                                       in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString value);
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // FIXME: remove the these two versions once [Optional] is implemented for Objective-C.
+        boolean            execCommand(in DOMString command,
+                                       in boolean userInterface);
+        boolean            execCommand(in DOMString command);
+#endif
+
+        boolean            queryCommandEnabled(in [Optional=DefaultIsUndefined] DOMString command);
+        boolean            queryCommandIndeterm(in [Optional=DefaultIsUndefined] DOMString command);
+        boolean            queryCommandState(in [Optional=DefaultIsUndefined] DOMString command);
+        boolean            queryCommandSupported(in [Optional=DefaultIsUndefined] DOMString command);
+        DOMString          queryCommandValue(in [Optional=DefaultIsUndefined] DOMString command);
+
+        // Moved down from HTMLDocument
+
+                 attribute [TreatNullAs=NullString] DOMString title;
+        readonly attribute DOMString referrer;
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+                 attribute [TreatNullAs=NullString] DOMString domain
+                     setter raises (DOMException);
+#else
+        readonly attribute DOMString domain;
+#endif
+        readonly attribute DOMString URL;
+
+                 attribute [TreatNullAs=NullString] DOMString cookie
+                     setter raises (DOMException),
+                     getter raises (DOMException);
+
+        // FIXME: the DOM spec does NOT have this attribute
+        // raising an exception.
+                 attribute HTMLElement body
+                     setter raises (DOMException);
+
+        readonly attribute HTMLHeadElement head;
+        readonly attribute HTMLCollection images;
+        readonly attribute HTMLCollection applets;
+        readonly attribute HTMLCollection links;
+        readonly attribute HTMLCollection forms;
+        readonly attribute HTMLCollection anchors;
+        readonly attribute DOMString lastModified;
+
+        NodeList getElementsByName(in [Optional=DefaultIsUndefined] DOMString elementName);
+
+#if defined(ENABLE_MICRODATA) && ENABLE_MICRODATA
+        NodeList getItems(in [TreatNullAs=NullString, TreatUndefinedAs=NullString, Optional=DefaultIsUndefined] DOMString typeNames);
+#endif
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+                 attribute [Custom] Location location;
+#endif
+
+        // IE extensions
+
+                 attribute [TreatReturnedNullStringAs=Undefined, TreatNullAs=NullString] DOMString charset;
+        readonly attribute [TreatReturnedNullStringAs=Undefined] DOMString defaultCharset;
+        readonly attribute [TreatReturnedNullStringAs=Undefined] DOMString readyState;
+
+        Element            elementFromPoint(in [Optional=DefaultIsUndefined] long x, 
+                                            in [Optional=DefaultIsUndefined] long y);
+        Range              caretRangeFromPoint(in [Optional=DefaultIsUndefined] long x, 
+                                               in [Optional=DefaultIsUndefined] long y);
+
+        // Mozilla extensions
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        DOMSelection       getSelection();
+#endif
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString characterSet;
+
+        // WebKit extensions
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString preferredStylesheetSet;
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString selectedStylesheetSet;
+
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
+        CSSStyleDeclaration createCSSStyleDeclaration();
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // DOM Level 2 Style Interface
+        [ObjCLegacyUnnamedParameters, ObjCUseDefaultView] CSSStyleDeclaration getComputedStyle(in Element element,
+                                                                      in DOMString pseudoElement);
+
+        // WebKit extension
+        // FIXME: remove the first version once [Optional] is implemented for Objective-C.
+        [ObjCUseDefaultView] CSSRuleList getMatchedCSSRules(in Element element,
+                                                  in DOMString pseudoElement);
+        [ObjCUseDefaultView] CSSRuleList getMatchedCSSRules(in Element element,
+                                                  in DOMString pseudoElement,
+                                                  in [Optional] boolean authorOnly);
+                                                  
+#endif
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+        [V8Custom] DOMObject getCSSCanvasContext(in DOMString contextId, in DOMString name, in long width, in long height);
+#endif
+#endif
+
+        // HTML 5
+        NodeList getElementsByClassName(in [Optional=DefaultIsUndefined] DOMString tagname);
+
+        readonly attribute DOMString compatMode;
+
+        // NodeSelector - Selector API
+        Element querySelector(in DOMString selectors)
+            raises(DOMException);
+        NodeList querySelectorAll(in DOMString selectors)
+            raises(DOMException);
+
+#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
+        // Mozilla version
+        readonly attribute [V8EnabledAtRuntime] boolean webkitIsFullScreen;
+        readonly attribute [V8EnabledAtRuntime] boolean webkitFullScreenKeyboardInputAllowed;
+        readonly attribute [V8EnabledAtRuntime] Element webkitCurrentFullScreenElement;
+        [V8EnabledAtRuntime] void webkitCancelFullScreen();
+
+        // W3C version
+        readonly attribute [V8EnabledAtRuntime] boolean webkitFullscreenEnabled;
+        readonly attribute [V8EnabledAtRuntime] Element webkitFullscreenElement;
+        [V8EnabledAtRuntime] void webkitExitFullscreen();
+#endif
+
+#if defined(ENABLE_CSS_REGIONS) && ENABLE_CSS_REGIONS
+        WebKitNamedFlow webkitGetFlowByName(in DOMString name);
+#endif
+
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+        // Event handler DOM attributes
+        attribute [NotEnumerable] EventListener onabort;
+        attribute [NotEnumerable] EventListener onblur;
+        attribute [NotEnumerable] EventListener onchange;
+        attribute [NotEnumerable] EventListener onclick;
+        attribute [NotEnumerable] EventListener oncontextmenu;
+        attribute [NotEnumerable] EventListener ondblclick;
+        attribute [NotEnumerable] EventListener ondrag;
+        attribute [NotEnumerable] EventListener ondragend;
+        attribute [NotEnumerable] EventListener ondragenter;
+        attribute [NotEnumerable] EventListener ondragleave;
+        attribute [NotEnumerable] EventListener ondragover;
+        attribute [NotEnumerable] EventListener ondragstart;
+        attribute [NotEnumerable] EventListener ondrop;
+        attribute [NotEnumerable] EventListener onerror;
+        attribute [NotEnumerable] EventListener onfocus;
+        attribute [NotEnumerable] EventListener oninput;
+        attribute [NotEnumerable] EventListener oninvalid;
+        attribute [NotEnumerable] EventListener onkeydown;
+        attribute [NotEnumerable] EventListener onkeypress;
+        attribute [NotEnumerable] EventListener onkeyup;
+        attribute [NotEnumerable] EventListener onload;
+        attribute [NotEnumerable] EventListener onmousedown;
+        attribute [NotEnumerable] EventListener onmousemove;
+        attribute [NotEnumerable] EventListener onmouseout;
+        attribute [NotEnumerable] EventListener onmouseover;
+        attribute [NotEnumerable] EventListener onmouseup;
+        attribute [NotEnumerable] EventListener onmousewheel;
+        attribute [NotEnumerable] EventListener onreadystatechange;
+        attribute [NotEnumerable] EventListener onscroll;
+        attribute [NotEnumerable] EventListener onselect;
+        attribute [NotEnumerable] EventListener onsubmit;
+
+        // attribute [NotEnumerable] EventListener oncanplay;
+        // attribute [NotEnumerable] EventListener oncanplaythrough;
+        // attribute [NotEnumerable] EventListener ondurationchange;
+        // attribute [NotEnumerable] EventListener onemptied;
+        // attribute [NotEnumerable] EventListener onended;
+        // attribute [NotEnumerable] EventListener onloadeddata;
+        // attribute [NotEnumerable] EventListener onloadedmetadata;
+        // attribute [NotEnumerable] EventListener onloadstart;
+        // attribute [NotEnumerable] EventListener onpause;
+        // attribute [NotEnumerable] EventListener onplay;
+        // attribute [NotEnumerable] EventListener onplaying;
+        // attribute [NotEnumerable] EventListener onprogress;
+        // attribute [NotEnumerable] EventListener onratechange;
+        // attribute [NotEnumerable] EventListener onseeked;
+        // attribute [NotEnumerable] EventListener onseeking;
+        // attribute [NotEnumerable] EventListener onshow;
+        // attribute [NotEnumerable] EventListener onstalled;
+        // attribute [NotEnumerable] EventListener onsuspend;
+        // attribute [NotEnumerable] EventListener ontimeupdate;
+        // attribute [NotEnumerable] EventListener onvolumechange;
+        // attribute [NotEnumerable] EventListener onwaiting;
+
+        // WebKit extensions
+        attribute [NotEnumerable] EventListener onbeforecut;
+        attribute [NotEnumerable] EventListener oncut;
+        attribute [NotEnumerable] EventListener onbeforecopy;
+        attribute [NotEnumerable] EventListener oncopy;
+        attribute [NotEnumerable] EventListener onbeforepaste;
+        attribute [NotEnumerable] EventListener onpaste;
+        attribute [NotEnumerable] EventListener onreset;
+        attribute [NotEnumerable] EventListener onsearch;
+        attribute [NotEnumerable] EventListener onselectstart;
+        attribute [NotEnumerable] EventListener onselectionchange;
+        attribute [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchstart;
+        attribute [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchmove;
+        attribute [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchend;
+        attribute [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchcancel;
+        attribute [NotEnumerable, Conditional=FULLSCREEN_API] EventListener onwebkitfullscreenchange;
+        attribute [NotEnumerable, Conditional=FULLSCREEN_API] EventListener onwebkitfullscreenerror;
+#endif
+
+#if defined(ENABLE_TOUCH_EVENTS) && ENABLE_TOUCH_EVENTS
+        [ReturnNewObject, V8EnabledAtRuntime] Touch createTouch(in [Optional=DefaultIsUndefined] DOMWindow window,
+                                                         in [Optional=DefaultIsUndefined] EventTarget target,
+                                                         in [Optional=DefaultIsUndefined] long identifier,
+                                                         in [Optional=DefaultIsUndefined] long pageX,
+                                                         in [Optional=DefaultIsUndefined] long pageY,
+                                                         in [Optional=DefaultIsUndefined] long screenX,
+                                                         in [Optional=DefaultIsUndefined] long screenY,
+                                                         in [Optional=DefaultIsUndefined] long webkitRadiusX,
+                                                         in [Optional=DefaultIsUndefined] long webkitRadiusY,
+                                                         in [Optional=DefaultIsUndefined] float webkitRotationAngle,
+                                                         in [Optional=DefaultIsUndefined] float webkitForce)
+            raises (DOMException);
+        [ReturnNewObject, V8EnabledAtRuntime, Custom] TouchList createTouchList()
+            raises (DOMException);
+#endif
+
+#if defined(LANGUAGE_CPP) && LANGUAGE_CPP
+        // Extra WebCore methods exposed to allow compile-time casting in C++
+        boolean isHTMLDocument();
+#endif
+
+        // Page visibility API.
+        readonly attribute [Conditional=PAGE_VISIBILITY_API] DOMString webkitVisibilityState;
+        readonly attribute [Conditional=PAGE_VISIBILITY_API] boolean webkitHidden;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DocumentFragment.idl b/elemental/idl/third_party/WebCore/dom/DocumentFragment.idl
new file mode 100644
index 0000000..882b62d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DocumentFragment.idl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface DocumentFragment : Node {
+        // NodeSelector - Selector API
+        Element querySelector(in DOMString selectors)
+            raises(DOMException);
+        NodeList querySelectorAll(in DOMString selectors)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/DocumentType.idl b/elemental/idl/third_party/WebCore/dom/DocumentType.idl
new file mode 100644
index 0000000..7290232
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/DocumentType.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface [
+        JSGenerateToNativeObject
+    ] DocumentType : Node {
+
+        // DOM Level 1
+
+        readonly attribute DOMString name;
+        readonly attribute NamedNodeMap entities;
+        readonly attribute NamedNodeMap notations;
+
+        // DOM Level 2
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString publicId;
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString systemId;
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString internalSubset;        
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Element.idl b/elemental/idl/third_party/WebCore/dom/Element.idl
new file mode 100644
index 0000000..955bd47
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Element.idl
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface [
+        JSGenerateToNativeObject,
+        JSInlineGetOwnPropertySlot
+    ] Element : Node {
+
+        // DOM Level 1 Core
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString tagName;
+
+        [TreatReturnedNullStringAs=Null] DOMString getAttribute(in [Optional=DefaultIsUndefined] DOMString name);
+        [ObjCLegacyUnnamedParameters] void setAttribute(in [Optional=DefaultIsUndefined] DOMString name,
+                                         in [Optional=DefaultIsUndefined] DOMString value)
+            raises(DOMException);
+        void removeAttribute(in [Optional=DefaultIsUndefined] DOMString name);
+        Attr getAttributeNode(in [Optional=DefaultIsUndefined] DOMString name);
+        Attr setAttributeNode(in [Optional=DefaultIsUndefined] Attr newAttr)
+            raises(DOMException);
+        Attr removeAttributeNode(in [Optional=DefaultIsUndefined] Attr oldAttr)
+            raises(DOMException);
+        NodeList getElementsByTagName(in [Optional=DefaultIsUndefined] DOMString name);
+
+        // DOM Level 2 Core
+
+        [ObjCLegacyUnnamedParameters] DOMString getAttributeNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
+                                                in [Optional=DefaultIsUndefined] DOMString localName);
+        [ObjCLegacyUnnamedParameters] void setAttributeNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
+                                           in [Optional=DefaultIsUndefined] DOMString qualifiedName, 
+                                           in [Optional=DefaultIsUndefined] DOMString value)
+            raises(DOMException);
+        [ObjCLegacyUnnamedParameters] void removeAttributeNS(in [TreatNullAs=NullString] DOMString namespaceURI,
+                                              in DOMString localName);
+        [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
+                                                       in [Optional=DefaultIsUndefined] DOMString localName);
+        [ObjCLegacyUnnamedParameters] Attr getAttributeNodeNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
+                                               in [Optional=DefaultIsUndefined] DOMString localName);
+        Attr setAttributeNodeNS(in [Optional=DefaultIsUndefined] Attr newAttr)
+            raises(DOMException);
+        boolean hasAttribute(in DOMString name);
+        [ObjCLegacyUnnamedParameters] boolean hasAttributeNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
+                                              in [Optional=DefaultIsUndefined] DOMString localName);
+
+        readonly attribute CSSStyleDeclaration style;
+
+        // Common extensions
+
+        readonly attribute long offsetLeft;
+        readonly attribute long offsetTop;
+        readonly attribute long offsetWidth;
+        readonly attribute long offsetHeight;
+        readonly attribute Element offsetParent;
+        readonly attribute long clientLeft;
+        readonly attribute long clientTop;
+        readonly attribute long clientWidth;
+        readonly attribute long clientHeight;
+                 attribute long scrollLeft;
+                 attribute long scrollTop;
+        readonly attribute long scrollWidth;
+        readonly attribute long scrollHeight;
+
+        void focus();
+        void blur();
+        void scrollIntoView(in [Optional] boolean alignWithTop);
+
+        // WebKit extensions
+
+        void scrollIntoViewIfNeeded(in [Optional] boolean centerIfNeeded);
+        void scrollByLines(in [Optional=DefaultIsUndefined] long lines);
+        void scrollByPages(in [Optional=DefaultIsUndefined] long pages);
+
+#if defined(ENABLE_ANIMATION_API) && ENABLE_ANIMATION_API
+        WebKitAnimationList webkitGetAnimations();
+#endif
+
+        // HTML 5
+        NodeList getElementsByClassName(in [Optional=DefaultIsUndefined] DOMString name);
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        readonly attribute DOMStringMap dataset;
+#endif
+
+        // NodeSelector - Selector API
+        Element querySelector(in DOMString selectors)
+            raises(DOMException);
+        NodeList querySelectorAll(in DOMString selectors)
+            raises(DOMException);
+
+        // WebKit extension, pending specification.
+        boolean webkitMatchesSelector(in [Optional=DefaultIsUndefined] DOMString selectors)
+            raises(DOMException);
+
+        // ElementTraversal API
+        readonly attribute Element firstElementChild;
+        readonly attribute Element lastElementChild;
+        readonly attribute Element previousElementSibling;
+        readonly attribute Element nextElementSibling;
+        readonly attribute unsigned long childElementCount;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // CSSOM View Module API
+        ClientRectList getClientRects();
+        ClientRect getBoundingClientRect();
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // Objective-C extensions
+        readonly attribute DOMString innerText;
+#endif
+
+#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
+        // Mozilla version
+        const unsigned short ALLOW_KEYBOARD_INPUT = 1;
+        [V8EnabledAtRuntime] void webkitRequestFullScreen(in [Optional=DefaultIsUndefined] unsigned short flags);
+
+        // W3C version
+        [V8EnabledAtRuntime] void webkitRequestFullscreen();
+#endif
+
+        // CSS Regions API
+        readonly attribute DOMString webkitRegionOverflow;
+
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+        // Event handler DOM attributes
+        attribute [NotEnumerable] EventListener onabort;
+        attribute [NotEnumerable] EventListener onblur;
+        attribute [NotEnumerable] EventListener onchange;
+        attribute [NotEnumerable] EventListener onclick;
+        attribute [NotEnumerable] EventListener oncontextmenu;
+        attribute [NotEnumerable] EventListener ondblclick;
+        attribute [NotEnumerable] EventListener ondrag;
+        attribute [NotEnumerable] EventListener ondragend;
+        attribute [NotEnumerable] EventListener ondragenter;
+        attribute [NotEnumerable] EventListener ondragleave;
+        attribute [NotEnumerable] EventListener ondragover;
+        attribute [NotEnumerable] EventListener ondragstart;
+        attribute [NotEnumerable] EventListener ondrop;
+        attribute [NotEnumerable] EventListener onerror;
+        attribute [NotEnumerable] EventListener onfocus;
+        attribute [NotEnumerable] EventListener oninput;
+        attribute [NotEnumerable] EventListener oninvalid;
+        attribute [NotEnumerable] EventListener onkeydown;
+        attribute [NotEnumerable] EventListener onkeypress;
+        attribute [NotEnumerable] EventListener onkeyup;
+        attribute [NotEnumerable] EventListener onload;
+        attribute [NotEnumerable] EventListener onmousedown;
+        attribute [NotEnumerable] EventListener onmousemove;
+        attribute [NotEnumerable] EventListener onmouseout;
+        attribute [NotEnumerable] EventListener onmouseover;
+        attribute [NotEnumerable] EventListener onmouseup;
+        attribute [NotEnumerable] EventListener onmousewheel;
+        attribute [NotEnumerable] EventListener onscroll;
+        attribute [NotEnumerable] EventListener onselect;
+        attribute [NotEnumerable] EventListener onsubmit;
+
+        // attribute [NotEnumerable] EventListener oncanplay;
+        // attribute [NotEnumerable] EventListener oncanplaythrough;
+        // attribute [NotEnumerable] EventListener ondurationchange;
+        // attribute [NotEnumerable] EventListener onemptied;
+        // attribute [NotEnumerable] EventListener onended;
+        // attribute [NotEnumerable] EventListener onloadeddata;
+        // attribute [NotEnumerable] EventListener onloadedmetadata;
+        // attribute [NotEnumerable] EventListener onloadstart;
+        // attribute [NotEnumerable] EventListener onpause;
+        // attribute [NotEnumerable] EventListener onplay;
+        // attribute [NotEnumerable] EventListener onplaying;
+        // attribute [NotEnumerable] EventListener onprogress;
+        // attribute [NotEnumerable] EventListener onratechange;
+        // attribute [NotEnumerable] EventListener onreadystatechange;
+        // attribute [NotEnumerable] EventListener onseeked;
+        // attribute [NotEnumerable] EventListener onseeking;
+        // attribute [NotEnumerable] EventListener onshow;
+        // attribute [NotEnumerable] EventListener onstalled;
+        // attribute [NotEnumerable] EventListener onsuspend;
+        // attribute [NotEnumerable] EventListener ontimeupdate;
+        // attribute [NotEnumerable] EventListener onvolumechange;
+        // attribute [NotEnumerable] EventListener onwaiting;
+
+        // WebKit extensions
+        attribute [NotEnumerable] EventListener onbeforecut;
+        attribute [NotEnumerable] EventListener oncut;
+        attribute [NotEnumerable] EventListener onbeforecopy;
+        attribute [NotEnumerable] EventListener oncopy;
+        attribute [NotEnumerable] EventListener onbeforepaste;
+        attribute [NotEnumerable] EventListener onpaste;
+        attribute [NotEnumerable] EventListener onreset;
+        attribute [NotEnumerable] EventListener onsearch;
+        attribute [NotEnumerable] EventListener onselectstart;
+        attribute [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchstart;
+        attribute [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchmove;
+        attribute [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchend;
+        attribute [NotEnumerable,Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchcancel;
+        attribute [NotEnumerable, Conditional=FULLSCREEN_API] EventListener onwebkitfullscreenchange;
+        attribute [NotEnumerable, Conditional=FULLSCREEN_API] EventListener onwebkitfullscreenerror;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Entity.idl b/elemental/idl/third_party/WebCore/dom/Entity.idl
new file mode 100644
index 0000000..b9ec406
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Entity.idl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface Entity : Node {
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString publicId;
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString systemId;
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString notationName;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/EntityReference.idl b/elemental/idl/third_party/WebCore/dom/EntityReference.idl
new file mode 100644
index 0000000..f652d9a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/EntityReference.idl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface EntityReference : Node {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/ErrorEvent.idl b/elemental/idl/third_party/WebCore/dom/ErrorEvent.idl
new file mode 100644
index 0000000..2a0c2c5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/ErrorEvent.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    interface [
+        JSNoStaticTables,
+        ConstructorTemplate=Event
+    ] ErrorEvent : Event {
+        readonly attribute [InitializedByEventConstructor] DOMString message;
+        readonly attribute [InitializedByEventConstructor] DOMString filename;
+        readonly attribute [InitializedByEventConstructor] unsigned long lineno;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Event.idl b/elemental/idl/third_party/WebCore/dom/Event.idl
new file mode 100644
index 0000000..ab039d0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Event.idl
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2006, 2007, 2009, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module events {
+
+    // Introduced in DOM Level 2:
+    interface [
+        CustomToJSObject,
+        ConstructorTemplate=Event,
+        JSNoStaticTables,
+        ObjCPolymorphic
+    ] Event {
+
+        // DOM PhaseType
+        const unsigned short NONE                = 0;
+        const unsigned short CAPTURING_PHASE     = 1;
+        const unsigned short AT_TARGET           = 2;
+        const unsigned short BUBBLING_PHASE      = 3;
+
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+        // Reverse-engineered from Netscape
+        const unsigned short MOUSEDOWN           = 1;
+        const unsigned short MOUSEUP             = 2;
+        const unsigned short MOUSEOVER           = 4;
+        const unsigned short MOUSEOUT            = 8;
+        const unsigned short MOUSEMOVE           = 16;
+        const unsigned short MOUSEDRAG           = 32;
+        const unsigned short CLICK               = 64;
+        const unsigned short DBLCLICK            = 128;
+        const unsigned short KEYDOWN             = 256;
+        const unsigned short KEYUP               = 512;
+        const unsigned short KEYPRESS            = 1024;
+        const unsigned short DRAGDROP            = 2048;
+        const unsigned short FOCUS               = 4096;
+        const unsigned short BLUR                = 8192;
+        const unsigned short SELECT              = 16384;
+        const unsigned short CHANGE              = 32768;
+#endif
+
+        readonly attribute DOMString        type;
+        readonly attribute EventTarget      target;
+        readonly attribute EventTarget      currentTarget;
+        readonly attribute unsigned short   eventPhase;
+        readonly attribute [InitializedByEventConstructor] boolean bubbles;
+        readonly attribute [InitializedByEventConstructor] boolean cancelable;
+        readonly attribute DOMTimeStamp     timeStamp;
+
+        void               stopPropagation();
+        void               preventDefault();
+        [ObjCLegacyUnnamedParameters] void initEvent(in [Optional=DefaultIsUndefined] DOMString eventTypeArg, 
+                                      in [Optional=DefaultIsUndefined] boolean canBubbleArg, 
+                                      in [Optional=DefaultIsUndefined] boolean cancelableArg);
+
+        // DOM Level 3 Additions.
+        readonly attribute boolean defaultPrevented;
+        void stopImmediatePropagation();
+
+        // IE Extensions
+        readonly attribute EventTarget      srcElement;
+                 attribute boolean          returnValue;
+                 attribute boolean          cancelBubble;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        readonly attribute [Custom] Clipboard        clipboardData;
+#endif
+
+#if defined(LANGUAGE_CPP) && LANGUAGE_CPP
+        // Extra WebCore methods exposed to allow compile-time casting in C++
+        boolean isMouseEvent();
+        boolean isUIEvent();
+#endif
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/EventException.idl b/elemental/idl/third_party/WebCore/dom/EventException.idl
new file mode 100644
index 0000000..9d105cb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/EventException.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    // Introduced in DOM Level 2:
+    exception [
+        JSNoStaticTables,
+        DoNotCheckConstants
+    ] EventException {
+
+        readonly attribute unsigned short   code;
+        readonly attribute DOMString        name;
+        readonly attribute DOMString        message;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // Override in a Mozilla compatible format
+        [NotEnumerable] DOMString toString();
+#endif
+
+        // EventExceptionCode
+        const unsigned short UNSPECIFIED_EVENT_TYPE_ERR = 0;
+        const unsigned short DISPATCH_REQUEST_ERR = 1;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/EventListener.idl b/elemental/idl/third_party/WebCore/dom/EventListener.idl
new file mode 100644
index 0000000..4e83b44
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/EventListener.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module events {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSNoStaticTables,
+        ObjCProtocol,
+        CPPPureInterface,
+        OmitConstructor
+    ] EventListener {
+        void               handleEvent(in Event evt);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/EventTarget.idl b/elemental/idl/third_party/WebCore/dom/EventTarget.idl
new file mode 100644
index 0000000..f1b0ef0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/EventTarget.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module events {
+
+    // Introduced in DOM Level 2:
+    interface [
+        ObjCProtocol,
+        CPPPureInterface,
+        OmitConstructor
+    ] EventTarget {
+        [ObjCLegacyUnnamedParameters] void addEventListener(in DOMString type, 
+                                             in EventListener listener, 
+                                             in [Optional] boolean useCapture);
+        [ObjCLegacyUnnamedParameters] void removeEventListener(in DOMString type, 
+                                                in EventListener listener, 
+                                                in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event event)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/HashChangeEvent.idl b/elemental/idl/third_party/WebCore/dom/HashChangeEvent.idl
new file mode 100644
index 0000000..6c80a95
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/HashChangeEvent.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module events {
+
+    // Introduced in http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#event-hashchange
+    interface [
+        ConstructorTemplate=Event
+    ] HashChangeEvent : Event {
+        void initHashChangeEvent(in [Optional=DefaultIsUndefined] DOMString type, 
+                                 in [Optional=DefaultIsUndefined] boolean canBubble, 
+                                 in [Optional=DefaultIsUndefined] boolean cancelable, 
+                                 in [Optional=DefaultIsUndefined] DOMString oldURL, 
+                                 in [Optional=DefaultIsUndefined] DOMString newURL); 
+        readonly attribute [InitializedByEventConstructor] DOMString oldURL;
+        readonly attribute [InitializedByEventConstructor] DOMString newURL;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/KeyboardEvent.idl b/elemental/idl/third_party/WebCore/dom/KeyboardEvent.idl
new file mode 100644
index 0000000..2c2b7ba
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/KeyboardEvent.idl
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module events {
+
+    // Introduced in DOM Level 3:
+    interface KeyboardEvent : UIEvent {
+
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
+        // KeyLocationCode
+        const unsigned long       KEY_LOCATION_STANDARD      = 0x00;
+        const unsigned long       KEY_LOCATION_LEFT          = 0x01;
+        const unsigned long       KEY_LOCATION_RIGHT         = 0x02;
+        const unsigned long       KEY_LOCATION_NUMPAD        = 0x03;
+#endif
+
+        readonly attribute DOMString        keyIdentifier;
+        readonly attribute unsigned long    keyLocation;
+        readonly attribute boolean          ctrlKey;
+        readonly attribute boolean          shiftKey;
+        readonly attribute boolean          altKey;
+        readonly attribute boolean          metaKey;
+        readonly attribute boolean          altGraphKey;
+
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
+        boolean getModifierState(in [Optional=DefaultIsUndefined] DOMString keyIdentifierArg);
+#endif
+
+        // FIXME: this does not match the version in the DOM spec.
+        void initKeyboardEvent(in [Optional=DefaultIsUndefined] DOMString type, 
+                               in [Optional=DefaultIsUndefined] boolean canBubble, 
+                               in [Optional=DefaultIsUndefined] boolean cancelable, 
+                               in [Optional=DefaultIsUndefined] DOMWindow view, 
+                               in [Optional=DefaultIsUndefined] DOMString keyIdentifier,
+                               in [Optional=DefaultIsUndefined] unsigned long keyLocation,
+                               in [Optional=DefaultIsUndefined] boolean ctrlKey,
+                               in [Optional=DefaultIsUndefined] boolean altKey,
+                               in [Optional=DefaultIsUndefined] boolean shiftKey,
+                               in [Optional=DefaultIsUndefined] boolean metaKey,
+                               in [Optional=DefaultIsUndefined] boolean altGraphKey);
+
+        // WebKit Extensions
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
+        readonly attribute long             keyCode;
+        readonly attribute long             charCode;
+        
+        void initKeyboardEvent(in [Optional=DefaultIsUndefined] DOMString type, 
+                               in [Optional=DefaultIsUndefined] boolean canBubble, 
+                               in [Optional=DefaultIsUndefined] boolean cancelable, 
+                               in [Optional=DefaultIsUndefined] DOMWindow view, 
+                               in [Optional=DefaultIsUndefined] DOMString keyIdentifier,
+                               in [Optional=DefaultIsUndefined] unsigned long keyLocation,
+                               in [Optional=DefaultIsUndefined] boolean ctrlKey,
+                               in [Optional=DefaultIsUndefined] boolean altKey,
+                               in [Optional=DefaultIsUndefined] boolean shiftKey,
+                               in [Optional=DefaultIsUndefined] boolean metaKey);
+#endif
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/MessageChannel.idl b/elemental/idl/third_party/WebCore/dom/MessageChannel.idl
new file mode 100644
index 0000000..d21eb11
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/MessageChannel.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2008, 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module events {
+
+    interface [
+        Constructor,
+        CallWith=ScriptExecutionContext,
+        V8CustomConstructor,
+        JSCustomMarkFunction,
+        JSNoStaticTables
+    ] MessageChannel {
+
+        readonly attribute MessagePort port1;
+        readonly attribute MessagePort port2;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/MessageEvent.idl b/elemental/idl/third_party/WebCore/dom/MessageEvent.idl
new file mode 100644
index 0000000..c8356ed
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/MessageEvent.idl
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2007 Henry Mason <hmason@mac.com>
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module events {
+
+    interface [
+        JSNoStaticTables,
+        ConstructorTemplate=Event
+    ] MessageEvent : Event {
+        readonly attribute [InitializedByEventConstructor] DOMString origin;
+        readonly attribute [InitializedByEventConstructor] DOMString lastEventId;
+        readonly attribute [InitializedByEventConstructor] DOMWindow source;
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        readonly attribute [InitializedByEventConstructor, CachedAttribute, CustomGetter] DOMObject data;
+        readonly attribute [InitializedByEventConstructor, CustomGetter] Array ports;
+
+        [Custom] void initMessageEvent(in [Optional=DefaultIsUndefined] DOMString typeArg, 
+                                       in [Optional=DefaultIsUndefined] boolean canBubbleArg, 
+                                       in [Optional=DefaultIsUndefined] boolean cancelableArg, 
+                                       in [Optional=DefaultIsUndefined] DOMObject dataArg, 
+                                       in [Optional=DefaultIsUndefined] DOMString originArg, 
+                                       in [Optional=DefaultIsUndefined] DOMString lastEventIdArg, 
+                                       in [Optional=DefaultIsUndefined] DOMWindow sourceArg, 
+                                       in [Optional=DefaultIsUndefined] Array messagePorts);
+
+        [Custom] void webkitInitMessageEvent(in [Optional=DefaultIsUndefined] DOMString typeArg,
+                                             in [Optional=DefaultIsUndefined] boolean canBubbleArg,
+                                             in [Optional=DefaultIsUndefined] boolean cancelableArg,
+                                             in [Optional=DefaultIsUndefined] DOMObject dataArg,
+                                             in [Optional=DefaultIsUndefined] DOMString originArg,
+                                             in [Optional=DefaultIsUndefined] DOMString lastEventIdArg,
+                                             in [Optional=DefaultIsUndefined] DOMWindow sourceArg,
+                                             in [Optional=DefaultIsUndefined] Array transferables);
+#else
+        // Code generator for ObjC bindings does not support custom bindings, thus there is no good way to
+        // return a variant value. As workaround, expose the data attribute as SerializedScriptValue.
+        readonly attribute SerializedScriptValue data;
+
+        // There's no good way to expose an array via the ObjC bindings, so for now just expose a single port.
+        readonly attribute MessagePort messagePort;
+
+        void initMessageEvent(in [Optional=DefaultIsUndefined] DOMString typeArg, 
+                              in [Optional=DefaultIsUndefined] boolean canBubbleArg, 
+                              in [Optional=DefaultIsUndefined] boolean cancelableArg, 
+                              in [Optional=DefaultIsUndefined] SerializedScriptValue dataArg, 
+                              in [Optional=DefaultIsUndefined] DOMString originArg, 
+                              in [Optional=DefaultIsUndefined] DOMString lastEventIdArg, 
+                              in [Optional=DefaultIsUndefined] DOMWindow sourceArg, 
+                              in [Optional=DefaultIsUndefined] MessagePort messagePort);
+#endif
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/MessagePort.idl b/elemental/idl/third_party/WebCore/dom/MessagePort.idl
new file mode 100644
index 0000000..f318f79
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/MessagePort.idl
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2011 Google Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module events {
+
+    interface [
+        JSCustomMarkFunction,
+        JSGenerateIsReachable=Impl,
+        ActiveDOMObject,
+        EventTarget,
+        JSNoStaticTables
+    ] MessagePort {
+// We need to have something as an ObjC binding, because MessagePort is used in MessageEvent, which already has one,
+// but we don't want to actually expose the API while it is in flux.
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [Custom] void postMessage(in DOMString message, in [Optional] Array messagePorts)
+            raises(DOMException);
+        [Custom] void webkitPostMessage(in DOMString message, in [Optional] Array transfer)
+            raises(DOMException);
+        void start();
+        void close();
+
+        // event handler attributes
+        attribute EventListener onmessage;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/MouseEvent.idl b/elemental/idl/third_party/WebCore/dom/MouseEvent.idl
new file mode 100644
index 0000000..48eff1e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/MouseEvent.idl
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module events {
+
+    // Introduced in DOM Level 2:
+    interface MouseEvent : UIEvent {
+        readonly attribute long             screenX;
+        readonly attribute long             screenY;
+        readonly attribute long             clientX;
+        readonly attribute long             clientY;
+        readonly attribute [Conditional=POINTER_LOCK, V8EnabledAtRuntime] long webkitMovementX;
+        readonly attribute [Conditional=POINTER_LOCK, V8EnabledAtRuntime] long webkitMovementY;
+        readonly attribute boolean          ctrlKey;
+        readonly attribute boolean          shiftKey;
+        readonly attribute boolean          altKey;
+        readonly attribute boolean          metaKey;
+        readonly attribute unsigned short   button;
+        readonly attribute EventTarget      relatedTarget;
+        
+        [ObjCLegacyUnnamedParameters] void initMouseEvent(in [Optional=DefaultIsUndefined] DOMString type, 
+                                           in [Optional=DefaultIsUndefined] boolean canBubble, 
+                                           in [Optional=DefaultIsUndefined] boolean cancelable, 
+                                           in [Optional=DefaultIsUndefined] DOMWindow view, 
+                                           in [Optional=DefaultIsUndefined] long detail, 
+                                           in [Optional=DefaultIsUndefined] long screenX, 
+                                           in [Optional=DefaultIsUndefined] long screenY, 
+                                           in [Optional=DefaultIsUndefined] long clientX, 
+                                           in [Optional=DefaultIsUndefined] long clientY, 
+                                           in [Optional=DefaultIsUndefined] boolean ctrlKey, 
+                                           in [Optional=DefaultIsUndefined] boolean altKey, 
+                                           in [Optional=DefaultIsUndefined] boolean shiftKey, 
+                                           in [Optional=DefaultIsUndefined] boolean metaKey, 
+                                           in [Optional=DefaultIsUndefined] unsigned short button, 
+                                           in [Optional=DefaultIsUndefined] EventTarget relatedTarget);
+
+        // extensions
+        readonly attribute long             offsetX;
+        readonly attribute long             offsetY;
+        readonly attribute long             x;
+        readonly attribute long             y;
+        readonly attribute Node             fromElement;
+        readonly attribute Node             toElement;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        readonly attribute Clipboard        dataTransfer;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/MutationCallback.idl b/elemental/idl/third_party/WebCore/dom/MutationCallback.idl
new file mode 100644
index 0000000..1638171
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/MutationCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=MUTATION_OBSERVERS,
+        Callback
+    ] MutationCallback {
+        [Custom] boolean handleEvent(in MutationRecordArray mutations, in WebKitMutationObserver observer);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/dom/MutationEvent.idl b/elemental/idl/third_party/WebCore/dom/MutationEvent.idl
new file mode 100644
index 0000000..2765dc9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/MutationEvent.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module events {
+
+    // Introduced in DOM Level 2:
+    interface MutationEvent : Event {
+
+        // attrChangeType
+        const unsigned short MODIFICATION = 1;
+        const unsigned short ADDITION     = 2;
+        const unsigned short REMOVAL      = 3;
+
+        readonly attribute Node           relatedNode;
+        readonly attribute DOMString      prevValue;
+        readonly attribute DOMString      newValue;
+        readonly attribute DOMString      attrName;
+        readonly attribute unsigned short attrChange;
+
+        [ObjCLegacyUnnamedParameters] void initMutationEvent(in [Optional=DefaultIsUndefined] DOMString type, 
+                                              in [Optional=DefaultIsUndefined] boolean canBubble, 
+                                              in [Optional=DefaultIsUndefined] boolean cancelable, 
+                                              in [Optional=DefaultIsUndefined] Node relatedNode, 
+                                              in [Optional=DefaultIsUndefined] DOMString prevValue, 
+                                              in [Optional=DefaultIsUndefined] DOMString newValue, 
+                                              in [Optional=DefaultIsUndefined] DOMString attrName, 
+                                              in [Optional=DefaultIsUndefined] unsigned short attrChange);
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/MutationRecord.idl b/elemental/idl/third_party/WebCore/dom/MutationRecord.idl
new file mode 100644
index 0000000..a7883c5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/MutationRecord.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=MUTATION_OBSERVERS
+    ] MutationRecord {
+        readonly attribute DOMString type;
+        readonly attribute Node target;
+
+        readonly attribute NodeList addedNodes;
+        readonly attribute NodeList removedNodes;
+        readonly attribute Node previousSibling;
+        readonly attribute Node nextSibling;
+
+        readonly attribute DOMString attributeName;
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString attributeNamespace;
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString oldValue;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/dom/NamedNodeMap.idl b/elemental/idl/third_party/WebCore/dom/NamedNodeMap.idl
new file mode 100644
index 0000000..88820c0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/NamedNodeMap.idl
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface [
+        JSGenerateIsReachable=ImplElementRoot,
+        JSCustomMarkFunction,
+        IndexedGetter,
+        NamedGetter,
+        V8CustomToJSObject
+    ] NamedNodeMap {
+
+        Node getNamedItem(in [Optional=DefaultIsUndefined] DOMString name);
+
+        Node setNamedItem(in [Optional=DefaultIsUndefined] Node node)
+            raises(DOMException);
+
+        Node removeNamedItem(in [Optional=DefaultIsUndefined] DOMString name)
+            raises(DOMException);
+
+        Node item(in [Optional=DefaultIsUndefined] unsigned long index);
+        
+        readonly attribute unsigned long length;
+
+
+        // Introduced in DOM Level 2:
+
+        [ObjCLegacyUnnamedParameters] Node getNamedItemNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI, 
+                                           in [Optional=DefaultIsUndefined] DOMString localName)
+            // FIXME: the implementation does take an exceptioncode parameter.
+            /*raises(DOMException)*/;
+
+        Node setNamedItemNS(in [Optional=DefaultIsUndefined] Node node)
+            raises(DOMException);
+
+        [ObjCLegacyUnnamedParameters] Node removeNamedItemNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI, 
+                                              in [Optional=DefaultIsUndefined] DOMString localName)
+            raises(DOMException);
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Node.idl b/elemental/idl/third_party/WebCore/dom/Node.idl
new file mode 100644
index 0000000..fc4a882
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Node.idl
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface [
+        JSCustomHeader,
+        JSCustomMarkFunction,
+        JSCustomPushEventHandlerScope,
+        JSCustomIsReachable,
+        JSCustomFinalize,
+        CustomToJSObject,
+        EventTarget,
+        JSGenerateToNativeObject,
+        JSInlineGetOwnPropertySlot,
+        ObjCPolymorphic,
+        V8DependentLifetime
+    ] Node
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        : Object, EventTarget
+#endif /* defined(LANGUAGE_OBJECTIVE_C) */
+     {
+        // NodeType
+        const unsigned short      ELEMENT_NODE                   = 1;
+        const unsigned short      ATTRIBUTE_NODE                 = 2;
+        const unsigned short      TEXT_NODE                      = 3;
+        const unsigned short      CDATA_SECTION_NODE             = 4;
+        const unsigned short      ENTITY_REFERENCE_NODE          = 5;
+        const unsigned short      ENTITY_NODE                    = 6;
+        const unsigned short      PROCESSING_INSTRUCTION_NODE    = 7;
+        const unsigned short      COMMENT_NODE                   = 8;
+        const unsigned short      DOCUMENT_NODE                  = 9;
+        const unsigned short      DOCUMENT_TYPE_NODE             = 10;
+        const unsigned short      DOCUMENT_FRAGMENT_NODE         = 11;
+        const unsigned short      NOTATION_NODE                  = 12;
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString        nodeName;
+
+                 // FIXME: the spec says this can also raise on retrieval.
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString        nodeValue
+                     setter raises(DOMException);
+
+        readonly attribute unsigned short   nodeType;
+        readonly attribute Node             parentNode;
+        readonly attribute NodeList         childNodes;
+        readonly attribute Node             firstChild;
+        readonly attribute Node             lastChild;
+        readonly attribute Node             previousSibling;
+        readonly attribute Node             nextSibling;
+        readonly attribute NamedNodeMap     attributes;
+        readonly attribute Document         ownerDocument;
+
+        [ObjCLegacyUnnamedParameters, Custom] Node insertBefore(in [CustomReturn] Node newChild,
+                                                                in Node refChild)
+            raises(DOMException);
+        [ObjCLegacyUnnamedParameters, Custom] Node replaceChild(in Node newChild,
+                                                                in [CustomReturn] Node oldChild)
+            raises(DOMException);
+        [Custom] Node               removeChild(in [CustomReturn] Node oldChild)
+            raises(DOMException);
+        [Custom] Node               appendChild(in [CustomReturn] Node newChild)
+            raises(DOMException);
+
+        boolean            hasChildNodes();
+        Node               cloneNode(in [Optional=DefaultIsUndefined] boolean deep);
+        void               normalize();
+
+        // Introduced in DOM Level 2:
+
+        [ObjCLegacyUnnamedParameters] boolean isSupported(in [Optional=DefaultIsUndefined] DOMString feature, 
+                                           in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString version);
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString        namespaceURI;
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString        prefix
+                     setter raises(DOMException);
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString        localName;
+
+        boolean            hasAttributes();
+
+        // Introduced in DOM Level 3:
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString       baseURI;
+
+                 // FIXME: the spec says this can also raise on retrieval.
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString       textContent
+                     setter raises(DOMException);
+
+        boolean            isSameNode(in [Optional=DefaultIsUndefined] Node other);
+        boolean            isEqualNode(in [Optional=DefaultIsUndefined] Node other);
+        [TreatReturnedNullStringAs=Null] DOMString          lookupPrefix(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI);
+        boolean            isDefaultNamespace(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI);
+        [TreatReturnedNullStringAs=Null] DOMString          lookupNamespaceURI(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString prefix);
+
+        // DocumentPosition
+        const unsigned short      DOCUMENT_POSITION_DISCONNECTED = 0x01;
+        const unsigned short      DOCUMENT_POSITION_PRECEDING    = 0x02;
+        const unsigned short      DOCUMENT_POSITION_FOLLOWING    = 0x04;
+        const unsigned short      DOCUMENT_POSITION_CONTAINS     = 0x08;
+        const unsigned short      DOCUMENT_POSITION_CONTAINED_BY = 0x10;
+        const unsigned short      DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
+
+        unsigned short     compareDocumentPosition(in [Optional=DefaultIsUndefined] Node other);
+
+        // Introduced in DOM4
+        boolean contains(in [Optional=DefaultIsUndefined] Node other);
+
+#if 0
+        DOMObject          getFeature(in DOMString feature, 
+                                      in DOMString version);
+        DOMUserData        setUserData(in DOMString key, 
+                                       in DOMUserData data, 
+                                       in UserDataHandler handler);
+        DOMUserData        getUserData(in DOMString key);
+#endif /* 0 */
+
+        // IE extensions
+        readonly attribute Element          parentElement;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // Objective-C extensions
+        readonly attribute boolean          isContentEditable;
+
+        void inspect();
+#endif /* defined(LANGUAGE_OBJECTIVE_C) */
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event event)
+            raises(EventException);
+#endif
+#endif
+
+#if defined(LANGUAGE_CPP) && LANGUAGE_CPP
+        [Custom] void addEventListener(in DOMString type, 
+                                          in EventListener listener, 
+                                          in boolean useCapture);
+        [Custom] void removeEventListener(in DOMString type, 
+                                             in EventListener listener, 
+                                             in boolean useCapture);
+        boolean dispatchEvent(in Event event)
+            raises(EventException);
+#endif
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/NodeFilter.idl b/elemental/idl/third_party/WebCore/dom/NodeFilter.idl
new file mode 100644
index 0000000..5caa5ff
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/NodeFilter.idl
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module traversal {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSCustomMarkFunction,
+        JSCustomToNativeObject,
+        ObjCProtocol,
+        CPPPureInterface
+    ] NodeFilter {
+        // Constants returned by acceptNode
+        const short               FILTER_ACCEPT                  = 1;
+        const short               FILTER_REJECT                  = 2;
+        const short               FILTER_SKIP                    = 3;
+
+        // Constants for whatToShow
+        const unsigned long       SHOW_ALL                       = 0xFFFFFFFF;
+        const unsigned long       SHOW_ELEMENT                   = 0x00000001;
+        const unsigned long       SHOW_ATTRIBUTE                 = 0x00000002;
+        const unsigned long       SHOW_TEXT                      = 0x00000004;
+        const unsigned long       SHOW_CDATA_SECTION             = 0x00000008;
+        const unsigned long       SHOW_ENTITY_REFERENCE          = 0x00000010;
+        const unsigned long       SHOW_ENTITY                    = 0x00000020;
+        const unsigned long       SHOW_PROCESSING_INSTRUCTION    = 0x00000040;
+        const unsigned long       SHOW_COMMENT                   = 0x00000080;
+        const unsigned long       SHOW_DOCUMENT                  = 0x00000100;
+        const unsigned long       SHOW_DOCUMENT_TYPE             = 0x00000200;
+        const unsigned long       SHOW_DOCUMENT_FRAGMENT         = 0x00000400;
+        const unsigned long       SHOW_NOTATION                  = 0x00000800;
+
+        [CallWith=ScriptState] short acceptNode(in [Optional=DefaultIsUndefined] Node n);
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/NodeIterator.idl b/elemental/idl/third_party/WebCore/dom/NodeIterator.idl
new file mode 100644
index 0000000..5b3f288
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/NodeIterator.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module traversal {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSCustomMarkFunction
+    ] NodeIterator {
+        readonly attribute Node root;
+        readonly attribute unsigned long whatToShow;
+        readonly attribute NodeFilter filter;
+        readonly attribute boolean expandEntityReferences;
+        readonly attribute Node referenceNode;
+        readonly attribute boolean pointerBeforeReferenceNode;
+
+        [CallWith=ScriptState] Node nextNode() 
+            raises (DOMException);
+        [CallWith=ScriptState] Node previousNode()
+            raises (DOMException);
+        void detach();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/NodeList.idl b/elemental/idl/third_party/WebCore/dom/NodeList.idl
new file mode 100644
index 0000000..71544d1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/NodeList.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface [
+        JSCustomIsReachable,
+        IndexedGetter,
+        NamedGetter
+    ] NodeList {
+
+        Node item(in [IsIndex,Optional=DefaultIsUndefined] unsigned long index);
+
+        readonly attribute unsigned long length;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Notation.idl b/elemental/idl/third_party/WebCore/dom/Notation.idl
new file mode 100644
index 0000000..2917cb2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Notation.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface Notation : Node {
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString publicId;
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString systemId;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/OverflowEvent.idl b/elemental/idl/third_party/WebCore/dom/OverflowEvent.idl
new file mode 100644
index 0000000..10b9504
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/OverflowEvent.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module events {
+
+    interface [
+        ConstructorTemplate=Event
+    ] OverflowEvent : Event {
+        const unsigned short HORIZONTAL = 0;
+        const unsigned short VERTICAL   = 1;
+        const unsigned short BOTH       = 2;
+        
+        readonly attribute [InitializedByEventConstructor] unsigned short orient;
+        readonly attribute [InitializedByEventConstructor] boolean horizontalOverflow;
+        readonly attribute [InitializedByEventConstructor] boolean verticalOverflow;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        void initOverflowEvent(in [Optional=DefaultIsUndefined] unsigned short orient,
+                               in [Optional=DefaultIsUndefined] boolean horizontalOverflow,
+                               in [Optional=DefaultIsUndefined] boolean verticalOverflow);
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/PageTransitionEvent.idl b/elemental/idl/third_party/WebCore/dom/PageTransitionEvent.idl
new file mode 100644
index 0000000..76c8727
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/PageTransitionEvent.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module events {
+
+    interface [
+        ConstructorTemplate=Event
+    ] PageTransitionEvent : Event {
+        readonly attribute [InitializedByEventConstructor] boolean persisted;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/PopStateEvent.idl b/elemental/idl/third_party/WebCore/dom/PopStateEvent.idl
new file mode 100644
index 0000000..c9343ca
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/PopStateEvent.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module events {
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+    interface [
+        ConstructorTemplate=Event
+    ] PopStateEvent : Event {
+        readonly attribute [InitializedByEventConstructor, CachedAttribute, CustomGetter] DOMObject state;
+    };
+#endif
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/ProcessingInstruction.idl b/elemental/idl/third_party/WebCore/dom/ProcessingInstruction.idl
new file mode 100644
index 0000000..02499a2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/ProcessingInstruction.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface ProcessingInstruction : Node {
+
+        // DOM Level 1
+
+        readonly attribute [TreatReturnedNullStringAs=Null] DOMString target;
+                 attribute [TreatReturnedNullStringAs=Null, TreatNullAs=NullString] DOMString data
+                     setter raises(DOMException);
+
+        // interface LinkStyle from DOM Level 2 Style Sheets
+        readonly attribute StyleSheet sheet;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/ProgressEvent.idl b/elemental/idl/third_party/WebCore/dom/ProgressEvent.idl
new file mode 100644
index 0000000..525fa4a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/ProgressEvent.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module events {
+
+    interface [
+        ConstructorTemplate=Event,
+        JSNoStaticTables
+    ] ProgressEvent : Event {
+        readonly attribute [InitializedByEventConstructor] boolean lengthComputable;
+        readonly attribute [InitializedByEventConstructor] unsigned long long loaded;
+        readonly attribute [InitializedByEventConstructor] unsigned long long total;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Range.idl b/elemental/idl/third_party/WebCore/dom/Range.idl
new file mode 100644
index 0000000..67f4aee
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Range.idl
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module ranges {
+
+    // Introduced in DOM Level 2:
+    interface Range {
+
+        readonly attribute Node startContainer
+            getter raises(DOMException);
+        readonly attribute long startOffset
+            getter raises(DOMException);
+        readonly attribute Node endContainer
+            getter raises(DOMException);
+        readonly attribute long endOffset
+            getter raises(DOMException);
+        readonly attribute boolean collapsed
+            getter raises(DOMException);
+        readonly attribute Node commonAncestorContainer
+            getter raises(DOMException);
+
+        [ObjCLegacyUnnamedParameters] void setStart(in [Optional=DefaultIsUndefined] Node refNode, 
+                                     in [Optional=DefaultIsUndefined] long offset)
+            raises(RangeException, DOMException);
+        [ObjCLegacyUnnamedParameters] void setEnd(in [Optional=DefaultIsUndefined] Node refNode, 
+                                   in [Optional=DefaultIsUndefined] long offset)
+            raises(RangeException, DOMException);
+        void setStartBefore(in [Optional=DefaultIsUndefined] Node refNode)
+            raises(RangeException, DOMException);
+        void setStartAfter(in [Optional=DefaultIsUndefined] Node refNode)
+            raises(RangeException, DOMException);
+        void setEndBefore(in [Optional=DefaultIsUndefined] Node refNode)
+            raises(RangeException, DOMException);
+        void setEndAfter(in [Optional=DefaultIsUndefined] Node refNode)
+            raises(RangeException, DOMException);
+        void collapse(in [Optional=DefaultIsUndefined] boolean toStart)
+            raises(DOMException);
+        void selectNode(in [Optional=DefaultIsUndefined] Node refNode)
+            raises(RangeException, DOMException);
+        void selectNodeContents(in [Optional=DefaultIsUndefined] Node refNode)
+            raises(RangeException, DOMException);
+
+        // CompareHow
+        const unsigned short START_TO_START = 0;
+        const unsigned short START_TO_END   = 1;
+        const unsigned short END_TO_END     = 2;
+        const unsigned short END_TO_START   = 3;
+
+        [ObjCLegacyUnnamedParameters] short compareBoundaryPoints(in [Optional=DefaultIsUndefined] CompareHow how,
+                                                   in [Optional=DefaultIsUndefined] Range sourceRange)
+            raises(DOMException);
+
+        void deleteContents()
+            raises(DOMException);
+        DocumentFragment extractContents()
+            raises(DOMException);
+        DocumentFragment cloneContents()
+            raises(DOMException);
+        void insertNode(in [Optional=DefaultIsUndefined] Node newNode)
+            raises(DOMException, RangeException);
+        void surroundContents(in [Optional=DefaultIsUndefined] Node newParent)
+            raises(DOMException, RangeException);
+        Range cloneRange()
+            raises(DOMException);
+        DOMString toString()
+            raises(DOMException);
+
+        void detach()
+            raises(DOMException);
+
+#if defined(LANGUAGE_JAVASCRIPT) || LANGUAGE_JAVASCRIPT
+        // CSSOM View Module API extensions
+
+        ClientRectList getClientRects();
+        ClientRect getBoundingClientRect();
+#endif
+
+        // extensions
+
+        DocumentFragment createContextualFragment(in [Optional=DefaultIsUndefined] DOMString html)
+            raises(DOMException);
+
+        // WebKit extensions
+
+        boolean intersectsNode(in [Optional=DefaultIsUndefined] Node refNode)
+            raises(RangeException, DOMException);
+
+        short compareNode(in [Optional=DefaultIsUndefined] Node refNode)
+            raises(RangeException, DOMException);
+
+        // CompareResults
+        const unsigned short NODE_BEFORE           = 0;
+        const unsigned short NODE_AFTER            = 1;
+        const unsigned short NODE_BEFORE_AND_AFTER = 2;
+        const unsigned short NODE_INSIDE           = 3;
+
+        short comparePoint(in [Optional=DefaultIsUndefined] Node refNode, 
+                           in [Optional=DefaultIsUndefined] long offset)
+            raises(RangeException, DOMException);
+
+        boolean isPointInRange(in [Optional=DefaultIsUndefined] Node refNode, 
+                               in [Optional=DefaultIsUndefined] long offset)
+            raises(RangeException, DOMException);
+
+        void expand(in [Optional=DefaultIsUndefined] DOMString unit)
+            raises(RangeException, DOMException);
+
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
+        readonly attribute DOMString text;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/RangeException.idl b/elemental/idl/third_party/WebCore/dom/RangeException.idl
new file mode 100644
index 0000000..7ef8c4a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/RangeException.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module ranges {
+
+    exception [
+        DoNotCheckConstants
+    ] RangeException {
+
+        readonly attribute unsigned short   code;
+        readonly attribute DOMString        name;
+        readonly attribute DOMString        message;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [NotEnumerable] DOMString toString();
+#endif
+
+        // DOM Level 2
+
+        const unsigned short BAD_BOUNDARYPOINTS_ERR = 1;
+        const unsigned short INVALID_NODE_TYPE_ERR = 2;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/RequestAnimationFrameCallback.idl b/elemental/idl/third_party/WebCore/dom/RequestAnimationFrameCallback.idl
new file mode 100644
index 0000000..4da6820
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/RequestAnimationFrameCallback.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Callback,
+        Conditional=REQUEST_ANIMATION_FRAME,
+    ] RequestAnimationFrameCallback{
+#if defined(V8_BINDING) && V8_BINDING
+        boolean handleEvent(in DOMTimeStamp time);
+#else
+        [Custom] boolean handleEvent(in DOMTimeStamp time);
+#endif
+        
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/dom/ShadowRoot.idl b/elemental/idl/third_party/WebCore/dom/ShadowRoot.idl
new file mode 100644
index 0000000..8110c1e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/ShadowRoot.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=SHADOW_DOM,
+        Constructor(in Element host),
+        ConstructorRaisesException
+    ] ShadowRoot : DocumentFragment {
+        readonly attribute Element host;
+        readonly attribute Element activeElement;
+        attribute boolean applyAuthorStyles;
+
+        attribute [TreatNullAs=NullString] DOMString innerHTML
+            setter raises(DOMException);
+
+        DOMSelection getSelection();
+        Element getElementById(in [Optional=DefaultIsUndefined] DOMString elementId);
+        NodeList getElementsByClassName(in [Optional=DefaultIsUndefined] DOMString className);
+        NodeList getElementsByTagName(in [Optional=DefaultIsUndefined] DOMString tagName);
+        NodeList getElementsByTagNameNS(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString namespaceURI,
+                                        in [Optional=DefaultIsUndefined] DOMString localName);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/StringCallback.idl b/elemental/idl/third_party/WebCore/dom/StringCallback.idl
new file mode 100644
index 0000000..1e18d83
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/StringCallback.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Callback
+    ] StringCallback {
+        boolean handleEvent(in DOMString data);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Text.idl b/elemental/idl/third_party/WebCore/dom/Text.idl
new file mode 100644
index 0000000..4736e22
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Text.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module core {
+
+    interface Text : CharacterData {
+
+        // DOM Level 1
+
+        Text splitText(in [IsIndex,Optional=DefaultIsUndefined] unsigned long offset)
+            raises (DOMException);
+
+        // Introduced in DOM Level 3:
+        readonly attribute DOMString       wholeText;
+        Text               replaceWholeText(in [Optional=DefaultIsUndefined] DOMString content)
+                                            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/TextEvent.idl b/elemental/idl/third_party/WebCore/dom/TextEvent.idl
new file mode 100644
index 0000000..36f507c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/TextEvent.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module events {
+
+    // Introduced in DOM Level 3:
+    interface TextEvent : UIEvent {
+
+        readonly attribute DOMString data;
+
+        void initTextEvent(in [Optional=DefaultIsUndefined] DOMString typeArg, 
+                           in [Optional=DefaultIsUndefined] boolean canBubbleArg, 
+                           in [Optional=DefaultIsUndefined] boolean cancelableArg, 
+                           in [Optional=DefaultIsUndefined] DOMWindow viewArg, 
+                           in [Optional=DefaultIsUndefined] DOMString dataArg);
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/Touch.idl b/elemental/idl/third_party/WebCore/dom/Touch.idl
new file mode 100644
index 0000000..d2937b3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/Touch.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    interface [
+        Conditional=TOUCH_EVENTS
+    ] Touch {
+        readonly attribute long             clientX;
+        readonly attribute long             clientY;
+        readonly attribute long             screenX;
+        readonly attribute long             screenY;
+        readonly attribute long             pageX;
+        readonly attribute long             pageY;
+        readonly attribute EventTarget      target;
+        readonly attribute unsigned long    identifier;
+        readonly attribute int              webkitRadiusX;
+        readonly attribute int              webkitRadiusY;
+        readonly attribute float            webkitRotationAngle;
+        readonly attribute float            webkitForce;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/dom/TouchEvent.idl b/elemental/idl/third_party/WebCore/dom/TouchEvent.idl
new file mode 100644
index 0000000..4b79757
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/TouchEvent.idl
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    interface [
+        Conditional=TOUCH_EVENTS
+    ] TouchEvent : UIEvent {
+        readonly attribute TouchList touches;
+        readonly attribute TouchList targetTouches;
+        readonly attribute TouchList changedTouches;
+        readonly attribute boolean ctrlKey;
+        readonly attribute boolean shiftKey;
+        readonly attribute boolean altKey;
+        readonly attribute boolean metaKey;
+
+        void initTouchEvent(in [Optional=DefaultIsUndefined] TouchList touches,
+                            in [Optional=DefaultIsUndefined] TouchList targetTouches,
+                            in [Optional=DefaultIsUndefined] TouchList changedTouches,
+                            in [Optional=DefaultIsUndefined] DOMString type,
+                            in [Optional=DefaultIsUndefined] DOMWindow view,
+                            in [Optional=DefaultIsUndefined] long screenX, 
+                            in [Optional=DefaultIsUndefined] long screenY, 
+                            in [Optional=DefaultIsUndefined] long clientX, 
+                            in [Optional=DefaultIsUndefined] long clientY,
+                            in [Optional=DefaultIsUndefined] boolean ctrlKey,
+                            in [Optional=DefaultIsUndefined] boolean altKey,
+                            in [Optional=DefaultIsUndefined] boolean shiftKey,
+                            in [Optional=DefaultIsUndefined] boolean metaKey);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/dom/TouchList.idl b/elemental/idl/third_party/WebCore/dom/TouchList.idl
new file mode 100644
index 0000000..542325c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/TouchList.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    interface [
+        Conditional=TOUCH_EVENTS,
+        IndexedGetter
+    ] TouchList {
+        readonly attribute unsigned long length;
+
+        Touch item(in unsigned long index);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/dom/TreeWalker.idl b/elemental/idl/third_party/WebCore/dom/TreeWalker.idl
new file mode 100644
index 0000000..d9ed36e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/TreeWalker.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module traversal {
+
+    // Introduced in DOM Level 2:
+    interface [
+        JSCustomMarkFunction
+    ] TreeWalker {
+        readonly attribute Node root;
+        readonly attribute unsigned long whatToShow;
+        readonly attribute NodeFilter filter;
+        readonly attribute boolean expandEntityReferences;        
+                 attribute Node currentNode
+                     setter raises(DOMException);
+
+        [CallWith=ScriptState] Node parentNode();
+        [CallWith=ScriptState] Node firstChild();
+        [CallWith=ScriptState] Node lastChild();
+        [CallWith=ScriptState] Node previousSibling();
+        [CallWith=ScriptState] Node nextSibling();
+        [CallWith=ScriptState] Node previousNode();
+        [CallWith=ScriptState] Node nextNode();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/UIEvent.idl b/elemental/idl/third_party/WebCore/dom/UIEvent.idl
new file mode 100644
index 0000000..39a2caf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/UIEvent.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module events {
+
+    // Introduced in DOM Level 2:
+    interface UIEvent : Event {
+        readonly attribute DOMWindow            view;
+        readonly attribute long                 detail;
+        
+        [ObjCLegacyUnnamedParameters] void initUIEvent(in [Optional=DefaultIsUndefined] DOMString type, 
+                                        in [Optional=DefaultIsUndefined] boolean canBubble, 
+                                        in [Optional=DefaultIsUndefined] boolean cancelable, 
+                                        in [Optional=DefaultIsUndefined] DOMWindow view, 
+                                        in [Optional=DefaultIsUndefined] long detail);
+
+        // extensions
+        readonly attribute long                 keyCode;
+        readonly attribute long                 charCode;
+        readonly attribute long                 layerX;
+        readonly attribute long                 layerY;
+        readonly attribute long                 pageX;
+        readonly attribute long                 pageY;
+        readonly attribute long                 which;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/WebKitAnimationEvent.idl b/elemental/idl/third_party/WebCore/dom/WebKitAnimationEvent.idl
new file mode 100644
index 0000000..5e52250
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/WebKitAnimationEvent.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module events {
+
+    interface [
+        ConstructorTemplate=Event
+    ] WebKitAnimationEvent : Event {
+        readonly attribute [InitializedByEventConstructor] DOMString animationName;
+        readonly attribute [InitializedByEventConstructor] double elapsedTime;
+};
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/WebKitMutationObserver.idl b/elemental/idl/third_party/WebCore/dom/WebKitMutationObserver.idl
new file mode 100644
index 0000000..e535f45
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/WebKitMutationObserver.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=MUTATION_OBSERVERS,
+        CustomConstructor,
+        ConstructorParameters=1
+    ] WebKitMutationObserver {
+        [Custom] void observe(in Node target, in MutationObserverOptions options)
+            raises(DOMException);
+        sequence<MutationRecord> takeRecords();
+        void disconnect();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/dom/WebKitNamedFlow.idl b/elemental/idl/third_party/WebCore/dom/WebKitNamedFlow.idl
new file mode 100644
index 0000000..0da90e0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/WebKitNamedFlow.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        JSGenerateToJSObject
+    ] WebKitNamedFlow {
+        readonly attribute DOMString name;
+        readonly attribute boolean overset;
+        NodeList getRegionsByContentNode(in Node contentNode);
+        readonly attribute NodeList contentNodes;
+    };
+}
+
diff --git a/elemental/idl/third_party/WebCore/dom/WebKitTransitionEvent.idl b/elemental/idl/third_party/WebCore/dom/WebKitTransitionEvent.idl
new file mode 100644
index 0000000..39903bd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/WebKitTransitionEvent.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module events {
+
+    interface [
+        ConstructorTemplate=Event
+    ] WebKitTransitionEvent : Event {
+        readonly attribute [InitializedByEventConstructor] DOMString propertyName;
+        readonly attribute [InitializedByEventConstructor] double elapsedTime;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/dom/WheelEvent.idl b/elemental/idl/third_party/WebCore/dom/WheelEvent.idl
new file mode 100644
index 0000000..0282525
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/dom/WheelEvent.idl
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module events {
+
+    // Based off of proposed IDL interface for WheelEvent:
+    interface WheelEvent : UIEvent {
+        readonly attribute long    screenX;
+        readonly attribute long    screenY;
+        readonly attribute long    clientX;
+        readonly attribute long    clientY;
+        readonly attribute boolean ctrlKey;
+        readonly attribute boolean shiftKey;
+        readonly attribute boolean altKey;
+        readonly attribute boolean metaKey;
+        readonly attribute long    wheelDelta;
+        readonly attribute long    wheelDeltaX;
+        readonly attribute long    wheelDeltaY;
+
+        // WebKit Extensions
+        readonly attribute long    offsetX;
+        readonly attribute long    offsetY;
+        readonly attribute long    x;
+        readonly attribute long    y;
+        readonly attribute boolean webkitDirectionInvertedFromDevice;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        readonly attribute boolean isHorizontal;
+#endif /* defined(LANGUAGE_OBJECTIVE_C) */
+
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
+        void initWheelEvent(in [Optional=DefaultIsUndefined] long wheelDeltaX,
+                            in [Optional=DefaultIsUndefined] long wheelDeltaY, 
+                            in [Optional=DefaultIsUndefined] DOMWindow view, 
+                            in [Optional=DefaultIsUndefined] long screenX,
+                            in [Optional=DefaultIsUndefined] long screenY,
+                            in [Optional=DefaultIsUndefined] long clientX,
+                            in [Optional=DefaultIsUndefined] long clientY,
+                            in [Optional=DefaultIsUndefined] boolean ctrlKey,
+                            in [Optional=DefaultIsUndefined] boolean altKey,
+                            in [Optional=DefaultIsUndefined] boolean shiftKey,
+                            in [Optional=DefaultIsUndefined] boolean metaKey);
+#endif /* !defined(LANGUAGE_JAVASCRIPT) */
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        void initWebKitWheelEvent(in [Optional=DefaultIsUndefined] long wheelDeltaX,
+                                  in [Optional=DefaultIsUndefined] long wheelDeltaY, 
+                                  in [Optional=DefaultIsUndefined] DOMWindow view, 
+                                  in [Optional=DefaultIsUndefined] long screenX,
+                                  in [Optional=DefaultIsUndefined] long screenY,
+                                  in [Optional=DefaultIsUndefined] long clientX,
+                                  in [Optional=DefaultIsUndefined] long clientY,
+                                  in [Optional=DefaultIsUndefined] boolean ctrlKey,
+                                  in [Optional=DefaultIsUndefined] boolean altKey,
+                                  in [Optional=DefaultIsUndefined] boolean shiftKey,
+                                  in [Optional=DefaultIsUndefined] boolean metaKey);
+#endif /* defined(LANGUAGE_JAVASCRIPT) */
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/fileapi/Blob.idl b/elemental/idl/third_party/WebCore/fileapi/Blob.idl
new file mode 100644
index 0000000..6b7e59d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/fileapi/Blob.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        JSGenerateIsReachable=Impl,
+        CustomToJSObject,
+        JSNoStaticTables,
+        CustomConstructor,
+        ConstructorParameters=2
+    ] Blob {
+        readonly attribute unsigned long long size;
+        readonly attribute DOMString type;
+
+#if !defined(LANGUAGE_OBJECTIVE_C)
+#if defined(ENABLE_BLOB) && ENABLE_BLOB
+        Blob webkitSlice(in [Optional] long long start, in [Optional] long long end, in [Optional, TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString contentType);
+#endif
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/fileapi/File.idl b/elemental/idl/third_party/WebCore/fileapi/File.idl
new file mode 100644
index 0000000..00bdde6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/fileapi/File.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject,
+        JSNoStaticTables
+    ] File : Blob {
+        readonly attribute DOMString name;
+#if !defined(LANGUAGE_GOBJECT) || !LANGUAGE_GOBJECT
+        readonly attribute [ImplementedAs=lastModifiedDateForBinding] Date lastModifiedDate;
+#endif
+#if defined(ENABLE_DIRECTORY_UPLOAD) && ENABLE_DIRECTORY_UPLOAD
+        readonly attribute DOMString webkitRelativePath;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/fileapi/FileError.idl b/elemental/idl/third_party/WebCore/fileapi/FileError.idl
new file mode 100644
index 0000000..158d784
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/fileapi/FileError.idl
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2010 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=BLOB|FILE_SYSTEM,
+        JSNoStaticTables
+    ] FileError {
+#if !defined(LANGUAGE_OBJECTIVE_C)
+        // FIXME: Some of constant names are already defined in DOMException.h for Objective-C binding and we cannot have the same names here (they are translated into a enum in the same namespace).
+        const unsigned short NOT_FOUND_ERR = 1;
+        const unsigned short SECURITY_ERR = 2;
+        const unsigned short ABORT_ERR = 3;
+        const unsigned short NOT_READABLE_ERR = 4;
+        const unsigned short ENCODING_ERR = 5;
+        const unsigned short NO_MODIFICATION_ALLOWED_ERR = 6;
+        const unsigned short INVALID_STATE_ERR = 7;
+        const unsigned short SYNTAX_ERR = 8;
+        const unsigned short INVALID_MODIFICATION_ERR = 9;
+        const unsigned short QUOTA_EXCEEDED_ERR = 10;
+        const unsigned short TYPE_MISMATCH_ERR = 11;
+        const unsigned short PATH_EXISTS_ERR = 12;
+#endif
+        readonly attribute unsigned short code;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/fileapi/FileException.idl b/elemental/idl/third_party/WebCore/fileapi/FileException.idl
new file mode 100644
index 0000000..33244f9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/fileapi/FileException.idl
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    exception [
+        Conditional=BLOB|FILE_SYSTEM,
+        DoNotCheckConstants,
+        JSNoStaticTables
+    ] FileException {
+
+        readonly attribute unsigned short   code;
+        readonly attribute DOMString        name;
+        readonly attribute DOMString        message;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // Override in a Mozilla compatible format
+        [NotEnumerable] DOMString toString();
+#endif
+
+        // FileExceptionCode
+        const unsigned short NOT_FOUND_ERR = 1;
+        const unsigned short SECURITY_ERR = 2;
+        const unsigned short ABORT_ERR = 3;
+        const unsigned short NOT_READABLE_ERR = 4;
+        const unsigned short ENCODING_ERR = 5;
+        const unsigned short NO_MODIFICATION_ALLOWED_ERR = 6;
+        const unsigned short INVALID_STATE_ERR = 7;
+        const unsigned short SYNTAX_ERR = 8;
+        const unsigned short INVALID_MODIFICATION_ERR = 9;
+        const unsigned short QUOTA_EXCEEDED_ERR = 10;
+        const unsigned short TYPE_MISMATCH_ERR = 11;
+        const unsigned short PATH_EXISTS_ERR = 12;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/fileapi/FileList.idl b/elemental/idl/third_party/WebCore/fileapi/FileList.idl
new file mode 100644
index 0000000..0cdf861
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/fileapi/FileList.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        IndexedGetter,
+        JSNoStaticTables
+    ] FileList {
+        readonly attribute unsigned long length;
+        File item(in [IsIndex] unsigned long index);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/fileapi/FileReader.idl b/elemental/idl/third_party/WebCore/fileapi/FileReader.idl
new file mode 100644
index 0000000..9a6440c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/fileapi/FileReader.idl
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2010 Google Inc.  All rights reserved.
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=BLOB,
+        ActiveDOMObject,
+        Constructor,
+        CallWith=ScriptExecutionContext,
+        EventTarget,
+        JSNoStaticTables
+    ] FileReader {
+        // ready states
+        const unsigned short EMPTY = 0;
+        const unsigned short LOADING = 1;
+        const unsigned short DONE = 2;
+        readonly attribute unsigned short readyState;
+
+        // async read methods
+        void readAsArrayBuffer(in Blob blob)
+            raises(OperationNotAllowedException);
+        void readAsBinaryString(in Blob blob)
+            raises(OperationNotAllowedException);
+        void readAsText(in Blob blob, in [Optional] DOMString encoding)
+            raises(OperationNotAllowedException);
+        void readAsDataURL(in Blob blob)
+            raises(OperationNotAllowedException);
+
+        void abort();
+
+        // file data
+        readonly attribute [Custom] DOMObject result;
+
+        readonly attribute FileError error;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+
+        attribute EventListener onloadstart;
+        attribute EventListener onprogress;
+        attribute EventListener onload;
+        attribute EventListener onabort;
+        attribute EventListener onerror;
+        attribute EventListener onloadend;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/fileapi/FileReaderSync.idl b/elemental/idl/third_party/WebCore/fileapi/FileReaderSync.idl
new file mode 100644
index 0000000..920f368
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/fileapi/FileReaderSync.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=BLOB,
+        Constructor,
+        JSNoStaticTables
+    ] FileReaderSync {
+        [CallWith=ScriptExecutionContext] ArrayBuffer readAsArrayBuffer(in Blob blob)
+            raises(FileException);
+        [CallWith=ScriptExecutionContext] DOMString readAsBinaryString(in Blob blob)
+            raises(FileException);
+        [CallWith=ScriptExecutionContext] DOMString readAsText(in Blob blob, in [Optional] DOMString encoding)
+            raises(FileException);
+        [CallWith=ScriptExecutionContext] DOMString readAsDataURL(in Blob blob)
+            raises(FileException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/fileapi/OperationNotAllowedException.idl b/elemental/idl/third_party/WebCore/fileapi/OperationNotAllowedException.idl
new file mode 100644
index 0000000..50040df
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/fileapi/OperationNotAllowedException.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    exception [
+        Conditional=BLOB,
+        DoNotCheckConstants,
+        JSNoStaticTables
+    ] OperationNotAllowedException {
+        readonly attribute unsigned short   code;
+        readonly attribute DOMString        name;
+        readonly attribute DOMString        message;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // Override in a Mozilla compatible format
+        [NotEnumerable] DOMString toString();
+#endif
+
+        const unsigned short NOT_ALLOWED_ERR = 1;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/fileapi/WebKitBlobBuilder.idl b/elemental/idl/third_party/WebCore/fileapi/WebKitBlobBuilder.idl
new file mode 100644
index 0000000..e0c7c5c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/fileapi/WebKitBlobBuilder.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=LEGACY_WEBKIT_BLOB_BUILDER,
+        Constructor,
+        JSGenerateToNativeObject,
+        JSNoStaticTables
+    ] WebKitBlobBuilder {
+#if !defined(LANGUAGE_OBJECTIVE_C)
+        Blob getBlob(in [Optional, TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString contentType);
+#endif
+        void append(in Blob blob);
+#if defined(ENABLE_BLOB) && ENABLE_BLOB
+        void append(in ArrayBuffer arrayBuffer);
+#endif
+        void append(in DOMString value, in [Optional, TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString endings) raises (DOMException);
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/html/DOMFormData.idl b/elemental/idl/third_party/WebCore/html/DOMFormData.idl
new file mode 100644
index 0000000..73eaa66
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/DOMFormData.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject,
+        InterfaceName=FormData
+    ] DOMFormData {
+        // void append(DOMString name, DOMString value);
+        // void append(DOMString name, Blob value, optional DOMString filename);
+        [Custom] void append(in [Optional=DefaultIsUndefined] DOMString name, 
+                             in [Optional=DefaultIsUndefined] DOMString value,
+                             in [Optional=DefaultIsUndefined] DOMString filename);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/DOMSettableTokenList.idl b/elemental/idl/third_party/WebCore/html/DOMSettableTokenList.idl
new file mode 100644
index 0000000..93bf67f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/DOMSettableTokenList.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        IndexedGetter,
+        JSGenerateToJSObject
+    ] DOMSettableTokenList : DOMTokenList {
+        attribute DOMString value;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/DOMTokenList.idl b/elemental/idl/third_party/WebCore/html/DOMTokenList.idl
new file mode 100644
index 0000000..55b636f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/DOMTokenList.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        JSGenerateIsReachable=ImplElementRoot,
+        IndexedGetter,
+        V8CustomToJSObject
+    ] DOMTokenList {
+        readonly attribute unsigned long length;
+        [TreatReturnedNullStringAs=Null] DOMString item(in unsigned long index);
+        boolean contains(in DOMString token) raises(DOMException);
+        void add(in DOMString token) raises(DOMException);
+        void remove(in DOMString token) raises(DOMException);
+        boolean toggle(in DOMString token) raises(DOMException);
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [NotEnumerable] DOMString toString();
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/DOMURL.idl b/elemental/idl/third_party/WebCore/html/DOMURL.idl
new file mode 100644
index 0000000..44bb638
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/DOMURL.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ * Copyright (C) 2012 Motorola Mobility Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=BLOB,
+        Constructor,
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject,
+        JSNoStaticTables,
+        InterfaceName=URL
+    ] DOMURL {
+#if defined(ENABLE_MEDIA_STREAM) && ENABLE_MEDIA_STREAM
+        [CallWith=ScriptExecutionContext,TreatReturnedNullStringAs=Null] static DOMString createObjectURL(in MediaStream stream);
+#endif
+        [CallWith=ScriptExecutionContext,TreatReturnedNullStringAs=Null] static DOMString createObjectURL(in Blob blob);
+        [CallWith=ScriptExecutionContext] static void revokeObjectURL(in DOMString url);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLAllCollection.idl b/elemental/idl/third_party/WebCore/html/HTMLAllCollection.idl
new file mode 100644
index 0000000..5ceae01
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLAllCollection.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        IndexedGetter,
+        NamedGetter,
+        CustomCall,
+        MasqueradesAsUndefined,
+        JSGenerateIsReachable
+    ] HTMLAllCollection {
+        readonly attribute unsigned long length;
+        [Custom] Node item(in [Optional=DefaultIsUndefined] unsigned long index);
+        [Custom] Node namedItem(in DOMString name);
+
+        // FIXME: This should return an HTMLAllCollection.
+        NodeList tags(in DOMString name);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLAnchorElement.idl b/elemental/idl/third_party/WebCore/html/HTMLAnchorElement.idl
new file mode 100644
index 0000000..7bd174c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLAnchorElement.idl
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLAnchorElement : HTMLElement {
+        attribute [Reflect] DOMString charset;
+        attribute [Reflect] DOMString coords;
+        attribute [Conditional=DOWNLOAD_ATTRIBUTE, Reflect] DOMString download;
+        attribute [Reflect, URL] DOMString href;
+        attribute [Reflect] DOMString hreflang;
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] DOMString ping;
+        attribute [Reflect] DOMString rel;
+        attribute [Reflect] DOMString rev;
+        attribute [Reflect] DOMString shape;
+        attribute [Reflect] DOMString target;
+        attribute [Reflect] DOMString type;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        attribute [Reflect] DOMString accessKey;
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        readonly attribute DOMString hash;
+        readonly attribute DOMString host;
+        readonly attribute DOMString hostname;
+        readonly attribute DOMString pathname;
+        readonly attribute DOMString port;
+        readonly attribute DOMString protocol;
+        readonly attribute DOMString search;
+#else
+        attribute [TreatNullAs=NullString] DOMString hash;
+        attribute [TreatNullAs=NullString] DOMString host;
+        attribute [TreatNullAs=NullString] DOMString hostname;
+        attribute [TreatNullAs=NullString] DOMString pathname;
+        attribute [TreatNullAs=NullString] DOMString port;
+        attribute [TreatNullAs=NullString] DOMString protocol;
+        attribute [TreatNullAs=NullString] DOMString search;
+
+        readonly attribute [TreatNullAs=NullString] DOMString origin;
+#endif
+
+        readonly attribute DOMString text;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [NotEnumerable] DOMString toString();
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // Objective-C extension:
+        readonly attribute URL absoluteLinkURL;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLAppletElement.idl b/elemental/idl/third_party/WebCore/html/HTMLAppletElement.idl
new file mode 100644
index 0000000..8f16a40
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLAppletElement.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        CustomNamedSetter,
+        JSCustomGetOwnPropertySlotAndDescriptor,
+        CustomCall
+    ] HTMLAppletElement : HTMLElement {
+        attribute [Reflect] DOMString align;
+        attribute [Reflect] DOMString alt;
+        attribute [Reflect] DOMString archive;
+        attribute [Reflect] DOMString code;
+        attribute [Reflect] DOMString codeBase;
+        attribute [Reflect] DOMString height;
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        attribute [Reflect] DOMString hspace;
+#else
+        attribute [Reflect] long hspace;
+#endif
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] DOMString object;
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        attribute [Reflect] DOMString vspace;
+#else
+        attribute [Reflect] long vspace;
+#endif
+        attribute [Reflect] DOMString width;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLAreaElement.idl b/elemental/idl/third_party/WebCore/html/HTMLAreaElement.idl
new file mode 100644
index 0000000..dfb9c9b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLAreaElement.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2006, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLAreaElement : HTMLElement {
+        attribute [Reflect] DOMString alt;
+        attribute [Reflect] DOMString coords;
+        attribute [Reflect, URL] DOMString href;
+        attribute [Reflect] boolean noHref;
+        attribute [Reflect] DOMString ping;
+        attribute [Reflect] DOMString shape;
+        attribute [Reflect] DOMString target;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        attribute [Reflect] DOMString accessKey;
+#endif
+        // IE Extensions
+        readonly attribute DOMString hash;
+        readonly attribute DOMString host;
+        readonly attribute DOMString hostname;
+        readonly attribute DOMString pathname;
+        readonly attribute DOMString port;
+        readonly attribute DOMString protocol;
+        readonly attribute DOMString search;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // Objective-C extension:
+        readonly attribute URL absoluteLinkURL;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLAudioElement.idl b/elemental/idl/third_party/WebCore/html/HTMLAudioElement.idl
new file mode 100644
index 0000000..1adf01c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLAudioElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        ActiveDOMObject,
+        Conditional=VIDEO,
+        NamedConstructor=Audio(in [Optional=DefaultIsNullString] DOMString src)
+    ] HTMLAudioElement : HTMLMediaElement {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLBRElement.idl b/elemental/idl/third_party/WebCore/html/HTMLBRElement.idl
new file mode 100644
index 0000000..a6d215d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLBRElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2006, 2009 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLBRElement : HTMLElement {
+        attribute [Reflect] DOMString clear;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLBaseElement.idl b/elemental/idl/third_party/WebCore/html/HTMLBaseElement.idl
new file mode 100644
index 0000000..2750c9e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLBaseElement.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2006, 2009, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLBaseElement : HTMLElement {
+        attribute [Reflect, URL] DOMString href;
+        attribute [Reflect] DOMString target;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLBaseFontElement.idl b/elemental/idl/third_party/WebCore/html/HTMLBaseFontElement.idl
new file mode 100644
index 0000000..95bc92c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLBaseFontElement.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2006, 2009, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLBaseFontElement : HTMLElement {
+        attribute [Reflect] DOMString color;
+        attribute [Reflect] DOMString face;
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        attribute [Reflect] DOMString size; // this changed to a long, but our existing API is a string
+#else
+        attribute [Reflect] long size;
+#endif
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLBodyElement.idl b/elemental/idl/third_party/WebCore/html/HTMLBodyElement.idl
new file mode 100644
index 0000000..a6b7f56
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLBodyElement.idl
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2006, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLBodyElement : HTMLElement {
+        attribute [Reflect] DOMString aLink;
+        attribute [Reflect] DOMString background;
+        attribute [Reflect] DOMString bgColor;
+        attribute [Reflect] DOMString link;
+        attribute [Reflect] DOMString text;
+        attribute [Reflect] DOMString vLink;
+
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+        // Event handler attributes
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onbeforeunload;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onhashchange;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onmessage;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onoffline;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener ononline;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onpopstate;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onresize;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onstorage;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onunload;
+
+        attribute [Conditional=ORIENTATION_EVENTS, NotEnumerable, JSWindowEventListener] EventListener onorientationchange;
+
+        // Overrides of Element attributes (with different implementation in bindings).
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onblur;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onerror;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onfocus;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onload;
+
+        // Not implemented yet.
+        // attribute [NotEnumerable, JSWindowEventListener] EventListener onafterprint;
+        // attribute [NotEnumerable, JSWindowEventListener] EventListener onbeforeprint;
+        // attribute [NotEnumerable, JSWindowEventListener] EventListener onredo;
+        // attribute [NotEnumerable, JSWindowEventListener] EventListener onundo;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLButtonElement.idl b/elemental/idl/third_party/WebCore/html/HTMLButtonElement.idl
new file mode 100644
index 0000000..692fd61
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLButtonElement.idl
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLButtonElement : HTMLElement {
+        attribute [Reflect] boolean autofocus;
+        attribute [Reflect] boolean disabled;
+        readonly attribute HTMLFormElement form;
+        attribute [Reflect, URL] DOMString formAction;
+        attribute [TreatNullAs=NullString] DOMString formEnctype;
+        attribute [TreatNullAs=NullString] DOMString formMethod;
+        attribute [Reflect] boolean formNoValidate;
+        attribute [Reflect] DOMString formTarget;
+        attribute [Reflect] DOMString name;
+        readonly attribute DOMString type;
+        attribute [Reflect] DOMString value;
+
+        readonly attribute boolean willValidate;
+        readonly attribute ValidityState validity;
+        readonly attribute DOMString validationMessage;
+        boolean checkValidity();
+        void setCustomValidity(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);
+
+        readonly attribute NodeList labels;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        attribute [Reflect] DOMString accessKey;
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        void click();
+#endif
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLCanvasElement.idl b/elemental/idl/third_party/WebCore/html/HTMLCanvasElement.idl
new file mode 100644
index 0000000..2be96a5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLCanvasElement.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2006, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        JSGenerateToNativeObject
+    ] HTMLCanvasElement : HTMLElement {
+
+        attribute long width;
+        attribute long height;
+
+        [Custom] DOMString toDataURL(in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString type)
+            raises(DOMException);
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+        // The custom binding is needed to handle context creation attributes.
+        [Custom] DOMObject getContext(in [Optional=DefaultIsUndefined] DOMString contextId);
+#endif
+#endif
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLCollection.idl b/elemental/idl/third_party/WebCore/html/HTMLCollection.idl
new file mode 100644
index 0000000..7783776
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLCollection.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        IndexedGetter,
+        NamedGetter,
+        CustomToJSObject,
+        JSGenerateIsReachable,
+        ObjCPolymorphic
+    ] HTMLCollection {
+        readonly attribute unsigned long length;
+        Node item(in [Optional=DefaultIsUndefined] unsigned long index);
+        [Custom] Node namedItem(in [Optional=DefaultIsUndefined] DOMString name);
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        NodeList tags(in [Optional=DefaultIsUndefined] DOMString name);
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLDListElement.idl b/elemental/idl/third_party/WebCore/html/HTMLDListElement.idl
new file mode 100644
index 0000000..1a9326f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLDListElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLDListElement : HTMLElement {
+        attribute [Reflect] boolean compact;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLDataListElement.idl b/elemental/idl/third_party/WebCore/html/HTMLDataListElement.idl
new file mode 100644
index 0000000..1f38105
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLDataListElement.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2009, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=DATALIST,
+    ] HTMLDataListElement : HTMLElement {
+        readonly attribute HTMLCollection options;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLDetailsElement.idl b/elemental/idl/third_party/WebCore/html/HTMLDetailsElement.idl
new file mode 100644
index 0000000..5ad9508
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLDetailsElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLDetailsElement : HTMLElement {
+        attribute [Reflect] boolean open;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLDirectoryElement.idl b/elemental/idl/third_party/WebCore/html/HTMLDirectoryElement.idl
new file mode 100644
index 0000000..b096974
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLDirectoryElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLDirectoryElement : HTMLElement {
+        attribute [Reflect] boolean compact;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLDivElement.idl b/elemental/idl/third_party/WebCore/html/HTMLDivElement.idl
new file mode 100644
index 0000000..90fb84f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLDivElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLDivElement : HTMLElement {
+        attribute [Reflect] DOMString align;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLDocument.idl b/elemental/idl/third_party/WebCore/html/HTMLDocument.idl
new file mode 100644
index 0000000..de9b51d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLDocument.idl
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        CustomNamedGetter,
+        V8CustomToJSObject
+    ] HTMLDocument : Document {
+        [JSCustom, V8Custom] void open();
+        void close();
+        [Custom] void write(in [Optional=DefaultIsUndefined] DOMString text);
+        [Custom] void writeln(in [Optional=DefaultIsUndefined] DOMString text);
+
+        readonly attribute HTMLCollection embeds;
+        readonly attribute HTMLCollection plugins;
+        readonly attribute HTMLCollection scripts;
+
+        // Extensions
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // FIXME: This should eventually be available (if they are wanted) for all languages.
+                 attribute [Custom, Deletable] HTMLAllCollection all;
+#endif
+
+        void clear();
+
+        void captureEvents();
+        void releaseEvents();
+
+        readonly attribute long width;
+        readonly attribute long height;
+                 attribute [TreatNullAs=NullString] DOMString dir;
+                 attribute [TreatNullAs=NullString] DOMString designMode;
+        readonly attribute DOMString compatMode;
+
+        readonly attribute Element activeElement;
+        boolean hasFocus();
+
+        // Deprecated attributes
+                 attribute [TreatNullAs=NullString] DOMString bgColor;
+                 attribute [TreatNullAs=NullString] DOMString fgColor;
+                 attribute [TreatNullAs=NullString] DOMString alinkColor;
+                 attribute [TreatNullAs=NullString] DOMString linkColor;
+                 attribute [TreatNullAs=NullString] DOMString vlinkColor;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLElement.idl b/elemental/idl/third_party/WebCore/html/HTMLElement.idl
new file mode 100644
index 0000000..4f5f236
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLElement.idl
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        JSGenerateToNativeObject,
+        JSCustomPushEventHandlerScope,
+        V8CustomToJSObject
+    ] HTMLElement : Element {
+                 // iht.com relies on id returning the empty string when no id is present. 
+                 // Other browsers do this as well. So we don't convert null to JS null.
+                 attribute [Reflect] DOMString id;
+                 attribute [Reflect] DOMString title;
+                 attribute [Reflect] DOMString lang;
+                 attribute boolean             translate;
+                 attribute [Reflect] DOMString dir;
+                 attribute [Reflect=class] DOMString className;
+                 readonly attribute DOMTokenList classList;
+
+                 attribute long              tabIndex;
+                 attribute boolean           draggable;
+                 attribute [Reflect] DOMString webkitdropzone;
+                 attribute [Reflect] boolean hidden;
+                 attribute [Reflect] DOMString accessKey;
+
+        // Extensions
+                 attribute [TreatNullAs=NullString] DOMString innerHTML
+                     setter raises(DOMException);
+                 attribute [TreatNullAs=NullString] DOMString innerText
+                     setter raises(DOMException);
+                 attribute [TreatNullAs=NullString] DOMString outerHTML
+                     setter raises(DOMException);
+                 attribute [TreatNullAs=NullString] DOMString outerText
+                     setter raises(DOMException);
+
+        Element insertAdjacentElement(in [Optional=DefaultIsUndefined] DOMString where,
+                                      in [Optional=DefaultIsUndefined] Element element)
+            raises(DOMException);
+        void insertAdjacentHTML(in [Optional=DefaultIsUndefined] DOMString where,
+                                in [Optional=DefaultIsUndefined] DOMString html)
+            raises(DOMException);
+        void insertAdjacentText(in [Optional=DefaultIsUndefined] DOMString where,
+                                in [Optional=DefaultIsUndefined] DOMString text)
+            raises(DOMException);
+
+        readonly attribute HTMLCollection children;
+
+                 attribute [TreatNullAs=NullString] DOMString contentEditable
+                     setter raises(DOMException);
+        readonly attribute boolean isContentEditable;
+
+                 attribute boolean spellcheck;
+
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C // No Objective-C bindings yet.
+                 attribute [Conditional=MICRODATA, Reflect] boolean itemScope;
+        readonly attribute [Conditional=MICRODATA] DOMSettableTokenList itemType;
+                 attribute [Conditional=MICRODATA, Reflect, URL] DOMString itemId;
+
+        readonly attribute [Conditional=MICRODATA] DOMSettableTokenList itemRef;
+        readonly attribute [Conditional=MICRODATA] DOMSettableTokenList itemProp;
+
+#if defined(ENABLE_MICRODATA) && ENABLE_MICRODATA
+        readonly attribute [Conditional=MICRODATA] HTMLPropertiesCollection properties;
+#endif
+#endif
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+                 attribute [Conditional=MICRODATA, Custom] DOMObject itemValue
+                     setter raises(DOMException);
+#endif
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        readonly attribute DOMString titleDisplayString;
+#endif
+
+        void click();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLEmbedElement.idl b/elemental/idl/third_party/WebCore/html/HTMLEmbedElement.idl
new file mode 100644
index 0000000..b6e3c16
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLEmbedElement.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        CustomNamedSetter,
+        JSCustomGetOwnPropertySlotAndDescriptor,
+        CustomCall
+    ] HTMLEmbedElement : HTMLElement {
+    attribute [Reflect] DOMString align;
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+    attribute [Reflect] DOMString height;
+#else
+    attribute [Reflect] long height;
+#endif
+    attribute [Reflect] DOMString name;
+    attribute [Reflect, URL] DOMString src;
+    attribute [Reflect] DOMString type;
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+    attribute [Reflect] DOMString width;
+#else
+    attribute [Reflect] long width;
+#endif
+
+#if defined(ENABLE_SVG) && ENABLE_SVG
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C || defined(ENABLE_SVG_DOM_OBJC_BINDINGS) && ENABLE_SVG_DOM_OBJC_BINDINGS
+    [CheckSecurityForNode] SVGDocument getSVGDocument() raises(DOMException);
+#endif
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLFieldSetElement.idl b/elemental/idl/third_party/WebCore/html/HTMLFieldSetElement.idl
new file mode 100644
index 0000000..d67b3f6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLFieldSetElement.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLFieldSetElement : HTMLElement {
+        attribute [Reflect] boolean disabled;
+        readonly attribute HTMLFormElement form;
+        attribute [Reflect] DOMString name;
+
+        readonly attribute DOMString type;
+
+        readonly attribute HTMLCollection elements;
+
+        readonly attribute boolean         willValidate;
+        readonly attribute ValidityState   validity;
+        readonly attribute DOMString       validationMessage;
+        boolean  checkValidity();
+        void     setCustomValidity(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLFontElement.idl b/elemental/idl/third_party/WebCore/html/HTMLFontElement.idl
new file mode 100644
index 0000000..141816d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLFontElement.idl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLFontElement : HTMLElement {
+        attribute [Reflect] DOMString color;
+        attribute [Reflect] DOMString face;
+        attribute [Reflect] DOMString size;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLFormElement.idl b/elemental/idl/third_party/WebCore/html/HTMLFormElement.idl
new file mode 100644
index 0000000..b6a536c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLFormElement.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        IndexedGetter,
+        CustomNamedGetter
+    ] HTMLFormElement : HTMLElement {
+        attribute [Reflect=accept_charset] DOMString acceptCharset;
+        attribute [Reflect, URL] DOMString action;
+        attribute [Reflect] DOMString autocomplete;
+        attribute [TreatNullAs=NullString] DOMString enctype;
+        attribute [TreatNullAs=NullString] DOMString encoding;
+        attribute [TreatNullAs=NullString] DOMString method;
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] boolean noValidate;
+        attribute [Reflect] DOMString target;
+
+        readonly attribute HTMLCollection elements;
+        readonly attribute long length;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [ImplementedAs=submitFromJavaScript] void submit();
+#else
+        void submit();
+#endif
+        void reset();
+        boolean checkValidity();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLFrameElement.idl b/elemental/idl/third_party/WebCore/html/HTMLFrameElement.idl
new file mode 100644
index 0000000..f40f7b1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLFrameElement.idl
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLFrameElement : HTMLElement {
+
+        attribute [Reflect] DOMString frameBorder;
+        attribute [Reflect] DOMString longDesc;
+        attribute [Reflect] DOMString marginHeight;
+        attribute [Reflect] DOMString marginWidth;
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] boolean noResize;
+        attribute [Reflect] DOMString scrolling;
+        attribute [Reflect, URL] DOMString src;
+
+        // Introduced in DOM Level 2:
+        readonly attribute [CheckSecurityForNode] Document contentDocument;
+
+        // Extensions
+        readonly attribute DOMWindow contentWindow;
+
+#if defined(ENABLE_SVG) && ENABLE_SVG
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C || defined(ENABLE_SVG_DOM_OBJC_BINDINGS) && ENABLE_SVG_DOM_OBJC_BINDINGS
+        [CheckSecurityForNode] SVGDocument getSVGDocument()
+            raises(DOMException);
+#endif
+#endif
+
+        attribute [TreatNullAs=NullString, CustomSetter] DOMString location;
+
+        readonly attribute long width;
+        readonly attribute long height;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLFrameSetElement.idl b/elemental/idl/third_party/WebCore/html/HTMLFrameSetElement.idl
new file mode 100644
index 0000000..a3d4b3e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLFrameSetElement.idl
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2006, 2007, 2009, 2010 Apple Inc. All rights reserve
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        CustomNamedGetter
+    ] HTMLFrameSetElement : HTMLElement {
+        attribute [Reflect] DOMString cols;
+        attribute [Reflect] DOMString rows;
+
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+        // Event handler attributes
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onbeforeunload;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onhashchange;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onmessage;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onoffline;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener ononline;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onpopstate;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onresize;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onstorage;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onunload;
+
+        attribute [Conditional=ORIENTATION_EVENTS, NotEnumerable, JSWindowEventListener] EventListener onorientationchange;
+
+        // Overrides of Element attributes (with different implementation in bindings).
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onblur;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onerror;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onfocus;
+        attribute [NotEnumerable, JSWindowEventListener] EventListener onload;
+
+        // Not implemented yet.
+        // attribute [NotEnumerable, JSWindowEventListener] EventListener onafterprint;
+        // attribute [NotEnumerable, JSWindowEventListener] EventListener onbeforeprint;
+        // attribute [NotEnumerable, JSWindowEventListener] EventListener onredo;
+        // attribute [NotEnumerable, JSWindowEventListener] EventListener onundo;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLHRElement.idl b/elemental/idl/third_party/WebCore/html/HTMLHRElement.idl
new file mode 100644
index 0000000..23a57da
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLHRElement.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLHRElement : HTMLElement {
+        attribute [Reflect] DOMString align;
+        attribute [Reflect] boolean noShade;
+        attribute [Reflect] DOMString size;
+        attribute [Reflect] DOMString width;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLHeadElement.idl b/elemental/idl/third_party/WebCore/html/HTMLHeadElement.idl
new file mode 100644
index 0000000..59bdbf0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLHeadElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLHeadElement : HTMLElement {
+        attribute [Reflect] DOMString profile;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLHeadingElement.idl b/elemental/idl/third_party/WebCore/html/HTMLHeadingElement.idl
new file mode 100644
index 0000000..e419c1c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLHeadingElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLHeadingElement : HTMLElement {
+        attribute [Reflect] DOMString align;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLHtmlElement.idl b/elemental/idl/third_party/WebCore/html/HTMLHtmlElement.idl
new file mode 100644
index 0000000..03c661c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLHtmlElement.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLHtmlElement : HTMLElement {
+        attribute [Reflect] DOMString version;
+        attribute [Reflect, URL] DOMString manifest;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLIFrameElement.idl b/elemental/idl/third_party/WebCore/html/HTMLIFrameElement.idl
new file mode 100644
index 0000000..2dbf38d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLIFrameElement.idl
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLIFrameElement : HTMLElement {
+        attribute [Reflect] DOMString align;
+        attribute [Reflect] DOMString frameBorder;
+        attribute [Reflect] DOMString height;
+        attribute [Reflect] DOMString longDesc;
+        attribute [Reflect] DOMString marginHeight;
+        attribute [Reflect] DOMString marginWidth;
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] DOMString sandbox;
+        attribute [Reflect, Conditional=IFRAME_SEAMLESS] boolean seamless;
+        attribute [Reflect] DOMString scrolling;
+        attribute [Reflect, URL] DOMString src;
+        attribute [Reflect] DOMString srcdoc;
+        attribute [Reflect] DOMString width;
+
+        // Introduced in DOM Level 2:
+        readonly attribute [CheckSecurityForNode] Document contentDocument;
+
+        // Extensions
+        readonly attribute DOMWindow contentWindow;
+
+#if defined(ENABLE_SVG) && ENABLE_SVG
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C || defined(ENABLE_SVG_DOM_OBJC_BINDINGS) && ENABLE_SVG_DOM_OBJC_BINDINGS
+        [CheckSecurityForNode] SVGDocument getSVGDocument()
+            raises(DOMException);
+#endif
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLImageElement.idl b/elemental/idl/third_party/WebCore/html/HTMLImageElement.idl
new file mode 100644
index 0000000..d893b6c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLImageElement.idl
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2006, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        JSGenerateToNativeObject
+    ] HTMLImageElement : HTMLElement {
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] DOMString align;
+        attribute [Reflect] DOMString alt;
+        attribute [Reflect] DOMString border;
+        attribute [Reflect] DOMString crossOrigin;
+        attribute long height;
+        attribute [Reflect] long hspace;
+        attribute [Reflect] boolean isMap;
+        attribute [Reflect, URL] DOMString longDesc;
+        attribute [Reflect, URL] DOMString src;
+        attribute [Reflect] DOMString useMap;
+        attribute [Reflect] long vspace;
+        attribute long width;
+        
+        // Extensions
+        readonly attribute boolean complete;
+        attribute [Reflect,URL] DOMString lowsrc;
+        readonly attribute long naturalHeight;
+        readonly attribute long naturalWidth;
+        readonly attribute long x;
+        readonly attribute long y;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // Objective-C extension:
+        readonly attribute DOMString altDisplayString;
+        readonly attribute URL absoluteImageURL;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLInputElement.idl b/elemental/idl/third_party/WebCore/html/HTMLInputElement.idl
new file mode 100644
index 0000000..e326ce7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLInputElement.idl
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2012 Samsung Electronics. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLInputElement : HTMLElement {
+        attribute [Reflect] DOMString accept;
+        attribute [Reflect] DOMString alt;
+        attribute [Reflect] DOMString autocomplete;
+        attribute [Reflect] boolean autofocus;
+        attribute [Reflect=checked] boolean defaultChecked;
+        attribute boolean checked;
+        attribute [Reflect] DOMString dirName;
+        attribute [Reflect] boolean disabled;
+        readonly attribute HTMLFormElement form;
+        attribute FileList files;
+        attribute [Reflect, URL] DOMString formAction;
+        attribute [TreatNullAs=NullString] DOMString formEnctype;
+        attribute [TreatNullAs=NullString] DOMString formMethod;
+        attribute [Reflect] boolean formNoValidate;
+        attribute [Reflect] DOMString formTarget;
+        attribute unsigned long height;
+        attribute boolean indeterminate;
+        readonly attribute [Conditional=DATALIST] HTMLElement list;
+        attribute [Reflect] DOMString max;
+        attribute long maxLength setter raises(DOMException);
+        attribute [Reflect] DOMString min;
+        attribute [Reflect] boolean multiple;
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] DOMString pattern;
+        attribute [Reflect] DOMString placeholder;
+        attribute [Reflect] boolean readOnly;
+        attribute [Reflect] boolean required;
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        attribute [ObjCImplementedAsUnsignedLong] DOMString size; // DOM level 2 changed this to a long, but ObjC API is a string
+#else
+        attribute unsigned long size; // Changed string -> long -> unsigned long
+#endif
+        attribute [Reflect, URL] DOMString src;
+        attribute [Reflect] DOMString step;
+        attribute [TreatNullAs=NullString] DOMString type; // readonly dropped as part of DOM level 2
+        attribute [TreatNullAs=NullString] DOMString defaultValue;
+        attribute [TreatNullAs=NullString] DOMString value;
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+        attribute Date valueAsDate setter raises(DOMException);
+#endif
+        attribute double valueAsNumber setter raises(DOMException);
+
+        void stepUp(in [Optional] long n) raises(DOMException);
+        void stepDown(in [Optional] long n) raises(DOMException);
+
+        attribute unsigned long width;
+        readonly attribute boolean willValidate;
+        readonly attribute ValidityState validity;
+        readonly attribute DOMString validationMessage;
+        boolean checkValidity();
+        void setCustomValidity(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);
+
+        readonly attribute NodeList labels;
+
+        void select();
+        attribute [Custom] long selectionStart;
+        attribute [Custom] long selectionEnd;
+        attribute [Custom] DOMString selectionDirection;
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        [Custom] void setSelectionRange(in long start, in long end);
+#else
+        [Custom] void setSelectionRange(in [Optional=DefaultIsUndefined] long start, 
+                                        in [Optional=DefaultIsUndefined] long end, 
+                                        in [Optional] DOMString direction);
+#endif
+
+        // Non-standard attributes
+        attribute [Reflect] DOMString align;
+        attribute [Conditional=DIRECTORY_UPLOAD, Reflect] boolean webkitdirectory;
+        attribute [Reflect] DOMString useMap;
+        attribute [Reflect] boolean incremental;
+        attribute [Conditional=INPUT_SPEECH, Reflect, V8EnabledAtRuntime] boolean webkitSpeech;
+        attribute [Conditional=INPUT_SPEECH, Reflect, V8EnabledAtRuntime] boolean webkitGrammar;
+        attribute [Conditional=INPUT_SPEECH, NotEnumerable] EventListener onwebkitspeechchange;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        attribute [Reflect] DOMString accessKey;
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        void click();
+#endif
+
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
+        void setValueForUser(in [TreatNullAs=NullString] DOMString value);
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // Objective-C extension:
+        readonly attribute DOMString altDisplayString;
+        readonly attribute URL absoluteImageURL;
+#endif
+
+        // See http://www.w3.org/TR/html-media-capture/
+        attribute [Conditional=MEDIA_CAPTURE] DOMString capture;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLIntentElement.idl b/elemental/idl/third_party/WebCore/html/HTMLIntentElement.idl
new file mode 100644
index 0000000..608c5ac
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLIntentElement.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        Conditional=WEB_INTENTS_TAG
+    ] HTMLIntentElement : HTMLElement {
+        attribute [Reflect] DOMString action;
+        attribute [Reflect] DOMString type;
+        attribute [Reflect, URL] DOMString href;
+        attribute [Reflect] DOMString title;
+        attribute [Reflect] DOMString disposition;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLKeygenElement.idl b/elemental/idl/third_party/WebCore/html/HTMLKeygenElement.idl
new file mode 100644
index 0000000..914fb99
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLKeygenElement.idl
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface HTMLKeygenElement : HTMLElement {
+        attribute [Reflect] boolean autofocus;
+        attribute [Reflect] DOMString challenge;
+        attribute [Reflect] boolean disabled;
+        readonly attribute HTMLFormElement form;
+        attribute [Reflect] DOMString keytype;
+        attribute DOMString name;
+
+        readonly attribute DOMString type;
+
+        readonly attribute boolean willValidate;
+        readonly attribute ValidityState validity;
+        readonly attribute DOMString validationMessage;
+        boolean checkValidity();
+        void setCustomValidity(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);
+
+        readonly attribute NodeList labels;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLLIElement.idl b/elemental/idl/third_party/WebCore/html/HTMLLIElement.idl
new file mode 100644
index 0000000..2dc541b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLLIElement.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLLIElement : HTMLElement {
+        attribute [Reflect] DOMString type;
+        attribute [Reflect] long value;    
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLLabelElement.idl b/elemental/idl/third_party/WebCore/html/HTMLLabelElement.idl
new file mode 100644
index 0000000..bf79680
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLLabelElement.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLLabelElement : HTMLElement {
+        readonly attribute HTMLFormElement form;
+        attribute [Reflect=for] DOMString htmlFor;
+        readonly attribute HTMLElement control;
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        attribute [Reflect] DOMString accessKey;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLLegendElement.idl b/elemental/idl/third_party/WebCore/html/HTMLLegendElement.idl
new file mode 100644
index 0000000..bf755a5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLLegendElement.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLLegendElement : HTMLElement {
+        readonly attribute HTMLFormElement form;
+        attribute [Reflect] DOMString align;
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        attribute [Reflect] DOMString accessKey;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLLinkElement.idl b/elemental/idl/third_party/WebCore/html/HTMLLinkElement.idl
new file mode 100644
index 0000000..8d16f25
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLLinkElement.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLLinkElement : HTMLElement {
+        attribute [Reflect] boolean disabled;
+        attribute [Reflect] DOMString charset;
+        attribute [Reflect, URL] DOMString href;
+        attribute [Reflect] DOMString hreflang;
+        attribute [Reflect] DOMString media;
+        attribute [Reflect] DOMString rel;
+        attribute [Reflect] DOMString rev;
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        attribute [Custom] DOMSettableTokenList sizes;
+#endif
+        attribute [Reflect] DOMString target;
+        attribute [Reflect] DOMString type;
+
+        // DOM Level 2 Style
+        readonly attribute StyleSheet sheet;
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // Objective-C extension:
+        readonly attribute URL absoluteLinkURL;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLMapElement.idl b/elemental/idl/third_party/WebCore/html/HTMLMapElement.idl
new file mode 100644
index 0000000..7811c9a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLMapElement.idl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLMapElement : HTMLElement {
+        readonly attribute HTMLCollection areas;
+        attribute [Reflect] DOMString name;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLMarqueeElement.idl b/elemental/idl/third_party/WebCore/html/HTMLMarqueeElement.idl
new file mode 100644
index 0000000..3174fac
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLMarqueeElement.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLMarqueeElement : HTMLElement {
+        void start();
+        void stop();
+        
+        attribute [Reflect] DOMString behavior;
+        attribute [Reflect] DOMString bgColor;
+        attribute [Reflect] DOMString direction;
+        attribute [Reflect] DOMString height;
+        attribute [Reflect] unsigned long hspace;
+        attribute long loop setter raises(DOMException);
+        attribute long scrollAmount setter raises(DOMException);
+        attribute long scrollDelay setter raises(DOMException);
+        attribute [Reflect] boolean trueSpeed;
+        attribute [Reflect] unsigned long vspace;
+        attribute [Reflect] DOMString width;
+
+        // FIXME: Implement the following event handler attributes
+        // https://bugs.webkit.org/show_bug.cgi?id=49788
+        // attribute EventListener onbounce;
+        // attribute EventListener onfinish;
+        // attribute EventListener onstart;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLMediaElement.idl b/elemental/idl/third_party/WebCore/html/HTMLMediaElement.idl
new file mode 100644
index 0000000..ac0fa46
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLMediaElement.idl
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2007, 2010, 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=VIDEO,
+        JSGenerateToNativeObject
+    ] HTMLMediaElement : HTMLElement {
+
+    // error state
+    readonly attribute MediaError error;
+
+    // network state
+    attribute [Reflect, URL] DOMString src;
+    readonly attribute [URL] DOMString currentSrc;
+    
+    const unsigned short NETWORK_EMPTY = 0;
+    const unsigned short NETWORK_IDLE = 1;
+    const unsigned short NETWORK_LOADING = 2;
+    const unsigned short NETWORK_NO_SOURCE = 3;
+    readonly attribute unsigned short networkState;
+    attribute DOMString preload;
+
+    readonly attribute TimeRanges buffered;
+    void load() 
+        raises (DOMException);
+#if defined(ENABLE_ENCRYPTED_MEDIA) && ENABLE_ENCRYPTED_MEDIA
+    DOMString canPlayType(in [Optional=DefaultIsUndefined] DOMString type, in [Optional=DefaultIsNullString, TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString keySystem);
+#else
+    DOMString canPlayType(in [Optional=DefaultIsUndefined] DOMString type);
+#endif
+
+    // ready state
+    const unsigned short HAVE_NOTHING = 0;
+    const unsigned short HAVE_METADATA = 1;
+    const unsigned short HAVE_CURRENT_DATA = 2;
+    const unsigned short HAVE_FUTURE_DATA = 3;
+    const unsigned short HAVE_ENOUGH_DATA = 4;
+    readonly attribute unsigned short readyState;
+    readonly attribute boolean seeking;
+
+    // playback state
+    attribute float currentTime
+        setter raises (DOMException);
+    readonly attribute double initialTime;
+    readonly attribute float startTime;
+    readonly attribute float duration;
+    readonly attribute boolean paused;
+    attribute float defaultPlaybackRate;
+    attribute float playbackRate;
+    readonly attribute TimeRanges played;
+    readonly attribute TimeRanges seekable;
+    readonly attribute boolean ended;
+    attribute [Reflect] boolean autoplay;
+    attribute [Reflect] boolean loop;
+    void play();
+    void pause();
+
+    // controls
+    attribute boolean controls;
+    attribute float volume 
+        setter raises (DOMException);
+    attribute boolean muted;
+    attribute [Reflect=muted] boolean defaultMuted;
+
+    // WebKit extensions
+    attribute boolean webkitPreservesPitch;
+
+    readonly attribute boolean webkitHasClosedCaptions;
+    attribute boolean webkitClosedCaptionsVisible;
+
+    // The number of bytes consumed by the media decoder.
+    readonly attribute [Conditional=MEDIA_STATISTICS] unsigned long webkitAudioDecodedByteCount;
+    readonly attribute [Conditional=MEDIA_STATISTICS] unsigned long webkitVideoDecodedByteCount;
+
+#if defined(ENABLE_MEDIA_SOURCE) && ENABLE_MEDIA_SOURCE
+    // URL passed to src attribute to enable the media source logic.
+    readonly attribute [V8EnabledAtRuntime=mediaSource, URL] DOMString webkitMediaSourceURL;
+
+    // Manages IDs for appending media to the source.
+    [V8EnabledAtRuntime=mediaSource] void webkitSourceAddId(in DOMString id, in DOMString type) raises (DOMException);
+    [V8EnabledAtRuntime=mediaSource] void webkitSourceRemoveId(in DOMString id) raises (DOMException);
+
+    // Returns the time ranges buffered for a specific source ID.
+    [V8EnabledAtRuntime=mediaSource] TimeRanges webkitSourceBuffered(in DOMString id) raises (DOMException);
+    
+    // Appends segment data.
+    [V8EnabledAtRuntime=mediaSource] void webkitSourceAppend(in DOMString id, in Uint8Array data) raises (DOMException);
+
+    // Aborts the current segment.
+    [V8EnabledAtRuntime=mediaSource] void webkitSourceAbort(in DOMString id) raises (DOMException);
+
+    // Signals the end of stream.
+    [V8EnabledAtRuntime=mediaSource] const unsigned short EOS_NO_ERROR = 0; // End of stream reached w/o error.
+    [V8EnabledAtRuntime=mediaSource] const unsigned short EOS_NETWORK_ERR = 1; // A network error triggered end of stream.
+    [V8EnabledAtRuntime=mediaSource] const unsigned short EOS_DECODE_ERR = 2; // A decode error triggered end of stream.
+    [V8EnabledAtRuntime=mediaSource] void webkitSourceEndOfStream(in unsigned short status) raises (DOMException);
+
+    // Indicates the current state of the media source.
+    [V8EnabledAtRuntime=mediaSource] const unsigned short SOURCE_CLOSED = 0;
+    [V8EnabledAtRuntime=mediaSource] const unsigned short SOURCE_OPEN = 1;
+    [V8EnabledAtRuntime=mediaSource] const unsigned short SOURCE_ENDED = 2;
+    readonly attribute [V8EnabledAtRuntime=mediaSource] unsigned short webkitSourceState;
+
+    attribute [V8EnabledAtRuntime=mediaSource] EventListener onwebkitsourceopen;
+    attribute [V8EnabledAtRuntime=mediaSource] EventListener onwebkitsourceended;
+    attribute [V8EnabledAtRuntime=mediaSource] EventListener onwebkitsourceclose;
+#endif
+
+#if defined(ENABLE_ENCRYPTED_MEDIA) && ENABLE_ENCRYPTED_MEDIA
+    [V8EnabledAtRuntime=encryptedMedia] void webkitGenerateKeyRequest(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString keySystem, in [Optional] Uint8Array initData)
+        raises (DOMException);
+    [V8EnabledAtRuntime=encryptedMedia] void webkitAddKey(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString keySystem, in Uint8Array key, in [Optional] Uint8Array initData, in [Optional=DefaultIsNullString] DOMString sessionId)
+        raises (DOMException);
+    [V8EnabledAtRuntime=encryptedMedia] void webkitCancelKeyRequest(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString keySystem, in [Optional=DefaultIsNullString] DOMString sessionId)
+        raises (DOMException);
+
+    attribute [V8EnabledAtRuntime=encryptedMedia] EventListener onwebkitkeyadded;
+    attribute [V8EnabledAtRuntime=encryptedMedia] EventListener onwebkitkeyerror;
+    attribute [V8EnabledAtRuntime=encryptedMedia] EventListener onwebkitkeymessage;
+    attribute [V8EnabledAtRuntime=encryptedMedia] EventListener onwebkitneedkey;
+#endif
+
+#if defined(ENABLE_VIDEO_TRACK) && ENABLE_VIDEO_TRACK
+    [V8EnabledAtRuntime=webkitVideoTrack] TextTrack addTextTrack(in DOMString kind, in [Optional] DOMString label, in [Optional] DOMString language)
+        raises (DOMException);
+    readonly attribute [V8EnabledAtRuntime=webkitVideoTrack] TextTrackList textTracks;
+#endif
+
+    attribute [Reflect, TreatNullAs=NullString] DOMString mediaGroup;
+    attribute [CustomSetter] MediaController controller;
+};
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLMenuElement.idl b/elemental/idl/third_party/WebCore/html/HTMLMenuElement.idl
new file mode 100644
index 0000000..ff14754
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLMenuElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLMenuElement : HTMLElement {
+        attribute [Reflect] boolean compact;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLMetaElement.idl b/elemental/idl/third_party/WebCore/html/HTMLMetaElement.idl
new file mode 100644
index 0000000..f4ffb2d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLMetaElement.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLMetaElement : HTMLElement {
+        attribute [Reflect] DOMString content;
+        attribute [Reflect=http_equiv] DOMString httpEquiv;
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] DOMString scheme;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLMeterElement.idl b/elemental/idl/third_party/WebCore/html/HTMLMeterElement.idl
new file mode 100644
index 0000000..7c11fe4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLMeterElement.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+    interface [
+        Conditional=METER_TAG
+    ] HTMLMeterElement : HTMLElement {
+                 attribute double value
+                     setter raises(DOMException);
+                 attribute double min
+                     setter raises(DOMException);
+                 attribute double max
+                     setter raises(DOMException);
+                 attribute double low
+                     setter raises(DOMException);
+                 attribute double high
+                     setter raises(DOMException);
+                 attribute double optimum
+                     setter raises(DOMException);
+        readonly attribute NodeList labels;
+    };
+}
+
diff --git a/elemental/idl/third_party/WebCore/html/HTMLModElement.idl b/elemental/idl/third_party/WebCore/html/HTMLModElement.idl
new file mode 100644
index 0000000..ad8281c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLModElement.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLModElement : HTMLElement {
+        attribute [Reflect, URL] DOMString cite;
+        attribute [Reflect] DOMString dateTime;
+    };
+    
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLOListElement.idl b/elemental/idl/third_party/WebCore/html/HTMLOListElement.idl
new file mode 100644
index 0000000..8d1d3a4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLOListElement.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLOListElement : HTMLElement {
+        attribute [Reflect] boolean compact;
+        attribute long start;
+        attribute [Reflect] boolean reversed;
+        attribute [Reflect] DOMString type;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLObjectElement.idl b/elemental/idl/third_party/WebCore/html/HTMLObjectElement.idl
new file mode 100644
index 0000000..f1055fd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLObjectElement.idl
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        CustomNamedSetter,
+        JSCustomGetOwnPropertySlotAndDescriptor,
+        CustomCall
+    ] HTMLObjectElement : HTMLElement {
+        readonly attribute HTMLFormElement form;
+        attribute [Reflect] DOMString code;
+        attribute [Reflect] DOMString align;
+        attribute [Reflect] DOMString archive;
+        attribute [Reflect] DOMString border;
+        attribute [Reflect] DOMString codeBase;
+        attribute [Reflect] DOMString codeType;
+        attribute [Reflect, URL] DOMString data;
+        attribute [Reflect] boolean declare;
+        attribute [Reflect] DOMString height;
+        attribute [Reflect] long hspace;
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] DOMString standby;
+        attribute [Reflect] DOMString type;
+        attribute [Reflect] DOMString useMap;
+        attribute [Reflect] long vspace;
+        attribute [Reflect] DOMString width;
+        readonly attribute boolean willValidate;
+        readonly attribute ValidityState validity;
+        readonly attribute DOMString validationMessage;
+        boolean checkValidity();
+        void setCustomValidity(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);
+
+        // Introduced in DOM Level 2:
+        readonly attribute [CheckSecurityForNode] Document contentDocument;
+
+#if defined(ENABLE_SVG) && ENABLE_SVG
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C || defined(ENABLE_SVG_DOM_OBJC_BINDINGS) && ENABLE_SVG_DOM_OBJC_BINDINGS
+        [CheckSecurityForNode] SVGDocument getSVGDocument() raises(DOMException);
+#endif
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // Objective-C extension:
+        readonly attribute URL absoluteImageURL;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLOptGroupElement.idl b/elemental/idl/third_party/WebCore/html/HTMLOptGroupElement.idl
new file mode 100644
index 0000000..75cead0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLOptGroupElement.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLOptGroupElement : HTMLElement {
+        attribute [Reflect] boolean disabled;
+        attribute [Reflect] DOMString label;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLOptionElement.idl b/elemental/idl/third_party/WebCore/html/HTMLOptionElement.idl
new file mode 100644
index 0000000..b7b3489
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLOptionElement.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple, Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        JSGenerateToNativeObject,
+        NamedConstructor=Option(in [Optional=DefaultIsNullString] DOMString data, in [Optional=DefaultIsNullString] DOMString value, in [Optional=DefaultIsUndefined] boolean defaultSelected, in [Optional=DefaultIsUndefined] boolean selected),
+        ConstructorRaisesException
+    ] HTMLOptionElement : HTMLElement {
+        attribute [Reflect] boolean disabled;
+        readonly attribute HTMLFormElement form;
+        attribute DOMString label;
+        attribute [Reflect=selected] boolean defaultSelected;
+        attribute boolean selected;
+        attribute DOMString value;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        attribute DOMString text setter raises(DOMException);
+#else
+        readonly attribute DOMString text;
+#endif
+        readonly attribute long index;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLOptionsCollection.idl b/elemental/idl/third_party/WebCore/html/HTMLOptionsCollection.idl
new file mode 100644
index 0000000..0476e65
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLOptionsCollection.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        JSGenerateToNativeObject,
+        CustomIndexedSetter
+    ] HTMLOptionsCollection : HTMLCollection {
+                 attribute long selectedIndex;
+                 attribute [Custom] unsigned long length
+                        setter raises (DOMException);
+
+        [Custom] void add(in [Optional=DefaultIsUndefined] HTMLOptionElement option, 
+                          in [Optional] unsigned long index)
+             raises (DOMException);
+        [Custom] void remove(in [Optional=DefaultIsUndefined] unsigned long index);
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        Node item(in unsigned long index); 
+        Node namedItem(in DOMString name); 
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLOutputElement.idl b/elemental/idl/third_party/WebCore/html/HTMLOutputElement.idl
new file mode 100644
index 0000000..35761c3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLOutputElement.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface HTMLOutputElement : HTMLElement {
+        attribute [Custom] DOMSettableTokenList htmlFor;
+        readonly attribute HTMLFormElement form;
+        attribute [Reflect] DOMString name;
+
+        readonly attribute DOMString type;
+        attribute [TreatNullAs=NullString] DOMString defaultValue;
+        attribute [TreatNullAs=NullString] DOMString value;
+
+        readonly attribute boolean willValidate;
+        readonly attribute ValidityState validity;
+        readonly attribute DOMString validationMessage;
+        boolean checkValidity();
+        void setCustomValidity(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);
+
+        readonly attribute NodeList labels;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLParagraphElement.idl b/elemental/idl/third_party/WebCore/html/HTMLParagraphElement.idl
new file mode 100644
index 0000000..246e9e9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLParagraphElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLParagraphElement : HTMLElement {
+        attribute [Reflect] DOMString align;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLParamElement.idl b/elemental/idl/third_party/WebCore/html/HTMLParamElement.idl
new file mode 100644
index 0000000..1f0c0de
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLParamElement.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLParamElement : HTMLElement {
+        attribute [Reflect] DOMString name;
+        attribute [Reflect] DOMString type;
+        attribute [Reflect] DOMString value;
+        attribute [Reflect] DOMString valueType;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLPreElement.idl b/elemental/idl/third_party/WebCore/html/HTMLPreElement.idl
new file mode 100644
index 0000000..ae137f0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLPreElement.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All right reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLPreElement : HTMLElement {
+        // FIXME: DOM spec says that width should be of type DOMString
+        // see http://bugs.webkit.org/show_bug.cgi?id=8992
+        attribute [Reflect] long width;
+        
+        // Extensions
+        attribute [Reflect] boolean wrap;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLProgressElement.idl b/elemental/idl/third_party/WebCore/html/HTMLProgressElement.idl
new file mode 100644
index 0000000..ace4def
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLProgressElement.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+    interface [
+        Conditional=PROGRESS_TAG
+    ] HTMLProgressElement : HTMLElement {
+                 attribute  double                value
+                     setter raises(DOMException);
+                 attribute  double                max
+                     setter raises(DOMException);
+        readonly attribute  double                position;
+        readonly attribute  NodeList              labels;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLPropertiesCollection.idl b/elemental/idl/third_party/WebCore/html/HTMLPropertiesCollection.idl
new file mode 100644
index 0000000..d2c8e31
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLPropertiesCollection.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2011 Motorola Mobility, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * Neither the name of Motorola Mobility, Inc. nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        Conditional=MICRODATA,
+        JSGenerateToJSObject,
+        IndexedGetter,
+        NamedGetter
+    ] HTMLPropertiesCollection : HTMLCollection {
+        readonly attribute unsigned long length;
+        Node item(in unsigned long index);
+
+        readonly attribute DOMStringList names;
+
+        // FIXME: HTML5 specifies that this should return PropertyNodeList.
+        NodeList namedItem(in DOMString name);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLQuoteElement.idl b/elemental/idl/third_party/WebCore/html/HTMLQuoteElement.idl
new file mode 100644
index 0000000..fa1bcdb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLQuoteElement.idl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLQuoteElement : HTMLElement {
+        attribute [Reflect, URL] DOMString cite;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLScriptElement.idl b/elemental/idl/third_party/WebCore/html/HTMLScriptElement.idl
new file mode 100644
index 0000000..a41e104
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLScriptElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLScriptElement : HTMLElement {
+        attribute [TreatNullAs=NullString] DOMString text;
+        attribute [Reflect=for] DOMString htmlFor;
+        attribute [Reflect] DOMString event;
+        attribute [Reflect] DOMString charset;
+        attribute boolean async;
+        attribute [Reflect] boolean defer;
+        attribute [Reflect, URL] DOMString src;
+        attribute [Reflect] DOMString type;
+        attribute [Reflect] DOMString crossOrigin;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLSelectElement.idl b/elemental/idl/third_party/WebCore/html/HTMLSelectElement.idl
new file mode 100644
index 0000000..415b1b9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLSelectElement.idl
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        IndexedGetter,
+        CustomIndexedSetter
+    ] HTMLSelectElement : HTMLElement {
+        attribute [Reflect] boolean autofocus;
+        attribute [Reflect] boolean disabled;
+        readonly attribute HTMLFormElement form;
+        attribute boolean multiple;
+        attribute [TreatNullAs=NullString] DOMString name;
+        attribute [Reflect] boolean required;
+        attribute long size;
+
+        readonly attribute DOMString type;
+
+        readonly attribute HTMLOptionsCollection options;
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        // DOM Level 2 changes type of length attribute to unsigned long, 
+        // for compatibility we keep DOM Level 1 definition.
+        readonly attribute long length;
+#else
+        attribute unsigned long length setter raises (DOMException);
+#endif
+        Node item(in [IsIndex,Optional=DefaultIsUndefined] unsigned long index);
+        Node namedItem(in [Optional=DefaultIsUndefined] DOMString name);
+        [ObjCLegacyUnnamedParameters] void add(in [Optional=DefaultIsUndefined] HTMLElement element,
+                                in [Optional=DefaultIsUndefined] HTMLElement before) raises(DOMException);
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // In JavaScript, we support both option index and option object parameters.
+        // As of this writing this cannot be auto-generated.
+        [Custom] void remove(in long index);
+        [Custom] void remove(in HTMLOptionElement option);
+#else
+        void remove(in long index);
+#endif
+        readonly attribute HTMLCollection selectedOptions;
+        attribute long selectedIndex;
+        attribute [TreatNullAs=NullString] DOMString value;
+
+        readonly attribute boolean willValidate;
+        readonly attribute ValidityState validity;
+        readonly attribute DOMString validationMessage;
+        boolean checkValidity();
+        void setCustomValidity(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);
+
+        readonly attribute NodeList labels;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLSourceElement.idl b/elemental/idl/third_party/WebCore/html/HTMLSourceElement.idl
new file mode 100644
index 0000000..dc70714
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLSourceElement.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2007, 2010 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=VIDEO,
+    ] HTMLSourceElement : HTMLElement {
+    attribute [Reflect, URL] DOMString src;
+    attribute DOMString type;
+    attribute DOMString media;
+};
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLSpanElement.idl b/elemental/idl/third_party/WebCore/html/HTMLSpanElement.idl
new file mode 100644
index 0000000..d6d4e59
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLSpanElement.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2011 Google, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    // http://www.whatwg.org/specs/web-apps/current-work/#htmlspanelement
+    interface HTMLSpanElement : HTMLElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLStyleElement.idl b/elemental/idl/third_party/WebCore/html/HTMLStyleElement.idl
new file mode 100644
index 0000000..1b9abd4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLStyleElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLStyleElement : HTMLElement {
+        attribute boolean disabled;
+        attribute [Conditional=STYLE_SCOPED, V8EnabledAtRuntime=styleScoped] boolean scoped;
+        attribute [Reflect] DOMString media;
+        attribute [Reflect] DOMString type;
+
+        // DOM Level 2 Style
+        readonly attribute StyleSheet sheet;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLTableCaptionElement.idl b/elemental/idl/third_party/WebCore/html/HTMLTableCaptionElement.idl
new file mode 100644
index 0000000..0759539
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLTableCaptionElement.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        JSGenerateToNativeObject
+    ] HTMLTableCaptionElement : HTMLElement {
+        attribute [Reflect] DOMString align;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLTableCellElement.idl b/elemental/idl/third_party/WebCore/html/HTMLTableCellElement.idl
new file mode 100644
index 0000000..ae286f4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLTableCellElement.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLTableCellElement : HTMLElement {
+        readonly attribute long cellIndex;
+        attribute [Reflect] DOMString abbr;
+        attribute [Reflect] DOMString align;
+        attribute [Reflect] DOMString axis;
+        attribute [Reflect] DOMString bgColor;
+        attribute [Reflect=char] DOMString ch;
+        attribute [Reflect=charoff] DOMString chOff;
+        attribute long colSpan;
+        attribute [Reflect] DOMString headers;
+        attribute [Reflect] DOMString height;
+        attribute [Reflect] boolean noWrap;
+        attribute long rowSpan;
+        attribute [Reflect] DOMString scope;
+        attribute [Reflect] DOMString vAlign;
+        attribute [Reflect] DOMString width;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLTableColElement.idl b/elemental/idl/third_party/WebCore/html/HTMLTableColElement.idl
new file mode 100644
index 0000000..a6e6654
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLTableColElement.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLTableColElement : HTMLElement {
+        attribute [Reflect] DOMString align;
+        attribute [Reflect=char] DOMString ch;
+        attribute [Reflect=charoff] DOMString chOff;
+        attribute long span;
+        attribute [Reflect] DOMString vAlign;
+        attribute [Reflect] DOMString width;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLTableElement.idl b/elemental/idl/third_party/WebCore/html/HTMLTableElement.idl
new file mode 100644
index 0000000..190861a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLTableElement.idl
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLTableElement : HTMLElement {
+        attribute HTMLTableCaptionElement caption setter raises(DOMException);
+        attribute HTMLTableSectionElement tHead setter raises(DOMException);
+        attribute HTMLTableSectionElement tFoot setter raises(DOMException);
+
+        readonly attribute HTMLCollection rows;
+        readonly attribute HTMLCollection tBodies;
+        attribute [Reflect] DOMString align;
+        attribute [Reflect] DOMString bgColor;
+        attribute [Reflect] DOMString border;
+        attribute [Reflect] DOMString cellPadding;
+        attribute [Reflect] DOMString cellSpacing;
+
+        attribute [Reflect] DOMString frame;
+
+        attribute [Reflect] DOMString rules;
+        attribute [Reflect] DOMString summary;
+        attribute [Reflect] DOMString width;
+
+        HTMLElement createTHead();
+        void deleteTHead();
+        HTMLElement createTFoot();
+        void deleteTFoot();
+        HTMLElement createTBody();
+        HTMLElement createCaption();
+        void deleteCaption();
+
+        HTMLElement insertRow(in [Optional=DefaultIsUndefined] long index) raises(DOMException);
+        void deleteRow(in [Optional=DefaultIsUndefined] long index) raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLTableRowElement.idl b/elemental/idl/third_party/WebCore/html/HTMLTableRowElement.idl
new file mode 100644
index 0000000..b16d754
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLTableRowElement.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple Inc. ALl rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLTableRowElement : HTMLElement {
+        readonly attribute long rowIndex;
+        readonly attribute long sectionRowIndex;
+        readonly attribute HTMLCollection cells;
+        attribute [Reflect] DOMString align;
+        attribute [Reflect] DOMString bgColor;
+        attribute [Reflect=char] DOMString ch;
+        attribute [Reflect=charoff] DOMString chOff;
+        attribute [Reflect] DOMString vAlign;
+        HTMLElement insertCell(in [Optional=DefaultIsUndefined] long index) raises(DOMException);
+        void deleteCell(in [Optional=DefaultIsUndefined] long index) raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLTableSectionElement.idl b/elemental/idl/third_party/WebCore/html/HTMLTableSectionElement.idl
new file mode 100644
index 0000000..88f5336
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLTableSectionElement.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface [
+        JSGenerateToNativeObject
+    ] HTMLTableSectionElement : HTMLElement {
+        attribute [Reflect] DOMString align;
+        attribute [Reflect=char] DOMString ch;
+        attribute [Reflect=charoff] DOMString chOff;
+        attribute [Reflect] DOMString vAlign;
+        readonly attribute HTMLCollection rows;
+        HTMLElement insertRow(in [Optional=DefaultIsUndefined] long index) raises(DOMException);
+        void deleteRow(in [Optional=DefaultIsUndefined] long index) raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLTextAreaElement.idl b/elemental/idl/third_party/WebCore/html/HTMLTextAreaElement.idl
new file mode 100644
index 0000000..f9d80b5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLTextAreaElement.idl
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2011 Motorola Mobility, Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLTextAreaElement : HTMLElement {
+        attribute [Reflect] boolean autofocus;
+        attribute long cols;
+        attribute [Reflect] DOMString dirName;
+        attribute [Reflect] boolean disabled;
+        readonly attribute HTMLFormElement form;
+        attribute long maxLength setter raises(DOMException);
+        attribute [TreatNullAs=NullString] DOMString name;
+        attribute [Reflect] DOMString placeholder;
+        attribute [Reflect] boolean readOnly;
+        attribute [Reflect] boolean required;
+        attribute long rows;
+        attribute [Reflect] DOMString wrap;
+
+        readonly attribute DOMString type;
+        attribute [TreatNullAs=NullString] DOMString defaultValue;
+        attribute [TreatNullAs=NullString] DOMString value;
+        readonly attribute unsigned long textLength;
+
+        readonly attribute boolean willValidate;
+        readonly attribute ValidityState validity;
+        readonly attribute DOMString validationMessage;
+        boolean checkValidity();
+        void setCustomValidity(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);
+
+        readonly attribute NodeList labels;
+
+        void select();
+        attribute long selectionStart;
+        attribute long selectionEnd;
+        attribute DOMString selectionDirection;
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        void setSelectionRange(in long start, in long end);
+#else
+        void setSelectionRange(in [Optional=DefaultIsUndefined] long start,
+                               in [Optional=DefaultIsUndefined] long end,
+                               in [Optional] DOMString direction);
+#endif
+
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        attribute [Reflect] DOMString accessKey;
+#endif
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLTitleElement.idl b/elemental/idl/third_party/WebCore/html/HTMLTitleElement.idl
new file mode 100644
index 0000000..e691f7b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLTitleElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLTitleElement : HTMLElement {
+        attribute  [TreatNullAs=NullString] DOMString            text;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLTrackElement.idl b/elemental/idl/third_party/WebCore/html/HTMLTrackElement.idl
new file mode 100644
index 0000000..0107df5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLTrackElement.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2011 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=VIDEO_TRACK,
+        V8EnabledAtRuntime=webkitVideoTrack
+    ] HTMLTrackElement : HTMLElement {
+        attribute [Reflect, URL] DOMString src;
+        attribute DOMString kind;
+        attribute DOMString srclang;
+        attribute DOMString label;
+        attribute [Reflect] boolean default;
+
+        const unsigned short NONE = 0;
+        const unsigned short LOADING = 1;
+        const unsigned short LOADED = 2;
+        // Reflect is used for ERROR because it conflicts with a windows define.
+        [Reflect=TRACK_ERROR] const unsigned short ERROR = 3;
+        readonly attribute unsigned short readyState;
+
+        readonly attribute TextTrack track;
+};
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLUListElement.idl b/elemental/idl/third_party/WebCore/html/HTMLUListElement.idl
new file mode 100644
index 0000000..221dcca
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLUListElement.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module html {
+
+    interface HTMLUListElement : HTMLElement {
+        attribute [Reflect] boolean compact;
+        attribute [Reflect] DOMString type;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLUnknownElement.idl b/elemental/idl/third_party/WebCore/html/HTMLUnknownElement.idl
new file mode 100644
index 0000000..9e4f90a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLUnknownElement.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2011 Code Aurora Forum. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface HTMLUnknownElement : HTMLElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/HTMLVideoElement.idl b/elemental/idl/third_party/WebCore/html/HTMLVideoElement.idl
new file mode 100644
index 0000000..97a1779
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/HTMLVideoElement.idl
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2007, 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=VIDEO,
+        JSGenerateToNativeObject
+    ] HTMLVideoElement : HTMLMediaElement {
+        attribute [Reflect] unsigned long width;
+        attribute [Reflect] unsigned long height;
+        readonly attribute unsigned long videoWidth;
+        readonly attribute unsigned long videoHeight;
+        attribute [Reflect, URL] DOMString poster;
+
+        readonly attribute boolean webkitSupportsFullscreen;
+        readonly attribute boolean webkitDisplayingFullscreen;
+
+        void webkitEnterFullscreen() raises (DOMException);
+        void webkitExitFullscreen();
+
+        // Note the different capitalization of the "S" in FullScreen.
+        void webkitEnterFullScreen() raises (DOMException);
+        void webkitExitFullScreen();
+
+        // The number of frames that have been decoded and made available for
+        // playback.
+        readonly attribute [Conditional=MEDIA_STATISTICS] unsigned long webkitDecodedFrameCount;
+
+        // The number of decoded frames that have been dropped by the player
+        // for performance reasons during playback.
+        readonly attribute [Conditional=MEDIA_STATISTICS] unsigned long webkitDroppedFrameCount;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/ImageData.idl b/elemental/idl/third_party/WebCore/html/ImageData.idl
new file mode 100644
index 0000000..f2ea0ca
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/ImageData.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        CustomToJSObject
+    ] ImageData {
+        readonly attribute long width;
+        readonly attribute long height;
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
+        readonly attribute Uint8ClampedArray data;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/MediaController.idl b/elemental/idl/third_party/WebCore/html/MediaController.idl
new file mode 100644
index 0000000..d3f3348
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/MediaController.idl
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=VIDEO,
+        Constructor,
+        CallWith=ScriptExecutionContext,
+        JSGenerateToJSObject,
+        EventTarget
+    ] MediaController {
+        readonly attribute TimeRanges buffered;
+        readonly attribute TimeRanges seekable;
+
+        readonly attribute double duration;
+        attribute double currentTime
+            setter raises (DOMException);
+
+        readonly attribute boolean paused;
+        readonly attribute TimeRanges played;
+        void play();
+        void pause();
+
+        attribute double defaultPlaybackRate;
+        attribute double playbackRate;
+
+        attribute double volume
+            setter raises (DOMException);
+        attribute boolean muted;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/MediaError.idl b/elemental/idl/third_party/WebCore/html/MediaError.idl
new file mode 100644
index 0000000..8eb9d54
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/MediaError.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=VIDEO
+    ] MediaError {
+          const unsigned short MEDIA_ERR_ABORTED = 1;
+          const unsigned short MEDIA_ERR_NETWORK = 2;
+          const unsigned short MEDIA_ERR_DECODE = 3;
+          const unsigned short MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
+#if defined(ENABLE_ENCRYPTED_MEDIA) && ENABLE_ENCRYPTED_MEDIA
+          const unsigned short MEDIA_ERR_ENCRYPTED = 5;
+#endif
+          readonly attribute unsigned short code;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/MediaKeyError.idl b/elemental/idl/third_party/WebCore/html/MediaKeyError.idl
new file mode 100644
index 0000000..55b9b04
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/MediaKeyError.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2012 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=ENCRYPTED_MEDIA,
+        V8EnabledAtRuntime=encryptedMedia, 
+    ] MediaKeyError {
+        const unsigned short MEDIA_KEYERR_UNKNOWN = 1;
+        const unsigned short MEDIA_KEYERR_CLIENT = 2;
+        const unsigned short MEDIA_KEYERR_SERVICE = 3;
+        const unsigned short MEDIA_KEYERR_OUTPUT = 4;
+        const unsigned short MEDIA_KEYERR_HARDWARECHANGE = 5;
+        const unsigned short MEDIA_KEYERR_DOMAIN = 6;
+        readonly attribute unsigned short code;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/MediaKeyEvent.idl b/elemental/idl/third_party/WebCore/html/MediaKeyEvent.idl
new file mode 100644
index 0000000..b1387dc
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/MediaKeyEvent.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        Conditional=ENCRYPTED_MEDIA,
+        V8EnabledAtRuntime=encryptedMedia,
+        ConstructorTemplate=Event 
+    ] MediaKeyEvent : Event {
+        readonly attribute [InitializedByEventConstructor] DOMString keySystem;
+        readonly attribute [InitializedByEventConstructor] DOMString sessionId;
+        readonly attribute [InitializedByEventConstructor] Uint8Array initData;
+        readonly attribute [InitializedByEventConstructor] Uint8Array message;
+        readonly attribute [InitializedByEventConstructor] DOMString defaultURL;
+        readonly attribute [InitializedByEventConstructor] MediaKeyError errorCode;
+        readonly attribute [InitializedByEventConstructor] unsigned short systemCode;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/RadioNodeList.idl b/elemental/idl/third_party/WebCore/html/RadioNodeList.idl
new file mode 100644
index 0000000..8ed57ba
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/RadioNodeList.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012 Motorola Mobility, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY MOTOROLA MOBILITY, INC. AND ITS CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MOTOROLA MOBILITY, INC. OR ITS
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        JSGenerateToJSObject,
+        IndexedGetter,
+    ] RadioNodeList : NodeList {
+        attribute DOMString value;
+    };
+}
+
diff --git a/elemental/idl/third_party/WebCore/html/TextMetrics.idl b/elemental/idl/third_party/WebCore/html/TextMetrics.idl
new file mode 100644
index 0000000..1a315ba
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/TextMetrics.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface TextMetrics {
+        readonly attribute float width;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/TimeRanges.idl b/elemental/idl/third_party/WebCore/html/TimeRanges.idl
new file mode 100644
index 0000000..c37c360
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/TimeRanges.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2007, 2010 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        Conditional=VIDEO
+    ] TimeRanges {
+        readonly attribute unsigned long length;
+        float start(in unsigned long index)
+            raises (DOMException);
+        float end(in unsigned long index)
+            raises (DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/ValidityState.idl b/elemental/idl/third_party/WebCore/html/ValidityState.idl
new file mode 100644
index 0000000..601bfaf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/ValidityState.idl
@@ -0,0 +1,38 @@
+/*
+ * This file is part of the WebKit project.
+ *
+ * Copyright (C) 2009 Michelangelo De Simone <micdesim@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+module html {
+
+    interface [
+        OmitConstructor
+    ] ValidityState {
+        readonly attribute boolean         valueMissing;
+        readonly attribute boolean         typeMismatch;
+        readonly attribute boolean         patternMismatch;
+        readonly attribute boolean         tooLong;
+        readonly attribute boolean         rangeUnderflow;
+        readonly attribute boolean         rangeOverflow;
+        readonly attribute boolean         stepMismatch;
+        readonly attribute boolean         customError;
+        readonly attribute boolean         valid;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/VoidCallback.idl b/elemental/idl/third_party/WebCore/html/VoidCallback.idl
new file mode 100644
index 0000000..d0f159b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/VoidCallback.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        JSCustomToNativeObject,
+        OmitConstructor
+    ] VoidCallback {
+        void handleEvent();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/ArrayBuffer.idl b/elemental/idl/third_party/WebCore/html/canvas/ArrayBuffer.idl
new file mode 100644
index 0000000..26dd341
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/ArrayBuffer.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        JSGenerateIsReachable=Impl,
+        CustomConstructor,
+        ConstructorParameters=1,
+        JSNoStaticTables
+    ] ArrayBuffer {
+        readonly attribute int byteLength;
+        ArrayBuffer slice(in long begin, in [Optional] long end);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/ArrayBufferView.idl b/elemental/idl/third_party/WebCore/html/canvas/ArrayBufferView.idl
new file mode 100644
index 0000000..0e934e6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/ArrayBufferView.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        CustomToJSObject,
+        JSNoStaticTables,
+        OmitConstructor
+    ] ArrayBufferView {
+        readonly attribute ArrayBuffer buffer;
+        readonly attribute unsigned long byteOffset;
+        readonly attribute unsigned long byteLength;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/CanvasGradient.idl b/elemental/idl/third_party/WebCore/html/canvas/CanvasGradient.idl
new file mode 100644
index 0000000..496d4c1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/CanvasGradient.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface CanvasGradient {
+
+        void addColorStop(in [Optional=DefaultIsUndefined] float offset, 
+                          in [Optional=DefaultIsUndefined] DOMString color)
+            raises (DOMException);
+
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/html/canvas/CanvasPattern.idl b/elemental/idl/third_party/WebCore/html/canvas/CanvasPattern.idl
new file mode 100644
index 0000000..e5aa036
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/CanvasPattern.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface CanvasPattern {
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/html/canvas/CanvasPixelArray.idl b/elemental/idl/third_party/WebCore/html/canvas/CanvasPixelArray.idl
new file mode 100644
index 0000000..8c0836b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/CanvasPixelArray.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT || defined(V8_BINDING) && V8_BINDING
+    interface [
+        OmitConstructor,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        V8CustomToJSObject
+    ] CanvasPixelArray {
+#if !defined(V8_BINDING) || !V8_BINDING
+        readonly attribute long length;
+#endif
+    };
+#endif
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/CanvasRenderingContext.idl b/elemental/idl/third_party/WebCore/html/canvas/CanvasRenderingContext.idl
new file mode 100644
index 0000000..b937393
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/CanvasRenderingContext.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        JSCustomMarkFunction,
+        JSGenerateIsReachable,
+        JSCustomToJSObject
+    ] CanvasRenderingContext {
+
+        readonly attribute HTMLCanvasElement canvas;
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/html/canvas/CanvasRenderingContext2D.idl b/elemental/idl/third_party/WebCore/html/canvas/CanvasRenderingContext2D.idl
new file mode 100644
index 0000000..d41f875
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/CanvasRenderingContext2D.idl
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface CanvasRenderingContext2D : CanvasRenderingContext {
+
+        void save();
+        void restore();
+
+        void scale(in [Optional=DefaultIsUndefined] float sx,
+                   in [Optional=DefaultIsUndefined] float sy);
+        void rotate(in [Optional=DefaultIsUndefined] float angle);
+        void translate(in [Optional=DefaultIsUndefined] float tx,
+                       in [Optional=DefaultIsUndefined] float ty);
+        void transform(in [Optional=DefaultIsUndefined] float m11,
+                       in [Optional=DefaultIsUndefined] float m12,
+                       in [Optional=DefaultIsUndefined] float m21,
+                       in [Optional=DefaultIsUndefined] float m22,
+                       in [Optional=DefaultIsUndefined] float dx,
+                       in [Optional=DefaultIsUndefined] float dy);
+        void setTransform(in [Optional=DefaultIsUndefined] float m11,
+                          in [Optional=DefaultIsUndefined] float m12,
+                          in [Optional=DefaultIsUndefined] float m21,
+                          in [Optional=DefaultIsUndefined] float m22,
+                          in [Optional=DefaultIsUndefined] float dx,
+                          in [Optional=DefaultIsUndefined] float dy);
+
+        attribute float globalAlpha;
+        attribute [TreatNullAs=NullString] DOMString globalCompositeOperation;
+
+        CanvasGradient createLinearGradient(in [Optional=DefaultIsUndefined] float x0,
+                                            in [Optional=DefaultIsUndefined] float y0,
+                                            in [Optional=DefaultIsUndefined] float x1,
+                                            in [Optional=DefaultIsUndefined] float y1)
+            raises (DOMException);
+        CanvasGradient createRadialGradient(in [Optional=DefaultIsUndefined] float x0,
+                                            in [Optional=DefaultIsUndefined] float y0,
+                                            in [Optional=DefaultIsUndefined] float r0,
+                                            in [Optional=DefaultIsUndefined] float x1,
+                                            in [Optional=DefaultIsUndefined] float y1,
+                                            in [Optional=DefaultIsUndefined] float r1)
+            raises (DOMException);
+
+        attribute float lineWidth;
+        attribute [TreatNullAs=NullString] DOMString lineCap;
+        attribute [TreatNullAs=NullString] DOMString lineJoin;
+        attribute float miterLimit;
+
+        attribute float shadowOffsetX;
+        attribute float shadowOffsetY;
+        attribute float shadowBlur;
+        attribute [TreatNullAs=NullString] DOMString shadowColor;
+
+        // FIXME: These attributes should also be implemented for V8.
+#if !(defined(V8_BINDING) && V8_BINDING)
+        attribute [Custom] Array webkitLineDash;
+        attribute float webkitLineDashOffset;
+#endif
+
+        void clearRect(in [Optional=DefaultIsUndefined] float x,
+                       in [Optional=DefaultIsUndefined] float y,
+                       in [Optional=DefaultIsUndefined] float width,
+                       in [Optional=DefaultIsUndefined] float height);
+        void fillRect(in [Optional=DefaultIsUndefined] float x,
+                      in [Optional=DefaultIsUndefined] float y,
+                      in [Optional=DefaultIsUndefined] float width,
+                      in [Optional=DefaultIsUndefined] float height);
+
+        void beginPath();
+        void closePath();
+        void moveTo(in [Optional=DefaultIsUndefined] float x,
+                    in [Optional=DefaultIsUndefined] float y);
+        void lineTo(in [Optional=DefaultIsUndefined] float x,
+                    in [Optional=DefaultIsUndefined] float y);
+        void quadraticCurveTo(in [Optional=DefaultIsUndefined] float cpx,
+                              in [Optional=DefaultIsUndefined] float cpy,
+                              in [Optional=DefaultIsUndefined] float x,
+                              in [Optional=DefaultIsUndefined] float y);
+        void bezierCurveTo(in [Optional=DefaultIsUndefined] float cp1x,
+                           in [Optional=DefaultIsUndefined] float cp1y,
+                           in [Optional=DefaultIsUndefined] float cp2x,
+                           in [Optional=DefaultIsUndefined] float cp2y,
+                           in [Optional=DefaultIsUndefined] float x,
+                           in [Optional=DefaultIsUndefined] float y);
+        void arcTo(in [Optional=DefaultIsUndefined] float x1,
+                   in [Optional=DefaultIsUndefined] float y1,
+                   in [Optional=DefaultIsUndefined] float x2,
+                   in [Optional=DefaultIsUndefined] float y2,
+                   in [Optional=DefaultIsUndefined] float radius)
+            raises (DOMException);
+        void rect(in [Optional=DefaultIsUndefined] float x,
+                  in [Optional=DefaultIsUndefined] float y,
+                  in [Optional=DefaultIsUndefined] float width,
+                  in [Optional=DefaultIsUndefined] float height);
+        void arc(in [Optional=DefaultIsUndefined] float x,
+                 in [Optional=DefaultIsUndefined] float y,
+                 in [Optional=DefaultIsUndefined] float radius,
+                 in [Optional=DefaultIsUndefined] float startAngle,
+                 in [Optional=DefaultIsUndefined] float endAngle,
+                 in [Optional=DefaultIsUndefined] boolean anticlockwise)
+            raises (DOMException);
+        void fill();
+        void stroke();
+        void clip();
+        boolean isPointInPath(in [Optional=DefaultIsUndefined] float x,
+                              in [Optional=DefaultIsUndefined] float y);
+
+        // text
+        attribute DOMString font;
+        attribute DOMString textAlign;
+        attribute DOMString textBaseline;
+
+        TextMetrics measureText(in [Optional=DefaultIsUndefined] DOMString text);
+
+        // other
+
+        void setAlpha(in [Optional=DefaultIsUndefined] float alpha);
+        void setCompositeOperation(in [Optional=DefaultIsUndefined] DOMString compositeOperation);
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+        void setLineWidth(in [Optional=DefaultIsUndefined] float width);
+        void setLineCap(in [Optional=DefaultIsUndefined] DOMString cap);
+        void setLineJoin(in [Optional=DefaultIsUndefined] DOMString join);
+        void setMiterLimit(in [Optional=DefaultIsUndefined] float limit);
+#endif
+
+        void clearShadow();
+
+        void fillText(in DOMString text, in float x, in float y, in [Optional] float maxWidth);
+        void strokeText(in DOMString text, in float x, in float y, in [Optional] float maxWidth);
+
+        void setStrokeColor(in DOMString color, in [Optional] float alpha);
+        void setStrokeColor(in float grayLevel, in [Optional] float alpha);
+        void setStrokeColor(in float r, in float g, in float b, in float a);
+        void setStrokeColor(in float c, in float m, in float y, in float k, in float a);
+
+        void setFillColor(in DOMString color, in [Optional] float alpha);
+        void setFillColor(in float grayLevel, in [Optional] float alpha);
+        void setFillColor(in float r, in float g, in float b, in float a);
+        void setFillColor(in float c, in float m, in float y, in float k, in float a);
+
+        void strokeRect(in [Optional=DefaultIsUndefined] float x,
+                        in [Optional=DefaultIsUndefined] float y,
+                        in [Optional=DefaultIsUndefined] float width,
+                        in [Optional=DefaultIsUndefined] float height,
+                        in [Optional] float lineWidth);
+
+        void drawImage(in HTMLImageElement image, in float x, in float y)
+            raises (DOMException);
+        void drawImage(in HTMLImageElement image, in float x, in float y, in float width, in float height)
+            raises (DOMException);
+        void drawImage(in HTMLImageElement image, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh)
+            raises (DOMException);
+        void drawImage(in HTMLCanvasElement canvas, in float x, in float y)
+            raises (DOMException);
+        void drawImage(in HTMLCanvasElement canvas, in float x, in float y, in float width, in float height)
+            raises (DOMException);
+        void drawImage(in HTMLCanvasElement canvas, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh)
+            raises (DOMException);
+#if defined(ENABLE_VIDEO) && ENABLE_VIDEO
+        void drawImage(in HTMLVideoElement video, in float x, in float y)
+            raises (DOMException);
+        void drawImage(in HTMLVideoElement video, in float x, in float y, in float width, in float height)
+            raises (DOMException);
+        void drawImage(in HTMLVideoElement video, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh)
+            raises (DOMException);
+#endif
+
+        void drawImageFromRect(in HTMLImageElement image,
+                               in [Optional] float sx, in [Optional] float sy, in [Optional] float sw, in [Optional] float sh,
+                               in [Optional] float dx, in [Optional] float dy, in [Optional] float dw, in [Optional] float dh,
+                               in [Optional] DOMString compositeOperation);
+
+        void setShadow(in float width, in float height, in float blur, in [Optional] DOMString color, in [Optional] float alpha);
+        void setShadow(in float width, in float height, in float blur, in float grayLevel, in [Optional] float alpha);
+        void setShadow(in float width, in float height, in float blur, in float r, in float g, in float b, in float a);
+        void setShadow(in float width, in float height, in float blur, in float c, in float m, in float y, in float k, in float a);
+
+        void putImageData(in ImageData imagedata, in float dx, in float dy)
+            raises(DOMException);
+        void putImageData(in ImageData imagedata, in float dx, in float dy, in float dirtyX, in float dirtyY, in float dirtyWidth, in float dirtyHeight)
+            raises(DOMException);
+
+        void webkitPutImageDataHD(in ImageData imagedata, in float dx, in float dy)
+            raises(DOMException);
+        void webkitPutImageDataHD(in ImageData imagedata, in float dx, in float dy, in float dirtyX, in float dirtyY, in float dirtyWidth, in float dirtyHeight)
+            raises(DOMException);
+
+        CanvasPattern createPattern(in HTMLCanvasElement canvas, in [TreatNullAs=NullString] DOMString repetitionType)
+            raises (DOMException);
+        CanvasPattern createPattern(in HTMLImageElement image, in [TreatNullAs=NullString] DOMString repetitionType)
+            raises (DOMException);
+        ImageData createImageData(in ImageData imagedata)
+            raises (DOMException);
+        ImageData createImageData(in float sw, in float sh)
+            raises (DOMException);
+
+        attribute [Custom] custom strokeStyle;
+        attribute [Custom] custom fillStyle;
+
+        // pixel manipulation
+        ImageData getImageData(in [Optional=DefaultIsUndefined] float sx, in [Optional=DefaultIsUndefined] float sy,
+                               in [Optional=DefaultIsUndefined] float sw, in [Optional=DefaultIsUndefined] float sh)
+            raises(DOMException);
+
+        ImageData webkitGetImageDataHD(in [Optional=DefaultIsUndefined] float sx, in [Optional=DefaultIsUndefined] float sy,
+                                       in [Optional=DefaultIsUndefined] float sw, in [Optional=DefaultIsUndefined] float sh)
+            raises(DOMException);
+
+        readonly attribute float webkitBackingStorePixelRatio;
+
+        attribute boolean webkitImageSmoothingEnabled;
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/html/canvas/DataView.idl b/elemental/idl/third_party/WebCore/html/canvas/DataView.idl
new file mode 100755
index 0000000..3f4dcdf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/DataView.idl
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        CustomConstructor,
+        ConstructorParameters=3,
+        CustomToJSObject,
+        JSNoStaticTables
+    ] DataView : ArrayBufferView {
+        // All these methods raise an exception if they would read or write beyond the end of the view.
+
+        // We have to use custom code because our code generator does not support int8_t type.
+        // int8_t getInt8(in unsigned long byteOffset);
+        // uint8_t getUint8(in unsigned long byteOffset);
+        [Custom] DOMObject getInt8()
+            raises (DOMException);
+        [Custom] DOMObject getUint8()
+            raises (DOMException);
+
+        [StrictTypeChecking] short getInt16(in unsigned long byteOffset, in [Optional] boolean littleEndian)
+            raises (DOMException);
+        [StrictTypeChecking] unsigned short getUint16(in unsigned long byteOffset, in [Optional] boolean littleEndian)
+            raises (DOMException);
+        [StrictTypeChecking] long getInt32(in unsigned long byteOffset, in [Optional] boolean littleEndian)
+            raises (DOMException);
+        [StrictTypeChecking] unsigned long getUint32(in unsigned long byteOffset, in [Optional] boolean littleEndian)
+            raises (DOMException);
+
+        // Use custom code to handle NaN case for JSC.
+        [JSCustom, StrictTypeChecking] float getFloat32(in unsigned long byteOffset, in [Optional] boolean littleEndian)
+            raises (DOMException);
+        [JSCustom, StrictTypeChecking] double getFloat64(in unsigned long byteOffset, in [Optional] boolean littleEndian)
+            raises (DOMException);
+
+        // We have to use custom code because our code generator does not support uint8_t type.
+        // void setInt8(in unsigned long byteOffset, in int8_t value);
+        // void setUint8(in unsigned long byteOffset, in uint8_t value);
+        [Custom] void setInt8()
+            raises (DOMException);
+        [Custom] void setUint8()
+            raises (DOMException);
+
+        [StrictTypeChecking] void setInt16(in unsigned long byteOffset, in short value, in [Optional] boolean littleEndian)
+            raises (DOMException);
+        [StrictTypeChecking] void setUint16(in unsigned long byteOffset, in unsigned short value, in [Optional] boolean littleEndian)
+            raises (DOMException);
+        [StrictTypeChecking] void setInt32(in unsigned long byteOffset, in long value, in [Optional] boolean littleEndian)
+            raises (DOMException);
+        [StrictTypeChecking] void setUint32(in unsigned long byteOffset, in unsigned long value, in [Optional] boolean littleEndian)
+            raises (DOMException);
+        [StrictTypeChecking] void setFloat32(in unsigned long byteOffset, in float value, in [Optional] boolean littleEndian)
+            raises (DOMException);
+        [StrictTypeChecking] void setFloat64(in unsigned long byteOffset, in double value, in [Optional] boolean littleEndian)
+            raises (DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/EXTTextureFilterAnisotropic.idl b/elemental/idl/third_party/WebCore/html/canvas/EXTTextureFilterAnisotropic.idl
new file mode 100644
index 0000000..568aa9a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/EXTTextureFilterAnisotropic.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL,
+        JSGenerateIsReachable=ImplContext,
+        OmitConstructor,
+        DoNotCheckConstants
+    ] EXTTextureFilterAnisotropic {
+        const unsigned int TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;
+        const unsigned int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/Float32Array.idl b/elemental/idl/third_party/WebCore/html/canvas/Float32Array.idl
new file mode 100644
index 0000000..8eaebe4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/Float32Array.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Computer, Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Float32Array : ArrayBufferView {
+        const unsigned long BYTES_PER_ELEMENT = 4;
+
+        readonly attribute unsigned long length;
+        Float32Array subarray(in [Optional=DefaultIsUndefined] long start, 
+                              in [Optional] long end);
+
+        // void set(in Float32Array array, [Optional] in unsigned long offset);
+        // void set(in sequence<long> array, [Optional] in unsigned long offset);
+        [Custom] void set();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/Float64Array.idl b/elemental/idl/third_party/WebCore/html/canvas/Float64Array.idl
new file mode 100644
index 0000000..abfeb21
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/Float64Array.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Float64Array : ArrayBufferView {
+        const unsigned long BYTES_PER_ELEMENT = 8;
+
+        readonly attribute unsigned long length;
+        Float64Array subarray(in [Optional=DefaultIsUndefined] long start, 
+                              in [Optional] long end);
+
+        // void set(in Float64Array array, [Optional] in unsigned long offset);
+        // void set(in sequence<long> array, [Optional] in unsigned long offset);
+        [Custom] void set();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/Int16Array.idl b/elemental/idl/third_party/WebCore/html/canvas/Int16Array.idl
new file mode 100644
index 0000000..f6d089e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/Int16Array.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2006, 2010 Apple Computer, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Int16Array : ArrayBufferView {
+        const unsigned long BYTES_PER_ELEMENT = 2;
+
+        readonly attribute unsigned long length;
+        Int16Array subarray(in [Optional=DefaultIsUndefined] long start, 
+                            in [Optional] long end);
+
+        // void set(in Int16Array array, [Optional] in unsigned long offset);
+        // void set(in sequence<long> array, [Optional] in unsigned long offset);
+        [Custom] void set();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/Int32Array.idl b/elemental/idl/third_party/WebCore/html/canvas/Int32Array.idl
new file mode 100644
index 0000000..f98835a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/Int32Array.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Int32Array : ArrayBufferView {
+        const unsigned long BYTES_PER_ELEMENT = 4;
+
+        readonly attribute unsigned long length;
+        Int32Array subarray(in [Optional=DefaultIsUndefined] long start, 
+                            in [Optional] long end);
+
+        // void set(in Int32Array array, [Optional] in unsigned long offset);
+        // void set(in sequence<long> array, [Optional] in unsigned long offset);
+        [Custom] void set();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/Int8Array.idl b/elemental/idl/third_party/WebCore/html/canvas/Int8Array.idl
new file mode 100644
index 0000000..00faa4f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/Int8Array.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Int8Array : ArrayBufferView {
+        const unsigned long BYTES_PER_ELEMENT = 1;
+
+        readonly attribute unsigned long length;
+        Int8Array subarray(in [Optional=DefaultIsUndefined] long start, 
+                           in [Optional] long end);
+
+        // void set(in Int8Array array, [Optional] in unsigned long offset);
+        // void set(in sequence<long> array, [Optional] in unsigned long offset);
+        [Custom] void set();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/OESStandardDerivatives.idl b/elemental/idl/third_party/WebCore/html/canvas/OESStandardDerivatives.idl
new file mode 100644
index 0000000..93f0a01
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/OESStandardDerivatives.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL,
+        JSGenerateIsReachable=ImplContext,
+        OmitConstructor,
+        DoNotCheckConstants
+    ] OESStandardDerivatives {
+        const unsigned int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/OESTextureFloat.idl b/elemental/idl/third_party/WebCore/html/canvas/OESTextureFloat.idl
new file mode 100644
index 0000000..6537f47
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/OESTextureFloat.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL,
+        JSGenerateIsReachable=ImplContext,
+        OmitConstructor
+    ] OESTextureFloat {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/OESVertexArrayObject.idl b/elemental/idl/third_party/WebCore/html/canvas/OESVertexArrayObject.idl
new file mode 100644
index 0000000..c3d3666
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/OESVertexArrayObject.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL, 
+        JSGenerateIsReachable=ImplContext,
+        OmitConstructor, 
+        DoNotCheckConstants
+    ] OESVertexArrayObject {
+        const unsigned int VERTEX_ARRAY_BINDING_OES = 0x85B5;
+        
+        [StrictTypeChecking] WebGLVertexArrayObjectOES createVertexArrayOES();
+        [StrictTypeChecking] void         deleteVertexArrayOES(in [Optional=DefaultIsUndefined] WebGLVertexArrayObjectOES arrayObject);
+        [StrictTypeChecking] boolean      isVertexArrayOES(in [Optional=DefaultIsUndefined] WebGLVertexArrayObjectOES arrayObject);
+        [StrictTypeChecking] void         bindVertexArrayOES(in [Optional=DefaultIsUndefined] WebGLVertexArrayObjectOES arrayObject) raises(DOMException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/Uint16Array.idl b/elemental/idl/third_party/WebCore/html/canvas/Uint16Array.idl
new file mode 100644
index 0000000..79e05ef
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/Uint16Array.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Uint16Array : ArrayBufferView {
+        const unsigned long BYTES_PER_ELEMENT = 2;
+
+        readonly attribute unsigned long length;
+        Uint16Array subarray(in [Optional=DefaultIsUndefined] long start, in [Optional] long end);
+
+        // void set(in Uint16Array array, [Optional] in unsigned long offset);
+        // void set(in sequence<long> array, [Optional] in unsigned long offset);
+        [Custom] void set();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/Uint32Array.idl b/elemental/idl/third_party/WebCore/html/canvas/Uint32Array.idl
new file mode 100644
index 0000000..67e61b2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/Uint32Array.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Uint32Array : ArrayBufferView {
+        const unsigned long BYTES_PER_ELEMENT = 4;
+
+        readonly attribute unsigned long length;
+        Uint32Array subarray(in [Optional=DefaultIsUndefined] long start, in [Optional] long end);
+
+        // void set(in Uint32Array array, [Optional] in unsigned long offset);
+        // void set(in sequence<long> array, [Optional] in unsigned long offset);
+        [Custom] void set();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/Uint8Array.idl b/elemental/idl/third_party/WebCore/html/canvas/Uint8Array.idl
new file mode 100644
index 0000000..260a327
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/Uint8Array.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Uint8Array : ArrayBufferView {
+        const unsigned long BYTES_PER_ELEMENT = 1;
+
+        readonly attribute unsigned long length;
+        Uint8Array subarray(in [Optional=DefaultIsUndefined] long start, in [Optional] long end);
+
+        // void set(in Uint8Array array, [Optional] in unsigned long offset);
+        // void set(in sequence<long> array, [Optional] in unsigned long offset);
+        [Custom] void set();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/Uint8ClampedArray.idl b/elemental/idl/third_party/WebCore/html/canvas/Uint8ClampedArray.idl
new file mode 100644
index 0000000..cadd663
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/Uint8ClampedArray.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        CustomConstructor,
+        ConstructorParameters=1,
+        NumericIndexedGetter,
+        CustomIndexedSetter,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        CustomToJSObject,
+        DoNotCheckConstants
+    ] Uint8ClampedArray : Uint8Array {
+        const unsigned long BYTES_PER_ELEMENT = 1;
+
+        readonly attribute unsigned long length;
+        Uint8ClampedArray subarray(in [Optional=DefaultIsUndefined] long start, in [Optional] long end);
+
+        // FIXME: Missing other setters!
+        // void set(in Uint8ClampedArray array, [Optional] in unsigned long offset);
+        // void set(in sequence<long> array, [Optional] in unsigned long offset);
+        [Custom] void set();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLActiveInfo.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLActiveInfo.idl
new file mode 100644
index 0000000..20ab8af
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLActiveInfo.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        Conditional=WEBGL,
+    ] WebGLActiveInfo {
+        readonly attribute int size;
+        readonly attribute unsigned int type;
+        readonly attribute DOMString name;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLBuffer.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLBuffer.idl
new file mode 100644
index 0000000..312b009
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLBuffer.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL,
+    ] WebGLBuffer {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLCompressedTextureS3TC.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLCompressedTextureS3TC.idl
new file mode 100644
index 0000000..7fde5bb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLCompressedTextureS3TC.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL,
+        JSGenerateIsReachable=ImplContext,
+        OmitConstructor,
+        DoNotCheckConstants
+    ] WebGLCompressedTextureS3TC {
+        /* Compressed Texture Formats */
+        const unsigned int COMPRESSED_RGB_S3TC_DXT1_EXT        = 0x83F0;
+        const unsigned int COMPRESSED_RGBA_S3TC_DXT1_EXT       = 0x83F1;
+        const unsigned int COMPRESSED_RGBA_S3TC_DXT3_EXT       = 0x83F2;
+        const unsigned int COMPRESSED_RGBA_S3TC_DXT5_EXT       = 0x83F3;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLContextAttributes.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLContextAttributes.idl
new file mode 100644
index 0000000..56da1c6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLContextAttributes.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL,
+        OmitConstructor
+    ] WebGLContextAttributes {
+        attribute boolean alpha;
+        attribute boolean depth;
+        attribute boolean stencil;
+        attribute boolean antialias;
+        attribute boolean premultipliedAlpha;
+        attribute boolean preserveDrawingBuffer;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLContextEvent.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLContextEvent.idl
new file mode 100644
index 0000000..3735f12
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLContextEvent.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        Conditional=WEBGL,
+        ConstructorTemplate=Event
+    ] WebGLContextEvent : Event {
+        readonly attribute [InitializedByEventConstructor] DOMString statusMessage;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLDebugRendererInfo.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLDebugRendererInfo.idl
new file mode 100644
index 0000000..b307a14
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLDebugRendererInfo.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL,
+        JSGenerateIsReachable=ImplContext,
+        OmitConstructor,
+        DoNotCheckConstants
+    ] WebGLDebugRendererInfo {
+        const unsigned int UNMASKED_VENDOR_WEBGL = 0x9245;
+        const unsigned int UNMASKED_RENDERER_WEBGL = 0x9246;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLDebugShaders.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLDebugShaders.idl
new file mode 100644
index 0000000..ee330b6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLDebugShaders.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL,
+        JSGenerateIsReachable=ImplContext,
+        OmitConstructor
+    ] WebGLDebugShaders {
+        [StrictTypeChecking, TreatReturnedNullStringAs=Null] DOMString getTranslatedShaderSource(in WebGLShader shader) raises(DOMException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLFramebuffer.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLFramebuffer.idl
new file mode 100644
index 0000000..d0caa91
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLFramebuffer.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL
+    ] WebGLFramebuffer {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLLoseContext.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLLoseContext.idl
new file mode 100644
index 0000000..390da26
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLLoseContext.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL,
+        JSGenerateIsReachable=ImplContext,
+        OmitConstructor
+    ] WebGLLoseContext {
+        [StrictTypeChecking] void loseContext();
+        [StrictTypeChecking] void restoreContext();
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLProgram.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLProgram.idl
new file mode 100644
index 0000000..326f1c3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLProgram.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL
+    ] WebGLProgram {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLRenderbuffer.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLRenderbuffer.idl
new file mode 100644
index 0000000..a6518ea
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLRenderbuffer.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL
+    ] WebGLRenderbuffer {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLRenderingContext.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLRenderingContext.idl
new file mode 100644
index 0000000..e6d10a7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLRenderingContext.idl
@@ -0,0 +1,701 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        Conditional=WEBGL,
+        JSCustomMarkFunction,
+        DoNotCheckConstants
+    ] WebGLRenderingContext : CanvasRenderingContext {
+
+        /* ClearBufferMask */
+        const unsigned int DEPTH_BUFFER_BIT               = 0x00000100;
+        const unsigned int STENCIL_BUFFER_BIT             = 0x00000400;
+        const unsigned int COLOR_BUFFER_BIT               = 0x00004000;
+
+        /* BeginMode */
+        const unsigned int POINTS                         = 0x0000;
+        const unsigned int LINES                          = 0x0001;
+        const unsigned int LINE_LOOP                      = 0x0002;
+        const unsigned int LINE_STRIP                     = 0x0003;
+        const unsigned int TRIANGLES                      = 0x0004;
+        const unsigned int TRIANGLE_STRIP                 = 0x0005;
+        const unsigned int TRIANGLE_FAN                   = 0x0006;
+
+        /* AlphaFunction (not supported in ES20) */
+        /*      NEVER */
+        /*      LESS */
+        /*      EQUAL */
+        /*      LEQUAL */
+        /*      GREATER */
+        /*      NOTEQUAL */
+        /*      GEQUAL */
+        /*      ALWAYS */
+
+        /* BlendingFactorDest */
+        const unsigned int ZERO                           = 0;
+        const unsigned int ONE                            = 1;
+        const unsigned int SRC_COLOR                      = 0x0300;
+        const unsigned int ONE_MINUS_SRC_COLOR            = 0x0301;
+        const unsigned int SRC_ALPHA                      = 0x0302;
+        const unsigned int ONE_MINUS_SRC_ALPHA            = 0x0303;
+        const unsigned int DST_ALPHA                      = 0x0304;
+        const unsigned int ONE_MINUS_DST_ALPHA            = 0x0305;
+
+        /* BlendingFactorSrc */
+        /*      ZERO */
+        /*      ONE */
+        const unsigned int DST_COLOR                      = 0x0306;
+        const unsigned int ONE_MINUS_DST_COLOR            = 0x0307;
+        const unsigned int SRC_ALPHA_SATURATE             = 0x0308;
+        /*      SRC_ALPHA */
+        /*      ONE_MINUS_SRC_ALPHA */
+        /*      DST_ALPHA */
+        /*      ONE_MINUS_DST_ALPHA */
+
+        /* BlendEquationSeparate */
+        const unsigned int FUNC_ADD                       = 0x8006;
+        const unsigned int BLEND_EQUATION                 = 0x8009;
+        const unsigned int BLEND_EQUATION_RGB             = 0x8009;   /* same as BLEND_EQUATION */
+        const unsigned int BLEND_EQUATION_ALPHA           = 0x883D;
+
+        /* BlendSubtract */
+        const unsigned int FUNC_SUBTRACT                  = 0x800A;
+        const unsigned int FUNC_REVERSE_SUBTRACT          = 0x800B;
+
+        /* Separate Blend Functions */
+        const unsigned int BLEND_DST_RGB                  = 0x80C8;
+        const unsigned int BLEND_SRC_RGB                  = 0x80C9;
+        const unsigned int BLEND_DST_ALPHA                = 0x80CA;
+        const unsigned int BLEND_SRC_ALPHA                = 0x80CB;
+        const unsigned int CONSTANT_COLOR                 = 0x8001;
+        const unsigned int ONE_MINUS_CONSTANT_COLOR       = 0x8002;
+        const unsigned int CONSTANT_ALPHA                 = 0x8003;
+        const unsigned int ONE_MINUS_CONSTANT_ALPHA       = 0x8004;
+        const unsigned int BLEND_COLOR                    = 0x8005;
+
+        /* Buffer Objects */
+        const unsigned int ARRAY_BUFFER                   = 0x8892;
+        const unsigned int ELEMENT_ARRAY_BUFFER           = 0x8893;
+        const unsigned int ARRAY_BUFFER_BINDING           = 0x8894;
+        const unsigned int ELEMENT_ARRAY_BUFFER_BINDING   = 0x8895;
+
+        const unsigned int STREAM_DRAW                    = 0x88E0;
+        const unsigned int STATIC_DRAW                    = 0x88E4;
+        const unsigned int DYNAMIC_DRAW                   = 0x88E8;
+
+        const unsigned int BUFFER_SIZE                    = 0x8764;
+        const unsigned int BUFFER_USAGE                   = 0x8765;
+
+        const unsigned int CURRENT_VERTEX_ATTRIB          = 0x8626;
+
+        /* CullFaceMode */
+        const unsigned int FRONT                          = 0x0404;
+        const unsigned int BACK                           = 0x0405;
+        const unsigned int FRONT_AND_BACK                 = 0x0408;
+
+        /* DepthFunction */
+        /*      NEVER */
+        /*      LESS */
+        /*      EQUAL */
+        /*      LEQUAL */
+        /*      GREATER */
+        /*      NOTEQUAL */
+        /*      GEQUAL */
+        /*      ALWAYS */
+
+        /* EnableCap */
+        const unsigned int TEXTURE_2D                     = 0x0DE1;
+        const unsigned int CULL_FACE                      = 0x0B44;
+        const unsigned int BLEND                          = 0x0BE2;
+        const unsigned int DITHER                         = 0x0BD0;
+        const unsigned int STENCIL_TEST                   = 0x0B90;
+        const unsigned int DEPTH_TEST                     = 0x0B71;
+        const unsigned int SCISSOR_TEST                   = 0x0C11;
+        const unsigned int POLYGON_OFFSET_FILL            = 0x8037;
+        const unsigned int SAMPLE_ALPHA_TO_COVERAGE       = 0x809E;
+        const unsigned int SAMPLE_COVERAGE                = 0x80A0;
+
+        /* ErrorCode */
+        const unsigned int NO_ERROR                       = 0;
+        const unsigned int INVALID_ENUM                   = 0x0500;
+        const unsigned int INVALID_VALUE                  = 0x0501;
+        const unsigned int INVALID_OPERATION              = 0x0502;
+        const unsigned int OUT_OF_MEMORY                  = 0x0505;
+
+        /* FrontFaceDirection */
+        const unsigned int CW                             = 0x0900;
+        const unsigned int CCW                            = 0x0901;
+
+        /* GetPName */
+        const unsigned int LINE_WIDTH                     = 0x0B21;
+        const unsigned int ALIASED_POINT_SIZE_RANGE       = 0x846D;
+        const unsigned int ALIASED_LINE_WIDTH_RANGE       = 0x846E;
+        const unsigned int CULL_FACE_MODE                 = 0x0B45;
+        const unsigned int FRONT_FACE                     = 0x0B46;
+        const unsigned int DEPTH_RANGE                    = 0x0B70;
+        const unsigned int DEPTH_WRITEMASK                = 0x0B72;
+        const unsigned int DEPTH_CLEAR_VALUE              = 0x0B73;
+        const unsigned int DEPTH_FUNC                     = 0x0B74;
+        const unsigned int STENCIL_CLEAR_VALUE            = 0x0B91;
+        const unsigned int STENCIL_FUNC                   = 0x0B92;
+        const unsigned int STENCIL_FAIL                   = 0x0B94;
+        const unsigned int STENCIL_PASS_DEPTH_FAIL        = 0x0B95;
+        const unsigned int STENCIL_PASS_DEPTH_PASS        = 0x0B96;
+        const unsigned int STENCIL_REF                    = 0x0B97;
+        const unsigned int STENCIL_VALUE_MASK             = 0x0B93;
+        const unsigned int STENCIL_WRITEMASK              = 0x0B98;
+        const unsigned int STENCIL_BACK_FUNC              = 0x8800;
+        const unsigned int STENCIL_BACK_FAIL              = 0x8801;
+        const unsigned int STENCIL_BACK_PASS_DEPTH_FAIL   = 0x8802;
+        const unsigned int STENCIL_BACK_PASS_DEPTH_PASS   = 0x8803;
+        const unsigned int STENCIL_BACK_REF               = 0x8CA3;
+        const unsigned int STENCIL_BACK_VALUE_MASK        = 0x8CA4;
+        const unsigned int STENCIL_BACK_WRITEMASK         = 0x8CA5;
+        const unsigned int VIEWPORT                       = 0x0BA2;
+        const unsigned int SCISSOR_BOX                    = 0x0C10;
+        /*      SCISSOR_TEST */
+        const unsigned int COLOR_CLEAR_VALUE              = 0x0C22;
+        const unsigned int COLOR_WRITEMASK                = 0x0C23;
+        const unsigned int UNPACK_ALIGNMENT               = 0x0CF5;
+        const unsigned int PACK_ALIGNMENT                 = 0x0D05;
+        const unsigned int MAX_TEXTURE_SIZE               = 0x0D33;
+        const unsigned int MAX_VIEWPORT_DIMS              = 0x0D3A;
+        const unsigned int SUBPIXEL_BITS                  = 0x0D50;
+        const unsigned int RED_BITS                       = 0x0D52;
+        const unsigned int GREEN_BITS                     = 0x0D53;
+        const unsigned int BLUE_BITS                      = 0x0D54;
+        const unsigned int ALPHA_BITS                     = 0x0D55;
+        const unsigned int DEPTH_BITS                     = 0x0D56;
+        const unsigned int STENCIL_BITS                   = 0x0D57;
+        const unsigned int POLYGON_OFFSET_UNITS           = 0x2A00;
+        /*      POLYGON_OFFSET_FILL */
+        const unsigned int POLYGON_OFFSET_FACTOR          = 0x8038;
+        const unsigned int TEXTURE_BINDING_2D             = 0x8069;
+        const unsigned int SAMPLE_BUFFERS                 = 0x80A8;
+        const unsigned int SAMPLES                        = 0x80A9;
+        const unsigned int SAMPLE_COVERAGE_VALUE          = 0x80AA;
+        const unsigned int SAMPLE_COVERAGE_INVERT         = 0x80AB;
+
+        /* GetTextureParameter */
+        /*      TEXTURE_MAG_FILTER */
+        /*      TEXTURE_MIN_FILTER */
+        /*      TEXTURE_WRAP_S */
+        /*      TEXTURE_WRAP_T */
+
+        const unsigned int COMPRESSED_TEXTURE_FORMATS     = 0x86A3;
+
+        /* HintMode */
+        const unsigned int DONT_CARE                      = 0x1100;
+        const unsigned int FASTEST                        = 0x1101;
+        const unsigned int NICEST                         = 0x1102;
+
+        /* HintTarget */
+        const unsigned int GENERATE_MIPMAP_HINT            = 0x8192;
+
+        /* DataType */
+        const unsigned int BYTE                           = 0x1400;
+        const unsigned int UNSIGNED_BYTE                  = 0x1401;
+        const unsigned int SHORT                          = 0x1402;
+        const unsigned int UNSIGNED_SHORT                 = 0x1403;
+        const unsigned int INT                            = 0x1404;
+        const unsigned int UNSIGNED_INT                   = 0x1405;
+        const unsigned int FLOAT                          = 0x1406;
+
+        /* PixelFormat */
+        const unsigned int DEPTH_COMPONENT                = 0x1902;
+        const unsigned int ALPHA                          = 0x1906;
+        const unsigned int RGB                            = 0x1907;
+        const unsigned int RGBA                           = 0x1908;
+        const unsigned int LUMINANCE                      = 0x1909;
+        const unsigned int LUMINANCE_ALPHA                = 0x190A;
+
+        /* PixelType */
+        /*      UNSIGNED_BYTE */
+        const unsigned int UNSIGNED_SHORT_4_4_4_4         = 0x8033;
+        const unsigned int UNSIGNED_SHORT_5_5_5_1         = 0x8034;
+        const unsigned int UNSIGNED_SHORT_5_6_5           = 0x8363;
+
+        /* Shaders */
+        const unsigned int FRAGMENT_SHADER                  = 0x8B30;
+        const unsigned int VERTEX_SHADER                    = 0x8B31;
+        const unsigned int MAX_VERTEX_ATTRIBS               = 0x8869;
+        const unsigned int MAX_VERTEX_UNIFORM_VECTORS       = 0x8DFB;
+        const unsigned int MAX_VARYING_VECTORS              = 0x8DFC;
+        const unsigned int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
+        const unsigned int MAX_VERTEX_TEXTURE_IMAGE_UNITS   = 0x8B4C;
+        const unsigned int MAX_TEXTURE_IMAGE_UNITS          = 0x8872;
+        const unsigned int MAX_FRAGMENT_UNIFORM_VECTORS     = 0x8DFD;
+        const unsigned int SHADER_TYPE                      = 0x8B4F;
+        const unsigned int DELETE_STATUS                    = 0x8B80;
+        const unsigned int LINK_STATUS                      = 0x8B82;
+        const unsigned int VALIDATE_STATUS                  = 0x8B83;
+        const unsigned int ATTACHED_SHADERS                 = 0x8B85;
+        const unsigned int ACTIVE_UNIFORMS                  = 0x8B86;
+        const unsigned int ACTIVE_ATTRIBUTES                = 0x8B89;
+        const unsigned int SHADING_LANGUAGE_VERSION         = 0x8B8C;
+        const unsigned int CURRENT_PROGRAM                  = 0x8B8D;
+
+        /* StencilFunction */
+        const unsigned int NEVER                          = 0x0200;
+        const unsigned int LESS                           = 0x0201;
+        const unsigned int EQUAL                          = 0x0202;
+        const unsigned int LEQUAL                         = 0x0203;
+        const unsigned int GREATER                        = 0x0204;
+        const unsigned int NOTEQUAL                       = 0x0205;
+        const unsigned int GEQUAL                         = 0x0206;
+        const unsigned int ALWAYS                         = 0x0207;
+
+        /* StencilOp */
+        /*      ZERO */
+        const unsigned int KEEP                           = 0x1E00;
+        const unsigned int REPLACE                        = 0x1E01;
+        const unsigned int INCR                           = 0x1E02;
+        const unsigned int DECR                           = 0x1E03;
+        const unsigned int INVERT                         = 0x150A;
+        const unsigned int INCR_WRAP                      = 0x8507;
+        const unsigned int DECR_WRAP                      = 0x8508;
+
+        /* StringName */
+        const unsigned int VENDOR                         = 0x1F00;
+        const unsigned int RENDERER                       = 0x1F01;
+        const unsigned int VERSION                        = 0x1F02;
+
+        /* TextureMagFilter */
+        const unsigned int NEAREST                        = 0x2600;
+        const unsigned int LINEAR                         = 0x2601;
+
+        /* TextureMinFilter */
+        /*      NEAREST */
+        /*      LINEAR */
+        const unsigned int NEAREST_MIPMAP_NEAREST         = 0x2700;
+        const unsigned int LINEAR_MIPMAP_NEAREST          = 0x2701;
+        const unsigned int NEAREST_MIPMAP_LINEAR          = 0x2702;
+        const unsigned int LINEAR_MIPMAP_LINEAR           = 0x2703;
+
+        /* TextureParameterName */
+        const unsigned int TEXTURE_MAG_FILTER             = 0x2800;
+        const unsigned int TEXTURE_MIN_FILTER             = 0x2801;
+        const unsigned int TEXTURE_WRAP_S                 = 0x2802;
+        const unsigned int TEXTURE_WRAP_T                 = 0x2803;
+
+        /* TextureTarget */
+        /*      TEXTURE_2D */
+        const unsigned int TEXTURE                        = 0x1702;
+
+        const unsigned int TEXTURE_CUBE_MAP               = 0x8513;
+        const unsigned int TEXTURE_BINDING_CUBE_MAP       = 0x8514;
+        const unsigned int TEXTURE_CUBE_MAP_POSITIVE_X    = 0x8515;
+        const unsigned int TEXTURE_CUBE_MAP_NEGATIVE_X    = 0x8516;
+        const unsigned int TEXTURE_CUBE_MAP_POSITIVE_Y    = 0x8517;
+        const unsigned int TEXTURE_CUBE_MAP_NEGATIVE_Y    = 0x8518;
+        const unsigned int TEXTURE_CUBE_MAP_POSITIVE_Z    = 0x8519;
+        const unsigned int TEXTURE_CUBE_MAP_NEGATIVE_Z    = 0x851A;
+        const unsigned int MAX_CUBE_MAP_TEXTURE_SIZE      = 0x851C;
+
+        /* TextureUnit */
+        const unsigned int TEXTURE0                       = 0x84C0;
+        const unsigned int TEXTURE1                       = 0x84C1;
+        const unsigned int TEXTURE2                       = 0x84C2;
+        const unsigned int TEXTURE3                       = 0x84C3;
+        const unsigned int TEXTURE4                       = 0x84C4;
+        const unsigned int TEXTURE5                       = 0x84C5;
+        const unsigned int TEXTURE6                       = 0x84C6;
+        const unsigned int TEXTURE7                       = 0x84C7;
+        const unsigned int TEXTURE8                       = 0x84C8;
+        const unsigned int TEXTURE9                       = 0x84C9;
+        const unsigned int TEXTURE10                      = 0x84CA;
+        const unsigned int TEXTURE11                      = 0x84CB;
+        const unsigned int TEXTURE12                      = 0x84CC;
+        const unsigned int TEXTURE13                      = 0x84CD;
+        const unsigned int TEXTURE14                      = 0x84CE;
+        const unsigned int TEXTURE15                      = 0x84CF;
+        const unsigned int TEXTURE16                      = 0x84D0;
+        const unsigned int TEXTURE17                      = 0x84D1;
+        const unsigned int TEXTURE18                      = 0x84D2;
+        const unsigned int TEXTURE19                      = 0x84D3;
+        const unsigned int TEXTURE20                      = 0x84D4;
+        const unsigned int TEXTURE21                      = 0x84D5;
+        const unsigned int TEXTURE22                      = 0x84D6;
+        const unsigned int TEXTURE23                      = 0x84D7;
+        const unsigned int TEXTURE24                      = 0x84D8;
+        const unsigned int TEXTURE25                      = 0x84D9;
+        const unsigned int TEXTURE26                      = 0x84DA;
+        const unsigned int TEXTURE27                      = 0x84DB;
+        const unsigned int TEXTURE28                      = 0x84DC;
+        const unsigned int TEXTURE29                      = 0x84DD;
+        const unsigned int TEXTURE30                      = 0x84DE;
+        const unsigned int TEXTURE31                      = 0x84DF;
+        const unsigned int ACTIVE_TEXTURE                 = 0x84E0;
+
+        /* TextureWrapMode */
+        const unsigned int REPEAT                         = 0x2901;
+        const unsigned int CLAMP_TO_EDGE                  = 0x812F;
+        const unsigned int MIRRORED_REPEAT                = 0x8370;
+
+        /* Uniform Types */
+        const unsigned int FLOAT_VEC2                     = 0x8B50;
+        const unsigned int FLOAT_VEC3                     = 0x8B51;
+        const unsigned int FLOAT_VEC4                     = 0x8B52;
+        const unsigned int INT_VEC2                       = 0x8B53;
+        const unsigned int INT_VEC3                       = 0x8B54;
+        const unsigned int INT_VEC4                       = 0x8B55;
+        const unsigned int BOOL                           = 0x8B56;
+        const unsigned int BOOL_VEC2                      = 0x8B57;
+        const unsigned int BOOL_VEC3                      = 0x8B58;
+        const unsigned int BOOL_VEC4                      = 0x8B59;
+        const unsigned int FLOAT_MAT2                     = 0x8B5A;
+        const unsigned int FLOAT_MAT3                     = 0x8B5B;
+        const unsigned int FLOAT_MAT4                     = 0x8B5C;
+        const unsigned int SAMPLER_2D                     = 0x8B5E;
+        const unsigned int SAMPLER_CUBE                   = 0x8B60;
+
+        /* Vertex Arrays */
+        const unsigned int VERTEX_ATTRIB_ARRAY_ENABLED        = 0x8622;
+        const unsigned int VERTEX_ATTRIB_ARRAY_SIZE           = 0x8623;
+        const unsigned int VERTEX_ATTRIB_ARRAY_STRIDE         = 0x8624;
+        const unsigned int VERTEX_ATTRIB_ARRAY_TYPE           = 0x8625;
+        const unsigned int VERTEX_ATTRIB_ARRAY_NORMALIZED     = 0x886A;
+        const unsigned int VERTEX_ATTRIB_ARRAY_POINTER        = 0x8645;
+        const unsigned int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
+
+        /* Shader Source */
+        const unsigned int COMPILE_STATUS                 = 0x8B81;
+
+        /* Shader Precision-Specified Types */
+        const unsigned int LOW_FLOAT                      = 0x8DF0;
+        const unsigned int MEDIUM_FLOAT                   = 0x8DF1;
+        const unsigned int HIGH_FLOAT                     = 0x8DF2;
+        const unsigned int LOW_INT                        = 0x8DF3;
+        const unsigned int MEDIUM_INT                     = 0x8DF4;
+        const unsigned int HIGH_INT                       = 0x8DF5;
+
+        /* Framebuffer Object. */
+        const unsigned int FRAMEBUFFER                    = 0x8D40;
+        const unsigned int RENDERBUFFER                   = 0x8D41;
+
+        const unsigned int RGBA4                          = 0x8056;
+        const unsigned int RGB5_A1                        = 0x8057;
+        const unsigned int RGB565                         = 0x8D62;
+        const unsigned int DEPTH_COMPONENT16              = 0x81A5;
+        const unsigned int STENCIL_INDEX                  = 0x1901;
+        const unsigned int STENCIL_INDEX8                 = 0x8D48;
+        const unsigned int DEPTH_STENCIL                  = 0x84F9;
+
+        const unsigned int RENDERBUFFER_WIDTH             = 0x8D42;
+        const unsigned int RENDERBUFFER_HEIGHT            = 0x8D43;
+        const unsigned int RENDERBUFFER_INTERNAL_FORMAT   = 0x8D44;
+        const unsigned int RENDERBUFFER_RED_SIZE          = 0x8D50;
+        const unsigned int RENDERBUFFER_GREEN_SIZE        = 0x8D51;
+        const unsigned int RENDERBUFFER_BLUE_SIZE         = 0x8D52;
+        const unsigned int RENDERBUFFER_ALPHA_SIZE        = 0x8D53;
+        const unsigned int RENDERBUFFER_DEPTH_SIZE        = 0x8D54;
+        const unsigned int RENDERBUFFER_STENCIL_SIZE      = 0x8D55;
+
+        const unsigned int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE           = 0x8CD0;
+        const unsigned int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME           = 0x8CD1;
+        const unsigned int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL         = 0x8CD2;
+        const unsigned int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
+
+        const unsigned int COLOR_ATTACHMENT0              = 0x8CE0;
+        const unsigned int DEPTH_ATTACHMENT               = 0x8D00;
+        const unsigned int STENCIL_ATTACHMENT             = 0x8D20;
+        const unsigned int DEPTH_STENCIL_ATTACHMENT       = 0x821A;
+
+        const unsigned int NONE                           = 0;
+
+        const unsigned int FRAMEBUFFER_COMPLETE                      = 0x8CD5;
+        const unsigned int FRAMEBUFFER_INCOMPLETE_ATTACHMENT         = 0x8CD6;
+        const unsigned int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
+        const unsigned int FRAMEBUFFER_INCOMPLETE_DIMENSIONS         = 0x8CD9;
+        const unsigned int FRAMEBUFFER_UNSUPPORTED                   = 0x8CDD;
+
+        const unsigned int FRAMEBUFFER_BINDING            = 0x8CA6;
+        const unsigned int RENDERBUFFER_BINDING           = 0x8CA7;
+        const unsigned int MAX_RENDERBUFFER_SIZE          = 0x84E8;
+
+        const unsigned int INVALID_FRAMEBUFFER_OPERATION  = 0x0506;
+
+        /* WebGL-specific enums */
+        const unsigned int UNPACK_FLIP_Y_WEBGL                = 0x9240;
+        const unsigned int UNPACK_PREMULTIPLY_ALPHA_WEBGL     = 0x9241;
+        const unsigned int CONTEXT_LOST_WEBGL                 = 0x9242;
+        const unsigned int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
+        const unsigned int BROWSER_DEFAULT_WEBGL              = 0x9244;
+
+        readonly attribute long drawingBufferWidth;
+        readonly attribute long drawingBufferHeight;
+
+        [StrictTypeChecking] void         activeTexture(in unsigned long texture) raises(DOMException);
+        [StrictTypeChecking] void         attachShader(in WebGLProgram program, in WebGLShader shader) raises(DOMException);
+        [StrictTypeChecking] void         bindAttribLocation(in WebGLProgram program, in unsigned long index, in DOMString name) raises(DOMException);
+        [StrictTypeChecking] void         bindBuffer(in unsigned long target, in WebGLBuffer buffer) raises(DOMException);
+        [StrictTypeChecking] void         bindFramebuffer(in unsigned long target, in WebGLFramebuffer framebuffer) raises(DOMException);
+        [StrictTypeChecking] void         bindRenderbuffer(in unsigned long target, in WebGLRenderbuffer renderbuffer) raises(DOMException);
+        [StrictTypeChecking] void         bindTexture(in unsigned long target, in WebGLTexture texture) raises(DOMException);
+        [StrictTypeChecking] void         blendColor(in float red, in float green, in float blue, in float alpha);
+        [StrictTypeChecking] void         blendEquation( in unsigned long mode );
+        [StrictTypeChecking] void         blendEquationSeparate(in unsigned long modeRGB, in unsigned long modeAlpha);
+        [StrictTypeChecking] void         blendFunc(in unsigned long sfactor, in unsigned long dfactor);
+        [StrictTypeChecking] void         blendFuncSeparate(in unsigned long srcRGB, in unsigned long dstRGB, in unsigned long srcAlpha, in unsigned long dstAlpha);
+        [StrictTypeChecking] void         bufferData(in unsigned long target, in ArrayBuffer data, in unsigned long usage) raises (DOMException);
+        [StrictTypeChecking] void         bufferData(in unsigned long target, in ArrayBufferView data, in unsigned long usage) raises (DOMException);
+        [StrictTypeChecking] void         bufferData(in unsigned long target, in long long size, in unsigned long usage) raises (DOMException);
+        [StrictTypeChecking] void         bufferSubData(in unsigned long target, in long long offset, in ArrayBuffer data) raises (DOMException);
+        [StrictTypeChecking] void         bufferSubData(in unsigned long target, in long long offset, in ArrayBufferView data) raises (DOMException);
+
+        [StrictTypeChecking] unsigned long checkFramebufferStatus(in unsigned long target);
+        [StrictTypeChecking] void         clear(in unsigned long mask);
+        [StrictTypeChecking] void         clearColor(in float red, in float green, in float blue, in float alpha);
+        [StrictTypeChecking] void         clearDepth(in float depth);
+        [StrictTypeChecking] void         clearStencil(in long s);
+        [StrictTypeChecking] void         colorMask(in boolean red, in boolean green, in boolean blue, in boolean alpha);
+        [StrictTypeChecking] void         compileShader(in WebGLShader shader) raises(DOMException);
+
+        [StrictTypeChecking] void         compressedTexImage2D(in unsigned long target, in long level, in unsigned long internalformat,
+                                                               in long width, in long height, in long border, in ArrayBufferView data);
+        [StrictTypeChecking] void         compressedTexSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset,
+                                                                  in long width, in long height, in unsigned long format, in ArrayBufferView data);
+        
+        [StrictTypeChecking] void         copyTexImage2D(in unsigned long target, in long level, in unsigned long internalformat, in long x, in long y, in long width, in long height, in long border);
+        [StrictTypeChecking] void         copyTexSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset, in long x, in long y, in long width, in long height);
+
+        [StrictTypeChecking] WebGLBuffer createBuffer();
+        [StrictTypeChecking] WebGLFramebuffer createFramebuffer();
+        [StrictTypeChecking] WebGLProgram createProgram();
+        [StrictTypeChecking] WebGLRenderbuffer createRenderbuffer();
+        [StrictTypeChecking] WebGLShader createShader(in unsigned long type) raises(DOMException);
+        [StrictTypeChecking] WebGLTexture createTexture();
+
+        [StrictTypeChecking] void         cullFace(in unsigned long mode);
+
+        [StrictTypeChecking] void         deleteBuffer(in WebGLBuffer buffer);
+        [StrictTypeChecking] void         deleteFramebuffer(in WebGLFramebuffer framebuffer);
+        [StrictTypeChecking] void         deleteProgram(in WebGLProgram program);
+        [StrictTypeChecking] void         deleteRenderbuffer(in WebGLRenderbuffer renderbuffer);
+        [StrictTypeChecking] void         deleteShader(in WebGLShader shader);
+        [StrictTypeChecking] void         deleteTexture(in WebGLTexture texture);
+
+        [StrictTypeChecking] void         depthFunc(in unsigned long func);
+        [StrictTypeChecking] void         depthMask(in boolean flag);
+        // FIXME: this differs from the current WebGL spec (depthRangef)
+        [StrictTypeChecking] void         depthRange(in float zNear, in float zFar);
+        [StrictTypeChecking] void         detachShader(in WebGLProgram program, in WebGLShader shader) raises(DOMException);
+        [StrictTypeChecking] void         disable(in unsigned long cap);
+        [StrictTypeChecking] void         disableVertexAttribArray(in unsigned long index) raises(DOMException);
+        [StrictTypeChecking] void         drawArrays(in unsigned long mode, in long first, in long count) raises(DOMException);
+        [StrictTypeChecking] void         drawElements(in unsigned long mode, in long count, in unsigned long type, in long long offset) raises(DOMException);
+
+        [StrictTypeChecking] void         enable(in unsigned long cap);
+        [StrictTypeChecking] void         enableVertexAttribArray(in unsigned long index) raises(DOMException);
+        [StrictTypeChecking] void         finish();
+        [StrictTypeChecking] void         flush();
+        [StrictTypeChecking] void         framebufferRenderbuffer(in unsigned long target, in unsigned long attachment, in unsigned long renderbuffertarget, in WebGLRenderbuffer renderbuffer) raises(DOMException);
+        [StrictTypeChecking] void         framebufferTexture2D(in unsigned long target, in unsigned long attachment, in unsigned long textarget, in WebGLTexture texture, in long level) raises(DOMException);
+        [StrictTypeChecking] void         frontFace(in unsigned long mode);
+        [StrictTypeChecking] void         generateMipmap(in unsigned long target);
+        
+        [StrictTypeChecking] WebGLActiveInfo getActiveAttrib(in WebGLProgram program, in unsigned long index) raises (DOMException);
+        [StrictTypeChecking] WebGLActiveInfo getActiveUniform(in WebGLProgram program, in unsigned long index) raises (DOMException);
+
+#if (defined(LANGUAGE_DART) && LANGUAGE_DART)
+        [StrictTypeChecking, Custom] any[] getAttachedShaders(in WebGLProgram program) raises (DOMException);
+#else
+        [StrictTypeChecking, Custom] void getAttachedShaders(in WebGLProgram program) raises (DOMException);
+#endif
+
+        [StrictTypeChecking] int          getAttribLocation(in WebGLProgram program, in DOMString name);
+
+        // any getBufferParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+#if (defined(LANGUAGE_DART) && LANGUAGE_DART)
+        [StrictTypeChecking, Custom] any getBufferParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+#else
+        [StrictTypeChecking, Custom] void getBufferParameter();
+#endif
+
+        [StrictTypeChecking] WebGLContextAttributes getContextAttributes();
+
+        [StrictTypeChecking] unsigned long getError();
+
+#if (defined(LANGUAGE_DART) && LANGUAGE_DART)
+        [StrictTypeChecking, Custom] any getExtension(in DOMString name);
+        [StrictTypeChecking, Custom] any getParameter(in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] any getFramebufferAttachmentParameter(in unsigned long target, in unsigned long attachment, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] any getProgramParameter(in WebGLProgram program, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, TreatReturnedNullStringAs=Null] DOMString getProgramInfoLog(in WebGLProgram program) raises(DOMException);
+#else
+        // object getExtension(in DOMString name);
+        [StrictTypeChecking, Custom] void getExtension(in DOMString name);
+
+        // any getFramebufferAttachmentParameter(in unsigned long target, in unsigned long attachment, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] void getFramebufferAttachmentParameter();
+        // any getParameter(in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] void getParameter();
+        // any getProgramParameter(in WebGLProgram program, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] void getProgramParameter();
+        [StrictTypeChecking, TreatReturnedNullStringAs=Null] DOMString getProgramInfoLog(in WebGLProgram program) raises(DOMException);
+#endif
+
+#if (defined(LANGUAGE_DART) && LANGUAGE_DART)
+        [StrictTypeChecking, Custom] any getRenderbufferParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] any getShaderParameter(in WebGLShader shader, in unsigned long pname) raises(DOMException);
+#else
+        // any getRenderbufferParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] void getRenderbufferParameter();
+        // any getShaderParameter(in WebGLShader shader, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] void getShaderParameter() raises(DOMException);
+#endif
+
+        [StrictTypeChecking, TreatReturnedNullStringAs=Null] DOMString    getShaderInfoLog(in WebGLShader shader) raises(DOMException);
+
+        [StrictTypeChecking] WebGLShaderPrecisionFormat getShaderPrecisionFormat(in unsigned long shadertype, in unsigned long precisiontype) raises(DOMException);
+
+        [StrictTypeChecking, TreatReturnedNullStringAs=Null] DOMString    getShaderSource(in WebGLShader shader) raises(DOMException);
+
+#if (defined(LANGUAGE_DART) && LANGUAGE_DART)
+        [StrictTypeChecking, Custom] DOMString[] getSupportedExtensions();
+        [StrictTypeChecking, Custom] any getTexParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] any getUniform(in WebGLProgram program, in WebGLUniformLocation location) raises(DOMException);
+#else
+        // DOMString[] getSupportedExtensions()
+        [StrictTypeChecking, Custom] void getSupportedExtensions();
+
+        // any getTexParameter(in unsigned long target, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] void getTexParameter();
+
+        // any getUniform(in WebGLProgram program, in WebGLUniformLocation location) raises(DOMException);
+        [StrictTypeChecking, Custom] void getUniform();
+#endif
+
+        [StrictTypeChecking] WebGLUniformLocation getUniformLocation(in WebGLProgram program, in DOMString name) raises(DOMException);
+
+#if (defined(LANGUAGE_DART) && LANGUAGE_DART)
+        [StrictTypeChecking, Custom] any getVertexAttrib(in unsigned long index, in unsigned long pname) raises(DOMException);
+#else
+        // any getVertexAttrib(in unsigned long index, in unsigned long pname) raises(DOMException);
+        [StrictTypeChecking, Custom] void getVertexAttrib();
+#endif
+
+        [StrictTypeChecking] long long getVertexAttribOffset(in unsigned long index, in unsigned long pname);
+
+        [StrictTypeChecking] void         hint(in unsigned long target, in unsigned long mode);
+        [StrictTypeChecking] boolean      isBuffer(in WebGLBuffer buffer);
+        [StrictTypeChecking] boolean      isContextLost();
+        [StrictTypeChecking] boolean      isEnabled(in unsigned long cap);
+        [StrictTypeChecking] boolean      isFramebuffer(in WebGLFramebuffer framebuffer);
+        [StrictTypeChecking] boolean      isProgram(in WebGLProgram program);
+        [StrictTypeChecking] boolean      isRenderbuffer(in WebGLRenderbuffer renderbuffer);
+        [StrictTypeChecking] boolean      isShader(in WebGLShader shader);
+        [StrictTypeChecking] boolean      isTexture(in WebGLTexture texture);
+        [StrictTypeChecking] void         lineWidth(in float width);
+        [StrictTypeChecking] void         linkProgram(in WebGLProgram program) raises(DOMException);
+        [StrictTypeChecking] void         pixelStorei(in unsigned long pname, in long param);
+        [StrictTypeChecking] void         polygonOffset(in float factor, in float units);
+
+        [StrictTypeChecking] void         readPixels(in long x, in long y, in long width, in long height, in unsigned long format, in unsigned long type, in ArrayBufferView pixels) raises(DOMException);
+        
+        [StrictTypeChecking] void         releaseShaderCompiler();
+        [StrictTypeChecking] void         renderbufferStorage(in unsigned long target, in unsigned long internalformat, in long width, in long height);
+        [StrictTypeChecking] void         sampleCoverage(in float value, in boolean invert);
+        [StrictTypeChecking] void         scissor(in long x, in long y, in long width, in long height);
+        [StrictTypeChecking] void         shaderSource(in WebGLShader shader, in DOMString string) raises(DOMException);
+        [StrictTypeChecking] void         stencilFunc(in unsigned long func, in long ref, in unsigned long mask);
+        [StrictTypeChecking] void         stencilFuncSeparate(in unsigned long face, in unsigned long func, in long ref, in unsigned long mask);
+        [StrictTypeChecking] void         stencilMask(in unsigned long mask);
+        [StrictTypeChecking] void         stencilMaskSeparate(in unsigned long face, in unsigned long mask);
+        [StrictTypeChecking] void         stencilOp(in unsigned long fail, in unsigned long zfail, in unsigned long zpass);
+        [StrictTypeChecking] void         stencilOpSeparate(in unsigned long face, in unsigned long fail, in unsigned long zfail, in unsigned long zpass);
+
+        [StrictTypeChecking] void         texParameterf(in unsigned long target, in unsigned long pname, in float param);
+        [StrictTypeChecking] void         texParameteri(in unsigned long target, in unsigned long pname, in long param);
+
+        // Supported forms:
+        [StrictTypeChecking] void         texImage2D(in unsigned long target, in long level, in unsigned long internalformat, in long width, in long height, 
+                                                     in long border, in unsigned long format, in unsigned long type, in ArrayBufferView pixels) raises (DOMException);
+        [StrictTypeChecking] void         texImage2D(in unsigned long target, in long level, in unsigned long internalformat,
+                                                     in unsigned long format, in unsigned long type, in ImageData pixels) raises (DOMException);
+        [StrictTypeChecking] void         texImage2D(in unsigned long target, in long level, in unsigned long internalformat,
+                                                     in unsigned long format, in unsigned long type, in HTMLImageElement image) raises (DOMException);
+        [StrictTypeChecking] void         texImage2D(in unsigned long target, in long level, in unsigned long internalformat,
+                                                     in unsigned long format, in unsigned long type, in HTMLCanvasElement canvas) raises (DOMException);
+#if defined(ENABLE_VIDEO) && ENABLE_VIDEO
+        [StrictTypeChecking] void         texImage2D(in unsigned long target, in long level, in unsigned long internalformat,
+                                                     in unsigned long format, in unsigned long type, in HTMLVideoElement video) raises (DOMException);
+#endif
+
+        [StrictTypeChecking] void         texSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset, 
+                                                        in long width, in long height, 
+                                                        in unsigned long format, in unsigned long type, in ArrayBufferView pixels) raises (DOMException);
+        [StrictTypeChecking] void         texSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset,
+                                                        in unsigned long format, in unsigned long type, in ImageData pixels) raises (DOMException);
+        [StrictTypeChecking] void         texSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset,
+                                                        in unsigned long format, in unsigned long type, in HTMLImageElement image) raises (DOMException);
+        [StrictTypeChecking] void         texSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset,
+                                                        in unsigned long format, in unsigned long type, in HTMLCanvasElement canvas) raises (DOMException);
+#if defined(ENABLE_VIDEO) && ENABLE_VIDEO
+        [StrictTypeChecking] void         texSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset,
+                                                        in unsigned long format, in unsigned long type, in HTMLVideoElement video) raises (DOMException);
+#endif
+
+        [StrictTypeChecking] void uniform1f(in WebGLUniformLocation location, in float x) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniform1fv(in WebGLUniformLocation location, in Float32Array v) raises(DOMException);
+        [StrictTypeChecking] void uniform1i(in WebGLUniformLocation location, in long x) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniform1iv(in WebGLUniformLocation location, in Int32Array v) raises(DOMException);
+        [StrictTypeChecking] void uniform2f(in WebGLUniformLocation location, in float x, in float y) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniform2fv(in WebGLUniformLocation location, in Float32Array v) raises(DOMException);
+        [StrictTypeChecking] void uniform2i(in WebGLUniformLocation location, in long x, in long y) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniform2iv(in WebGLUniformLocation location, in Int32Array v) raises(DOMException);
+        [StrictTypeChecking] void uniform3f(in WebGLUniformLocation location, in float x, in float y, in float z) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniform3fv(in WebGLUniformLocation location, in Float32Array v) raises(DOMException);
+        [StrictTypeChecking] void uniform3i(in WebGLUniformLocation location, in long x, in long y, in long z) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniform3iv(in WebGLUniformLocation location, in Int32Array v) raises(DOMException);
+        [StrictTypeChecking] void uniform4f(in WebGLUniformLocation location, in float x, in float y, in float z, in float w) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniform4fv(in WebGLUniformLocation location, in Float32Array v) raises(DOMException);
+        [StrictTypeChecking] void uniform4i(in WebGLUniformLocation location, in long x, in long y, in long z, in long w) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniform4iv(in WebGLUniformLocation location, in Int32Array v) raises(DOMException);
+
+        [StrictTypeChecking, Custom] void uniformMatrix2fv(in WebGLUniformLocation location, in boolean transpose, in Float32Array array) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniformMatrix3fv(in WebGLUniformLocation location, in boolean transpose, in Float32Array array) raises(DOMException);
+        [StrictTypeChecking, Custom] void uniformMatrix4fv(in WebGLUniformLocation location, in boolean transpose, in Float32Array array) raises(DOMException);
+
+        [StrictTypeChecking] void         useProgram(in WebGLProgram program) raises(DOMException);
+        [StrictTypeChecking] void         validateProgram(in WebGLProgram program) raises(DOMException);
+
+        [StrictTypeChecking] void         vertexAttrib1f(in unsigned long indx, in float x);
+        [StrictTypeChecking, Custom] void         vertexAttrib1fv(in unsigned long indx, in Float32Array values);
+        [StrictTypeChecking] void         vertexAttrib2f(in unsigned long indx, in float x, in float y);
+        [StrictTypeChecking, Custom] void         vertexAttrib2fv(in unsigned long indx, in Float32Array values);
+        [StrictTypeChecking] void         vertexAttrib3f(in unsigned long indx, in float x, in float y, in float z);
+        [StrictTypeChecking, Custom] void         vertexAttrib3fv(in unsigned long indx, in Float32Array values);
+        [StrictTypeChecking] void         vertexAttrib4f(in unsigned long indx, in float x, in float y, in float z, in float w);
+        [StrictTypeChecking, Custom] void         vertexAttrib4fv(in unsigned long indx, in Float32Array values);
+        [StrictTypeChecking] void         vertexAttribPointer(in unsigned long indx, in long size, in unsigned long type, in boolean normalized, 
+                                                              in long stride, in long long offset) raises(DOMException);
+
+        [StrictTypeChecking] void         viewport(in long x, in long y, in long width, in long height);
+    };
+}
+
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLShader.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLShader.idl
new file mode 100644
index 0000000..2aeb704
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLShader.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL
+    ] WebGLShader {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLShaderPrecisionFormat.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLShaderPrecisionFormat.idl
new file mode 100644
index 0000000..7cfb80e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLShaderPrecisionFormat.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2012, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        Conditional=WEBGL,
+    ] WebGLShaderPrecisionFormat {
+        readonly attribute int rangeMin;
+        readonly attribute int rangeMax;
+        readonly attribute int precision;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLTexture.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLTexture.idl
new file mode 100644
index 0000000..8e72dd3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLTexture.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL
+    ] WebGLTexture {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLUniformLocation.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLUniformLocation.idl
new file mode 100644
index 0000000..eb3167c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLUniformLocation.idl
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL
+    ] WebGLUniformLocation {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/canvas/WebGLVertexArrayObjectOES.idl b/elemental/idl/third_party/WebCore/html/canvas/WebGLVertexArrayObjectOES.idl
new file mode 100644
index 0000000..0abbe07
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/canvas/WebGLVertexArrayObjectOES.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+    interface [
+        Conditional=WEBGL
+    ] WebGLVertexArrayObjectOES {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/shadow/HTMLContentElement.idl b/elemental/idl/third_party/WebCore/html/shadow/HTMLContentElement.idl
new file mode 100644
index 0000000..c928d44
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/shadow/HTMLContentElement.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+    interface [
+        Conditional=SHADOW_DOM,
+        V8EnabledAtRuntime=shadowDOM
+    ] HTMLContentElement : HTMLElement {
+        attribute [Reflect] DOMString select;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/shadow/HTMLShadowElement.idl b/elemental/idl/third_party/WebCore/html/shadow/HTMLShadowElement.idl
new file mode 100644
index 0000000..94facb7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/shadow/HTMLShadowElement.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface [
+        Conditional=SHADOW_DOM,
+        V8EnabledAtRuntime=shadowDOM
+    ] HTMLShadowElement : HTMLElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/track/TextTrack.idl b/elemental/idl/third_party/WebCore/html/track/TextTrack.idl
new file mode 100644
index 0000000..845a80c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/track/TextTrack.idl
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2011 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        Conditional=VIDEO_TRACK,
+        V8EnabledAtRuntime=webkitVideoTrack,
+        EventTarget,
+        JSCustomMarkFunction,
+        JSCustomIsReachable
+    ] TextTrack {
+        readonly attribute DOMString kind;
+        readonly attribute DOMString label;
+        readonly attribute DOMString language;
+
+        const unsigned short DISABLED = 0;
+        const unsigned short HIDDEN = 1;
+        const unsigned short SHOWING = 2;
+        attribute unsigned short mode
+            setter raises (DOMException);
+
+        readonly attribute TextTrackCueList cues;
+        readonly attribute TextTrackCueList activeCues;
+                 attribute EventListener oncuechange;
+
+        void addCue(in TextTrackCue cue)
+            raises (DOMException);
+        void removeCue(in TextTrackCue cue)
+            raises (DOMException);
+
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/html/track/TextTrackCue.idl b/elemental/idl/third_party/WebCore/html/track/TextTrackCue.idl
new file mode 100644
index 0000000..d552525
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/track/TextTrackCue.idl
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2011 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        Conditional=VIDEO_TRACK,
+        V8EnabledAtRuntime=webkitVideoTrack,
+        JSGenerateToNativeObject,
+        Constructor(in DOMString id, in double startTime, in double endTime, in DOMString text, in [Optional=DefaultIsUndefined] DOMString settings, in [Optional=DefaultIsUndefined] boolean pauseOnExit),
+        CallWith=ScriptExecutionContext,
+        EventTarget,
+        JSCustomMarkFunction,
+        JSCustomIsReachable
+    ] TextTrackCue {
+        readonly attribute TextTrack track;
+
+        attribute DOMString id;
+        attribute double startTime;
+        attribute double endTime;
+        attribute boolean pauseOnExit;
+
+        attribute DOMString vertical
+            setter raises (DOMException);
+        attribute boolean snapToLines;
+        attribute long line
+            setter raises (DOMException);
+        attribute long position
+            setter raises (DOMException);
+        attribute long size
+            setter raises (DOMException);
+        attribute DOMString align
+            setter raises (DOMException);
+
+        attribute DOMString text;
+        DocumentFragment getCueAsHTML();
+        
+        attribute EventListener onenter;
+        attribute EventListener onexit;
+        
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/track/TextTrackCueList.idl b/elemental/idl/third_party/WebCore/html/track/TextTrackCueList.idl
new file mode 100644
index 0000000..380e59a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/track/TextTrackCueList.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        Conditional=VIDEO_TRACK,
+        V8EnabledAtRuntime=webkitVideoTrack,
+        IndexedGetter
+    ] TextTrackCueList {
+        readonly attribute unsigned long length;
+        TextTrackCue item(in unsigned long index);
+        TextTrackCue getCueById(in DOMString id);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/track/TextTrackList.idl b/elemental/idl/third_party/WebCore/html/track/TextTrackList.idl
new file mode 100644
index 0000000..aedda2e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/track/TextTrackList.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        Conditional=VIDEO_TRACK,
+        V8EnabledAtRuntime=webkitVideoTrack,
+        IndexedGetter,
+        EventTarget,
+        JSCustomMarkFunction,
+        JSCustomIsReachable
+    ] TextTrackList {
+        readonly attribute unsigned long length;
+        TextTrack item(in unsigned long index);
+
+        attribute EventListener onaddtrack;
+
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/html/track/TrackEvent.idl b/elemental/idl/third_party/WebCore/html/track/TrackEvent.idl
new file mode 100644
index 0000000..b475ad4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/html/track/TrackEvent.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        Conditional=VIDEO_TRACK,
+        V8EnabledAtRuntime=webkitVideoTrack,
+        ConstructorTemplate=Event
+    ] TrackEvent : Event {
+        readonly attribute [InitializedByEventConstructor, CustomGetter] object track;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/inspector/InjectedScriptHost.idl b/elemental/idl/third_party/WebCore/inspector/InjectedScriptHost.idl
new file mode 100644
index 0000000..54f080f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/inspector/InjectedScriptHost.idl
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=INSPECTOR
+    ] InjectedScriptHost {
+        void clearConsoleMessages();
+
+        void copyText(in DOMString text);
+        [Custom] void inspect(in DOMObject objectId, in DOMObject hints);
+        [Custom] DOMObject inspectedObject(in int num);
+        [Custom] DOMObject internalConstructorName(in DOMObject object);
+        [Custom] boolean isHTMLAllCollection(in DOMObject object);
+        [Custom] DOMString type(in DOMObject object);
+        [Custom] DOMObject functionDetails(in DOMObject object);
+        [Custom] Array getEventListeners(in Node node);
+
+        [Custom] DOMString databaseId(in DOMObject database);
+        [Custom] DOMString storageId(in DOMObject storage);
+
+#if defined(ENABLE_WORKERS) && ENABLE_WORKERS
+        void didCreateWorker(in long id, in DOMString url, in boolean isFakeWorker);
+        void didDestroyWorker(in long id);
+        long nextWorkerId();
+#endif
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/inspector/InspectorFrontendHost.idl b/elemental/idl/third_party/WebCore/inspector/InspectorFrontendHost.idl
new file mode 100644
index 0000000..2a20370
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/inspector/InspectorFrontendHost.idl
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+    interface [
+        Conditional=INSPECTOR
+    ] InspectorFrontendHost {
+        void loaded();
+        void closeWindow();
+        void bringToFront();
+        void setZoomFactor(in float zoom);
+        void inspectedURLChanged(in DOMString newURL);
+
+        void requestAttachWindow();
+        void requestDetachWindow();
+        void requestSetDockSide(in DOMString side);
+        void setAttachedWindowHeight(in unsigned long height);
+        void moveWindowBy(in float x, in float y);
+        void setInjectedScriptForOrigin(in DOMString origin, in DOMString script);
+
+        DOMString localizedStringsURL();
+        DOMString hiddenPanels();
+
+        void copyText(in DOMString text);
+        void openInNewTab(in DOMString url);
+        boolean canSave();
+        void save(in DOMString url, in DOMString content, in boolean forceSaveAs);
+        void append(in DOMString url, in DOMString content);
+
+        [Custom] DOMString platform();
+        [Custom] DOMString port();
+        [Custom] void showContextMenu(in MouseEvent event, in DOMObject items);
+        void sendMessageToBackend(in DOMString message);
+
+        [Custom] void recordActionTaken(in unsigned long actionCode);
+        [Custom] void recordPanelShown(in unsigned long panelCode);
+        [Custom] void recordSettingChanged(in unsigned long settingChanged);
+        
+        DOMString loadResourceSynchronously(in DOMString url);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/inspector/JavaScriptCallFrame.idl b/elemental/idl/third_party/WebCore/inspector/JavaScriptCallFrame.idl
new file mode 100644
index 0000000..47ca5d1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/inspector/JavaScriptCallFrame.idl
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module inspector {
+
+    interface [
+        Conditional=JAVASCRIPT_DEBUGGER,
+        OmitConstructor,
+        DoNotCheckConstants
+    ] JavaScriptCallFrame {
+
+        // Scope type
+        const unsigned short GLOBAL_SCOPE = 0;
+        const unsigned short LOCAL_SCOPE = 1;
+        const unsigned short WITH_SCOPE = 2;
+        const unsigned short CLOSURE_SCOPE = 3;
+        const unsigned short CATCH_SCOPE = 4;
+
+        [Custom] void evaluate(in DOMString script);
+
+        readonly attribute JavaScriptCallFrame caller;
+        readonly attribute long sourceID;
+        readonly attribute long line;
+        readonly attribute long column;
+        readonly attribute [CustomGetter] Array scopeChain;
+        [Custom] unsigned short scopeType(in int scopeIndex);
+        readonly attribute [CustomGetter] Object thisObject;
+        readonly attribute DOMString functionName;
+        readonly attribute [CustomGetter] DOMString type;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/inspector/ScriptProfile.idl b/elemental/idl/third_party/WebCore/inspector/ScriptProfile.idl
new file mode 100644
index 0000000..ebbee2e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/inspector/ScriptProfile.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=JAVASCRIPT_DEBUGGER,
+        OmitConstructor,
+        V8CustomToJSObject
+    ] ScriptProfile {
+        readonly attribute DOMString title;
+        readonly attribute unsigned long uid;
+        readonly attribute ScriptProfileNode head;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/inspector/ScriptProfileNode.idl b/elemental/idl/third_party/WebCore/inspector/ScriptProfileNode.idl
new file mode 100644
index 0000000..43f795f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/inspector/ScriptProfileNode.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=JAVASCRIPT_DEBUGGER,
+        OmitConstructor,
+        V8CustomToJSObject
+    ] ScriptProfileNode {
+        readonly attribute DOMString functionName;
+        readonly attribute DOMString url;
+        readonly attribute unsigned long lineNumber;
+        readonly attribute double totalTime;
+        readonly attribute double selfTime;
+        readonly attribute unsigned long numberOfCalls;
+        readonly attribute sequence<ScriptProfileNode> children;
+        readonly attribute boolean visible;
+        readonly attribute [CustomGetter] unsigned long callUID;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/loader/appcache/DOMApplicationCache.idl b/elemental/idl/third_party/WebCore/loader/appcache/DOMApplicationCache.idl
new file mode 100644
index 0000000..a35fa47
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/loader/appcache/DOMApplicationCache.idl
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+ 
+module offline {
+ 
+    interface [
+        EventTarget,
+        OmitConstructor,
+        DoNotCheckConstants,
+        JSGenerateIsReachable=ImplFrame
+    ] DOMApplicationCache {
+        // update status
+        const unsigned short UNCACHED = 0;
+        const unsigned short IDLE = 1;
+        const unsigned short CHECKING = 2;
+        const unsigned short DOWNLOADING = 3;
+        const unsigned short UPDATEREADY = 4;
+        const unsigned short OBSOLETE = 5;
+        readonly attribute unsigned short status;
+
+        void update()
+            raises(DOMException);
+        void swapCache()
+            raises(DOMException);
+        void abort();
+
+        // events
+        attribute EventListener onchecking;
+        attribute EventListener onerror;
+        attribute EventListener onnoupdate;
+        attribute EventListener ondownloading;
+        attribute EventListener onprogress;
+        attribute EventListener onupdateready;
+        attribute EventListener oncached;
+        attribute EventListener onobsolete;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/notifications/DOMWindowNotifications.idl b/elemental/idl/third_party/WebCore/notifications/DOMWindowNotifications.idl
new file mode 100644
index 0000000..ea8a129
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/notifications/DOMWindowNotifications.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        Conditional=NOTIFICATIONS|LEGACY_NOTIFICATIONS,
+        Supplemental=DOMWindow
+    ] DOMWindowNotifications {
+#if defined(ENABLE_LEGACY_NOTIFICATIONS) && ENABLE_LEGACY_NOTIFICATIONS
+        readonly attribute [V8EnabledAtRuntime] NotificationCenter webkitNotifications;
+#endif
+#if defined(ENABLE_NOTIFICATIONS) && ENABLE_NOTIFICATIONS
+        attribute NotificationConstructor Notification;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/notifications/Notification.idl b/elemental/idl/third_party/WebCore/notifications/Notification.idl
new file mode 100644
index 0000000..da2eb7f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/notifications/Notification.idl
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module threads {
+
+    interface [
+        Conditional=NOTIFICATIONS|LEGACY_NOTIFICATIONS,
+        ActiveDOMObject,
+        EventTarget,
+#if defined(ENABLE_NOTIFICATIONS) && ENABLE_NOTIFICATIONS
+        Constructor(in DOMString title, in [Optional=DefaultIsUndefined] Dictionary options),
+        CallWith=ScriptExecutionContext,
+#else
+        OmitConstructor
+#endif
+    ] Notification {
+        void show();
+#if defined(ENABLE_LEGACY_NOTIFICATIONS) && ENABLE_LEGACY_NOTIFICATIONS
+        void cancel();
+#endif
+#if defined(ENABLE_NOTIFICATIONS) && ENABLE_NOTIFICATIONS
+        void close();
+#endif
+
+
+#if defined(ENABLE_NOTIFICATIONS) && ENABLE_NOTIFICATIONS
+        [CallWith=ScriptExecutionContext] static DOMString permissionLevel();
+        [Custom] static void requestPermission(in NotificationPermissionCallback callback);
+#endif
+
+        attribute EventListener onshow;
+#if defined(ENABLE_LEGACY_NOTIFICATIONS) && ENABLE_LEGACY_NOTIFICATIONS
+        attribute EventListener ondisplay;
+#endif
+        attribute EventListener onerror;
+        attribute EventListener onclose;
+        attribute EventListener onclick;
+
+        attribute DOMString dir;
+#if defined(ENABLE_LEGACY_NOTIFICATIONS) && ENABLE_LEGACY_NOTIFICATIONS
+        attribute DOMString replaceId;
+#endif
+#if defined(ENABLE_NOTIFICATIONS) && ENABLE_NOTIFICATIONS
+        attribute DOMString tag;
+#endif
+
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/notifications/NotificationCenter.idl b/elemental/idl/third_party/WebCore/notifications/NotificationCenter.idl
new file mode 100644
index 0000000..da99ba9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/notifications/NotificationCenter.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module threads {
+
+    interface [
+        Conditional=LEGACY_NOTIFICATIONS,
+        ActiveDOMObject,
+        OmitConstructor
+    ] NotificationCenter {
+#if !defined(ENABLE_TEXT_NOTIFICATIONS_ONLY) || !ENABLE_TEXT_NOTIFICATIONS_ONLY
+       [V8Custom] Notification createHTMLNotification(in DOMString url) raises(DOMException);
+#endif
+       [V8Custom] Notification createNotification(in DOMString iconUrl, in DOMString title, in DOMString body) raises(DOMException);
+
+       int checkPermission();
+       [Custom] void requestPermission(in VoidCallback callback);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/notifications/NotificationPermissionCallback.idl b/elemental/idl/third_party/WebCore/notifications/NotificationPermissionCallback.idl
new file mode 100644
index 0000000..1f11161
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/notifications/NotificationPermissionCallback.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module threads {
+
+    interface [
+        Conditional=NOTIFICATIONS,
+        Callback
+    ] NotificationPermissionCallback {
+        boolean handleEvent(in DOMString permission);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/notifications/WorkerContextNotifications.idl b/elemental/idl/third_party/WebCore/notifications/WorkerContextNotifications.idl
new file mode 100644
index 0000000..3c93bc2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/notifications/WorkerContextNotifications.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module threads {
+
+    interface [
+        Conditional=NOTIFICATIONS|LEGACY_NOTIFICATIONS,
+        Supplemental=WorkerContext
+    ] WorkerContextNotifications {
+#if defined(ENABLE_LEGACY_NOTIFICATIONS) && ENABLE_LEGACY_NOTIFICATIONS
+        readonly attribute [V8EnabledAtRuntime] NotificationCenter webkitNotifications;
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/AbstractView.idl b/elemental/idl/third_party/WebCore/page/AbstractView.idl
new file mode 100644
index 0000000..6d8232b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/AbstractView.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module views {
+
+    // Introduced in DOM Level 2:
+    interface [
+        ObjCCustomImplementation,
+        OmitConstructor
+    ] AbstractView {
+        readonly attribute Document document;
+        readonly attribute StyleMedia styleMedia;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/BarInfo.idl b/elemental/idl/third_party/WebCore/page/BarInfo.idl
new file mode 100644
index 0000000..11a97c7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/BarInfo.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        JSGenerateIsReachable=ImplFrame,
+        OmitConstructor
+    ] BarInfo {
+        readonly attribute boolean visible;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/Console.idl b/elemental/idl/third_party/WebCore/page/Console.idl
new file mode 100644
index 0000000..5f215e8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/Console.idl
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        JSGenerateIsReachable=ImplFrame,
+        OmitConstructor
+    ] Console {
+
+        [CallWith=ScriptArguments|CallStack] void debug();
+        [CallWith=ScriptArguments|CallStack] void error();
+        [CallWith=ScriptArguments|CallStack] void info();
+        [CallWith=ScriptArguments|CallStack] void log();
+        [CallWith=ScriptArguments|CallStack] void warn();
+        [CallWith=ScriptArguments|CallStack] void dir();
+        [CallWith=ScriptArguments|CallStack] void dirxml();
+        [V8Custom, CallWith=ScriptArguments|CallStack] void trace();
+        [V8Custom, CallWith=ScriptArguments|CallStack, ImplementedAs=assertCondition] void assert(in boolean condition);
+        [CallWith=ScriptArguments|CallStack] void count();
+        [CallWith=ScriptArguments|CallStack] void markTimeline();
+
+#if defined(ENABLE_JAVASCRIPT_DEBUGGER) && ENABLE_JAVASCRIPT_DEBUGGER
+        readonly attribute sequence<ScriptProfile> profiles;
+        [Custom] void profile(in DOMString title);
+        [Custom] void profileEnd(in DOMString title);
+#endif
+
+        void time(in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString title);
+        [CallWith=ScriptArguments|CallStack] void timeEnd(in [TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString title);
+        [CallWith=ScriptArguments|CallStack] void timeStamp();
+        [CallWith=ScriptArguments|CallStack] void group();
+        [CallWith=ScriptArguments|CallStack] void groupCollapsed();
+        void groupEnd();
+
+        readonly attribute [V8CustomGetter] MemoryInfo memory;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/Coordinates.idl b/elemental/idl/third_party/WebCore/page/Coordinates.idl
new file mode 100644
index 0000000..f83d87e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/Coordinates.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module core {
+
+    interface [
+        OmitConstructor
+    ] Coordinates {
+        readonly attribute double latitude;
+        readonly attribute double longitude;
+        readonly attribute [Custom] double altitude;
+        readonly attribute double accuracy;
+        readonly attribute [Custom] double altitudeAccuracy;
+        readonly attribute [Custom] double heading;
+        readonly attribute [Custom] double speed;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/page/Crypto.idl b/elemental/idl/third_party/WebCore/page/Crypto.idl
new file mode 100644
index 0000000..807b63f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/Crypto.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Googl, Inc. ("Google") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        OmitConstructor
+    ] Crypto {
+        void getRandomValues(in ArrayBufferView array) raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/DOMSelection.idl b/elemental/idl/third_party/WebCore/page/DOMSelection.idl
new file mode 100644
index 0000000..1f7d3da
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/DOMSelection.idl
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2009 Google Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    // This is based off of Mozilla's Selection interface
+    // https://developer.mozilla.org/En/DOM/Selection
+    interface [
+        JSGenerateIsReachable=ImplFrame,
+        InterfaceName=Selection
+    ] DOMSelection {
+        readonly attribute Node anchorNode;
+        readonly attribute long anchorOffset;
+        readonly attribute Node focusNode;
+        readonly attribute long focusOffset;
+
+        readonly attribute boolean isCollapsed;
+        readonly attribute long rangeCount;
+
+        void collapse(in [Optional=DefaultIsUndefined] Node node, 
+                      in [Optional=DefaultIsUndefined] long index)
+            raises(DOMException);
+        void collapseToEnd()
+            raises(DOMException);
+        void collapseToStart()
+            raises(DOMException);
+
+        void deleteFromDocument();
+        boolean containsNode(in [Optional=DefaultIsUndefined] Node node, 
+                             in [Optional=DefaultIsUndefined] boolean allowPartial);
+        void selectAllChildren(in [Optional=DefaultIsUndefined] Node node)
+            raises(DOMException);
+
+        void extend(in [Optional=DefaultIsUndefined] Node node, 
+                    in [Optional=DefaultIsUndefined] long offset)
+            raises(DOMException);
+
+        Range getRangeAt(in [Optional=DefaultIsUndefined] long index)
+            raises(DOMException);
+        void removeAllRanges();
+        void addRange(in [Optional=DefaultIsUndefined] Range range);
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [NotEnumerable] DOMString toString();
+#endif
+
+        // WebKit extensions
+        readonly attribute Node baseNode;
+        readonly attribute long baseOffset;
+        readonly attribute Node extentNode;
+        readonly attribute long extentOffset;
+
+        // WebKit's "type" accessor returns "None", "Range" and "Caret"
+        // IE's type accessor returns "none", "text" and "control"
+        readonly attribute DOMString type;
+
+        void modify(in [Optional=DefaultIsUndefined] DOMString alter, 
+                    in [Optional=DefaultIsUndefined] DOMString direction, 
+                    in [Optional=DefaultIsUndefined] DOMString granularity);
+        void setBaseAndExtent(in [Optional=DefaultIsUndefined] Node baseNode, 
+                              in [Optional=DefaultIsUndefined] long baseOffset, 
+                              in [Optional=DefaultIsUndefined] Node extentNode, 
+                              in [Optional=DefaultIsUndefined] long extentOffset)
+            raises(DOMException);
+        void setPosition(in [Optional=DefaultIsUndefined] Node node, 
+                         in [Optional=DefaultIsUndefined] long offset)
+            raises(DOMException);
+
+        // IE extentions
+        // http://msdn.microsoft.com/en-us/library/ms535869(VS.85).aspx
+        void empty();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/DOMWindow.idl b/elemental/idl/third_party/WebCore/page/DOMWindow.idl
new file mode 100644
index 0000000..f0656d8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/DOMWindow.idl
@@ -0,0 +1,796 @@
+/*
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        CheckSecurity,
+        JSCustomDefineOwnProperty,
+        CustomDeleteProperty,
+        CustomGetOwnPropertySlot,
+        CustomEnumerateProperty,
+        JSCustomMarkFunction,
+        JSCustomToNativeObject,
+        CustomPutFunction,
+        EventTarget,
+        ExtendsDOMGlobalObject,
+        JSGenerateToNativeObject,
+        ReplaceableConstructor,
+        JSLegacyParent=JSDOMWindowBase,
+        V8CustomToJSObject,
+        InterfaceName=Window
+    ] DOMWindow {
+        // DOM Level 0
+        attribute [Replaceable] Screen screen;
+        attribute [Replaceable, DoNotCheckSecurityOnGetter] History history;
+        attribute [Replaceable] BarInfo locationbar;
+        attribute [Replaceable] BarInfo menubar;
+        attribute [Replaceable] BarInfo personalbar;
+        attribute [Replaceable] BarInfo scrollbars;
+        attribute [Replaceable] BarInfo statusbar;
+        attribute [Replaceable] BarInfo toolbar;
+        attribute [Replaceable] Navigator navigator;
+        attribute [Replaceable] Navigator clientInformation;
+        readonly attribute Crypto crypto;
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+        attribute [DoNotCheckSecurity, CustomSetter, V8Unforgeable] Location location;
+#endif
+        attribute [Replaceable, CustomGetter, V8CustomSetter] Event event;
+
+        DOMSelection getSelection();
+
+        readonly attribute [CheckSecurityForNode] Element frameElement;
+
+        [DoNotCheckSecurity, CallWith=ScriptExecutionContext] void focus();
+        [DoNotCheckSecurity] void blur();
+        [DoNotCheckSecurity, CallWith=ScriptExecutionContext] void close();
+
+        void print();
+        void stop();
+
+        [Custom] DOMWindow open(in DOMString url,
+                                in DOMString name,
+                                in [Optional] DOMString options);
+
+        [Custom] DOMObject showModalDialog(in DOMString url,
+                                           in [Optional] DOMObject dialogArgs,
+                                           in [Optional] DOMString featureArgs);
+
+        void alert(in [Optional=DefaultIsUndefined] DOMString message);
+        boolean confirm(in [Optional=DefaultIsUndefined] DOMString message);
+        [TreatReturnedNullStringAs=Null] DOMString prompt(in [Optional=DefaultIsUndefined] DOMString message,
+                                                    in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString defaultValue);
+
+        boolean find(in [Optional=DefaultIsUndefined] DOMString string,
+                     in [Optional=DefaultIsUndefined] boolean caseSensitive,
+                     in [Optional=DefaultIsUndefined] boolean backwards,
+                     in [Optional=DefaultIsUndefined] boolean wrap,
+                     in [Optional=DefaultIsUndefined] boolean wholeWord,
+                     in [Optional=DefaultIsUndefined] boolean searchInFrames,
+                     in [Optional=DefaultIsUndefined] boolean showDialog);
+
+        attribute [Replaceable] boolean offscreenBuffering;
+
+        attribute [Replaceable] long outerHeight;
+        attribute [Replaceable] long outerWidth;
+        attribute [Replaceable] long innerHeight;
+        attribute [Replaceable] long innerWidth;
+        attribute [Replaceable] long screenX;
+        attribute [Replaceable] long screenY;
+        attribute [Replaceable] long screenLeft;
+        attribute [Replaceable] long screenTop;
+        attribute [Replaceable] long scrollX;
+        attribute [Replaceable] long scrollY;
+        readonly attribute long pageXOffset;
+        readonly attribute long pageYOffset;
+
+        void scrollBy(in [Optional=DefaultIsUndefined] long x, in [Optional=DefaultIsUndefined] long y);
+        void scrollTo(in [Optional=DefaultIsUndefined] long x, in [Optional=DefaultIsUndefined] long y);
+        void scroll(in [Optional=DefaultIsUndefined] long x, in [Optional=DefaultIsUndefined] long y);
+        void moveBy(in [Optional=DefaultIsUndefined] float x, in [Optional=DefaultIsUndefined] float y); // FIXME: this should take longs not floats.
+        void moveTo(in [Optional=DefaultIsUndefined] float x, in [Optional=DefaultIsUndefined] float y); // FIXME: this should take longs not floats.
+        void resizeBy(in [Optional=DefaultIsUndefined] float x, in [Optional=DefaultIsUndefined] float y); // FIXME: this should take longs not floats.
+        void resizeTo(in [Optional=DefaultIsUndefined] float width, in [Optional=DefaultIsUndefined] float height); // FIXME: this should take longs not floats.
+
+        readonly attribute [DoNotCheckSecurity] boolean closed;
+
+        attribute [Replaceable, DoNotCheckSecurityOnGetter] unsigned long length;
+
+        attribute DOMString name;
+
+        attribute DOMString status;
+        attribute DOMString defaultStatus;
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // This attribute is an alias of defaultStatus and is necessary for legacy uses.
+        attribute DOMString defaultstatus;
+#endif
+
+        // Self referential attributes
+        attribute [Replaceable, DoNotCheckSecurityOnGetter] DOMWindow self;
+        readonly attribute [DoNotCheckSecurity, V8Unforgeable] DOMWindow window;
+        attribute [Replaceable, DoNotCheckSecurityOnGetter] DOMWindow frames;
+
+        attribute [Replaceable, DoNotCheckSecurityOnGetter, V8CustomSetter] DOMWindow opener;
+        attribute [Replaceable, DoNotCheckSecurityOnGetter] DOMWindow parent;
+        attribute [Replaceable, DoNotCheckSecurityOnGetter, V8Unforgeable, V8ReadOnly] DOMWindow top;
+
+        // DOM Level 2 AbstractView Interface
+        readonly attribute Document document;
+
+        // CSSOM View Module
+        MediaQueryList matchMedia(in DOMString query);
+
+        // styleMedia has been removed from the CSSOM View specification.
+        readonly attribute StyleMedia styleMedia;
+
+        // DOM Level 2 Style Interface
+        CSSStyleDeclaration getComputedStyle(in [Optional=DefaultIsUndefined] Element element,
+                                             in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString pseudoElement);
+
+        // WebKit extensions
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        CSSRuleList getMatchedCSSRules(in [Optional=DefaultIsUndefined] Element element,
+                                       in [TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] DOMString pseudoElement);
+#endif
+
+        attribute [Replaceable] double devicePixelRatio;
+        
+        WebKitPoint webkitConvertPointFromPageToNode(in [Optional=DefaultIsUndefined] Node node, 
+                                                     in [Optional=DefaultIsUndefined] WebKitPoint p);
+        WebKitPoint webkitConvertPointFromNodeToPage(in [Optional=DefaultIsUndefined] Node node, 
+                                                     in [Optional=DefaultIsUndefined] WebKitPoint p);
+
+        readonly attribute [V8EnabledAtRuntime] DOMApplicationCache applicationCache;
+
+        readonly attribute [V8EnabledAtRuntime] Storage sessionStorage
+            getter raises(DOMException);
+        readonly attribute [V8EnabledAtRuntime] Storage localStorage
+            getter raises(DOMException);
+
+#if defined(ENABLE_ORIENTATION_EVENTS) && ENABLE_ORIENTATION_EVENTS
+        // This is the interface orientation in degrees. Some examples are:
+        //  0 is straight up; -90 is when the device is rotated 90 clockwise;
+        //  90 is when rotated counter clockwise.
+        readonly attribute long orientation;
+#endif
+
+                 attribute [Replaceable] Console console;
+
+        // cross-document messaging
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [DoNotCheckSecurity, Custom] void postMessage(in SerializedScriptValue message, in DOMString targetOrigin)
+            raises(DOMException);
+        [DoNotCheckSecurity, Custom] void postMessage(in SerializedScriptValue message, in DOMString targetOrigin, in Array messagePorts)
+            raises(DOMException);
+
+        [DoNotCheckSecurity, Custom] void webkitPostMessage(in SerializedScriptValue message, in DOMString targetOrigin)
+            raises(DOMException);
+        [DoNotCheckSecurity, Custom] void webkitPostMessage(in SerializedScriptValue message, in DOMString targetOrigin, in Array transferList)
+            raises(DOMException);
+#else
+        // There's no good way to expose an array via the ObjC bindings, so for now just allow passing in a single port.
+        [DoNotCheckSecurity, Custom] void postMessage(in SerializedScriptValue message, in [Optional] MessagePort messagePort, in DOMString targetOrigin)
+            raises(DOMException);
+#endif
+
+#if defined(ENABLE_WEB_TIMING) && ENABLE_WEB_TIMING
+        attribute [Replaceable] Performance performance;
+#endif
+
+        // Timers
+        [Custom] long setTimeout(in [Optional=DefaultIsUndefined] TimeoutHandler handler, 
+                                 in [Optional=DefaultIsUndefined] long timeout);
+        // [Custom] long setTimeout(in TimeoutHandler handler, in long timeout, arguments...);
+        // [Custom] long setTimeout(in DOMString code, in long timeout);
+        void clearTimeout(in [Optional=DefaultIsUndefined] long handle);
+        [Custom] long setInterval(in TimeoutHandler handler, in long timeout);
+        // [Custom] long setInterval(in TimeoutHandler handler, in long timeout, arguments...);
+        // [Custom] long setInterval(in DOMString code, in long timeout);
+        void clearInterval(in [Optional=DefaultIsUndefined] long handle);
+
+#if defined(ENABLE_REQUEST_ANIMATION_FRAME)
+        // WebKit animation extensions, being standardized in the WebPerf WG
+        long webkitRequestAnimationFrame(in [Callback] RequestAnimationFrameCallback callback);
+        void webkitCancelAnimationFrame(in long id);
+        void webkitCancelRequestAnimationFrame(in long id); // This is a deprecated alias for webkitCancelAnimationFrame(). Remove this when removing vendor prefix.
+#endif
+
+        // Base64
+        DOMString atob(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString string)
+            raises(DOMException);
+        DOMString btoa(in [TreatNullAs=NullString,Optional=DefaultIsUndefined] DOMString string)
+            raises(DOMException);
+
+        // Events
+        attribute EventListener onabort;
+        attribute EventListener onbeforeunload;
+        attribute EventListener onblur;
+        attribute EventListener oncanplay;
+        attribute EventListener oncanplaythrough;
+        attribute EventListener onchange;
+        attribute EventListener onclick;
+        attribute EventListener oncontextmenu;
+        attribute EventListener ondblclick;
+        attribute EventListener ondrag;
+        attribute EventListener ondragend;
+        attribute EventListener ondragenter;
+        attribute EventListener ondragleave;
+        attribute EventListener ondragover;
+        attribute EventListener ondragstart;
+        attribute EventListener ondrop;
+        attribute EventListener ondurationchange;
+        attribute EventListener onemptied;
+        attribute EventListener onended;
+        attribute EventListener onerror;
+        attribute EventListener onfocus;
+        attribute EventListener onhashchange;
+        attribute EventListener oninput;
+        attribute EventListener oninvalid;
+        attribute EventListener onkeydown;
+        attribute EventListener onkeypress;
+        attribute EventListener onkeyup;
+        attribute EventListener onload;
+        attribute EventListener onloadeddata;
+        attribute EventListener onloadedmetadata;
+        attribute EventListener onloadstart;
+        attribute EventListener onmessage;
+        attribute EventListener onmousedown;
+        attribute EventListener onmousemove;
+        attribute EventListener onmouseout;
+        attribute EventListener onmouseover;
+        attribute EventListener onmouseup;
+        attribute EventListener onmousewheel;
+        attribute EventListener onoffline;
+        attribute EventListener ononline;
+        attribute EventListener onpagehide;
+        attribute EventListener onpageshow;
+        attribute EventListener onpause;
+        attribute EventListener onplay;
+        attribute EventListener onplaying;
+        attribute EventListener onpopstate;
+        attribute EventListener onprogress;
+        attribute EventListener onratechange;
+        attribute EventListener onresize;
+        attribute EventListener onscroll;
+        attribute EventListener onseeked;
+        attribute EventListener onseeking;
+        attribute EventListener onselect;
+        attribute EventListener onstalled;
+        attribute EventListener onstorage;
+        attribute EventListener onsubmit;
+        attribute EventListener onsuspend;
+        attribute EventListener ontimeupdate;
+        attribute EventListener onunload;
+        attribute EventListener onvolumechange;
+        attribute EventListener onwaiting;
+
+        // Not implemented yet.
+        // attribute EventListener onafterprint;
+        // attribute EventListener onbeforeprint;
+        // attribute EventListener onreadystatechange;
+        // attribute EventListener onredo;
+        // attribute EventListener onshow;
+        // attribute EventListener onundo;
+
+        // Webkit extensions
+        attribute EventListener onreset;
+        attribute EventListener onsearch;
+        attribute EventListener onwebkitanimationend;
+        attribute EventListener onwebkitanimationiteration;
+        attribute EventListener onwebkitanimationstart;
+        attribute EventListener onwebkittransitionend;
+#if defined(ENABLE_ORIENTATION_EVENTS) && ENABLE_ORIENTATION_EVENTS
+        attribute EventListener onorientationchange;
+#endif
+        attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchstart;
+        attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchmove;
+        attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchend;
+        attribute [Conditional=TOUCH_EVENTS,V8EnabledAtRuntime] EventListener ontouchcancel;
+
+        attribute [Conditional=DEVICE_ORIENTATION,V8EnabledAtRuntime] EventListener ondevicemotion;
+        attribute [Conditional=DEVICE_ORIENTATION,V8EnabledAtRuntime] EventListener ondeviceorientation;
+
+        // EventTarget interface
+        [Custom] void addEventListener(in DOMString type,
+                                      in EventListener listener,
+                                      in [Optional] boolean useCapture);
+        [Custom] void removeEventListener(in DOMString type,
+                                          in EventListener listener,
+                                          in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+
+        [V8Custom] void captureEvents(/*in long eventFlags*/);
+        [V8Custom] void releaseEvents(/*in long eventFlags*/);
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // Global constructors
+        attribute StyleSheetConstructor StyleSheet;
+        attribute CSSStyleSheetConstructor CSSStyleSheet;
+
+        attribute CSSValueConstructor CSSValue;
+        attribute CSSPrimitiveValueConstructor CSSPrimitiveValue;
+        attribute CSSValueListConstructor CSSValueList;
+        attribute WebKitCSSTransformValueConstructor WebKitCSSTransformValue;
+
+#if defined(ENABLE_CSS_FILTERS) && ENABLE_CSS_FILTERS
+        attribute WebKitCSSFilterValueConstructor WebKitCSSFilterValue;
+#endif
+
+        attribute CSSRuleConstructor CSSRule;
+        attribute CSSCharsetRuleConstructor CSSCharsetRule;
+        attribute CSSFontFaceRuleConstructor CSSFontFaceRule;
+        attribute CSSImportRuleConstructor CSSImportRule;
+        attribute CSSMediaRuleConstructor CSSMediaRule;
+        attribute CSSPageRuleConstructor CSSPageRule;
+        attribute CSSStyleRuleConstructor CSSStyleRule;
+        
+        attribute CSSStyleDeclarationConstructor CSSStyleDeclaration;
+        attribute MediaListConstructor MediaList;
+        attribute CounterConstructor Counter;
+        attribute CSSRuleListConstructor CSSRuleList;
+        attribute RectConstructor Rect;
+        attribute RGBColorConstructor RGBColor;
+        attribute StyleSheetListConstructor StyleSheetList;
+
+        // FIXME: Implement the commented-out global constructors for interfaces listed in DOM Level 3 Core specification.
+        attribute DOMCoreExceptionConstructor DOMException;
+        attribute DOMStringListConstructor DOMStringList;
+//        attribute NameListConstructor NameList;
+//        attribute DOMImplementationListConstructor DOMImplementationList;
+//        attribute DOMImplementationSourceConstructor DOMImplementationSource;
+        attribute DOMImplementationConstructor DOMImplementation;
+        attribute DOMSettableTokenListConstructor DOMSettableTokenList;
+        attribute DOMTokenListConstructor DOMTokenList;
+        attribute DocumentFragmentConstructor DocumentFragment;
+        attribute DocumentConstructor Document;
+        attribute NodeConstructor Node;
+        attribute NodeListConstructor NodeList;
+        attribute NamedNodeMapConstructor NamedNodeMap;
+        attribute CharacterDataConstructor CharacterData;
+        attribute AttrConstructor Attr;
+        attribute ElementConstructor Element;
+        attribute TextConstructor Text;
+        attribute CommentConstructor Comment;
+//        attribute TypeInfoConstructor TypeInfo;
+//        attribute UserDataHandlerConstructor UserDataHandler;
+//        attribute DOMErrorConstructor DOMError;
+//        attribute DOMErrorHandlerConstructor DOMErrorHandler
+//        attribute DOMLocatorConstructor DOMLocator;
+//        attribute DOMConfigurationConstructor DOMConfiguration;
+        attribute CDATASectionConstructor CDATASection;
+        attribute DocumentTypeConstructor DocumentType;
+        attribute NotationConstructor Notation;
+        attribute EntityConstructor Entity;
+        attribute EntityReferenceConstructor EntityReference;
+        attribute ProcessingInstructionConstructor ProcessingInstruction;
+        attribute [Conditional=SHADOW_DOM, V8EnabledPerContext=shadowDOM] ShadowRootConstructor WebKitShadowRoot;
+        attribute [Conditional=SHADOW_DOM, V8EnabledPerContext=shadowDOM] HTMLContentElementConstructor HTMLContentElement;
+        attribute [Conditional=SHADOW_DOM, V8EnabledPerContext=shadowDOM] HTMLShadowElementConstructor HTMLShadowElement;
+
+        attribute DOMSelectionConstructor Selection;
+        attribute DOMWindowConstructor Window;
+
+        attribute HTMLDocumentConstructor HTMLDocument;
+        attribute HTMLElementConstructor HTMLElement;
+        attribute HTMLAnchorElementConstructor HTMLAnchorElement;
+        attribute HTMLAppletElementConstructor HTMLAppletElement;
+        attribute HTMLAreaElementConstructor HTMLAreaElement;
+        attribute HTMLBRElementConstructor HTMLBRElement;
+        attribute HTMLBaseElementConstructor HTMLBaseElement;
+        attribute HTMLBaseFontElementConstructor HTMLBaseFontElement;
+        attribute HTMLBodyElementConstructor HTMLBodyElement;
+        attribute HTMLButtonElementConstructor HTMLButtonElement;
+        attribute HTMLCanvasElementConstructor HTMLCanvasElement;
+        attribute HTMLDListElementConstructor HTMLDListElement;
+        attribute [Conditional=DATALIST] HTMLDataListElementConstructor HTMLDataListElement;
+        attribute HTMLDirectoryElementConstructor HTMLDirectoryElement;
+        attribute HTMLDivElementConstructor HTMLDivElement;
+        attribute HTMLEmbedElementConstructor HTMLEmbedElement;
+        attribute HTMLFieldSetElementConstructor HTMLFieldSetElement;
+        attribute HTMLFontElementConstructor HTMLFontElement;
+        attribute HTMLFormElementConstructor HTMLFormElement;
+        attribute HTMLFrameElementConstructor HTMLFrameElement;
+        attribute HTMLFrameSetElementConstructor HTMLFrameSetElement;
+        attribute HTMLHRElementConstructor HTMLHRElement;
+        attribute HTMLHeadElementConstructor HTMLHeadElement;
+        attribute HTMLHeadingElementConstructor HTMLHeadingElement;
+        attribute HTMLHtmlElementConstructor HTMLHtmlElement;
+        attribute HTMLIFrameElementConstructor HTMLIFrameElement;
+        attribute HTMLImageElementConstructor HTMLImageElement;
+        attribute HTMLInputElementConstructor HTMLInputElement;
+        attribute HTMLKeygenElementConstructor HTMLKeygenElement;
+        attribute HTMLLIElementConstructor HTMLLIElement;
+        attribute HTMLLabelElementConstructor HTMLLabelElement;
+        attribute HTMLLegendElementConstructor HTMLLegendElement;
+        attribute HTMLLinkElementConstructor HTMLLinkElement;
+        attribute HTMLMapElementConstructor HTMLMapElement;
+        attribute HTMLMarqueeElementConstructor HTMLMarqueeElement;
+        attribute HTMLMenuElementConstructor HTMLMenuElement;
+        attribute HTMLMetaElementConstructor HTMLMetaElement;
+#if defined(ENABLE_METER_TAG) && ENABLE_METER_TAG
+        attribute HTMLMeterElementConstructor HTMLMeterElement;
+#endif
+        attribute HTMLModElementConstructor HTMLModElement;
+        attribute HTMLOListElementConstructor HTMLOListElement;
+        attribute HTMLObjectElementConstructor HTMLObjectElement;
+        attribute HTMLOptGroupElementConstructor HTMLOptGroupElement;
+        attribute HTMLOptionElementConstructor HTMLOptionElement;
+        attribute HTMLOutputElementConstructor HTMLOutputElement;
+        attribute HTMLParagraphElementConstructor HTMLParagraphElement;
+        attribute HTMLParamElementConstructor HTMLParamElement;
+        attribute HTMLPreElementConstructor HTMLPreElement;
+#if defined(ENABLE_PROGRESS_TAG) && ENABLE_PROGRESS_TAG
+        attribute HTMLProgressElementConstructor HTMLProgressElement;
+#endif
+        attribute HTMLQuoteElementConstructor HTMLQuoteElement;
+        attribute HTMLScriptElementConstructor HTMLScriptElement;
+        attribute HTMLSelectElementConstructor HTMLSelectElement;
+        attribute HTMLSpanElementConstructor HTMLSpanElement;
+        attribute HTMLStyleElementConstructor HTMLStyleElement;
+        attribute HTMLTableCaptionElementConstructor HTMLTableCaptionElement;
+        attribute HTMLTableCellElementConstructor HTMLTableCellElement;
+        attribute HTMLTableColElementConstructor HTMLTableColElement;
+        attribute HTMLTableElementConstructor HTMLTableElement;
+        attribute HTMLTableRowElementConstructor HTMLTableRowElement;
+        attribute HTMLTableSectionElementConstructor HTMLTableSectionElement;
+        attribute HTMLTextAreaElementConstructor HTMLTextAreaElement;
+        attribute HTMLTitleElementConstructor HTMLTitleElement;
+        attribute HTMLUListElementConstructor HTMLUListElement;
+
+        attribute HTMLCollectionConstructor HTMLCollection;
+        attribute HTMLAllCollectionConstructor HTMLAllCollection;
+        attribute [Conditional=MICRODATA] HTMLPropertiesCollectionConstructor HTMLPropertiesCollection;
+        attribute HTMLUnknownElementConstructor HTMLUnknownElement;
+
+        attribute [JSCustomGetter, CustomConstructor] HTMLImageElementConstructorConstructor Image; // Usable with new operator
+        attribute [JSCustomGetter] HTMLOptionElementConstructorConstructor Option; // Usable with new operator
+
+        attribute [Conditional=ENCRYPTED_MEDIA, V8EnabledAtRuntime=encryptedMedia] MediaKeyErrorConstructor MediaKeyError;
+        attribute [Conditional=ENCRYPTED_MEDIA, V8EnabledAtRuntime=encryptedMedia] MediaKeyEventConstructor MediaKeyEvent;
+
+        attribute [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] HTMLTrackElementConstructor HTMLTrackElement;
+        attribute [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] TextTrackConstructor TextTrack;
+        attribute [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] TextTrackCueConstructor TextTrackCue; // Usable with the new operator
+        attribute [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] TextTrackCueListConstructor TextTrackCueList;
+        attribute [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] TextTrackListConstructor TextTrackList;
+        attribute [Conditional=VIDEO_TRACK, V8EnabledAtRuntime=webkitVideoTrack] TrackEventConstructor TrackEvent;
+
+        attribute [JSCustomGetter, Conditional=VIDEO, V8EnabledAtRuntime] HTMLAudioElementConstructorConstructor Audio; // Usable with the new operator
+        attribute [Conditional=VIDEO, V8EnabledAtRuntime] HTMLAudioElementConstructor HTMLAudioElement;
+        attribute [Conditional=VIDEO, V8EnabledAtRuntime] HTMLMediaElementConstructor HTMLMediaElement;
+        attribute [Conditional=VIDEO, V8EnabledAtRuntime] HTMLVideoElementConstructor HTMLVideoElement;
+        attribute [Conditional=VIDEO, V8EnabledAtRuntime] MediaErrorConstructor MediaError;
+        attribute [Conditional=VIDEO, V8EnabledAtRuntime] TimeRangesConstructor TimeRanges;
+        attribute [Conditional=VIDEO, V8EnabledAtRuntime] HTMLSourceElementConstructor HTMLSourceElement;
+        attribute [Conditional=VIDEO, V8EnabledAtRuntime] MediaControllerConstructor MediaController;
+
+        attribute [Conditional=WEB_INTENTS_TAG] HTMLIntentElementConstructor HTMLIntentElement;
+
+        attribute CanvasPatternConstructor CanvasPattern;
+        attribute CanvasGradientConstructor CanvasGradient;
+        attribute CanvasRenderingContext2DConstructor CanvasRenderingContext2D;
+
+        attribute ImageDataConstructor ImageData;
+        attribute TextMetricsConstructor TextMetrics;
+
+        attribute [Conditional=WEBGL] WebGLActiveInfoConstructor WebGLActiveInfo;
+        attribute [Conditional=WEBGL] WebGLBufferConstructor WebGLBuffer;
+        attribute [Conditional=WEBGL] WebGLFramebufferConstructor WebGLFramebuffer;
+        attribute [Conditional=WEBGL] WebGLProgramConstructor WebGLProgram;
+        attribute [Conditional=WEBGL] WebGLRenderbufferConstructor WebGLRenderbuffer;
+        attribute [Conditional=WEBGL] WebGLRenderingContextConstructor WebGLRenderingContext;
+        attribute [Conditional=WEBGL] WebGLShaderConstructor WebGLShader;
+        attribute [Conditional=WEBGL] WebGLShaderPrecisionFormatConstructor WebGLShaderPrecisionFormat;
+        attribute [Conditional=WEBGL] WebGLTextureConstructor WebGLTexture;
+        attribute [Conditional=WEBGL] WebGLUniformLocationConstructor WebGLUniformLocation;
+
+        attribute DOMStringMapConstructor DOMStringMap;
+
+        attribute ArrayBufferConstructor ArrayBuffer; // Usable with new operator
+        attribute Int8ArrayConstructor Int8Array; // Usable with new operator
+        attribute Uint8ArrayConstructor Uint8Array; // Usable with new operator
+        attribute Uint8ClampedArrayConstructor Uint8ClampedArray; // Usable with new operator
+        attribute Int16ArrayConstructor Int16Array; // Usable with new operator
+        attribute Uint16ArrayConstructor Uint16Array; // Usable with new operator
+        attribute Int32ArrayConstructor Int32Array; // Usable with new operator
+        attribute Uint32ArrayConstructor Uint32Array; // Usable with new operator
+        attribute Float32ArrayConstructor Float32Array; // Usable with new operator
+        attribute Float64ArrayConstructor Float64Array; // Usable with new operator
+        attribute DataViewConstructor DataView; // Usable with new operator
+
+        // Event Constructors
+        attribute EventConstructor Event;
+        attribute BeforeLoadEventConstructor BeforeLoadEvent;
+        attribute CompositionEventConstructor CompositionEvent;
+        attribute CustomEventConstructor CustomEvent;
+        attribute ErrorEventConstructor ErrorEvent;
+        attribute HashChangeEventConstructor HashChangeEvent;
+        attribute KeyboardEventConstructor KeyboardEvent;
+        attribute MessageEventConstructor MessageEvent;
+        attribute MouseEventConstructor MouseEvent;
+        attribute MutationEventConstructor MutationEvent;
+        attribute OverflowEventConstructor OverflowEvent;
+        attribute PopStateEventConstructor PopStateEvent;
+        attribute PageTransitionEventConstructor PageTransitionEvent;
+        attribute ProgressEventConstructor ProgressEvent;
+        attribute TextEventConstructor TextEvent;
+        attribute UIEventConstructor UIEvent;
+        attribute WebKitAnimationEventConstructor WebKitAnimationEvent;
+        attribute WebKitTransitionEventConstructor WebKitTransitionEvent;
+        attribute WheelEventConstructor WheelEvent;
+        attribute XMLHttpRequestProgressEventConstructor XMLHttpRequestProgressEvent;
+        attribute [Conditional=DEVICE_ORIENTATION, V8EnabledAtRuntime] DeviceMotionEventConstructor DeviceMotionEvent;
+        attribute [Conditional=DEVICE_ORIENTATION, V8EnabledAtRuntime] DeviceOrientationEventConstructor DeviceOrientationEvent;
+        attribute [Conditional=TOUCH_EVENTS] TouchEventConstructor TouchEvent;
+        attribute StorageEventConstructor StorageEvent;
+        attribute [Conditional=INPUT_SPEECH] SpeechInputEventConstructor SpeechInputEvent;
+        attribute [Conditional=WEBGL] WebGLContextEventConstructor WebGLContextEvent;
+
+        attribute EventExceptionConstructor EventException;
+
+        attribute WebKitCSSKeyframeRuleConstructor WebKitCSSKeyframeRule;
+        attribute WebKitCSSKeyframesRuleConstructor WebKitCSSKeyframesRule;
+        attribute [Conditional=CSS_REGIONS] WebKitCSSRegionRuleConstructor WebKitCSSRegionRule;
+
+        attribute WebKitCSSMatrixConstructor WebKitCSSMatrix; // Usable with the new operator
+
+        attribute WebKitPointConstructor WebKitPoint; // Usable with new the operator
+
+        attribute ClipboardConstructor Clipboard;
+
+        attribute [Conditional=WORKERS] WorkerConstructor Worker; // Usable with the new operator
+        attribute [Conditional=SHARED_WORKERS, JSCustomGetter, V8EnabledAtRuntime] SharedWorkerConstructor SharedWorker; // Usable with the new operator
+
+        attribute FileConstructor File;
+        attribute FileListConstructor FileList;
+        attribute BlobConstructor Blob;
+
+        attribute NodeFilterConstructor NodeFilter;
+        attribute RangeConstructor Range;
+        attribute RangeExceptionConstructor RangeException;
+
+        attribute EventSourceConstructor EventSource; // Usable with new the operator
+
+        // Mozilla has a separate XMLDocument object for XML documents. 
+        // We just use Document for this.
+        attribute DocumentConstructor XMLDocument;
+        attribute DOMParserConstructor DOMParser;
+        attribute XMLSerializerConstructor XMLSerializer;
+        attribute XMLHttpRequestConstructor XMLHttpRequest; // Usable with the new operator
+        attribute XMLHttpRequestUploadConstructor XMLHttpRequestUpload;
+        attribute XMLHttpRequestExceptionConstructor XMLHttpRequestException;
+        attribute [Conditional=XSLT] XSLTProcessorConstructor XSLTProcessor; // Usable with the new operator
+
+#if defined(ENABLE_CHANNEL_MESSAGING) && ENABLE_CHANNEL_MESSAGING
+        attribute MessagePortConstructor MessagePort;
+        attribute MessageChannelConstructor MessageChannel; // Usable with the new operator
+#endif
+
+        attribute DOMPluginConstructor Plugin;
+        attribute DOMPluginArrayConstructor PluginArray;
+
+        attribute DOMMimeTypeConstructor MimeType;
+        attribute DOMMimeTypeArrayConstructor MimeTypeArray;
+
+        attribute ClientRectConstructor ClientRect;
+        attribute ClientRectListConstructor ClientRectList;
+
+        attribute StorageConstructor Storage;
+
+#if defined(ENABLE_ANIMATION_API) && ENABLE_ANIMATION_API
+        attribute WebKitAnimationConstructor WebKitAnimation;
+        attribute WebKitAnimationListConstructor WebKitAnimationList;
+#endif
+
+        attribute XPathEvaluatorConstructor XPathEvaluator;
+        attribute XPathResultConstructor XPathResult;
+        attribute XPathExceptionConstructor XPathException;
+
+        attribute [Conditional=SVG] SVGZoomEventConstructor SVGZoomEvent;
+
+#if defined(ENABLE_SVG) && ENABLE_SVG
+        // Expose all implemented SVG 1.1 interfaces, excluding the SVG MI interfaces:
+        // SVGAnimatedPathData, SVGAnimatedPoints, SVGExternalResourcesRequired,
+        // SVGFilterPrimitiveStandardAttributes, SVGFitToViewBox, SVGLangSpace, SVGLocatable
+        // SVGStylable, SVGTests, SVGTransformable, SVGURIReference, SVGZoomAndPan
+        attribute SVGAElementConstructor SVGAElement;
+        attribute SVGAngleConstructor SVGAngle;
+        attribute SVGAnimatedAngleConstructor SVGAnimatedAngle;
+        attribute SVGAnimatedBooleanConstructor SVGAnimatedBoolean;
+        attribute SVGAnimatedEnumerationConstructor SVGAnimatedEnumeration;
+        attribute SVGAnimatedIntegerConstructor SVGAnimatedInteger;
+        attribute SVGAnimatedLengthConstructor SVGAnimatedLength;
+        attribute SVGAnimatedLengthListConstructor SVGAnimatedLengthList;
+        attribute SVGAnimatedNumberConstructor SVGAnimatedNumber;
+        attribute SVGAnimatedNumberListConstructor SVGAnimatedNumberList;
+        attribute SVGAnimatedPreserveAspectRatioConstructor SVGAnimatedPreserveAspectRatio;
+        attribute SVGAnimatedRectConstructor SVGAnimatedRect;
+        attribute SVGAnimatedStringConstructor SVGAnimatedString;
+        attribute SVGAnimatedTransformListConstructor SVGAnimatedTransformList;
+        attribute SVGCircleElementConstructor SVGCircleElement;
+        attribute SVGClipPathElementConstructor SVGClipPathElement;
+        attribute SVGColorConstructor SVGColor;
+        attribute SVGCursorElementConstructor SVGCursorElement;
+//      attribute SVGCSSRuleConstructor SVGCSSRule;
+        attribute SVGDefsElementConstructor SVGDefsElement;
+        attribute SVGDescElementConstructor SVGDescElement;
+        attribute SVGDocumentConstructor SVGDocument;
+        attribute SVGElementConstructor SVGElement;
+        attribute SVGElementInstanceConstructor SVGElementInstance;
+        attribute SVGElementInstanceListConstructor SVGElementInstanceList;
+        attribute SVGEllipseElementConstructor SVGEllipseElement;
+        attribute SVGForeignObjectElementConstructor SVGForeignObjectElement;
+        attribute SVGExceptionConstructor SVGException;
+        attribute SVGGElementConstructor SVGGElement;
+        attribute SVGGradientElementConstructor SVGGradientElement;
+        attribute SVGImageElementConstructor SVGImageElement;
+        attribute SVGLengthConstructor SVGLength;
+        attribute SVGLengthListConstructor SVGLengthList;
+        attribute SVGLinearGradientElementConstructor SVGLinearGradientElement;
+        attribute SVGLineElementConstructor SVGLineElement;
+        attribute SVGMarkerElementConstructor SVGMarkerElement;
+        attribute SVGMaskElementConstructor SVGMaskElement;
+        attribute SVGMatrixConstructor SVGMatrix;
+        attribute SVGMetadataElementConstructor SVGMetadataElement;
+        attribute SVGNumberConstructor SVGNumber;
+        attribute SVGNumberListConstructor SVGNumberList;
+        attribute SVGPaintConstructor SVGPaint;
+        attribute SVGPathElementConstructor SVGPathElement;
+        attribute SVGPathSegConstructor SVGPathSeg;
+        attribute SVGPathSegArcAbsConstructor SVGPathSegArcAbs;
+        attribute SVGPathSegArcRelConstructor SVGPathSegArcRel;
+        attribute SVGPathSegClosePathConstructor SVGPathSegClosePath;
+        attribute SVGPathSegCurvetoCubicAbsConstructor SVGPathSegCurvetoCubicAbs;
+        attribute SVGPathSegCurvetoCubicRelConstructor SVGPathSegCurvetoCubicRel;
+        attribute SVGPathSegCurvetoCubicSmoothAbsConstructor SVGPathSegCurvetoCubicSmoothAbs;
+        attribute SVGPathSegCurvetoCubicSmoothRelConstructor SVGPathSegCurvetoCubicSmoothRel;
+        attribute SVGPathSegCurvetoQuadraticAbsConstructor SVGPathSegCurvetoQuadraticAbs;
+        attribute SVGPathSegCurvetoQuadraticRelConstructor SVGPathSegCurvetoQuadraticRel;
+        attribute SVGPathSegCurvetoQuadraticSmoothAbsConstructor SVGPathSegCurvetoQuadraticSmoothAbs;
+        attribute SVGPathSegCurvetoQuadraticSmoothRelConstructor SVGPathSegCurvetoQuadraticSmoothRel;
+        attribute SVGPathSegLinetoAbsConstructor SVGPathSegLinetoAbs;
+        attribute SVGPathSegLinetoHorizontalAbsConstructor SVGPathSegLinetoHorizontalAbs;
+        attribute SVGPathSegLinetoHorizontalRelConstructor SVGPathSegLinetoHorizontalRel;
+        attribute SVGPathSegLinetoRelConstructor SVGPathSegLinetoRel;
+        attribute SVGPathSegLinetoVerticalAbsConstructor SVGPathSegLinetoVerticalAbs;
+        attribute SVGPathSegLinetoVerticalRelConstructor SVGPathSegLinetoVerticalRel;
+        attribute SVGPathSegListConstructor SVGPathSegList;
+        attribute SVGPathSegMovetoAbsConstructor SVGPathSegMovetoAbs;
+        attribute SVGPathSegMovetoRelConstructor SVGPathSegMovetoRel;
+        attribute SVGPatternElementConstructor SVGPatternElement;
+        attribute SVGPointConstructor SVGPoint;
+        attribute SVGPointListConstructor SVGPointList;
+        attribute SVGPolygonElementConstructor SVGPolygonElement;
+        attribute SVGPolylineElementConstructor SVGPolylineElement;
+        attribute SVGPreserveAspectRatioConstructor SVGPreserveAspectRatio;
+        attribute SVGRadialGradientElementConstructor SVGRadialGradientElement;
+        attribute SVGRectConstructor SVGRect;
+        attribute SVGRectElementConstructor SVGRectElement;
+        attribute SVGRenderingIntentConstructor SVGRenderingIntent;
+        attribute SVGScriptElementConstructor SVGScriptElement;
+        attribute SVGStopElementConstructor SVGStopElement;
+        attribute SVGStringListConstructor SVGStringList;
+        attribute SVGStyleElementConstructor SVGStyleElement;
+        attribute SVGSVGElementConstructor SVGSVGElement;
+        attribute SVGSwitchElementConstructor SVGSwitchElement;
+        attribute SVGSymbolElementConstructor SVGSymbolElement;
+        attribute SVGTextContentElementConstructor SVGTextContentElement;
+        attribute SVGTextElementConstructor SVGTextElement;
+        attribute SVGTextPathElementConstructor SVGTextPathElement;
+        attribute SVGTextPositioningElementConstructor SVGTextPositioningElement;
+        attribute SVGTitleElementConstructor SVGTitleElement;
+        attribute SVGTransformConstructor SVGTransform;
+        attribute SVGTransformListConstructor SVGTransformList;
+        attribute SVGTRefElementConstructor SVGTRefElement;
+        attribute SVGTSpanElementConstructor SVGTSpanElement;
+        attribute SVGUnitTypesConstructor SVGUnitTypes;
+        attribute SVGUseElementConstructor SVGUseElement;
+        attribute SVGViewElementConstructor SVGViewElement;
+        attribute SVGViewSpecConstructor SVGViewSpec;
+        attribute SVGZoomAndPanConstructor SVGZoomAndPan;
+
+        attribute SVGAnimateColorElementConstructor SVGAnimateColorElement;
+        attribute SVGAnimateElementConstructor SVGAnimateElement;
+        attribute SVGAnimateMotionElementConstructor SVGAnimateMotionElement;
+        attribute SVGAnimateTransformElementConstructor SVGAnimateTransformElement;
+        attribute SVGMPathElementConstructor SVGMPathElement;
+        attribute SVGSetElementConstructor SVGSetElement;
+
+#if defined(ENABLE_SVG_FONTS) && ENABLE_SVG_FONTS
+        attribute SVGAltGlyphDefElementConstructor SVGAltGlyphDefElement;
+        attribute SVGAltGlyphElementConstructor SVGAltGlyphElement;
+        attribute SVGAltGlyphItemElementConstructor SVGAltGlyphItemElement;
+//      attribute SVGDefinitionSrcElementConstructor SVGDefinitionSrcElement;
+        attribute SVGFontElementConstructor SVGFontElement;
+        attribute SVGFontFaceElementConstructor SVGFontFaceElement;
+        attribute SVGFontFaceFormatElementConstructor SVGFontFaceFormatElement;
+        attribute SVGFontFaceNameElementConstructor SVGFontFaceNameElement;
+        attribute SVGFontFaceSrcElementConstructor SVGFontFaceSrcElement;
+        attribute SVGFontFaceUriElementConstructor SVGFontFaceUriElement;
+        attribute SVGGlyphElementConstructor SVGGlyphElement;
+        attribute SVGGlyphRefElementConstructor SVGGlyphRefElement;
+        attribute SVGHKernElementConstructor SVGHKernElement;
+        attribute SVGMissingGlyphElementConstructor SVGMissingGlyphElement;
+        attribute SVGVKernElementConstructor SVGVKernElement;
+#endif
+
+#if defined(ENABLE_FILTERS) && ENABLE_FILTERS
+        attribute SVGComponentTransferFunctionElementConstructor SVGComponentTransferFunctionElement;
+        attribute SVGFEBlendElementConstructor SVGFEBlendElement;
+        attribute SVGFEColorMatrixElementConstructor SVGFEColorMatrixElement;
+        attribute SVGFEComponentTransferElementConstructor SVGFEComponentTransferElement;
+        attribute SVGFECompositeElementConstructor SVGFECompositeElement;
+        attribute SVGFEConvolveMatrixElementConstructor SVGFEConvolveMatrixElement;
+        attribute SVGFEDiffuseLightingElementConstructor SVGFEDiffuseLightingElement;
+        attribute SVGFEDisplacementMapElementConstructor SVGFEDisplacementMapElement;
+        attribute SVGFEDistantLightElementConstructor SVGFEDistantLightElement;
+        attribute SVGFEDropShadowElementConstructor SVGFEDropShadowElement;
+        attribute SVGFEFloodElementConstructor SVGFEFloodElement;
+        attribute SVGFEFuncAElementConstructor SVGFEFuncAElement;
+        attribute SVGFEFuncBElementConstructor SVGFEFuncBElement;
+        attribute SVGFEFuncGElementConstructor SVGFEFuncGElement;
+        attribute SVGFEFuncRElementConstructor SVGFEFuncRElement;
+        attribute SVGFEGaussianBlurElementConstructor SVGFEGaussianBlurElement;
+        attribute SVGFEImageElementConstructor SVGFEImageElement;
+        attribute SVGFEMergeElementConstructor SVGFEMergeElement;
+        attribute SVGFEMergeNodeElementConstructor SVGFEMergeNodeElement;
+        attribute SVGFEMorphologyElementConstructor SVGFEMorphologyElement;
+        attribute SVGFEOffsetElementConstructor SVGFEOffsetElement;
+        attribute SVGFEPointLightElementConstructor SVGFEPointLightElement;
+        attribute SVGFESpecularLightingElementConstructor SVGFESpecularLightingElement;
+        attribute SVGFESpotLightElementConstructor SVGFESpotLightElement;
+        attribute SVGFETileElementConstructor SVGFETileElement;
+        attribute SVGFETurbulenceElementConstructor SVGFETurbulenceElement;
+        attribute SVGFilterElementConstructor SVGFilterElement;
+#endif
+#endif
+
+        attribute DOMFormDataConstructor FormData;
+
+        attribute [Conditional=BLOB|FILE_SYSTEM] FileErrorConstructor FileError;
+        attribute [Conditional=BLOB] FileReaderConstructor FileReader;
+
+        attribute [Conditional=BLOB&LEGACY_WEBKIT_BLOB_BUILDER] WebKitBlobBuilderConstructor WebKitBlobBuilder;
+
+        attribute [Conditional=BLOB] DOMURLConstructor webkitURL;
+
+#if defined(ENABLE_QUOTA) && ENABLE_QUOTA
+        readonly attribute [V8EnabledAtRuntime=Quota] StorageInfo webkitStorageInfo;
+#endif
+
+        attribute [Conditional=MUTATION_OBSERVERS] WebKitMutationObserverConstructor WebKitMutationObserver;
+
+#endif // defined(LANGUAGE_JAVASCRIPT)
+
+#if defined(V8_BINDING) && V8_BINDING
+        // window.toString() requires special handling in V8
+        [V8DoNotCheckSignature, DoNotCheckSecurity, Custom, NotEnumerable] DOMString toString();
+#endif // defined(V8_BINDING)
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/page/DOMWindowPagePopup.idl b/elemental/idl/third_party/WebCore/page/DOMWindowPagePopup.idl
new file mode 100644
index 0000000..aa477a1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/DOMWindowPagePopup.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+    interface [
+        Conditional=PAGE_POPUP,
+        Supplemental=DOMWindow
+    ] DOMWindowPagePopup {
+        readonly attribute [V8EnabledPerContext=pagePopup] PagePopupController pagePopupController;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/page/EventSource.idl b/elemental/idl/third_party/WebCore/page/EventSource.idl
new file mode 100644
index 0000000..48df3eb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/EventSource.idl
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2009 Ericsson AB. All rights reserved.
+ * Copyright (C) 2010, 2011 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of Ericsson nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        ActiveDOMObject,
+        Constructor(in DOMString scriptUrl),
+        CallWith=ScriptExecutionContext,
+        ConstructorRaisesException,
+        EventTarget,
+        JSNoStaticTables
+    ] EventSource {
+
+        readonly attribute DOMString URL; // Lowercased .url is the one in the spec, but leaving .URL for compatibility reasons.
+        readonly attribute DOMString url;
+
+        // ready state
+        const unsigned short CONNECTING = 0;
+        const unsigned short OPEN = 1;
+        const unsigned short CLOSED = 2;
+        readonly attribute unsigned short readyState;
+
+        // networking
+        attribute EventListener onopen;
+        attribute EventListener onmessage;
+        attribute EventListener onerror;
+        void close();
+
+        // EventTarget interface
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/page/History.idl b/elemental/idl/third_party/WebCore/page/History.idl
new file mode 100644
index 0000000..6e8f6ab
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/History.idl
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module window {
+
+    interface [
+#if defined(V8_BINDING) && V8_BINDING
+        CheckSecurity,
+#endif
+        JSCustomGetOwnPropertySlotAndDescriptor,
+        CustomNamedSetter,
+        JSGenerateIsReachable=ImplFrame,
+        CustomDeleteProperty,
+        CustomEnumerateProperty,
+        OmitConstructor
+    ] History {
+        readonly attribute unsigned long length;
+        readonly attribute [CachedAttribute, Custom] SerializedScriptValue state;
+
+        [DoNotCheckSecurity, CallWith=ScriptExecutionContext] void back();
+        [DoNotCheckSecurity, CallWith=ScriptExecutionContext] void forward();
+        [DoNotCheckSecurity, CallWith=ScriptExecutionContext] void go(in [Optional=DefaultIsUndefined] long distance);
+        
+        [Custom, V8EnabledAtRuntime] void pushState(in any data, in DOMString title, in [Optional] DOMString url)
+            raises(DOMException);
+        [Custom, V8EnabledAtRuntime] void replaceState(in any data, in DOMString title, in [Optional] DOMString url)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/Location.idl b/elemental/idl/third_party/WebCore/page/Location.idl
new file mode 100644
index 0000000..1f1703a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/Location.idl
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+#if defined(V8_BINDING) && V8_BINDING
+        CheckSecurity,
+#endif
+        JSCustomGetOwnPropertySlotAndDescriptor,
+        CustomNamedSetter,
+        JSGenerateIsReachable=ImplFrame,
+        CustomDeleteProperty,
+        CustomEnumerateProperty,
+        JSCustomDefineOwnProperty,
+        JSCustomNamedGetterOnPrototype,
+        JSCustomDefineOwnPropertyOnPrototype,
+        OmitConstructor,
+        V8CustomToJSObject
+    ] Location {
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+                 attribute [DoNotCheckSecurityOnSetter, CustomSetter, V8Unforgeable] DOMString href;
+#endif
+
+        [Custom, V8Unforgeable] void assign(in [Optional=DefaultIsUndefined] DOMString url);
+        [Custom, V8Unforgeable] void replace(in [Optional=DefaultIsUndefined] DOMString url);
+        [Custom, V8Unforgeable] void reload();
+
+        // URI decomposition attributes
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+                 attribute [CustomSetter] DOMString protocol;
+                 attribute [CustomSetter] DOMString host;
+                 attribute [CustomSetter] DOMString hostname;
+                 attribute [CustomSetter] DOMString port;
+                 attribute [CustomSetter] DOMString pathname;
+                 attribute [CustomSetter] DOMString search;
+                 attribute [CustomSetter] DOMString hash;
+
+                 readonly attribute DOMString origin;
+#endif
+
+        readonly attribute DOMStringList ancestorOrigins;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [NotEnumerable, Custom, V8Unforgeable, V8ReadOnly, ImplementedAs=toStringFunction] DOMString toString();
+#endif
+#if defined(V8_BINDING) && V8_BINDING
+        [NotEnumerable, Custom, V8Unforgeable, V8ReadOnly] DOMObject valueOf();
+#endif
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/MemoryInfo.idl b/elemental/idl/third_party/WebCore/page/MemoryInfo.idl
new file mode 100644
index 0000000..b9149d5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/MemoryInfo.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    interface [
+        OmitConstructor
+    ] MemoryInfo {
+
+        readonly attribute unsigned long totalJSHeapSize;
+        readonly attribute unsigned long usedJSHeapSize;
+        readonly attribute [JSCustomGetter] unsigned long jsHeapSizeLimit;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/Navigator.idl b/elemental/idl/third_party/WebCore/page/Navigator.idl
new file mode 100644
index 0000000..400d8e0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/Navigator.idl
@@ -0,0 +1,50 @@
+/*
+    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+module window {
+
+    interface [
+        JSGenerateIsReachable=ImplFrame,
+        OmitConstructor
+    ] Navigator {
+        readonly attribute DOMString appCodeName;
+        readonly attribute DOMString appName;
+        readonly attribute DOMString appVersion;
+        readonly attribute DOMString language;
+        readonly attribute DOMString userAgent;
+        readonly attribute DOMString platform;
+        readonly attribute DOMPluginArray plugins;
+        readonly attribute DOMMimeTypeArray mimeTypes;
+        readonly attribute DOMString product;
+        readonly attribute DOMString productSub;
+        readonly attribute DOMString vendor;
+        readonly attribute DOMString vendorSub;
+        readonly attribute boolean cookieEnabled;
+        boolean javaEnabled();
+
+        readonly attribute boolean onLine;
+
+#if defined(ENABLE_POINTER_LOCK) && ENABLE_POINTER_LOCK
+        readonly attribute [V8EnabledAtRuntime] PointerLock webkitPointer;
+#endif
+
+        void getStorageUpdates(); // FIXME: Remove this method or rename to yieldForStorageUpdates.
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/NavigatorRegisterProtocolHandler.idl b/elemental/idl/third_party/WebCore/page/NavigatorRegisterProtocolHandler.idl
new file mode 100644
index 0000000..174d063
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/NavigatorRegisterProtocolHandler.idl
@@ -0,0 +1,30 @@
+/*
+    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+module window {
+
+    interface [
+        Conditional=REGISTER_PROTOCOL_HANDLER,
+        Supplemental=Navigator
+    ] NavigatorRegisterProtocolHandler {
+        void registerProtocolHandler(in DOMString scheme, in DOMString url, in DOMString title)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/PagePopupController.idl b/elemental/idl/third_party/WebCore/page/PagePopupController.idl
new file mode 100644
index 0000000..6e0a49d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/PagePopupController.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+    interface [
+        Conditional=PAGE_POPUP
+    ] PagePopupController {
+        void setValueAndClosePopup(in long numberValue, in DOMString stringValue);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/page/Performance.idl b/elemental/idl/third_party/WebCore/page/Performance.idl
new file mode 100644
index 0000000..663b742
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/Performance.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    // See: http://dev.w3.org/2006/webapi/WebTiming/
+    interface [
+        Conditional=WEB_TIMING,
+        OmitConstructor
+    ] Performance {
+        readonly attribute PerformanceNavigation navigation;
+        readonly attribute PerformanceTiming timing;
+        readonly attribute [V8CustomGetter] MemoryInfo memory;
+
+#if defined(ENABLE_PERFORMANCE_TIMELINE) && ENABLE_PERFORMANCE_TIMELINE
+        PerformanceEntryList webkitGetEntries();
+        PerformanceEntryList webkitGetEntriesByType(in DOMString entryType);
+        PerformanceEntryList webkitGetEntriesByName(in DOMString name, in [Optional=DefaultIsNullString] DOMString entryType);
+#endif
+        // See http://www.w3.org/TR/hr-time/ for details.
+        double webkitNow();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/PerformanceEntry.idl b/elemental/idl/third_party/WebCore/page/PerformanceEntry.idl
new file mode 100644
index 0000000..a788bd9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/PerformanceEntry.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    // See: https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PerformanceTimeline/Overview.html
+    interface [
+        Conditional=WEB_TIMING,
+        Conditional=PERFORMANCE_TIMELINE,
+        OmitConstructor
+    ] PerformanceEntry {
+        readonly attribute DOMString name;
+        readonly attribute DOMString entryType;
+        readonly attribute double startTime;
+        readonly attribute double duration;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/page/PerformanceEntryList.idl b/elemental/idl/third_party/WebCore/page/PerformanceEntryList.idl
new file mode 100644
index 0000000..8be43d5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/PerformanceEntryList.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    // See: https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PerformanceTimeline/Overview.html
+    interface [
+        Conditional=WEB_TIMING,
+        Conditional=PERFORMANCE_TIMELINE,
+        OmitConstructor,
+        IndexedGetter
+    ] PerformanceEntryList {
+        readonly attribute unsigned long length;
+        PerformanceEntry item(in unsigned long index);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/PerformanceNavigation.idl b/elemental/idl/third_party/WebCore/page/PerformanceNavigation.idl
new file mode 100644
index 0000000..4c6b612
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/PerformanceNavigation.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    // See: http://www.w3.org/TR/navigation-timing/
+    interface [
+        Conditional=WEB_TIMING,
+        OmitConstructor
+    ] PerformanceNavigation {
+        const unsigned short TYPE_NAVIGATE = 0;
+        const unsigned short TYPE_RELOAD = 1;
+        const unsigned short TYPE_BACK_FORWARD = 2;
+        const unsigned short TYPE_RESERVED = 255;
+        readonly attribute unsigned short type;
+
+        readonly attribute unsigned short redirectCount;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/PerformanceTiming.idl b/elemental/idl/third_party/WebCore/page/PerformanceTiming.idl
new file mode 100644
index 0000000..3e14f7c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/PerformanceTiming.idl
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+
+    // See: http://dev.w3.org/2006/webapi/WebTiming/
+    interface [
+        Conditional=WEB_TIMING,
+        OmitConstructor
+    ] PerformanceTiming {
+        readonly attribute unsigned long long navigationStart;
+        readonly attribute unsigned long long unloadEventStart;
+        readonly attribute unsigned long long unloadEventEnd;
+        readonly attribute unsigned long long redirectStart;
+        readonly attribute unsigned long long redirectEnd;
+        readonly attribute unsigned long long fetchStart;
+        readonly attribute unsigned long long domainLookupStart;
+        readonly attribute unsigned long long domainLookupEnd;
+        readonly attribute unsigned long long connectStart;
+        readonly attribute unsigned long long connectEnd;
+        readonly attribute unsigned long long secureConnectionStart;
+        readonly attribute unsigned long long requestStart;
+        readonly attribute unsigned long long responseStart;
+        readonly attribute unsigned long long responseEnd;
+        readonly attribute unsigned long long domLoading;
+        readonly attribute unsigned long long domInteractive;
+        readonly attribute unsigned long long domContentLoadedEventStart;
+        readonly attribute unsigned long long domContentLoadedEventEnd;
+        readonly attribute unsigned long long domComplete;
+        readonly attribute unsigned long long loadEventStart;
+        readonly attribute unsigned long long loadEventEnd;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/PointerLock.idl b/elemental/idl/third_party/WebCore/page/PointerLock.idl
new file mode 100644
index 0000000..3054bcf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/PointerLock.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=POINTER_LOCK,
+        OmitConstructor
+    ] PointerLock {
+        void lock(in Element target, in [Callback, Optional] VoidCallback successCallback, in [Callback, Optional] VoidCallback failureCallback);
+        void unlock();
+        readonly attribute boolean isLocked;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/Screen.idl b/elemental/idl/third_party/WebCore/page/Screen.idl
new file mode 100644
index 0000000..5880609
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/Screen.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+module window {
+
+    interface [
+        JSGenerateIsReachable=ImplFrame,
+        OmitConstructor
+    ] Screen {
+        readonly attribute unsigned long height;
+        readonly attribute unsigned long width;
+        readonly attribute unsigned long colorDepth;
+        readonly attribute unsigned long pixelDepth;
+        readonly attribute long availLeft;
+        readonly attribute long availTop;
+        readonly attribute unsigned long availHeight;
+        readonly attribute unsigned long availWidth;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/SpeechInputEvent.idl b/elemental/idl/third_party/WebCore/page/SpeechInputEvent.idl
new file mode 100644
index 0000000..03846af
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/SpeechInputEvent.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=INPUT_SPEECH,
+    ] SpeechInputEvent : Event {
+        readonly attribute SpeechInputResultList results;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/SpeechInputResult.idl b/elemental/idl/third_party/WebCore/page/SpeechInputResult.idl
new file mode 100644
index 0000000..3542c60
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/SpeechInputResult.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        Conditional=INPUT_SPEECH,
+    ] SpeechInputResult {
+        readonly attribute DOMString utterance;
+        readonly attribute float confidence;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/SpeechInputResultList.idl b/elemental/idl/third_party/WebCore/page/SpeechInputResultList.idl
new file mode 100644
index 0000000..b9213d0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/SpeechInputResultList.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module core {
+
+    interface [
+        IndexedGetter,
+        Conditional=INPUT_SPEECH
+    ] SpeechInputResultList {
+        readonly attribute unsigned long length;
+        SpeechInputResult item(in [IsIndex] unsigned long index);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/WebKitAnimation.idl b/elemental/idl/third_party/WebCore/page/WebKitAnimation.idl
new file mode 100644
index 0000000..4fba2e8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/WebKitAnimation.idl
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module html {
+
+    interface WebKitAnimation {
+
+        readonly attribute DOMString name;
+
+        readonly attribute double duration;
+        attribute double elapsedTime;
+
+        readonly attribute double delay;
+        readonly attribute [Custom] int iterationCount;
+
+        readonly attribute boolean paused;
+        readonly attribute boolean ended;
+
+        const unsigned short DIRECTION_NORMAL = 0;
+        const unsigned short DIRECTION_ALTERNATE = 1;
+        readonly attribute unsigned short direction;
+
+        const unsigned short FILL_NONE = 0;
+        const unsigned short FILL_BACKWARDS = 1;
+        const unsigned short FILL_FORWARDS = 2;
+        const unsigned short FILL_BOTH = 3;
+        readonly attribute unsigned short fillMode;
+
+        void play();
+        void pause();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/WebKitAnimationList.idl b/elemental/idl/third_party/WebCore/page/WebKitAnimationList.idl
new file mode 100644
index 0000000..ed305f7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/WebKitAnimationList.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module html {
+
+    interface [
+        IndexedGetter
+    ] WebKitAnimationList {
+        readonly attribute unsigned long length;
+        WebKitAnimation item(in unsigned long index);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/WebKitPoint.idl b/elemental/idl/third_party/WebCore/page/WebKitPoint.idl
new file mode 100644
index 0000000..e44fd21
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/WebKitPoint.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module window {
+
+    interface [
+        CustomConstructor,
+        ConstructorParameters=2
+    ] WebKitPoint {
+        attribute float x;
+        attribute float y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/page/WorkerNavigator.idl b/elemental/idl/third_party/WebCore/page/WorkerNavigator.idl
new file mode 100644
index 0000000..819de09
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/page/WorkerNavigator.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module threads {
+
+    interface [
+        Conditional=WORKERS,
+        JSGenerateIsReachable=Impl,
+        JSNoStaticTables,
+        OmitConstructor
+    ] WorkerNavigator {
+        readonly attribute DOMString appName;
+        readonly attribute DOMString appVersion;
+        readonly attribute DOMString platform;
+        readonly attribute DOMString userAgent;
+
+        readonly attribute boolean onLine;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/plugins/DOMMimeType.idl b/elemental/idl/third_party/WebCore/plugins/DOMMimeType.idl
new file mode 100644
index 0000000..942060f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/plugins/DOMMimeType.idl
@@ -0,0 +1,32 @@
+/*
+    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+    Copyright (C) 2008 Apple Inc. All rights reserved.
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+module window {
+
+    interface [
+        InterfaceName=MimeType
+    ] DOMMimeType {
+        readonly attribute DOMString type;
+        readonly attribute DOMString suffixes;
+        readonly attribute DOMString description;
+        readonly attribute DOMPlugin enabledPlugin;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/plugins/DOMMimeTypeArray.idl b/elemental/idl/third_party/WebCore/plugins/DOMMimeTypeArray.idl
new file mode 100644
index 0000000..3de7f8d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/plugins/DOMMimeTypeArray.idl
@@ -0,0 +1,34 @@
+/*
+    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+    Copyright (C) 2008 Apple Inc. All rights reserved.
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+module window {
+
+    interface [
+        JSGenerateIsReachable=ImplFrame,
+        NamedGetter,
+        IndexedGetter,
+        InterfaceName=MimeTypeArray
+    ] DOMMimeTypeArray {
+        readonly attribute unsigned long length;
+        DOMMimeType item(in [Optional=DefaultIsUndefined] unsigned long index);
+        DOMMimeType namedItem(in [Optional=DefaultIsUndefined] DOMString name);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/plugins/DOMPlugin.idl b/elemental/idl/third_party/WebCore/plugins/DOMPlugin.idl
new file mode 100644
index 0000000..f645a0b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/plugins/DOMPlugin.idl
@@ -0,0 +1,36 @@
+/*
+    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+    Copyright (C) 2008 Apple Inc. All rights reserved.
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+module window {
+
+    interface [
+        NamedGetter,
+        IndexedGetter,
+        InterfaceName=Plugin
+    ] DOMPlugin {
+        readonly attribute DOMString name;
+        readonly attribute DOMString filename;
+        readonly attribute DOMString description;
+        readonly attribute unsigned long length;
+        DOMMimeType item(in [Optional=DefaultIsUndefined] unsigned long index);
+        DOMMimeType namedItem(in [Optional=DefaultIsUndefined] DOMString name);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/plugins/DOMPluginArray.idl b/elemental/idl/third_party/WebCore/plugins/DOMPluginArray.idl
new file mode 100644
index 0000000..f042f92
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/plugins/DOMPluginArray.idl
@@ -0,0 +1,35 @@
+/*
+    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+    Copyright (C) 2008 Apple Inc. All rights reserved.
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+module window {
+
+    interface [
+        JSGenerateIsReachable=ImplFrame,
+        NamedGetter,
+        IndexedGetter,
+        InterfaceName=PluginArray
+    ] DOMPluginArray {
+        readonly attribute unsigned long length;
+        DOMPlugin item(in [Optional=DefaultIsUndefined] unsigned long index);
+        DOMPlugin namedItem(in [Optional=DefaultIsUndefined] DOMString name);
+        void refresh(in [Optional=DefaultIsUndefined] boolean reload);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/storage/Storage.idl b/elemental/idl/third_party/WebCore/storage/Storage.idl
new file mode 100644
index 0000000..1d5b327
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/storage/Storage.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module storage {
+
+    interface [
+        NamedGetter,
+        JSGenerateIsReachable=ImplFrame,
+        CustomDeleteProperty,
+        CustomEnumerateProperty,
+        CustomNamedSetter,
+    ] Storage {
+        readonly attribute [NotEnumerable] unsigned long length;
+        [NotEnumerable, TreatReturnedNullStringAs=Null] DOMString key(in unsigned long index);
+        [NotEnumerable, TreatReturnedNullStringAs=Null] DOMString getItem(in DOMString key);
+        [NotEnumerable] void setItem(in DOMString key, in DOMString data) 
+            raises(DOMException);
+        [NotEnumerable] void removeItem(in DOMString key);
+        [NotEnumerable] void clear();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/storage/StorageEvent.idl b/elemental/idl/third_party/WebCore/storage/StorageEvent.idl
new file mode 100644
index 0000000..6e4770a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/storage/StorageEvent.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module storage {
+
+    interface [
+        ConstructorTemplate=Event
+    ] StorageEvent : Event {
+        readonly attribute [InitializedByEventConstructor] DOMString key;
+        readonly attribute [InitializedByEventConstructor, TreatReturnedNullStringAs=Null] DOMString oldValue;
+        readonly attribute [InitializedByEventConstructor, TreatReturnedNullStringAs=Null] DOMString newValue;
+        readonly attribute [InitializedByEventConstructor] DOMString url;
+        readonly attribute [InitializedByEventConstructor] Storage storageArea;
+
+        void initStorageEvent(in [Optional=DefaultIsUndefined] DOMString typeArg, 
+                              in [Optional=DefaultIsUndefined] boolean canBubbleArg, 
+                              in [Optional=DefaultIsUndefined] boolean cancelableArg, 
+                              in [Optional=DefaultIsUndefined] DOMString keyArg, 
+                              in [Optional=DefaultIsUndefined,TreatNullAs=NullString] DOMString oldValueArg, 
+                              in [Optional=DefaultIsUndefined,TreatNullAs=NullString] DOMString newValueArg, 
+                              in [Optional=DefaultIsUndefined] DOMString urlArg, 
+                              in [Optional=DefaultIsUndefined] Storage storageAreaArg);
+
+        // Needed once we support init<blank>EventNS
+        // void initStorageEventNS(in DOMString namespaceURI, in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in DOMString oldValueArg, in DOMString newValueArg, in DOMString urlArg, in Storage storageAreaArg);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/storage/StorageInfo.idl b/elemental/idl/third_party/WebCore/storage/StorageInfo.idl
new file mode 100644
index 0000000..eb8b9a1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/storage/StorageInfo.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module storage {
+    interface [
+        Conditional=QUOTA,
+        OmitConstructor,
+        JSGenerateToNativeObject
+    ] StorageInfo {
+        const unsigned short TEMPORARY = 0;
+        const unsigned short PERSISTENT = 1;
+
+        [CallWith=ScriptExecutionContext] void queryUsageAndQuota(in unsigned short storageType, in [Callback, Optional] StorageInfoUsageCallback usageCallback, in [Callback, Optional] StorageInfoErrorCallback errorCallback);
+        [CallWith=ScriptExecutionContext] void requestQuota(in unsigned short storageType, in unsigned long long newQuotaInBytes, in [Callback, Optional] StorageInfoQuotaCallback quotaCallback, in [Callback, Optional] StorageInfoErrorCallback errorCallback);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/storage/StorageInfoErrorCallback.idl b/elemental/idl/third_party/WebCore/storage/StorageInfoErrorCallback.idl
new file mode 100644
index 0000000..66c3316
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/storage/StorageInfoErrorCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=QUOTA,
+        Callback
+    ] StorageInfoErrorCallback {
+        boolean handleEvent(in DOMCoreException error);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/storage/StorageInfoQuotaCallback.idl b/elemental/idl/third_party/WebCore/storage/StorageInfoQuotaCallback.idl
new file mode 100644
index 0000000..1c8e11c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/storage/StorageInfoQuotaCallback.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=QUOTA,
+        Callback
+    ] StorageInfoQuotaCallback {
+        boolean handleEvent(in unsigned long long grantedQuotaInBytes);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/storage/StorageInfoUsageCallback.idl b/elemental/idl/third_party/WebCore/storage/StorageInfoUsageCallback.idl
new file mode 100644
index 0000000..dfa58e6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/storage/StorageInfoUsageCallback.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+    interface [
+        Conditional=QUOTA,
+        Callback
+    ] StorageInfoUsageCallback {
+        boolean handleEvent(in unsigned long long currentUsageInBytes, in unsigned long long currentQuotaInBytes);
+    };
+}
+
diff --git a/elemental/idl/third_party/WebCore/svg/ElementTimeControl.idl b/elemental/idl/third_party/WebCore/svg/ElementTimeControl.idl
new file mode 100644
index 0000000..9c748c9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/ElementTimeControl.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+ 
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        OmitConstructor
+    ] ElementTimeControl { 
+        void beginElement();
+        void beginElementAt(in [Optional=DefaultIsUndefined] float offset);
+        void endElement();
+        void endElementAt(in [Optional=DefaultIsUndefined] float offset);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAElement.idl b/elemental/idl/third_party/WebCore/svg/SVGAElement.idl
new file mode 100644
index 0000000..686503b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAElement.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAElement : SVGElement,
+                                              SVGURIReference,
+                                              SVGTests,
+                                              SVGLangSpace,
+                                              SVGExternalResourcesRequired,
+                                              SVGStylable,
+                                              SVGTransformable {
+        readonly attribute SVGAnimatedString target;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAltGlyphDefElement.idl b/elemental/idl/third_party/WebCore/svg/SVGAltGlyphDefElement.idl
new file mode 100644
index 0000000..b4b44d2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAltGlyphDefElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2011 Leo Yang <leoyang@webkit.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [Conditional=SVG&SVG_FONTS] SVGAltGlyphDefElement : SVGElement {
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAltGlyphElement.idl b/elemental/idl/third_party/WebCore/svg/SVGAltGlyphElement.idl
new file mode 100644
index 0000000..865dbdd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAltGlyphElement.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS,
+    ] SVGAltGlyphElement : SVGTextPositioningElement, SVGURIReference {
+        attribute DOMString glyphRef
+            setter raises(DOMException);
+        attribute DOMString format
+            setter raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAltGlyphItemElement.idl b/elemental/idl/third_party/WebCore/svg/SVGAltGlyphItemElement.idl
new file mode 100644
index 0000000..a98443c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAltGlyphItemElement.idl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2011 Leo Yang <leoyang@webkit.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [Conditional=SVG&SVG_FONTS] SVGAltGlyphItemElement : SVGElement {
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAngle.idl b/elemental/idl/third_party/WebCore/svg/SVGAngle.idl
new file mode 100644
index 0000000..24ab62f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAngle.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAngle { 
+        // Angle Unit Types
+        const unsigned short SVG_ANGLETYPE_UNKNOWN = 0;
+        const unsigned short SVG_ANGLETYPE_UNSPECIFIED = 1;
+        const unsigned short SVG_ANGLETYPE_DEG = 2;
+        const unsigned short SVG_ANGLETYPE_RAD = 3;
+        const unsigned short SVG_ANGLETYPE_GRAD = 4;
+
+        readonly attribute unsigned short unitType;
+        attribute [StrictTypeChecking] float value;
+        attribute [StrictTypeChecking] float valueInSpecifiedUnits;
+
+        attribute [TreatNullAs=NullString] DOMString valueAsString
+            setter raises(DOMException);
+
+        [StrictTypeChecking] void newValueSpecifiedUnits(in unsigned short unitType, in float valueInSpecifiedUnits)
+            raises(DOMException);
+
+        [StrictTypeChecking] void convertToSpecifiedUnits(in unsigned short unitType)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimateColorElement.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimateColorElement.idl
new file mode 100644
index 0000000..2240fc1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimateColorElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimateColorElement : SVGAnimationElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimateElement.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimateElement.idl
new file mode 100644
index 0000000..013615a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimateElement.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimateElement : SVGAnimationElement {
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimateMotionElement.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimateMotionElement.idl
new file mode 100644
index 0000000..bd09b3c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimateMotionElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimateMotionElement : SVGAnimationElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimateTransformElement.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimateTransformElement.idl
new file mode 100644
index 0000000..76053ac
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimateTransformElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimateTransformElement : SVGAnimationElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedAngle.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedAngle.idl
new file mode 100644
index 0000000..bdeff62
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedAngle.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedAngle {
+        readonly attribute SVGAngle baseVal;
+        readonly attribute SVGAngle animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedBoolean.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedBoolean.idl
new file mode 100644
index 0000000..a7252d6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedBoolean.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedBoolean {
+        attribute [StrictTypeChecking] boolean baseVal
+            setter raises(DOMException);
+        readonly attribute boolean animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedEnumeration.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedEnumeration.idl
new file mode 100644
index 0000000..0d43abd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedEnumeration.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedEnumeration {
+        attribute [StrictTypeChecking] unsigned short baseVal
+            setter raises(DOMException);
+        readonly attribute unsigned short animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedInteger.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedInteger.idl
new file mode 100644
index 0000000..a8c07ea
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedInteger.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedInteger {
+        attribute [StrictTypeChecking] long baseVal
+            setter raises(DOMException);
+        readonly attribute long animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedLength.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedLength.idl
new file mode 100644
index 0000000..1bb7317
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedLength.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedLength {
+        readonly attribute SVGLength baseVal;
+        readonly attribute SVGLength animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedLengthList.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedLengthList.idl
new file mode 100644
index 0000000..d02c998
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedLengthList.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedLengthList {
+        readonly attribute SVGLengthList baseVal;
+        readonly attribute SVGLengthList animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedNumber.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedNumber.idl
new file mode 100644
index 0000000..ed0c395
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedNumber.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedNumber {
+        attribute [StrictTypeChecking] float baseVal
+            setter raises(DOMException);
+        readonly attribute float animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedNumberList.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedNumberList.idl
new file mode 100644
index 0000000..b644938
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedNumberList.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedNumberList {
+        readonly attribute SVGNumberList baseVal;
+        readonly attribute SVGNumberList animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedPreserveAspectRatio.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedPreserveAspectRatio.idl
new file mode 100644
index 0000000..e5b1e8b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedPreserveAspectRatio.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedPreserveAspectRatio {
+        readonly attribute SVGPreserveAspectRatio baseVal;
+        readonly attribute SVGPreserveAspectRatio animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedRect.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedRect.idl
new file mode 100644
index 0000000..d589738
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedRect.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedRect {
+        readonly attribute SVGRect baseVal;
+        readonly attribute SVGRect animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedString.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedString.idl
new file mode 100644
index 0000000..7804dfa
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedString.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedString {
+        attribute DOMString baseVal
+            setter raises(DOMException);
+        readonly attribute DOMString animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimatedTransformList.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimatedTransformList.idl
new file mode 100644
index 0000000..b6aa84e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimatedTransformList.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGAnimatedTransformList {
+        readonly attribute SVGTransformList baseVal;
+        readonly attribute SVGTransformList animVal;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGAnimationElement.idl b/elemental/idl/third_party/WebCore/svg/SVGAnimationElement.idl
new file mode 100644
index 0000000..532603c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGAnimationElement.idl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        OmitConstructor
+    ] SVGAnimationElement : SVGElement,
+                                                      SVGTests,
+                                                      SVGExternalResourcesRequired,
+                                                      ElementTimeControl {
+        readonly attribute SVGElement targetElement;
+
+        float getStartTime();
+        float getCurrentTime();
+        float getSimpleDuration()
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGCircleElement.idl b/elemental/idl/third_party/WebCore/svg/SVGCircleElement.idl
new file mode 100644
index 0000000..50b84bd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGCircleElement.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGCircleElement : SVGElement,
+                                                   SVGTests,
+                                                   SVGLangSpace,
+                                                   SVGExternalResourcesRequired,
+                                                   SVGStylable,
+                                                   SVGTransformable {
+        readonly attribute SVGAnimatedLength cx;
+        readonly attribute SVGAnimatedLength cy;
+        readonly attribute SVGAnimatedLength r;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGClipPathElement.idl b/elemental/idl/third_party/WebCore/svg/SVGClipPathElement.idl
new file mode 100644
index 0000000..5d346f4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGClipPathElement.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGClipPathElement : SVGElement,
+                                                     SVGTests,
+                                                     SVGLangSpace,
+                                                     SVGExternalResourcesRequired,
+                                                     SVGStylable,
+                                                     SVGTransformable
+                                                  /* SVGUnitTypes */ { 
+        readonly attribute SVGAnimatedEnumeration clipPathUnits;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGColor.idl b/elemental/idl/third_party/WebCore/svg/SVGColor.idl
new file mode 100644
index 0000000..887ad84
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGColor.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGColor : CSSValue {
+        const unsigned short SVG_COLORTYPE_UNKNOWN = 0;
+        const unsigned short SVG_COLORTYPE_RGBCOLOR = 1;
+        const unsigned short SVG_COLORTYPE_RGBCOLOR_ICCCOLOR = 2;
+        const unsigned short SVG_COLORTYPE_CURRENTCOLOR = 3;
+
+        readonly attribute unsigned short colorType;
+        readonly attribute RGBColor rgbColor;
+        // FIXME: readonly attribute SVGICCColor iccColor;
+
+        [StrictTypeChecking] void setRGBColor(in DOMString rgbColor)
+            raises(DOMException, SVGException);
+
+        [StrictTypeChecking] void setRGBColorICCColor(in DOMString rgbColor, in DOMString iccColor)
+            raises(DOMException, SVGException);
+
+        [StrictTypeChecking] void setColor(in unsigned short colorType, in DOMString rgbColor, in DOMString iccColor)
+            raises(DOMException, SVGException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGComponentTransferFunctionElement.idl b/elemental/idl/third_party/WebCore/svg/SVGComponentTransferFunctionElement.idl
new file mode 100644
index 0000000..1edd5cf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGComponentTransferFunctionElement.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS,
+        DoNotCheckConstants
+    ] SVGComponentTransferFunctionElement : SVGElement {
+        // Component Transfer Types
+        const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN  = 0;
+        const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
+        const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_TABLE    = 2;
+        const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
+        const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_LINEAR   = 4;
+        const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_GAMMA    = 5;
+
+        readonly attribute SVGAnimatedEnumeration type;
+        readonly attribute SVGAnimatedNumberList  tableValues;
+        readonly attribute SVGAnimatedNumber      slope;
+        readonly attribute SVGAnimatedNumber      intercept;
+        readonly attribute SVGAnimatedNumber      amplitude;
+        readonly attribute SVGAnimatedNumber      exponent;
+        readonly attribute SVGAnimatedNumber      offset;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGCursorElement.idl b/elemental/idl/third_party/WebCore/svg/SVGCursorElement.idl
new file mode 100644
index 0000000..2c8b5f5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGCursorElement.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGCursorElement : SVGElement,
+                                                   SVGURIReference,
+                                                   SVGTests,
+                                                   SVGExternalResourcesRequired {
+        readonly attribute SVGAnimatedLength x;
+        readonly attribute SVGAnimatedLength y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGDefsElement.idl b/elemental/idl/third_party/WebCore/svg/SVGDefsElement.idl
new file mode 100644
index 0000000..8cb2b08
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGDefsElement.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGDefsElement : SVGElement,
+                                                 SVGTests,
+                                                 SVGLangSpace,
+                                                 SVGExternalResourcesRequired,
+                                                 SVGStylable,
+                                                 SVGTransformable {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGDescElement.idl b/elemental/idl/third_party/WebCore/svg/SVGDescElement.idl
new file mode 100644
index 0000000..b7b33c2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGDescElement.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGDescElement : SVGElement,
+                                                 SVGLangSpace,
+                                                 SVGStylable {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGDocument.idl b/elemental/idl/third_party/WebCore/svg/SVGDocument.idl
new file mode 100644
index 0000000..2f9abfc
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGDocument.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        V8CustomToJSObject
+    ] SVGDocument : Document {
+        readonly attribute SVGSVGElement        rootElement;
+
+        // Overwrite the one in events::DocumentEvent
+        Event createEvent(in [Optional=DefaultIsUndefined] DOMString eventType)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGElement.idl b/elemental/idl/third_party/WebCore/svg/SVGElement.idl
new file mode 100644
index 0000000..41ae9c2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGElement.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        JSGenerateToNativeObject,
+        Conditional=SVG,
+        V8CustomToJSObject
+    ] SVGElement : Element {
+        attribute [Reflect] DOMString id;
+        attribute [TreatNullAs=NullString] DOMString xmlbase setter raises(DOMException);
+        readonly attribute SVGSVGElement ownerSVGElement;
+        readonly attribute SVGElement viewportElement;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGElementInstance.idl b/elemental/idl/third_party/WebCore/svg/SVGElementInstance.idl
new file mode 100644
index 0000000..9c7175c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGElementInstance.idl
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        JSCustomMarkFunction,
+        JSGenerateToNativeObject
+    ] SVGElementInstance
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
+        : Object, EventTarget
+#endif /* defined(LANGUAGE_OBJECTIVE_C) */
+    {
+        readonly attribute SVGElement correspondingElement;
+        readonly attribute SVGUseElement correspondingUseElement;
+        readonly attribute SVGElementInstance parentNode;
+        readonly attribute SVGElementInstanceList childNodes;
+        readonly attribute SVGElementInstance firstChild;
+        readonly attribute SVGElementInstance lastChild;
+        readonly attribute SVGElementInstance previousSibling;
+        readonly attribute SVGElementInstance nextSibling;
+
+        // EventTarget
+#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
+        attribute [NotEnumerable] EventListener onabort;
+        attribute [NotEnumerable] EventListener onblur;
+        attribute [NotEnumerable] EventListener onchange;
+        attribute [NotEnumerable] EventListener onclick;
+        attribute [NotEnumerable] EventListener oncontextmenu;
+        attribute [NotEnumerable] EventListener ondblclick;
+        attribute [NotEnumerable] EventListener onerror;
+        attribute [NotEnumerable] EventListener onfocus;
+        attribute [NotEnumerable] EventListener oninput;
+        attribute [NotEnumerable] EventListener onkeydown;
+        attribute [NotEnumerable] EventListener onkeypress;
+        attribute [NotEnumerable] EventListener onkeyup;
+        attribute [NotEnumerable] EventListener onload;
+        attribute [NotEnumerable] EventListener onmousedown;
+        attribute [NotEnumerable] EventListener onmousemove;
+        attribute [NotEnumerable] EventListener onmouseout;
+        attribute [NotEnumerable] EventListener onmouseover;
+        attribute [NotEnumerable] EventListener onmouseup;
+        attribute [NotEnumerable] EventListener onmousewheel;
+        attribute [NotEnumerable] EventListener onbeforecut;
+        attribute [NotEnumerable] EventListener oncut;
+        attribute [NotEnumerable] EventListener onbeforecopy;
+        attribute [NotEnumerable] EventListener oncopy;
+        attribute [NotEnumerable] EventListener onbeforepaste;
+        attribute [NotEnumerable] EventListener onpaste;
+        attribute [NotEnumerable] EventListener ondragenter;
+        attribute [NotEnumerable] EventListener ondragover;
+        attribute [NotEnumerable] EventListener ondragleave;
+        attribute [NotEnumerable] EventListener ondrop;
+        attribute [NotEnumerable] EventListener ondragstart;
+        attribute [NotEnumerable] EventListener ondrag;
+        attribute [NotEnumerable] EventListener ondragend;
+        attribute [NotEnumerable] EventListener onreset;
+        attribute [NotEnumerable] EventListener onresize;
+        attribute [NotEnumerable] EventListener onscroll;
+        attribute [NotEnumerable] EventListener onsearch;
+        attribute [NotEnumerable] EventListener onselect;
+        attribute [NotEnumerable] EventListener onselectstart;
+        attribute [NotEnumerable] EventListener onsubmit;
+        attribute [NotEnumerable] EventListener onunload;
+
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event event)
+            raises(EventException);
+#endif /* defined(LANGUAGE_OBJECTIVE_C) */
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGElementInstanceList.idl b/elemental/idl/third_party/WebCore/svg/SVGElementInstanceList.idl
new file mode 100644
index 0000000..9429da7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGElementInstanceList.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+    interface [
+        Conditional=SVG
+    ] SVGElementInstanceList {
+        readonly attribute unsigned long length;
+
+        SVGElementInstance item(in [Optional=DefaultIsUndefined] unsigned long index);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGEllipseElement.idl b/elemental/idl/third_party/WebCore/svg/SVGEllipseElement.idl
new file mode 100644
index 0000000..7c291dd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGEllipseElement.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGEllipseElement : SVGElement,
+                                                    SVGTests,
+                                                    SVGLangSpace,
+                                                    SVGExternalResourcesRequired,
+                                                    SVGStylable,
+                                                    SVGTransformable {
+        readonly attribute SVGAnimatedLength cx;
+        readonly attribute SVGAnimatedLength cy;
+        readonly attribute SVGAnimatedLength rx;
+        readonly attribute SVGAnimatedLength ry;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGException.idl b/elemental/idl/third_party/WebCore/svg/SVGException.idl
new file mode 100644
index 0000000..57255c3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGException.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2007 Rob Buis <buis@kde.org>
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    exception [
+        Conditional=SVG,
+        DoNotCheckConstants
+    ] SVGException {
+
+        readonly attribute unsigned short   code;
+        readonly attribute DOMString        name;
+        readonly attribute DOMString        message;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // Override in a Mozilla compatible format
+        [NotEnumerable] DOMString toString();
+#endif
+
+        // SVGExceptionCode
+        const unsigned short SVG_WRONG_TYPE_ERR = 0;
+        const unsigned short SVG_INVALID_VALUE_ERR = 1;
+        const unsigned short SVG_MATRIX_NOT_INVERTABLE = 2;
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGExternalResourcesRequired.idl b/elemental/idl/third_party/WebCore/svg/SVGExternalResourcesRequired.idl
new file mode 100644
index 0000000..a650c8f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGExternalResourcesRequired.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        SuppressToJSObject,
+        OmitConstructor
+    ] SVGExternalResourcesRequired { 
+        readonly attribute SVGAnimatedBoolean externalResourcesRequired;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEBlendElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEBlendElement.idl
new file mode 100644
index 0000000..288059c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEBlendElement.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS,
+        DoNotCheckConstants
+    ] SVGFEBlendElement : SVGElement,
+                          SVGFilterPrimitiveStandardAttributes {
+        // Blend Mode Types
+        const unsigned short SVG_FEBLEND_MODE_UNKNOWN  = 0;
+        const unsigned short SVG_FEBLEND_MODE_NORMAL   = 1;
+        const unsigned short SVG_FEBLEND_MODE_MULTIPLY = 2;
+        const unsigned short SVG_FEBLEND_MODE_SCREEN   = 3;
+        const unsigned short SVG_FEBLEND_MODE_DARKEN   = 4;
+        const unsigned short SVG_FEBLEND_MODE_LIGHTEN  = 5;
+
+        readonly attribute SVGAnimatedString      in1;
+        readonly attribute SVGAnimatedString      in2;
+        readonly attribute SVGAnimatedEnumeration mode;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEColorMatrixElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEColorMatrixElement.idl
new file mode 100644
index 0000000..6b18061
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEColorMatrixElement.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS,
+        DoNotCheckConstants
+    ] SVGFEColorMatrixElement : SVGElement,
+                                SVGFilterPrimitiveStandardAttributes {
+        // Color Matrix Types
+        const unsigned short SVG_FECOLORMATRIX_TYPE_UNKNOWN          = 0;
+        const unsigned short SVG_FECOLORMATRIX_TYPE_MATRIX           = 1;
+        const unsigned short SVG_FECOLORMATRIX_TYPE_SATURATE         = 2;
+        const unsigned short SVG_FECOLORMATRIX_TYPE_HUEROTATE        = 3;
+        const unsigned short SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
+
+        readonly attribute SVGAnimatedString      in1;
+        readonly attribute SVGAnimatedEnumeration type;
+        readonly attribute SVGAnimatedNumberList  values;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEComponentTransferElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEComponentTransferElement.idl
new file mode 100644
index 0000000..bf69915
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEComponentTransferElement.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEComponentTransferElement : SVGElement,
+                                                                SVGFilterPrimitiveStandardAttributes {
+        readonly attribute SVGAnimatedString in1;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFECompositeElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFECompositeElement.idl
new file mode 100644
index 0000000..76840e5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFECompositeElement.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS,
+        DoNotCheckConstants
+    ] SVGFECompositeElement : SVGElement,
+                              SVGFilterPrimitiveStandardAttributes {
+        // Composite Operators
+        const unsigned short SVG_FECOMPOSITE_OPERATOR_UNKNOWN    = 0;
+        const unsigned short SVG_FECOMPOSITE_OPERATOR_OVER       = 1;
+        const unsigned short SVG_FECOMPOSITE_OPERATOR_IN         = 2;
+        const unsigned short SVG_FECOMPOSITE_OPERATOR_OUT        = 3;
+        const unsigned short SVG_FECOMPOSITE_OPERATOR_ATOP       = 4;
+        const unsigned short SVG_FECOMPOSITE_OPERATOR_XOR        = 5;
+        const unsigned short SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
+
+        readonly attribute SVGAnimatedString      in1;
+        readonly attribute SVGAnimatedString      in2;
+        readonly attribute SVGAnimatedEnumeration operator;
+        readonly attribute SVGAnimatedNumber      k1;
+        readonly attribute SVGAnimatedNumber      k2;
+        readonly attribute SVGAnimatedNumber      k3;
+        readonly attribute SVGAnimatedNumber      k4;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEConvolveMatrixElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEConvolveMatrixElement.idl
new file mode 100644
index 0000000..e78219d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEConvolveMatrixElement.idl
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS,
+        DoNotCheckConstants
+    ] SVGFEConvolveMatrixElement : SVGElement,
+                                   SVGFilterPrimitiveStandardAttributes {
+        // Edge Mode Values
+        const unsigned short SVG_EDGEMODE_UNKNOWN   = 0;
+        const unsigned short SVG_EDGEMODE_DUPLICATE = 1;
+        const unsigned short SVG_EDGEMODE_WRAP      = 2;
+        const unsigned short SVG_EDGEMODE_NONE      = 3;
+
+        readonly attribute SVGAnimatedString      in1;
+        readonly attribute SVGAnimatedInteger     orderX;
+        readonly attribute SVGAnimatedInteger     orderY;
+        readonly attribute SVGAnimatedNumberList  kernelMatrix;
+        readonly attribute SVGAnimatedNumber      divisor;
+        readonly attribute SVGAnimatedNumber      bias;
+        readonly attribute SVGAnimatedInteger     targetX;
+        readonly attribute SVGAnimatedInteger     targetY;
+        readonly attribute SVGAnimatedEnumeration edgeMode;
+        readonly attribute SVGAnimatedNumber      kernelUnitLengthX;
+        readonly attribute SVGAnimatedNumber      kernelUnitLengthY;
+        readonly attribute SVGAnimatedBoolean     preserveAlpha;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEDiffuseLightingElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEDiffuseLightingElement.idl
new file mode 100644
index 0000000..f9fac19
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEDiffuseLightingElement.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEDiffuseLightingElement : SVGElement,
+                                                              SVGFilterPrimitiveStandardAttributes {
+        readonly attribute SVGAnimatedString in1;
+        readonly attribute SVGAnimatedNumber surfaceScale;
+        readonly attribute SVGAnimatedNumber diffuseConstant;
+        readonly attribute SVGAnimatedNumber kernelUnitLengthX;
+        readonly attribute SVGAnimatedNumber kernelUnitLengthY;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEDisplacementMapElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEDisplacementMapElement.idl
new file mode 100644
index 0000000..0729586
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEDisplacementMapElement.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS,
+        DoNotCheckConstants
+    ] SVGFEDisplacementMapElement : SVGElement,
+                                    SVGFilterPrimitiveStandardAttributes {
+        // Channel Selectors
+        const unsigned short SVG_CHANNEL_UNKNOWN = 0;
+        const unsigned short SVG_CHANNEL_R       = 1;
+        const unsigned short SVG_CHANNEL_G       = 2;
+        const unsigned short SVG_CHANNEL_B       = 3;
+        const unsigned short SVG_CHANNEL_A       = 4;
+
+        readonly attribute SVGAnimatedString      in1;
+        readonly attribute SVGAnimatedString      in2;
+        readonly attribute SVGAnimatedNumber      scale;
+        readonly attribute SVGAnimatedEnumeration xChannelSelector;
+        readonly attribute SVGAnimatedEnumeration yChannelSelector;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEDistantLightElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEDistantLightElement.idl
new file mode 100644
index 0000000..d8ff6fe
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEDistantLightElement.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEDistantLightElement : SVGElement {
+        readonly attribute SVGAnimatedNumber azimuth;
+        readonly attribute SVGAnimatedNumber elevation;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEDropShadowElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEDropShadowElement.idl
new file mode 100644
index 0000000..3c7d7ce
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEDropShadowElement.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEDropShadowElement : SVGElement,
+                                                           SVGFilterPrimitiveStandardAttributes { 
+        readonly attribute SVGAnimatedString in1;
+        readonly attribute SVGAnimatedNumber dx;
+        readonly attribute SVGAnimatedNumber dy;
+        readonly attribute SVGAnimatedNumber stdDeviationX;
+        readonly attribute SVGAnimatedNumber stdDeviationY;
+
+        void setStdDeviation(in [Optional=DefaultIsUndefined] float stdDeviationX, 
+                             in [Optional=DefaultIsUndefined] float stdDeviationY);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEFloodElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEFloodElement.idl
new file mode 100644
index 0000000..53ce047
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEFloodElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEFloodElement : SVGElement,
+                                                    SVGFilterPrimitiveStandardAttributes {
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEFuncAElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEFuncAElement.idl
new file mode 100644
index 0000000..ca3fa11
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEFuncAElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEFuncAElement : SVGComponentTransferFunctionElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEFuncBElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEFuncBElement.idl
new file mode 100644
index 0000000..0581b39
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEFuncBElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEFuncBElement : SVGComponentTransferFunctionElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEFuncGElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEFuncGElement.idl
new file mode 100644
index 0000000..ab09161
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEFuncGElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEFuncGElement : SVGComponentTransferFunctionElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEFuncRElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEFuncRElement.idl
new file mode 100644
index 0000000..5678f99
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEFuncRElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEFuncRElement : SVGComponentTransferFunctionElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEGaussianBlurElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEGaussianBlurElement.idl
new file mode 100644
index 0000000..25858f8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEGaussianBlurElement.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEGaussianBlurElement : SVGElement,
+                                                           SVGFilterPrimitiveStandardAttributes { 
+        readonly attribute SVGAnimatedString in1;
+        readonly attribute SVGAnimatedNumber stdDeviationX;
+        readonly attribute SVGAnimatedNumber stdDeviationY;
+
+        void setStdDeviation(in [Optional=DefaultIsUndefined] float stdDeviationX, 
+                             in [Optional=DefaultIsUndefined] float stdDeviationY);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEImageElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEImageElement.idl
new file mode 100644
index 0000000..9a6c0e8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEImageElement.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEImageElement : SVGElement,
+                                                            SVGURIReference,
+                                                            SVGLangSpace,
+                                                            SVGExternalResourcesRequired,
+                                                            SVGFilterPrimitiveStandardAttributes {
+        readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEMergeElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEMergeElement.idl
new file mode 100644
index 0000000..18cf92c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEMergeElement.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEMergeElement : SVGElement,
+                                                    SVGFilterPrimitiveStandardAttributes {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEMergeNodeElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEMergeNodeElement.idl
new file mode 100644
index 0000000..f6b1d27
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEMergeNodeElement.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEMergeNodeElement : SVGElement {
+        readonly attribute SVGAnimatedString in1;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEMorphologyElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEMorphologyElement.idl
new file mode 100644
index 0000000..24c0a47
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEMorphologyElement.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS,
+        DoNotCheckConstants
+    ] SVGFEMorphologyElement : SVGElement,
+                               SVGFilterPrimitiveStandardAttributes {
+        // Morphology Operators
+        const unsigned short SVG_MORPHOLOGY_OPERATOR_UNKNOWN  = 0;
+        const unsigned short SVG_MORPHOLOGY_OPERATOR_ERODE    = 1;
+        const unsigned short SVG_MORPHOLOGY_OPERATOR_DILATE   = 2;
+
+        readonly attribute SVGAnimatedString      in1;
+        readonly attribute SVGAnimatedEnumeration operator;
+        readonly attribute SVGAnimatedNumber      radiusX;
+        readonly attribute SVGAnimatedNumber      radiusY;
+
+        void setRadius(in [Optional=DefaultIsUndefined] float radiusX, 
+                       in [Optional=DefaultIsUndefined] float radiusY);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEOffsetElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEOffsetElement.idl
new file mode 100644
index 0000000..95f9565
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEOffsetElement.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEOffsetElement : SVGElement,
+                                                     SVGFilterPrimitiveStandardAttributes {
+        readonly attribute SVGAnimatedString in1;
+        readonly attribute SVGAnimatedNumber dx;
+        readonly attribute SVGAnimatedNumber dy;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFEPointLightElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFEPointLightElement.idl
new file mode 100644
index 0000000..b6dd0fa
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFEPointLightElement.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFEPointLightElement : SVGElement {
+        readonly attribute SVGAnimatedNumber x;
+        readonly attribute SVGAnimatedNumber y;
+        readonly attribute SVGAnimatedNumber z;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFESpecularLightingElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFESpecularLightingElement.idl
new file mode 100644
index 0000000..3dc4e34
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFESpecularLightingElement.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFESpecularLightingElement : SVGElement,
+                                                               SVGFilterPrimitiveStandardAttributes {
+        readonly attribute SVGAnimatedString in1;
+        readonly attribute SVGAnimatedNumber surfaceScale;
+        readonly attribute SVGAnimatedNumber specularConstant;
+        readonly attribute SVGAnimatedNumber specularExponent;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFESpotLightElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFESpotLightElement.idl
new file mode 100644
index 0000000..36c12eb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFESpotLightElement.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFESpotLightElement : SVGElement {
+        readonly attribute SVGAnimatedNumber x;
+        readonly attribute SVGAnimatedNumber y;
+        readonly attribute SVGAnimatedNumber z;
+        readonly attribute SVGAnimatedNumber pointsAtX;
+        readonly attribute SVGAnimatedNumber pointsAtY;
+        readonly attribute SVGAnimatedNumber pointsAtZ;
+        readonly attribute SVGAnimatedNumber specularExponent;
+        readonly attribute SVGAnimatedNumber limitingConeAngle;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFETileElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFETileElement.idl
new file mode 100644
index 0000000..6b853e5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFETileElement.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFETileElement : SVGElement,
+                                                   SVGFilterPrimitiveStandardAttributes {
+        readonly attribute SVGAnimatedString in1;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFETurbulenceElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFETurbulenceElement.idl
new file mode 100644
index 0000000..0060fbf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFETurbulenceElement.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS,
+        DoNotCheckConstants
+    ] SVGFETurbulenceElement : SVGElement,
+                               SVGFilterPrimitiveStandardAttributes {
+        // Turbulence Types
+        const unsigned short SVG_TURBULENCE_TYPE_UNKNOWN      = 0;
+        const unsigned short SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
+        const unsigned short SVG_TURBULENCE_TYPE_TURBULENCE   = 2;
+
+        // Stitch Options
+        const unsigned short SVG_STITCHTYPE_UNKNOWN  = 0;
+        const unsigned short SVG_STITCHTYPE_STITCH   = 1;
+        const unsigned short SVG_STITCHTYPE_NOSTITCH = 2;
+
+        readonly attribute SVGAnimatedNumber      baseFrequencyX;
+        readonly attribute SVGAnimatedNumber      baseFrequencyY;
+        readonly attribute SVGAnimatedInteger     numOctaves;
+        readonly attribute SVGAnimatedNumber      seed;
+        readonly attribute SVGAnimatedEnumeration stitchTiles;
+        readonly attribute SVGAnimatedEnumeration type;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFilterElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFilterElement.idl
new file mode 100644
index 0000000..ff2f496
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFilterElement.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&FILTERS
+    ] SVGFilterElement : SVGElement,
+                                                   SVGURIReference,
+                                                   SVGLangSpace,
+                                                   SVGExternalResourcesRequired,
+                                                   SVGStylable
+                                                /* SVGUnitTypes */ {  
+        readonly attribute SVGAnimatedEnumeration filterUnits;
+        readonly attribute SVGAnimatedEnumeration primitiveUnits;
+        readonly attribute SVGAnimatedLength      x;
+        readonly attribute SVGAnimatedLength      y;
+        readonly attribute SVGAnimatedLength      width;
+        readonly attribute SVGAnimatedLength      height;
+        readonly attribute SVGAnimatedInteger     filterResX;
+        readonly attribute SVGAnimatedInteger     filterResY;
+
+        void setFilterRes(in [Optional=DefaultIsUndefined] unsigned long filterResX, 
+                          in [Optional=DefaultIsUndefined] unsigned long filterResY);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFilterPrimitiveStandardAttributes.idl b/elemental/idl/third_party/WebCore/svg/SVGFilterPrimitiveStandardAttributes.idl
new file mode 100644
index 0000000..4b1d3fb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFilterPrimitiveStandardAttributes.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol
+    ] SVGFilterPrimitiveStandardAttributes : SVGStylable {
+        readonly attribute SVGAnimatedLength x;
+        readonly attribute SVGAnimatedLength y;
+        readonly attribute SVGAnimatedLength width;
+        readonly attribute SVGAnimatedLength height;
+        readonly attribute SVGAnimatedString result;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFitToViewBox.idl b/elemental/idl/third_party/WebCore/svg/SVGFitToViewBox.idl
new file mode 100644
index 0000000..a57a8dd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFitToViewBox.idl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        SuppressToJSObject,
+        OmitConstructor
+    ] SVGFitToViewBox {
+        readonly attribute SVGAnimatedRect                viewBox;
+        readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFontElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFontElement.idl
new file mode 100644
index 0000000..0b95d0f
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFontElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGFontElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFontFaceElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFontFaceElement.idl
new file mode 100644
index 0000000..1eed0e2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFontFaceElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGFontFaceElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFontFaceFormatElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFontFaceFormatElement.idl
new file mode 100644
index 0000000..a0848b9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFontFaceFormatElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGFontFaceFormatElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFontFaceNameElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFontFaceNameElement.idl
new file mode 100644
index 0000000..8407ccf
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFontFaceNameElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGFontFaceNameElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFontFaceSrcElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFontFaceSrcElement.idl
new file mode 100644
index 0000000..77af8cd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFontFaceSrcElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGFontFaceSrcElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGFontFaceUriElement.idl b/elemental/idl/third_party/WebCore/svg/SVGFontFaceUriElement.idl
new file mode 100644
index 0000000..b4f626a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGFontFaceUriElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGFontFaceUriElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGForeignObjectElement.idl b/elemental/idl/third_party/WebCore/svg/SVGForeignObjectElement.idl
new file mode 100644
index 0000000..a1b3882
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGForeignObjectElement.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGForeignObjectElement : SVGElement,
+                                                          SVGTests,
+                                                          SVGLangSpace,
+                                                          SVGExternalResourcesRequired,
+                                                          SVGStylable,
+                                                          SVGTransformable {
+        readonly attribute SVGAnimatedLength x;
+        readonly attribute SVGAnimatedLength y;
+        readonly attribute SVGAnimatedLength width;
+        readonly attribute SVGAnimatedLength height;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGGElement.idl b/elemental/idl/third_party/WebCore/svg/SVGGElement.idl
new file mode 100644
index 0000000..b6377a6
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGGElement.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGGElement : SVGElement,
+                                              SVGTests,
+                                              SVGLangSpace,
+                                              SVGExternalResourcesRequired,
+                                              SVGStylable,
+                                              SVGTransformable {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGGlyphElement.idl b/elemental/idl/third_party/WebCore/svg/SVGGlyphElement.idl
new file mode 100644
index 0000000..d00309c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGGlyphElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGGlyphElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGGlyphRefElement.idl b/elemental/idl/third_party/WebCore/svg/SVGGlyphRefElement.idl
new file mode 100644
index 0000000..8a1cdb1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGGlyphRefElement.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2011 Leo Yang <leoyang@webkit.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [Conditional=SVG&SVG_FONTS] SVGGlyphRefElement : SVGElement,
+                                                               SVGURIReference,
+                                                               SVGStylable {
+        // FIXME: Use [Reflect] after https://bugs.webkit.org/show_bug.cgi?id=64843 is fixed.
+        attribute DOMString glyphRef
+            setter raises(DOMException);
+        attribute [Reflect] DOMString format;
+        attribute float x
+            setter raises(DOMException);
+        attribute float y
+            setter raises(DOMException);
+        attribute float dx
+            setter raises(DOMException);
+        attribute float dy
+            setter raises(DOMException);
+    };
+
+}
+
diff --git a/elemental/idl/third_party/WebCore/svg/SVGGradientElement.idl b/elemental/idl/third_party/WebCore/svg/SVGGradientElement.idl
new file mode 100644
index 0000000..6db27fb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGGradientElement.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        DoNotCheckConstants
+    ] SVGGradientElement : SVGElement,
+                           SVGURIReference,
+                           SVGExternalResourcesRequired,
+                           SVGStylable
+                           /* SVGUnitTypes */ {
+        // Spread Method Types
+        const unsigned short SVG_SPREADMETHOD_UNKNOWN = 0;
+        const unsigned short SVG_SPREADMETHOD_PAD     = 1;
+        const unsigned short SVG_SPREADMETHOD_REFLECT = 2;
+        const unsigned short SVG_SPREADMETHOD_REPEAT  = 3;
+
+        readonly attribute SVGAnimatedEnumeration   gradientUnits;
+        readonly attribute SVGAnimatedTransformList gradientTransform;
+        readonly attribute SVGAnimatedEnumeration   spreadMethod;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGHKernElement.idl b/elemental/idl/third_party/WebCore/svg/SVGHKernElement.idl
new file mode 100644
index 0000000..4087749
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGHKernElement.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGHKernElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGImageElement.idl b/elemental/idl/third_party/WebCore/svg/SVGImageElement.idl
new file mode 100644
index 0000000..6f716e1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGImageElement.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGImageElement : SVGElement,
+                                                  SVGURIReference,
+                                                  SVGTests,
+                                                  SVGLangSpace,
+                                                  SVGExternalResourcesRequired,
+                                                  SVGStylable,
+                                                  SVGTransformable {
+        readonly attribute SVGAnimatedLength x;
+        readonly attribute SVGAnimatedLength y;
+        readonly attribute SVGAnimatedLength width;
+        readonly attribute SVGAnimatedLength height;
+        readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGLangSpace.idl b/elemental/idl/third_party/WebCore/svg/SVGLangSpace.idl
new file mode 100644
index 0000000..212c85a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGLangSpace.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        SuppressToJSObject,
+        OmitConstructor
+    ] SVGLangSpace {
+                 attribute DOMString xmllang
+                     /*setter raises(DOMException)*/;
+                 attribute DOMString xmlspace
+                     /*setter raises(DOMException)*/;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGLength.idl b/elemental/idl/third_party/WebCore/svg/SVGLength.idl
new file mode 100644
index 0000000..a5c952d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGLength.idl
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGLength { 
+        // Length Unit Types
+        const unsigned short SVG_LENGTHTYPE_UNKNOWN    = 0;
+        const unsigned short SVG_LENGTHTYPE_NUMBER     = 1;
+        const unsigned short SVG_LENGTHTYPE_PERCENTAGE = 2;
+        const unsigned short SVG_LENGTHTYPE_EMS        = 3;
+        const unsigned short SVG_LENGTHTYPE_EXS        = 4;
+        const unsigned short SVG_LENGTHTYPE_PX         = 5;
+        const unsigned short SVG_LENGTHTYPE_CM         = 6;
+        const unsigned short SVG_LENGTHTYPE_MM         = 7;
+        const unsigned short SVG_LENGTHTYPE_IN         = 8;
+        const unsigned short SVG_LENGTHTYPE_PT         = 9;
+        const unsigned short SVG_LENGTHTYPE_PC         = 10;
+
+        readonly attribute unsigned short unitType;
+        attribute [Custom, StrictTypeChecking] float value
+            setter raises(DOMException),
+            getter raises(DOMException);
+
+        attribute [StrictTypeChecking] float valueInSpecifiedUnits;
+        attribute [TreatNullAs=NullString, StrictTypeChecking] DOMString valueAsString
+            setter raises(DOMException);
+
+        [StrictTypeChecking] void newValueSpecifiedUnits(in unsigned short unitType, 
+                                                         in float valueInSpecifiedUnits)
+            raises(DOMException);
+
+        [Custom, StrictTypeChecking] void convertToSpecifiedUnits(in unsigned short unitType)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGLengthList.idl b/elemental/idl/third_party/WebCore/svg/SVGLengthList.idl
new file mode 100644
index 0000000..a90c9e2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGLengthList.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGLengthList { 
+        readonly attribute unsigned long numberOfItems;
+
+        void clear()
+            raises(DOMException);
+        [StrictTypeChecking] SVGLength initialize(in SVGLength item)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGLength getItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGLength insertItemBefore(in SVGLength item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGLength replaceItem(in SVGLength item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGLength removeItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGLength appendItem(in SVGLength item)
+            raises(DOMException, SVGException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGLineElement.idl b/elemental/idl/third_party/WebCore/svg/SVGLineElement.idl
new file mode 100644
index 0000000..1655861
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGLineElement.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGLineElement : SVGElement,
+                                                 SVGTests,
+                                                 SVGLangSpace,
+                                                 SVGExternalResourcesRequired,
+                                                 SVGStylable,
+                                                 SVGTransformable {
+        readonly attribute SVGAnimatedLength x1;
+        readonly attribute SVGAnimatedLength y1;
+        readonly attribute SVGAnimatedLength x2;
+        readonly attribute SVGAnimatedLength y2;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGLinearGradientElement.idl b/elemental/idl/third_party/WebCore/svg/SVGLinearGradientElement.idl
new file mode 100644
index 0000000..385bcfb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGLinearGradientElement.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGLinearGradientElement : SVGGradientElement {
+        readonly attribute SVGAnimatedLength x1;
+        readonly attribute SVGAnimatedLength y1;
+        readonly attribute SVGAnimatedLength x2;
+        readonly attribute SVGAnimatedLength y2;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGLocatable.idl b/elemental/idl/third_party/WebCore/svg/SVGLocatable.idl
new file mode 100644
index 0000000..3b38a39
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGLocatable.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        SuppressToJSObject,
+        OmitConstructor
+    ] SVGLocatable {
+        readonly attribute SVGElement nearestViewportElement;
+        readonly attribute SVGElement farthestViewportElement;
+
+        SVGRect   getBBox();
+        SVGMatrix getCTM();
+        SVGMatrix getScreenCTM();
+        SVGMatrix getTransformToElement(in [Optional=DefaultIsUndefined] SVGElement element)
+            raises(SVGException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGMPathElement.idl b/elemental/idl/third_party/WebCore/svg/SVGMPathElement.idl
new file mode 100644
index 0000000..da52f3d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGMPathElement.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGMPathElement : SVGElement,
+                                                                SVGURIReference,
+                                                                SVGExternalResourcesRequired {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGMarkerElement.idl b/elemental/idl/third_party/WebCore/svg/SVGMarkerElement.idl
new file mode 100644
index 0000000..dd351e3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGMarkerElement.idl
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGMarkerElement : SVGElement,
+                                                   SVGLangSpace,
+                                                   SVGExternalResourcesRequired,
+                                                   SVGStylable,
+                                                   SVGFitToViewBox { 
+        // Marker Unit Types
+        const unsigned short SVG_MARKERUNITS_UNKNOWN        = 0;
+        const unsigned short SVG_MARKERUNITS_USERSPACEONUSE = 1;
+        const unsigned short SVG_MARKERUNITS_STROKEWIDTH    = 2;
+
+        // Marker Orientation Types
+        const unsigned short SVG_MARKER_ORIENT_UNKNOWN      = 0;
+        const unsigned short SVG_MARKER_ORIENT_AUTO         = 1;
+        const unsigned short SVG_MARKER_ORIENT_ANGLE        = 2;
+
+        readonly attribute SVGAnimatedLength      refX;
+        readonly attribute SVGAnimatedLength      refY;
+        readonly attribute SVGAnimatedEnumeration markerUnits;
+        readonly attribute SVGAnimatedLength      markerWidth;
+        readonly attribute SVGAnimatedLength      markerHeight;
+        readonly attribute SVGAnimatedEnumeration orientType;
+        readonly attribute SVGAnimatedAngle       orientAngle;
+
+        void setOrientToAuto();
+        void setOrientToAngle(in [Optional=DefaultIsUndefined] SVGAngle angle);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGMaskElement.idl b/elemental/idl/third_party/WebCore/svg/SVGMaskElement.idl
new file mode 100644
index 0000000..6106ed3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGMaskElement.idl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGMaskElement : SVGElement,
+                                                 SVGTests,
+                                                 SVGLangSpace,
+                                                 SVGExternalResourcesRequired,
+                                                 SVGStylable {
+        readonly attribute SVGAnimatedEnumeration maskUnits;
+        readonly attribute SVGAnimatedEnumeration maskContentUnits;
+
+        readonly attribute SVGAnimatedLength x;
+        readonly attribute SVGAnimatedLength y;
+        readonly attribute SVGAnimatedLength width;
+        readonly attribute SVGAnimatedLength height;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGMatrix.idl b/elemental/idl/third_party/WebCore/svg/SVGMatrix.idl
new file mode 100644
index 0000000..0cfe547
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGMatrix.idl
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGMatrix {
+        // FIXME: these attributes should all be floats but since we implement
+        // AffineTransform with doubles setting these as doubles makes more sense.
+        attribute [StrictTypeChecking] double a;
+        attribute [StrictTypeChecking] double b;
+        attribute [StrictTypeChecking] double c;
+        attribute [StrictTypeChecking] double d;
+        attribute [StrictTypeChecking] double e;
+        attribute [StrictTypeChecking] double f;
+
+        [StrictTypeChecking] SVGMatrix multiply(in SVGMatrix secondMatrix);
+        SVGMatrix inverse()
+            raises(SVGException);
+        [Immutable, StrictTypeChecking] SVGMatrix translate(in float x, in float y);
+        [Immutable, StrictTypeChecking] SVGMatrix scale(in float scaleFactor);
+        [Immutable, StrictTypeChecking] SVGMatrix scaleNonUniform(in float scaleFactorX, in float scaleFactorY);
+        [Immutable, StrictTypeChecking] SVGMatrix rotate(in float angle);
+        [StrictTypeChecking] SVGMatrix rotateFromVector(in float x, in float y)
+            raises(SVGException);
+        [Immutable] SVGMatrix flipX();
+        [Immutable] SVGMatrix flipY();
+        [Immutable, StrictTypeChecking] SVGMatrix skewX(in float angle);
+        [Immutable, StrictTypeChecking] SVGMatrix skewY(in float angle);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGMetadataElement.idl b/elemental/idl/third_party/WebCore/svg/SVGMetadataElement.idl
new file mode 100644
index 0000000..878e5d9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGMetadataElement.idl
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGMetadataElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGMissingGlyphElement.idl b/elemental/idl/third_party/WebCore/svg/SVGMissingGlyphElement.idl
new file mode 100644
index 0000000..5e3074b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGMissingGlyphElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGMissingGlyphElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGNumber.idl b/elemental/idl/third_party/WebCore/svg/SVGNumber.idl
new file mode 100644
index 0000000..ebd212b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGNumber.idl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGNumber {
+        attribute [StrictTypeChecking] float value;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGNumberList.idl b/elemental/idl/third_party/WebCore/svg/SVGNumberList.idl
new file mode 100644
index 0000000..43e5117
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGNumberList.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGNumberList {
+        readonly attribute unsigned long numberOfItems;
+
+        void clear()
+            raises(DOMException);
+        [StrictTypeChecking] SVGNumber initialize(in SVGNumber item)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGNumber getItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGNumber insertItemBefore(in SVGNumber item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGNumber replaceItem(in SVGNumber item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGNumber removeItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGNumber appendItem(in SVGNumber item)
+            raises(DOMException, SVGException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPaint.idl b/elemental/idl/third_party/WebCore/svg/SVGPaint.idl
new file mode 100644
index 0000000..8711655
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPaint.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPaint : SVGColor {
+        const unsigned short SVG_PAINTTYPE_UNKNOWN = 0;
+        const unsigned short SVG_PAINTTYPE_RGBCOLOR = 1;
+        const unsigned short SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2;
+        const unsigned short SVG_PAINTTYPE_NONE = 101;
+        const unsigned short SVG_PAINTTYPE_CURRENTCOLOR = 102;
+        const unsigned short SVG_PAINTTYPE_URI_NONE = 103;
+        const unsigned short SVG_PAINTTYPE_URI_CURRENTCOLOR = 104;
+        const unsigned short SVG_PAINTTYPE_URI_RGBCOLOR = 105;
+        const unsigned short SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
+        const unsigned short SVG_PAINTTYPE_URI = 107;
+
+        readonly attribute unsigned short paintType;
+        readonly attribute DOMString uri;
+
+        [StrictTypeChecking] void setUri(in DOMString uri);
+        [StrictTypeChecking] void setPaint(in unsigned short paintType, in DOMString uri, in DOMString rgbColor, in DOMString iccColor)
+            raises(DOMException, SVGException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathElement.idl b/elemental/idl/third_party/WebCore/svg/SVGPathElement.idl
new file mode 100644
index 0000000..5f4f6ca
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathElement.idl
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathElement : SVGElement,
+                                                 SVGTests,
+                                                 SVGLangSpace,
+                                                 SVGExternalResourcesRequired,
+                                                 SVGStylable,
+                                                 SVGTransformable {
+        readonly attribute SVGAnimatedNumber pathLength;
+
+        float getTotalLength();
+        SVGPoint getPointAtLength(in [Optional=DefaultIsUndefined] float distance);
+        unsigned long getPathSegAtLength(in [Optional=DefaultIsUndefined] float distance);
+
+        SVGPathSegClosePath createSVGPathSegClosePath();
+
+        SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(in [Optional=DefaultIsUndefined] float x, 
+                                                      in [Optional=DefaultIsUndefined] float y);
+        SVGPathSegMovetoRel createSVGPathSegMovetoRel(in [Optional=DefaultIsUndefined] float x, 
+                                                      in [Optional=DefaultIsUndefined] float y);
+
+        SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(in [Optional=DefaultIsUndefined] float x, 
+                                                      in [Optional=DefaultIsUndefined] float y);
+        SVGPathSegLinetoRel createSVGPathSegLinetoRel(in [Optional=DefaultIsUndefined] float x, 
+                                                      in [Optional=DefaultIsUndefined] float y);
+
+        SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(in [Optional=DefaultIsUndefined] float x, 
+                                                                  in [Optional=DefaultIsUndefined] float y, 
+                                                                  in [Optional=DefaultIsUndefined] float x1, 
+                                                                  in [Optional=DefaultIsUndefined] float y1, 
+                                                                  in [Optional=DefaultIsUndefined] float x2, 
+                                                                  in [Optional=DefaultIsUndefined] float y2);
+        SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(in [Optional=DefaultIsUndefined] float x, 
+                                                                  in [Optional=DefaultIsUndefined] float y, 
+                                                                  in [Optional=DefaultIsUndefined] float x1, 
+                                                                  in [Optional=DefaultIsUndefined] float y1, 
+                                                                  in [Optional=DefaultIsUndefined] float x2, 
+                                                                  in [Optional=DefaultIsUndefined] float y2);
+
+        SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(in [Optional=DefaultIsUndefined] float x, 
+                                                                          in [Optional=DefaultIsUndefined] float y, 
+                                                                          in [Optional=DefaultIsUndefined] float x1, 
+                                                                          in [Optional=DefaultIsUndefined] float y1);
+        SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(in [Optional=DefaultIsUndefined] float x, 
+                                                                          in [Optional=DefaultIsUndefined] float y, 
+                                                                          in [Optional=DefaultIsUndefined] float x1, 
+                                                                          in [Optional=DefaultIsUndefined] float y1);
+
+        SVGPathSegArcAbs createSVGPathSegArcAbs(in [Optional=DefaultIsUndefined] float x, 
+                                                in [Optional=DefaultIsUndefined] float y, 
+                                                in [Optional=DefaultIsUndefined] float r1, 
+                                                in [Optional=DefaultIsUndefined] float r2, 
+                                                in [Optional=DefaultIsUndefined] float angle, 
+                                                in [Optional=DefaultIsUndefined] boolean largeArcFlag, 
+                                                in [Optional=DefaultIsUndefined] boolean sweepFlag);
+        SVGPathSegArcRel createSVGPathSegArcRel(in [Optional=DefaultIsUndefined] float x, 
+                                                in [Optional=DefaultIsUndefined] float y, 
+                                                in [Optional=DefaultIsUndefined] float r1, 
+                                                in [Optional=DefaultIsUndefined] float r2, 
+                                                in [Optional=DefaultIsUndefined] float angle, 
+                                                in [Optional=DefaultIsUndefined] boolean largeArcFlag, 
+                                                in [Optional=DefaultIsUndefined] boolean sweepFlag);
+
+        SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(in [Optional=DefaultIsUndefined] float x);
+        SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(in [Optional=DefaultIsUndefined] float x);
+
+        SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(in [Optional=DefaultIsUndefined] float y);
+        SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(in [Optional=DefaultIsUndefined] float y);
+
+        SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(in [Optional=DefaultIsUndefined] float x, 
+                                                                              in [Optional=DefaultIsUndefined] float y, 
+                                                                              in [Optional=DefaultIsUndefined] float x2, 
+                                                                              in [Optional=DefaultIsUndefined] float y2);
+        SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(in [Optional=DefaultIsUndefined] float x, 
+                                                                              in [Optional=DefaultIsUndefined] float y, 
+                                                                              in [Optional=DefaultIsUndefined] float x2, 
+                                                                              in [Optional=DefaultIsUndefined] float y2);
+
+        SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(in [Optional=DefaultIsUndefined] float x, 
+                                                                                      in [Optional=DefaultIsUndefined] float y);
+        SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(in [Optional=DefaultIsUndefined] float x, 
+                                                                                      in [Optional=DefaultIsUndefined] float y);
+
+        readonly attribute SVGPathSegList pathSegList;
+        readonly attribute SVGPathSegList normalizedPathSegList;
+        readonly attribute SVGPathSegList animatedPathSegList;
+        readonly attribute SVGPathSegList animatedNormalizedPathSegList;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSeg.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSeg.idl
new file mode 100644
index 0000000..e7ad75a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSeg.idl
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006, 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        CustomToJSObject,
+        ObjCPolymorphic
+    ] SVGPathSeg {
+        // Path Segment Types
+        const unsigned short PATHSEG_UNKNOWN = 0;
+        const unsigned short PATHSEG_CLOSEPATH = 1;
+        const unsigned short PATHSEG_MOVETO_ABS = 2;
+        const unsigned short PATHSEG_MOVETO_REL = 3;
+        const unsigned short PATHSEG_LINETO_ABS = 4;
+        const unsigned short PATHSEG_LINETO_REL = 5;
+        const unsigned short PATHSEG_CURVETO_CUBIC_ABS = 6;
+        const unsigned short PATHSEG_CURVETO_CUBIC_REL = 7;
+        const unsigned short PATHSEG_CURVETO_QUADRATIC_ABS = 8;
+        const unsigned short PATHSEG_CURVETO_QUADRATIC_REL = 9;
+        const unsigned short PATHSEG_ARC_ABS = 10;
+        const unsigned short PATHSEG_ARC_REL = 11;
+        const unsigned short PATHSEG_LINETO_HORIZONTAL_ABS = 12;
+        const unsigned short PATHSEG_LINETO_HORIZONTAL_REL = 13;
+        const unsigned short PATHSEG_LINETO_VERTICAL_ABS = 14;
+        const unsigned short PATHSEG_LINETO_VERTICAL_REL = 15;
+        const unsigned short PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
+        const unsigned short PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
+        const unsigned short PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
+        const unsigned short PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
+
+        readonly attribute unsigned short pathSegType;
+        readonly attribute DOMString pathSegTypeAsLetter;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegArcAbs.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegArcAbs.idl
new file mode 100644
index 0000000..4805e8b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegArcAbs.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegArcAbs : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+        attribute [StrictTypeChecking] float r1;
+        attribute [StrictTypeChecking] float r2;
+        attribute [StrictTypeChecking] float angle;
+        attribute [StrictTypeChecking] boolean largeArcFlag;
+        attribute [StrictTypeChecking] boolean sweepFlag;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegArcRel.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegArcRel.idl
new file mode 100644
index 0000000..a22c61e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegArcRel.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegArcRel : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+        attribute [StrictTypeChecking] float r1;
+        attribute [StrictTypeChecking] float r2;
+        attribute [StrictTypeChecking] float angle;
+        attribute [StrictTypeChecking] boolean largeArcFlag;
+        attribute [StrictTypeChecking] boolean sweepFlag;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegClosePath.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegClosePath.idl
new file mode 100644
index 0000000..8c57d86
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegClosePath.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegClosePath : SVGPathSeg {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicAbs.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicAbs.idl
new file mode 100644
index 0000000..4311c8d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicAbs.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */ 
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegCurvetoCubicAbs : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+        attribute [StrictTypeChecking] float x1;
+        attribute [StrictTypeChecking] float y1;
+        attribute [StrictTypeChecking] float x2;
+        attribute [StrictTypeChecking] float y2;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicRel.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicRel.idl
new file mode 100644
index 0000000..f279f6e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicRel.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */ 
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegCurvetoCubicRel : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+        attribute [StrictTypeChecking] float x1;
+        attribute [StrictTypeChecking] float y1;
+        attribute [StrictTypeChecking] float x2;
+        attribute [StrictTypeChecking] float y2;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicSmoothAbs.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicSmoothAbs.idl
new file mode 100644
index 0000000..fbfde0d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicSmoothAbs.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */ 
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegCurvetoCubicSmoothAbs : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+        attribute [StrictTypeChecking] float x2;
+        attribute [StrictTypeChecking] float y2;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicSmoothRel.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicSmoothRel.idl
new file mode 100644
index 0000000..1b9de2a
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoCubicSmoothRel.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */ 
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegCurvetoCubicSmoothRel : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+        attribute [StrictTypeChecking] float x2;
+        attribute [StrictTypeChecking] float y2;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticAbs.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticAbs.idl
new file mode 100644
index 0000000..69a9930
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticAbs.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegCurvetoQuadraticAbs : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+        attribute [StrictTypeChecking] float x1;
+        attribute [StrictTypeChecking] float y1;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticRel.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticRel.idl
new file mode 100644
index 0000000..0679280
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticRel.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegCurvetoQuadraticRel : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+        attribute [StrictTypeChecking] float x1;
+        attribute [StrictTypeChecking] float y1;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothAbs.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothAbs.idl
new file mode 100644
index 0000000..8834c03
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothAbs.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegCurvetoQuadraticSmoothAbs : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothRel.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothRel.idl
new file mode 100644
index 0000000..3d042c8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothRel.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegCurvetoQuadraticSmoothRel : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoAbs.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoAbs.idl
new file mode 100644
index 0000000..714fa10
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoAbs.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegLinetoAbs : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoHorizontalAbs.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoHorizontalAbs.idl
new file mode 100644
index 0000000..2948297
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoHorizontalAbs.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegLinetoHorizontalAbs : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoHorizontalRel.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoHorizontalRel.idl
new file mode 100644
index 0000000..1e46dd0
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoHorizontalRel.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegLinetoHorizontalRel : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoRel.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoRel.idl
new file mode 100644
index 0000000..62ea231
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoRel.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegLinetoRel : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoVerticalAbs.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoVerticalAbs.idl
new file mode 100644
index 0000000..95c9d27
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoVerticalAbs.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegLinetoVerticalAbs : SVGPathSeg {
+        attribute [StrictTypeChecking] float y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoVerticalRel.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoVerticalRel.idl
new file mode 100644
index 0000000..4a359a5
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegLinetoVerticalRel.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegLinetoVerticalRel : SVGPathSeg {
+        attribute [StrictTypeChecking] float y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegList.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegList.idl
new file mode 100644
index 0000000..ea9e515
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegList.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegList {
+        readonly attribute unsigned long numberOfItems;
+
+        void clear()
+            raises(DOMException);
+        [StrictTypeChecking] SVGPathSeg initialize(in SVGPathSeg newItem)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGPathSeg getItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGPathSeg insertItemBefore(in SVGPathSeg newItem, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGPathSeg replaceItem(in SVGPathSeg newItem, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGPathSeg removeItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGPathSeg appendItem(in SVGPathSeg newItem)
+            raises(DOMException, SVGException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegMovetoAbs.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegMovetoAbs.idl
new file mode 100644
index 0000000..3a4f806
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegMovetoAbs.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegMovetoAbs : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPathSegMovetoRel.idl b/elemental/idl/third_party/WebCore/svg/SVGPathSegMovetoRel.idl
new file mode 100644
index 0000000..a64b351
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPathSegMovetoRel.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPathSegMovetoRel : SVGPathSeg {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPatternElement.idl b/elemental/idl/third_party/WebCore/svg/SVGPatternElement.idl
new file mode 100644
index 0000000..2dd89c2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPatternElement.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPatternElement : SVGElement,
+                                                    SVGURIReference,
+                                                    SVGTests,
+                                                    SVGLangSpace,
+                                                    SVGExternalResourcesRequired,
+                                                    SVGStylable,
+                                                    SVGFitToViewBox
+                                                 /* SVGUnitTypes */ {
+        readonly attribute SVGAnimatedEnumeration   patternUnits;
+        readonly attribute SVGAnimatedEnumeration   patternContentUnits;
+        readonly attribute SVGAnimatedTransformList patternTransform;
+        readonly attribute SVGAnimatedLength        x;
+        readonly attribute SVGAnimatedLength        y;
+        readonly attribute SVGAnimatedLength        width;
+        readonly attribute SVGAnimatedLength        height;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPoint.idl b/elemental/idl/third_party/WebCore/svg/SVGPoint.idl
new file mode 100644
index 0000000..ce2d51d
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPoint.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPoint {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+
+        [StrictTypeChecking] SVGPoint matrixTransform(in SVGMatrix matrix);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPointList.idl b/elemental/idl/third_party/WebCore/svg/SVGPointList.idl
new file mode 100644
index 0000000..9713ca2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPointList.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPointList {
+        readonly attribute unsigned long numberOfItems;
+
+        void clear()
+            raises(DOMException);
+        [StrictTypeChecking] SVGPoint initialize(in SVGPoint item)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGPoint getItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGPoint insertItemBefore(in SVGPoint item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGPoint replaceItem(in SVGPoint item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGPoint removeItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGPoint appendItem(in SVGPoint item)
+            raises(DOMException, SVGException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPolygonElement.idl b/elemental/idl/third_party/WebCore/svg/SVGPolygonElement.idl
new file mode 100644
index 0000000..bc9f966
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPolygonElement.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPolygonElement : SVGElement,
+                                                    SVGTests,
+                                                    SVGLangSpace,
+                                                    SVGExternalResourcesRequired,
+                                                    SVGStylable,
+                                                    SVGTransformable {
+        readonly attribute SVGPointList points;
+        readonly attribute SVGPointList animatedPoints;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPolylineElement.idl b/elemental/idl/third_party/WebCore/svg/SVGPolylineElement.idl
new file mode 100644
index 0000000..93bdaf1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPolylineElement.idl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPolylineElement : SVGElement,
+                                                     SVGTests,
+                                                     SVGLangSpace,
+                                                     SVGExternalResourcesRequired,
+                                                     SVGStylable,
+                                                     SVGTransformable {
+        readonly attribute SVGPointList points;
+        readonly attribute SVGPointList animatedPoints;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGPreserveAspectRatio.idl b/elemental/idl/third_party/WebCore/svg/SVGPreserveAspectRatio.idl
new file mode 100644
index 0000000..975bfc7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGPreserveAspectRatio.idl
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGPreserveAspectRatio {
+        // Alignment Types
+        const unsigned short SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
+        const unsigned short SVG_PRESERVEASPECTRATIO_NONE = 1;
+        const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
+        const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
+        const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
+        const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
+        const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
+        const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
+        const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
+        const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
+        const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
+
+        // Meet-or-slice Types
+        const unsigned short SVG_MEETORSLICE_UNKNOWN = 0;
+        const unsigned short SVG_MEETORSLICE_MEET = 1;
+        const unsigned short SVG_MEETORSLICE_SLICE = 2;
+
+        attribute [StrictTypeChecking] unsigned short align
+            setter raises(DOMException);
+
+        attribute [StrictTypeChecking] unsigned short meetOrSlice
+            setter raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGRadialGradientElement.idl b/elemental/idl/third_party/WebCore/svg/SVGRadialGradientElement.idl
new file mode 100644
index 0000000..000f6b4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGRadialGradientElement.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGRadialGradientElement : SVGGradientElement {
+        readonly attribute SVGAnimatedLength cx;
+        readonly attribute SVGAnimatedLength cy;
+        readonly attribute SVGAnimatedLength r;
+        readonly attribute SVGAnimatedLength fx;
+        readonly attribute SVGAnimatedLength fy;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGRect.idl b/elemental/idl/third_party/WebCore/svg/SVGRect.idl
new file mode 100644
index 0000000..4bfce0e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGRect.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGRect {
+        attribute [StrictTypeChecking] float x;
+        attribute [StrictTypeChecking] float y;
+        attribute [StrictTypeChecking] float width;
+        attribute [StrictTypeChecking] float height;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGRectElement.idl b/elemental/idl/third_party/WebCore/svg/SVGRectElement.idl
new file mode 100644
index 0000000..d93f5d7
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGRectElement.idl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGRectElement : SVGElement,
+                                                 SVGTests,
+                                                 SVGLangSpace,
+                                                 SVGExternalResourcesRequired,
+                                                 SVGStylable,
+                                                 SVGTransformable {
+        readonly attribute SVGAnimatedLength x;
+        readonly attribute SVGAnimatedLength y;
+        readonly attribute SVGAnimatedLength width;
+        readonly attribute SVGAnimatedLength height;
+        readonly attribute SVGAnimatedLength rx;
+        readonly attribute SVGAnimatedLength ry;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGRenderingIntent.idl b/elemental/idl/third_party/WebCore/svg/SVGRenderingIntent.idl
new file mode 100644
index 0000000..c66d648
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGRenderingIntent.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        SuppressToJSObject
+    ] SVGRenderingIntent {
+        // Rendering Intent Types
+        const unsigned short RENDERING_INTENT_UNKNOWN               = 0;
+        const unsigned short RENDERING_INTENT_AUTO                  = 1;
+        const unsigned short RENDERING_INTENT_PERCEPTUAL            = 2;
+        const unsigned short RENDERING_INTENT_RELATIVE_COLORIMETRIC = 3;
+        const unsigned short RENDERING_INTENT_SATURATION            = 4;
+        const unsigned short RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGSVGElement.idl b/elemental/idl/third_party/WebCore/svg/SVGSVGElement.idl
new file mode 100644
index 0000000..54f4c61
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGSVGElement.idl
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005, 2010 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    // TODO: no css::ViewCSS available!
+    // TODO: Fix SVGSVGElement inheritance (css::DocumentCSS)! 
+    // TODO: no events::DocumentEvent available!
+    interface [
+        Conditional=SVG
+    ] SVGSVGElement : SVGElement,
+                                                SVGTests,
+                                                SVGLangSpace,
+                                                SVGExternalResourcesRequired,
+                                                SVGStylable,
+                                                SVGLocatable,
+                                                SVGFitToViewBox,
+                                                SVGZoomAndPan {
+        readonly attribute SVGAnimatedLength x;
+        readonly attribute SVGAnimatedLength y;
+        readonly attribute SVGAnimatedLength width;
+        readonly attribute SVGAnimatedLength height;
+                 attribute DOMString contentScriptType
+                     /*setter raises(DOMException)*/;
+                 attribute DOMString contentStyleType
+                     /*setter raises(DOMException)*/;
+        readonly attribute SVGRect viewport;
+        readonly attribute float pixelUnitToMillimeterX;
+        readonly attribute float pixelUnitToMillimeterY;
+        readonly attribute float screenPixelToMillimeterX;
+        readonly attribute float screenPixelToMillimeterY;
+        readonly attribute boolean useCurrentView;
+        readonly attribute SVGViewSpec currentView;
+                 attribute float currentScale
+                     /*setter raises(DOMException)*/;
+        readonly attribute SVGPoint currentTranslate;
+
+        unsigned long suspendRedraw(in [Optional=DefaultIsUndefined] unsigned long maxWaitMilliseconds);
+        void unsuspendRedraw(in [Optional=DefaultIsUndefined] unsigned long suspendHandleId);
+        void unsuspendRedrawAll();
+        void forceRedraw();
+        void pauseAnimations();
+        void unpauseAnimations();
+        boolean animationsPaused();
+        float getCurrentTime();
+        void setCurrentTime(in [Optional=DefaultIsUndefined] float seconds);
+        NodeList getIntersectionList(in [Optional=DefaultIsUndefined] SVGRect rect, 
+                                     in [Optional=DefaultIsUndefined] SVGElement referenceElement);
+        NodeList getEnclosureList(in [Optional=DefaultIsUndefined] SVGRect rect, 
+                                  in [Optional=DefaultIsUndefined] SVGElement referenceElement);
+        boolean checkIntersection(in [Optional=DefaultIsUndefined] SVGElement element, 
+                                  in [Optional=DefaultIsUndefined] SVGRect rect);
+        boolean checkEnclosure(in [Optional=DefaultIsUndefined] SVGElement element, 
+                               in [Optional=DefaultIsUndefined] SVGRect rect);
+        void deselectAll();
+
+        SVGNumber createSVGNumber();
+        SVGLength createSVGLength();
+        SVGAngle createSVGAngle();
+        SVGPoint createSVGPoint();
+        SVGMatrix createSVGMatrix();
+        SVGRect createSVGRect();
+        SVGTransform createSVGTransform();
+        SVGTransform createSVGTransformFromMatrix(in [Optional=DefaultIsUndefined] SVGMatrix matrix);
+        Element getElementById(in [Optional=DefaultIsUndefined] DOMString elementId);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGScriptElement.idl b/elemental/idl/third_party/WebCore/svg/SVGScriptElement.idl
new file mode 100644
index 0000000..111ee59
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGScriptElement.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGScriptElement : SVGElement,
+                                                   SVGURIReference,
+                                                   SVGExternalResourcesRequired {
+                 attribute [TreatNullAs=NullString] DOMString type
+                     /*setter raises(DOMException)*/;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGSetElement.idl b/elemental/idl/third_party/WebCore/svg/SVGSetElement.idl
new file mode 100644
index 0000000..a285789
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGSetElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGSetElement : SVGAnimationElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGStopElement.idl b/elemental/idl/third_party/WebCore/svg/SVGStopElement.idl
new file mode 100644
index 0000000..14a2ba3
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGStopElement.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGStopElement : SVGElement,
+                                                 SVGStylable {
+        readonly attribute SVGAnimatedNumber offset;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGStringList.idl b/elemental/idl/third_party/WebCore/svg/SVGStringList.idl
new file mode 100644
index 0000000..9d94e71
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGStringList.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGStringList {
+        readonly attribute unsigned long numberOfItems;
+
+        void clear()
+            raises(DOMException);
+        [StrictTypeChecking] DOMString initialize(in DOMString item)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] DOMString getItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] DOMString insertItemBefore(in DOMString item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] DOMString replaceItem(in DOMString item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] DOMString removeItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] DOMString appendItem(in DOMString item)
+            raises(DOMException, SVGException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGStylable.idl b/elemental/idl/third_party/WebCore/svg/SVGStylable.idl
new file mode 100644
index 0000000..53269c9
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGStylable.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2007 Rob Buis <rwlbuis@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        SuppressToJSObject,
+        OmitConstructor
+    ] SVGStylable {
+        readonly attribute SVGAnimatedString className;
+        readonly attribute CSSStyleDeclaration style;
+
+        CSSValue getPresentationAttribute(in [Optional=DefaultIsUndefined] DOMString name);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGStyleElement.idl b/elemental/idl/third_party/WebCore/svg/SVGStyleElement.idl
new file mode 100644
index 0000000..7fbe999
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGStyleElement.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGStyleElement : SVGElement,
+                                                  SVGLangSpace {
+                 attribute boolean disabled;
+                 attribute DOMString type
+                     setter raises(DOMException);
+                 attribute DOMString media
+                     setter raises(DOMException);
+                 attribute DOMString title
+                     setter raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGSwitchElement.idl b/elemental/idl/third_party/WebCore/svg/SVGSwitchElement.idl
new file mode 100644
index 0000000..10f8332
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGSwitchElement.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGSwitchElement : SVGElement,
+                                                   SVGTests,
+                                                   SVGLangSpace,
+                                                   SVGExternalResourcesRequired,
+                                                   SVGStylable,
+                                                   SVGTransformable {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGSymbolElement.idl b/elemental/idl/third_party/WebCore/svg/SVGSymbolElement.idl
new file mode 100644
index 0000000..f214116
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGSymbolElement.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGSymbolElement : SVGElement,
+                                                   SVGLangSpace,
+                                                   SVGExternalResourcesRequired,
+                                                   SVGStylable,
+                                                   SVGFitToViewBox {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTRefElement.idl b/elemental/idl/third_party/WebCore/svg/SVGTRefElement.idl
new file mode 100644
index 0000000..08637f4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTRefElement.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGTRefElement : SVGTextPositioningElement,
+                                                 SVGURIReference {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTSpanElement.idl b/elemental/idl/third_party/WebCore/svg/SVGTSpanElement.idl
new file mode 100644
index 0000000..5aec3a8
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTSpanElement.idl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGTSpanElement : SVGTextPositioningElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTests.idl b/elemental/idl/third_party/WebCore/svg/SVGTests.idl
new file mode 100644
index 0000000..d9f79cc
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTests.idl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        SuppressToJSObject,
+        OmitConstructor
+    ] SVGTests {
+        readonly attribute SVGStringList requiredFeatures;
+        readonly attribute SVGStringList requiredExtensions;
+        readonly attribute SVGStringList systemLanguage;
+
+        boolean hasExtension(in [Optional=DefaultIsUndefined] DOMString extension);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTextContentElement.idl b/elemental/idl/third_party/WebCore/svg/SVGTextContentElement.idl
new file mode 100644
index 0000000..6ce8a53
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTextContentElement.idl
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGTextContentElement : SVGElement,
+                                                        SVGTests,
+                                                        SVGLangSpace,
+                                                        SVGExternalResourcesRequired,
+                                                        SVGStylable {
+        // lengthAdjust Types
+        const unsigned short LENGTHADJUST_UNKNOWN          = 0;
+        const unsigned short LENGTHADJUST_SPACING          = 1;
+        const unsigned short LENGTHADJUST_SPACINGANDGLYPHS = 2;
+
+        readonly attribute SVGAnimatedLength      textLength;
+        readonly attribute SVGAnimatedEnumeration lengthAdjust;
+
+        long getNumberOfChars();
+        float getComputedTextLength();
+        float getSubStringLength(in [Optional=DefaultIsUndefined,IsIndex] unsigned long offset, 
+                                 in [Optional=DefaultIsUndefined,IsIndex] unsigned long length)
+            raises(DOMException);
+        SVGPoint getStartPositionOfChar(in [Optional=DefaultIsUndefined,IsIndex] unsigned long offset)
+            raises(DOMException);
+        SVGPoint getEndPositionOfChar(in [Optional=DefaultIsUndefined,IsIndex] unsigned long offset)
+            raises(DOMException);
+        SVGRect getExtentOfChar(in [Optional=DefaultIsUndefined,IsIndex] unsigned long offset)
+            raises(DOMException);
+        float getRotationOfChar(in [Optional=DefaultIsUndefined,IsIndex] unsigned long offset)
+            raises(DOMException);
+        long getCharNumAtPosition(in [Optional=DefaultIsUndefined] SVGPoint point);
+        void selectSubString(in [Optional=DefaultIsUndefined,IsIndex] unsigned long offset, 
+                             in [Optional=DefaultIsUndefined,IsIndex] unsigned long length)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTextElement.idl b/elemental/idl/third_party/WebCore/svg/SVGTextElement.idl
new file mode 100644
index 0000000..a381dd2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTextElement.idl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGTextElement : SVGTextPositioningElement,
+                                                 SVGTransformable {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTextPathElement.idl b/elemental/idl/third_party/WebCore/svg/SVGTextPathElement.idl
new file mode 100644
index 0000000..0904a0c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTextPathElement.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGTextPathElement : SVGTextContentElement,
+                                                     SVGURIReference {    
+        // textPath Method Types
+        const unsigned short TEXTPATH_METHODTYPE_UNKNOWN   = 0;
+        const unsigned short TEXTPATH_METHODTYPE_ALIGN     = 1;
+        const unsigned short TEXTPATH_METHODTYPE_STRETCH   = 2;
+
+        // textPath Spacing Types
+        const unsigned short TEXTPATH_SPACINGTYPE_UNKNOWN  = 0;
+        const unsigned short TEXTPATH_SPACINGTYPE_AUTO     = 1;
+        const unsigned short TEXTPATH_SPACINGTYPE_EXACT    = 2;
+
+        readonly attribute SVGAnimatedLength startOffset;
+        readonly attribute SVGAnimatedEnumeration method;
+        readonly attribute SVGAnimatedEnumeration spacing;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTextPositioningElement.idl b/elemental/idl/third_party/WebCore/svg/SVGTextPositioningElement.idl
new file mode 100644
index 0000000..0410f77
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTextPositioningElement.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGTextPositioningElement : SVGTextContentElement {
+        readonly attribute SVGAnimatedLengthList x;
+        readonly attribute SVGAnimatedLengthList y;
+        readonly attribute SVGAnimatedLengthList dx;
+        readonly attribute SVGAnimatedLengthList dy;
+        readonly attribute SVGAnimatedNumberList rotate;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTitleElement.idl b/elemental/idl/third_party/WebCore/svg/SVGTitleElement.idl
new file mode 100644
index 0000000..2cf241b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTitleElement.idl
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGTitleElement : SVGElement,
+                                                  SVGLangSpace,
+                                                  SVGStylable {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTransform.idl b/elemental/idl/third_party/WebCore/svg/SVGTransform.idl
new file mode 100644
index 0000000..e3e9f5e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTransform.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGTransform { 
+        // Transform Types
+        const unsigned short SVG_TRANSFORM_UNKNOWN = 0;
+        const unsigned short SVG_TRANSFORM_MATRIX = 1;
+        const unsigned short SVG_TRANSFORM_TRANSLATE = 2;
+        const unsigned short SVG_TRANSFORM_SCALE = 3;
+        const unsigned short SVG_TRANSFORM_ROTATE = 4;
+        const unsigned short SVG_TRANSFORM_SKEWX = 5;
+        const unsigned short SVG_TRANSFORM_SKEWY = 6;
+
+        readonly attribute unsigned short type;
+        readonly attribute SVGMatrix matrix;
+        readonly attribute float angle;
+
+        [StrictTypeChecking] void setMatrix(in SVGMatrix matrix);
+        [StrictTypeChecking] void setTranslate(in float tx, in float ty);
+        [StrictTypeChecking] void setScale(in float sx, in float sy);
+        [StrictTypeChecking] void setRotate(in float angle, in float cx, in float cy);
+        [StrictTypeChecking] void setSkewX(in float angle);
+        [StrictTypeChecking] void setSkewY(in float angle);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTransformList.idl b/elemental/idl/third_party/WebCore/svg/SVGTransformList.idl
new file mode 100644
index 0000000..590fe65
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTransformList.idl
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGTransformList {
+        readonly attribute unsigned long numberOfItems;
+
+        void clear()
+            raises(DOMException);
+        [StrictTypeChecking] SVGTransform initialize(in SVGTransform item)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGTransform getItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGTransform insertItemBefore(in SVGTransform item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGTransform replaceItem(in SVGTransform item, in unsigned long index)
+            raises(DOMException, SVGException);
+        [StrictTypeChecking] SVGTransform removeItem(in unsigned long index)
+            raises(DOMException);
+        [StrictTypeChecking] SVGTransform appendItem(in SVGTransform item)
+            raises(DOMException, SVGException);
+
+        [StrictTypeChecking] SVGTransform createSVGTransformFromMatrix(in SVGMatrix matrix)
+            raises(DOMException);
+
+        SVGTransform consolidate()
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGTransformable.idl b/elemental/idl/third_party/WebCore/svg/SVGTransformable.idl
new file mode 100644
index 0000000..1af3895
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGTransformable.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        OmitConstructor
+    ] SVGTransformable : SVGLocatable {
+        readonly attribute SVGAnimatedTransformList transform;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGURIReference.idl b/elemental/idl/third_party/WebCore/svg/SVGURIReference.idl
new file mode 100644
index 0000000..960873e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGURIReference.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        SuppressToJSObject,
+        OmitConstructor
+    ] SVGURIReference {
+        readonly attribute SVGAnimatedString href;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGUnitTypes.idl b/elemental/idl/third_party/WebCore/svg/SVGUnitTypes.idl
new file mode 100644
index 0000000..7ed8b0b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGUnitTypes.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        SuppressToJSObject
+    ] SVGUnitTypes {
+        // Unit Types
+        const unsigned short SVG_UNIT_TYPE_UNKNOWN           = 0;
+        const unsigned short SVG_UNIT_TYPE_USERSPACEONUSE    = 1;
+        const unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGUseElement.idl b/elemental/idl/third_party/WebCore/svg/SVGUseElement.idl
new file mode 100644
index 0000000..032f453
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGUseElement.idl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGUseElement : SVGElement,
+                                                SVGURIReference,
+                                                SVGTests,
+                                                SVGLangSpace,
+                                                SVGExternalResourcesRequired,
+                                                SVGStylable,
+                                                SVGTransformable {
+        readonly attribute SVGAnimatedLength   x;
+        readonly attribute SVGAnimatedLength   y;
+        readonly attribute SVGAnimatedLength   width;
+        readonly attribute SVGAnimatedLength   height;
+
+        readonly attribute SVGElementInstance instanceRoot;
+        readonly attribute SVGElementInstance animatedInstanceRoot;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGVKernElement.idl b/elemental/idl/third_party/WebCore/svg/SVGVKernElement.idl
new file mode 100644
index 0000000..7fe8dc2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGVKernElement.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG&SVG_FONTS
+    ] SVGVKernElement : SVGElement {
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGViewElement.idl b/elemental/idl/third_party/WebCore/svg/SVGViewElement.idl
new file mode 100644
index 0000000..04b2457
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGViewElement.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGViewElement : SVGElement,
+                                                 SVGExternalResourcesRequired,
+                                                 SVGFitToViewBox,
+                                                 SVGZoomAndPan {
+        readonly attribute SVGStringList viewTarget;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGViewSpec.idl b/elemental/idl/third_party/WebCore/svg/SVGViewSpec.idl
new file mode 100644
index 0000000..ec545d1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGViewSpec.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    // SVGViewSpec intentionally doesn't inherit from SVGZoomAndPan & SVGFitToViewBox on the IDLs.
+    // It would require that any of those classes would be RefCounted, and we want to avoid that.
+    interface [
+        Conditional=SVG,
+        JSGenerateToJSObject
+    ] SVGViewSpec {
+          readonly attribute SVGTransformList transform;
+          readonly attribute SVGElement viewTarget;
+          readonly attribute DOMString viewBoxString;
+          readonly attribute DOMString preserveAspectRatioString;
+          readonly attribute DOMString transformString;
+          readonly attribute DOMString viewTargetString;
+
+          // SVGZoomAndPan
+          attribute unsigned short zoomAndPan
+              setter raises(DOMException);
+
+          // SVGFitToViewBox
+          readonly attribute SVGAnimatedRect viewBox;
+          readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGZoomAndPan.idl b/elemental/idl/third_party/WebCore/svg/SVGZoomAndPan.idl
new file mode 100644
index 0000000..37621bb
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGZoomAndPan.idl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG,
+        ObjCProtocol,
+        SuppressToJSObject
+    ] SVGZoomAndPan {
+        const unsigned short SVG_ZOOMANDPAN_UNKNOWN = 0;
+        const unsigned short SVG_ZOOMANDPAN_DISABLE = 1;
+        const unsigned short SVG_ZOOMANDPAN_MAGNIFY = 2;
+
+        attribute unsigned short zoomAndPan;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/svg/SVGZoomEvent.idl b/elemental/idl/third_party/WebCore/svg/SVGZoomEvent.idl
new file mode 100644
index 0000000..a288237
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/svg/SVGZoomEvent.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+module svg {
+
+    interface [
+        Conditional=SVG
+    ] SVGZoomEvent : UIEvent { 
+        readonly attribute SVGRect zoomRectScreen;
+        readonly attribute float previousScale;
+        readonly attribute [Immutable] SVGPoint previousTranslate;
+        readonly attribute float newScale;
+        readonly attribute [Immutable] SVGPoint newTranslate;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/testing/InternalSettings.idl b/elemental/idl/third_party/WebCore/testing/InternalSettings.idl
new file mode 100644
index 0000000..53c5176
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/testing/InternalSettings.idl
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+    interface [
+        OmitConstructor
+    ] InternalSettings {
+        void setInspectorResourcesDataSizeLimits(in long maximumResourcesContentSize, in long maximumSingleResourceContentSize) raises(DOMException);
+        void setForceCompositingMode(in boolean enabled) raises(DOMException);
+        void setEnableCompositingForFixedPosition(in boolean enabled) raises(DOMException);
+        void setEnableCompositingForScrollableFrames(in boolean enabled) raises(DOMException);
+        void setAcceleratedDrawingEnabled(in boolean enabled) raises(DOMException);
+        void setAcceleratedFiltersEnabled(in boolean enabled) raises(DOMException);
+        void setMockScrollbarsEnabled(in boolean enabled) raises(DOMException);
+        void setPasswordEchoEnabled(in boolean enabled) raises(DOMException);
+        void setPasswordEchoDurationInSeconds(in double durationInSeconds) raises(DOMException);
+        void setFixedElementsLayoutRelativeToFrame(in boolean enabled) raises(DOMException);
+        void setUnifiedTextCheckingEnabled(in boolean enabled) raises (DOMException);
+        boolean unifiedTextCheckingEnabled() raises (DOMException);
+        void setPageScaleFactor(in float scaleFactor, in long x, in long y) raises(DOMException);
+        void setTouchEventEmulationEnabled(in boolean enabled) raises(DOMException);
+        void setDeviceSupportsTouch(in boolean enabled) raises(DOMException);
+        void setShadowDOMEnabled(in boolean enabled) raises(DOMException);
+        void setStandardFontFamily(in DOMString family, in DOMString script) raises(DOMException);
+        void setSerifFontFamily(in DOMString family, in DOMString script) raises(DOMException);
+        void setSansSerifFontFamily(in DOMString family, in DOMString script) raises(DOMException);
+        void setFixedFontFamily(in DOMString family, in DOMString script) raises(DOMException);
+        void setCursiveFontFamily(in DOMString family, in DOMString script) raises(DOMException);
+        void setFantasyFontFamily(in DOMString family, in DOMString script) raises(DOMException);
+        void setPictographFontFamily(in DOMString family, in DOMString script) raises(DOMException);
+        void setEnableScrollAnimator(in boolean enabled) raises(DOMException);
+        boolean scrollAnimatorEnabled() raises(DOMException);
+        void setCSSExclusionsEnabled(in boolean enabled) raises(DOMException);
+        void setMediaPlaybackRequiresUserGesture(in boolean enabled) raises(DOMException);
+        void setEditingBehavior(in DOMString behavior) raises(DOMException);
+        void setFixedPositionCreatesStackingContext(in boolean creates) raises(DOMException);
+        void setSyncXHRInDocumentsEnabled(in boolean enabled) raises(DOMException);
+        void setJavaScriptProfilingEnabled(in boolean creates) raises(DOMException);
+        void setWindowFocusRestricted(in boolean restricted) raises(DOMException);
+    };
+}
+
diff --git a/elemental/idl/third_party/WebCore/testing/Internals.idl b/elemental/idl/third_party/WebCore/testing/Internals.idl
new file mode 100644
index 0000000..aa10858
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/testing/Internals.idl
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module window {
+    interface [
+        OmitConstructor
+    ] Internals {
+        DOMString address(in Node node);
+
+        DOMString elementRenderTreeAsText(in Element element) raises(DOMException);
+        boolean isPreloaded(in Document document, in DOMString url);
+
+        unsigned long numberOfScopedHTMLStyleChildren(in Node scope) raises(DOMException);
+
+#if defined(ENABLE_SHADOW_DOM)
+        ShadowRoot ensureShadowRoot(in Element host) raises (DOMException);
+        ShadowRoot shadowRoot(in Element host) raises (DOMException);
+        ShadowRoot youngestShadowRoot(in Element host) raises (DOMException);
+        ShadowRoot oldestShadowRoot(in Element host) raises (DOMException);
+        ShadowRoot youngerShadowRoot(in Node root) raises (DOMException);
+        ShadowRoot olderShadowRoot(in Node root) raises (DOMException);
+#else
+        Node ensureShadowRoot(in Element host) raises (DOMException);
+        Node shadowRoot(in Element host) raises (DOMException);
+        Node youngestShadowRoot(in Element host) raises (DOMException);
+        Node oldestShadowRoot(in Element host) raises (DOMException);
+        Node youngerShadowRoot(in Node root) raises (DOMException);
+#endif
+        Element includerFor(in Node node) raises (DOMException);
+        DOMString shadowPseudoId(in Element element) raises (DOMException);
+        Element createContentElement(in Document document) raises(DOMException);
+        Element getElementByIdInShadowRoot(in Node shadowRoot, in DOMString id) raises(DOMException);
+        boolean isValidContentSelect(in Element contentElement) raises(DOMException);
+        Node treeScopeRootNode(in Node node) raises (DOMException);
+
+        Node nextSiblingByWalker(in Node node) raises(DOMException);
+        Node firstChildByWalker(in Node node) raises(DOMException);
+        Node lastChildByWalker(in Node node) raises(DOMException);
+        Node nextNodeByWalker(in Node node) raises(DOMException);
+        Node previousNodeByWalker(in Node node) raises(DOMException);
+
+        boolean attached(in Node node) raises(DOMException);
+
+        DOMString visiblePlaceholder(in Element element);
+#if defined(ENABLE_INPUT_TYPE_COLOR) && ENABLE_INPUT_TYPE_COLOR
+        void selectColorInColorChooser(in Element element, in DOMString colorValue);
+#endif
+
+        ClientRect absoluteCaretBounds(in Document document) raises(DOMException);
+
+        ClientRect boundingBox(in Element element) raises(DOMException);
+
+        ClientRectList inspectorHighlightRects(in Document document) raises (DOMException);
+
+        void setBackgroundBlurOnNode(in Node node, in long blurLength) raises(DOMException);
+
+        unsigned long markerCountForNode(in Node node, in DOMString markerType) raises(DOMException);
+        Range markerRangeForNode(in Node node, in DOMString markerType, in unsigned long index) raises(DOMException);
+        DOMString markerDescriptionForNode(in Node node, in DOMString markerType, in unsigned long index) raises(DOMException);
+
+        void setScrollViewPosition(in Document document, in long x, in long y) raises(DOMException);
+
+        void setPagination(in Document document, in DOMString mode, in long gap) raises(DOMException);
+
+        boolean wasLastChangeUserEdit(in Element textField) raises (DOMException);
+        DOMString suggestedValue(in Element inputElement) raises (DOMException);
+        void setSuggestedValue(in Element inputElement, in DOMString value) raises (DOMException);
+        void setEditingValue(in Element inputElement, in DOMString value) raises (DOMException);
+
+        void paintControlTints(in Document document) raises (DOMException);
+
+        void scrollElementToRect(in Element element, in long x, in long y, in long w, in long h) raises (DOMException);
+
+        Range rangeFromLocationAndLength(in Element scope, in long rangeLocation, in long rangeLength) raises (DOMException);
+        unsigned long locationFromRange(in Element scope, in Range range) raises (DOMException);
+        unsigned long lengthFromRange(in Element scope, in Range range) raises (DOMException);
+        DOMString rangeAsText(in Range range) raises (DOMException);
+
+        void setDelegatesScrolling(in boolean enabled, in Document document) raises (DOMException);
+#if defined(ENABLE_TOUCH_ADJUSTMENT) && ENABLE_TOUCH_ADJUSTMENT
+        WebKitPoint touchPositionAdjustedToBestClickableNode(in long x, in long y, in long width, in long height, in Document document) raises (DOMException);
+        Node touchNodeAdjustedToBestClickableNode(in long x, in long y, in long width, in long height, in Document document) raises (DOMException);
+        ClientRect bestZoomableAreaForTouchPoint(in long x, in long y, in long width, in long height, in Document document) raises (DOMException);
+#endif
+
+        long lastSpellCheckRequestSequence(in Document document) raises (DOMException);
+        long lastSpellCheckProcessedSequence(in Document document) raises (DOMException);
+
+#if defined(ENABLE_VIDEO_TRACK) && ENABLE_VIDEO_TRACK
+        void setShouldDisplayTrackKind(in Document document, in DOMString kind, in boolean enabled) raises (DOMException);
+        boolean shouldDisplayTrackKind(in Document document, in DOMString trackKind) raises (DOMException);
+#endif
+
+        attribute sequence<String> userPreferredLanguages;
+
+        unsigned long wheelEventHandlerCount(in Document document) raises (DOMException);
+        unsigned long touchEventHandlerCount(in Document document) raises (DOMException);
+
+        NodeList nodesFromRect(in Document document, in long x, in long y,
+            in unsigned long topPadding, in unsigned long rightPadding, in unsigned long bottomPadding, in unsigned long leftPadding,
+            in boolean ignoreClipping, in boolean allowShadowContent) raises (DOMException);
+
+        void emitInspectorDidBeginFrame();
+        void emitInspectorDidCancelFrame();
+
+        boolean hasSpellingMarker(in Document document, in long from, in long length) raises (DOMException);
+        boolean hasGrammarMarker(in Document document, in long from, in long length) raises (DOMException);
+
+        unsigned long numberOfScrollableAreas(in Document document) raises (DOMException);
+
+        boolean isPageBoxVisible(in Document document, in long pageNumber) raises (DOMException);
+
+        readonly attribute InternalSettings settings;
+
+        void suspendAnimations(in Document document) raises (DOMException);
+        void resumeAnimations(in Document document) raises (DOMException);
+
+        void allowRoundingHacks();
+
+#if defined(ENABLE_BATTERY_STATUS) && ENABLE_BATTERY_STATUS
+        void setBatteryStatus(in Document document, in DOMString eventType, in boolean charging, in double chargingTime, in double dischargingTime, in double level) raises (DOMException);
+#endif
+
+#if defined(ENABLE_NETWORK_INFO) && ENABLE_NETWORK_INFO
+        void setNetworkInformation(in Document document, in DOMString eventType, in long bandwidth, in boolean metered) raises (DOMException);
+#endif
+
+        [Conditional=INSPECTOR] unsigned long numberOfLiveNodes();
+        [Conditional=INSPECTOR] unsigned long numberOfLiveDocuments();
+        [Conditional=INSPECTOR] sequence<String> consoleMessageArgumentCounts(in Document document);
+
+#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
+        void webkitWillEnterFullScreenForElement(in Document document, in Element element);
+        void webkitDidEnterFullScreenForElement(in Document document, in Element element);
+        void webkitWillExitFullScreenForElement(in Document document, in Element element);
+        void webkitDidExitFullScreenForElement(in Document document, in Element element);
+#endif
+    };
+}
+
diff --git a/elemental/idl/third_party/WebCore/workers/AbstractWorker.idl b/elemental/idl/third_party/WebCore/workers/AbstractWorker.idl
new file mode 100644
index 0000000..3c90d1e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/workers/AbstractWorker.idl
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module threads {
+
+    interface [
+        Conditional=WORKERS,
+        ActiveDOMObject,
+        JSCustomToJSObject,
+        EventTarget
+    ] AbstractWorker {
+
+        attribute EventListener onerror;
+
+        void addEventListener(in DOMString type,
+                              in EventListener listener,
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type,
+                                 in EventListener listener,
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/workers/DedicatedWorkerContext.idl b/elemental/idl/third_party/WebCore/workers/DedicatedWorkerContext.idl
new file mode 100644
index 0000000..48ecfdc
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/workers/DedicatedWorkerContext.idl
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2009, 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module threads {
+
+    interface [
+        Conditional=WORKERS,
+        ExtendsDOMGlobalObject,
+        IsWorkerContext,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        OmitConstructor
+    ] DedicatedWorkerContext : WorkerContext {
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [Custom] void postMessage(in any message, in [Optional] Array messagePorts)
+            raises(DOMException);
+        [Custom] void webkitPostMessage(in any message, in [Optional] Array transferList)
+            raises(DOMException);
+#else
+        // There's no good way to expose an array via the ObjC bindings, so for now just allow passing in a single port.
+        void postMessage(in DOMString message, in [Optional] MessagePort messagePort)
+            raises(DOMException);
+#endif
+#endif
+
+                 attribute EventListener onmessage;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/workers/SharedWorker.idl b/elemental/idl/third_party/WebCore/workers/SharedWorker.idl
new file mode 100644
index 0000000..40ccdd4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/workers/SharedWorker.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module threads {
+
+    interface [
+        Conditional=SHARED_WORKERS,
+        ActiveDOMObject,
+        JSCustomConstructor,
+        Constructor(in DOMString scriptURL, in [Optional=DefaultIsNullString] DOMString name),
+        CallWith=ScriptExecutionContext,
+        ConstructorRaisesException,
+        JSCustomMarkFunction,
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject
+    ] SharedWorker : AbstractWorker {
+        readonly attribute MessagePort port;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/workers/SharedWorkerContext.idl b/elemental/idl/third_party/WebCore/workers/SharedWorkerContext.idl
new file mode 100644
index 0000000..6769811
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/workers/SharedWorkerContext.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module threads {
+
+    interface [
+        Conditional=SHARED_WORKERS,
+        ExtendsDOMGlobalObject,
+        IsWorkerContext,
+        JSGenerateToNativeObject,
+        JSNoStaticTables,
+        OmitConstructor
+    ] SharedWorkerContext : WorkerContext {
+
+        readonly attribute DOMString name;
+                 attribute EventListener onconnect;
+
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/workers/Worker.idl b/elemental/idl/third_party/WebCore/workers/Worker.idl
new file mode 100644
index 0000000..083353c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/workers/Worker.idl
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2008, 2010 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2011 Google Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module threads {
+
+    interface [
+        Conditional=WORKERS,
+        ActiveDOMObject,
+        JSCustomConstructor,
+        Constructor(in DOMString scriptUrl),
+        CallWith=ScriptExecutionContext,
+        ConstructorRaisesException,
+        JSGenerateToNativeObject,
+        JSGenerateToJSObject
+    ] Worker : AbstractWorker {
+
+        attribute EventListener onmessage;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        [Custom] void postMessage(in SerializedScriptValue message, in [Optional] Array messagePorts)
+            raises(DOMException);
+        [Custom] void webkitPostMessage(in SerializedScriptValue message, in [Optional] Array messagePorts)
+            raises(DOMException);
+#else
+        // There's no good way to expose an array via the ObjC bindings, so for now just allow passing in a single port.
+        void postMessage(in SerializedScriptValue message, in [Optional] MessagePort messagePort)
+            raises(DOMException);
+#endif
+
+        void terminate();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/workers/WorkerContext.idl b/elemental/idl/third_party/WebCore/workers/WorkerContext.idl
new file mode 100644
index 0000000..65a64fd
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/workers/WorkerContext.idl
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+
+module threads {
+
+    interface [
+        Conditional=WORKERS,
+        JSCustomMarkFunction,
+        JSCustomGetOwnPropertySlotAndDescriptor,
+        EventTarget,
+        ExtendsDOMGlobalObject,
+        IsWorkerContext,
+        JSLegacyParent=JSWorkerContextBase,
+        JSNoStaticTables,
+        OmitConstructor,
+        V8CustomToJSObject
+    ] WorkerContext {
+
+        // WorkerGlobalScope
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+                 attribute [Replaceable] WorkerContext self;
+#endif
+                 attribute [Replaceable] WorkerLocation location;
+        void close();
+                 attribute EventListener onerror;
+
+        // WorkerUtils
+        [Custom] void importScripts(/*[Variadic] in DOMString urls */);
+                 attribute [Replaceable] WorkerNavigator navigator;
+
+        // Timers
+        [Custom] long setTimeout(in TimeoutHandler handler, in long timeout);
+        // [Custom] long setTimeout(in DOMString code, in long timeout);
+        void clearTimeout(in [Optional=DefaultIsUndefined] long handle);
+        [Custom] long setInterval(in TimeoutHandler handler, in long timeout);
+        // [Custom] long setInterval(in DOMString code, in long timeout);
+        void clearInterval(in [Optional=DefaultIsUndefined] long handle);
+
+
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+
+#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
+        // Constructors
+        attribute MessageEventConstructor MessageEvent;
+        attribute WorkerLocationConstructor WorkerLocation;
+
+#if ENABLE_CHANNEL_MESSAGING
+        attribute [JSCustomGetter] MessageChannelConstructor MessageChannel;
+#endif
+        attribute [JSCustomGetter] EventSourceConstructor EventSource;
+        attribute [JSCustomGetter] XMLHttpRequestConstructor XMLHttpRequest;
+#endif
+
+#if defined(ENABLE_BLOB) && ENABLE_BLOB
+        attribute [Conditional=LEGACY_WEBKIT_BLOB_BUILDER] WebKitBlobBuilderConstructor WebKitBlobBuilder;
+        attribute BlobConstructor Blob;
+        attribute FileReaderConstructor FileReader;
+        attribute FileReaderSyncConstructor FileReaderSync;
+#endif
+
+        attribute [Conditional=BLOB] DOMURLConstructor webkitURL;
+
+        attribute ArrayBufferConstructor ArrayBuffer; // Usable with new operator
+        attribute Int8ArrayConstructor Int8Array; // Usable with new operator
+        attribute Uint8ArrayConstructor Uint8Array; // Usable with new operator
+        attribute Uint8ArrayConstructor Uint8ClampedArray; // Usable with new operator
+        attribute Int16ArrayConstructor Int16Array; // Usable with new operator
+        attribute Uint16ArrayConstructor Uint16Array; // Usable with new operator
+        attribute Int32ArrayConstructor Int32Array; // Usable with new operator
+        attribute Uint32ArrayConstructor Uint32Array; // Usable with new operator
+        attribute Float32ArrayConstructor Float32Array; // Usable with new operator
+        attribute Float64ArrayConstructor Float64Array; // Usable with new operator
+        attribute DataViewConstructor DataView; // Usable with new operator
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/workers/WorkerLocation.idl b/elemental/idl/third_party/WebCore/workers/WorkerLocation.idl
new file mode 100644
index 0000000..3b302c4
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/workers/WorkerLocation.idl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2008 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution. 
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission. 
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module threads {
+
+    interface [
+        Conditional=WORKERS,
+        JSGenerateIsReachable=Impl,
+        JSNoStaticTables
+    ] WorkerLocation {
+        readonly attribute DOMString href;
+        readonly attribute DOMString protocol;
+        readonly attribute DOMString host;
+        readonly attribute DOMString hostname;
+        readonly attribute DOMString port;
+        readonly attribute DOMString pathname;
+        readonly attribute DOMString search;
+        readonly attribute DOMString hash;
+
+        [NotEnumerable] DOMString toString();
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/DOMParser.idl b/elemental/idl/third_party/WebCore/xml/DOMParser.idl
new file mode 100644
index 0000000..5e51bc1
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/DOMParser.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module xpath {
+    interface [
+        Constructor
+    ] DOMParser {
+        Document parseFromString(in [Optional=DefaultIsUndefined] DOMString str, 
+                                 in [Optional=DefaultIsUndefined] DOMString contentType);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XMLHttpRequest.idl b/elemental/idl/third_party/WebCore/xml/XMLHttpRequest.idl
new file mode 100644
index 0000000..0dcedfe
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XMLHttpRequest.idl
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2008, 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module xml {
+
+    interface [
+        ActiveDOMObject,
+        Constructor,
+        CallWith=ScriptExecutionContext,
+        V8CustomConstructor,
+        JSCustomMarkFunction,
+        EventTarget,
+        JSNoStaticTables
+    ] XMLHttpRequest {
+        // From XMLHttpRequestEventTarget
+        // event handler attributes
+        attribute EventListener onabort;
+        attribute EventListener onerror;
+        attribute EventListener onload;
+        attribute EventListener onloadend;
+        attribute EventListener onloadstart;
+        attribute EventListener onprogress;
+
+        // event handler attributes
+        attribute EventListener onreadystatechange;
+
+        // state
+        const unsigned short UNSENT = 0;
+        const unsigned short OPENED = 1;
+        const unsigned short HEADERS_RECEIVED = 2;
+        const unsigned short LOADING = 3;
+        const unsigned short DONE = 4;
+
+        readonly attribute unsigned short readyState;
+
+        // request
+        attribute [Conditional=XHR_RESPONSE_BLOB, V8EnabledAtRuntime] boolean asBlob
+            setter raises(DOMException);
+
+        attribute boolean withCredentials
+            setter raises(DOMException);
+
+        [Custom] void open(in DOMString method, in DOMString url, in [Optional] boolean async, in [Optional] DOMString user, in [Optional] DOMString password)
+            raises(DOMException);
+
+        void setRequestHeader(in DOMString header, in DOMString value)
+            raises(DOMException);
+
+        [Custom] void send()
+            raises(DOMException);
+        [Custom] void send(in ArrayBuffer data)
+            raises(DOMException);
+        [Conditional=BLOB, Custom] void send(in Blob data)
+            raises(DOMException);
+        [Custom] void send(in Document data)
+            raises(DOMException);
+        [Custom] void send(in DOMString data)
+            raises(DOMException);
+        [Custom] void send(in DOMFormData data)
+            raises(DOMException);
+
+        void abort();
+
+        readonly attribute XMLHttpRequestUpload upload;
+
+        // response
+        [TreatReturnedNullStringAs=Undefined] DOMString getAllResponseHeaders()
+            raises(DOMException);
+        [TreatReturnedNullStringAs=Null] DOMString getResponseHeader(in DOMString header)
+            raises(DOMException);
+        readonly attribute [CustomGetter] DOMString responseText // The custom getter implements TreatReturnedNullStringAs=Null
+            getter raises(DOMException);
+        readonly attribute Document responseXML
+            getter raises(DOMException);
+        readonly attribute [Conditional=XHR_RESPONSE_BLOB, V8EnabledAtRuntime] Blob responseBlob
+            getter raises(DOMException);
+
+        attribute DOMString responseType
+            setter raises(DOMException);
+        readonly attribute [CustomGetter] Object response
+            getter raises(DOMException);
+
+        readonly attribute unsigned short status
+            getter raises(DOMException);
+        readonly attribute DOMString statusText
+            getter raises(DOMException);
+
+        // Extension
+        void overrideMimeType(in DOMString override);
+
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XMLHttpRequestException.idl b/elemental/idl/third_party/WebCore/xml/XMLHttpRequestException.idl
new file mode 100644
index 0000000..a0be458
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XMLHttpRequestException.idl
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module xml {
+
+    exception [
+        JSNoStaticTables,
+        DoNotCheckConstants
+    ] XMLHttpRequestException {
+
+        readonly attribute unsigned short   code;
+        readonly attribute DOMString        name;
+        readonly attribute DOMString        message;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // Override in a Mozilla compatible format
+        [NotEnumerable] DOMString toString();
+#endif
+
+        // XMLHttpRequestExceptionCode
+        const unsigned short NETWORK_ERR = 101;
+        const unsigned short ABORT_ERR = 102;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XMLHttpRequestProgressEvent.idl b/elemental/idl/third_party/WebCore/xml/XMLHttpRequestProgressEvent.idl
new file mode 100644
index 0000000..b1ca355
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XMLHttpRequestProgressEvent.idl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008, 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module events {
+
+    interface [
+        JSNoStaticTables
+    // We should also inherit from LSProgressEvent when the idl is added.
+    ] XMLHttpRequestProgressEvent : ProgressEvent {
+         readonly attribute unsigned long long position;
+         readonly attribute unsigned long long totalSize;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XMLHttpRequestUpload.idl b/elemental/idl/third_party/WebCore/xml/XMLHttpRequestUpload.idl
new file mode 100644
index 0000000..584c293
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XMLHttpRequestUpload.idl
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module xml {
+
+    interface [
+        JSGenerateIsReachable=Impl,
+        EventTarget,
+        JSNoStaticTables
+    ] XMLHttpRequestUpload {
+        // From XMLHttpRequestEventTarget
+        // event handler attributes
+        attribute EventListener onabort;
+        attribute EventListener onerror;
+        attribute EventListener onload;
+        attribute EventListener onloadend;
+        attribute EventListener onloadstart;
+        attribute EventListener onprogress;
+
+        // EventTarget interface
+        void addEventListener(in DOMString type, 
+                              in EventListener listener, 
+                              in [Optional] boolean useCapture);
+        void removeEventListener(in DOMString type, 
+                                 in EventListener listener, 
+                                 in [Optional] boolean useCapture);
+        boolean dispatchEvent(in Event evt)
+            raises(EventException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XMLSerializer.idl b/elemental/idl/third_party/WebCore/xml/XMLSerializer.idl
new file mode 100644
index 0000000..58327cc
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XMLSerializer.idl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Samuel Weinig (sam@webkit.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module xpath {
+
+    interface [
+        Constructor
+    ] XMLSerializer {
+        DOMString serializeToString(in [Optional=DefaultIsUndefined] Node node)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XPathEvaluator.idl b/elemental/idl/third_party/WebCore/xml/XPathEvaluator.idl
new file mode 100644
index 0000000..cb9950c
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XPathEvaluator.idl
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module xpath {
+    interface [
+        Constructor
+    ] XPathEvaluator {
+        XPathExpression createExpression(in [Optional=DefaultIsUndefined] DOMString expression,
+                                         in [Optional=DefaultIsUndefined] XPathNSResolver resolver)
+            raises(DOMException);
+
+        XPathNSResolver createNSResolver(in [Optional=DefaultIsUndefined] Node nodeResolver);
+
+        XPathResult evaluate(in [Optional=DefaultIsUndefined] DOMString expression,
+                             in [Optional=DefaultIsUndefined] Node contextNode, 
+                             in [Optional=DefaultIsUndefined] XPathNSResolver resolver,
+                             in [Optional=DefaultIsUndefined] unsigned short type,
+                             in [Optional=DefaultIsUndefined] XPathResult inResult)
+            raises(DOMException);
+    };
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XPathException.idl b/elemental/idl/third_party/WebCore/xml/XPathException.idl
new file mode 100644
index 0000000..cec0c54
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XPathException.idl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2007 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module xpath {
+
+    exception [
+        DoNotCheckConstants
+    ] XPathException {
+
+        readonly attribute unsigned short   code;
+        readonly attribute DOMString        name;
+        readonly attribute DOMString        message;
+
+#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
+        // Override in a Mozilla compatible format
+        [NotEnumerable] DOMString toString();
+#endif
+
+        // XPathExceptionCode
+        const unsigned short INVALID_EXPRESSION_ERR = 51;
+        const unsigned short TYPE_ERR = 52;
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XPathExpression.idl b/elemental/idl/third_party/WebCore/xml/XPathExpression.idl
new file mode 100644
index 0000000..5e60840
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XPathExpression.idl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module xpath {
+
+    interface XPathExpression {
+        [ObjCLegacyUnnamedParameters] XPathResult evaluate(in [Optional=DefaultIsUndefined] Node contextNode, 
+                                            in [Optional=DefaultIsUndefined] unsigned short type, 
+                                            in [Optional=DefaultIsUndefined] XPathResult inResult)
+            raises(DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XPathNSResolver.idl b/elemental/idl/third_party/WebCore/xml/XPathNSResolver.idl
new file mode 100644
index 0000000..e9fa41b
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XPathNSResolver.idl
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module xpath {
+
+    interface [
+        ObjCProtocol,
+        OmitConstructor
+    ] XPathNSResolver {
+        [TreatReturnedNullStringAs=Null] DOMString lookupNamespaceURI(in [Optional=DefaultIsUndefined] DOMString prefix);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XPathResult.idl b/elemental/idl/third_party/WebCore/xml/XPathResult.idl
new file mode 100644
index 0000000..77c5b8e
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XPathResult.idl
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+module xpath {
+
+    interface [
+        JSCustomMarkFunction
+    ] XPathResult {
+        const unsigned short ANY_TYPE                       = 0;
+        const unsigned short NUMBER_TYPE                    = 1;
+        const unsigned short STRING_TYPE                    = 2;
+        const unsigned short BOOLEAN_TYPE                   = 3;
+        const unsigned short UNORDERED_NODE_ITERATOR_TYPE   = 4;
+        const unsigned short ORDERED_NODE_ITERATOR_TYPE     = 5;
+        const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE   = 6;
+        const unsigned short ORDERED_NODE_SNAPSHOT_TYPE     = 7;
+        const unsigned short ANY_UNORDERED_NODE_TYPE        = 8;
+        const unsigned short FIRST_ORDERED_NODE_TYPE        = 9;
+
+        readonly attribute unsigned short  resultType;
+        readonly attribute double          numberValue
+            getter raises (DOMException);
+            
+        readonly attribute DOMString       stringValue
+            getter raises (DOMException);
+
+        readonly attribute boolean         booleanValue
+            getter raises (DOMException);
+
+        readonly attribute Node            singleNodeValue
+            getter raises (DOMException);
+
+        readonly attribute boolean         invalidIteratorState;
+        readonly attribute unsigned long   snapshotLength
+            getter raises (DOMException);
+            
+        Node iterateNext()
+            raises (DOMException);
+        Node snapshotItem(in [Optional=DefaultIsUndefined] unsigned long index)
+            raises (DOMException);
+    };
+
+}
diff --git a/elemental/idl/third_party/WebCore/xml/XSLTProcessor.idl b/elemental/idl/third_party/WebCore/xml/XSLTProcessor.idl
new file mode 100644
index 0000000..48ec6c2
--- /dev/null
+++ b/elemental/idl/third_party/WebCore/xml/XSLTProcessor.idl
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2008, 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module xml {
+
+    // Eventually we should implement XSLTException:
+    // http://lxr.mozilla.org/seamonkey/source/content/xsl/public/nsIXSLTException.idl
+    // http://bugs.webkit.org/show_bug.cgi?id=5446
+
+    interface [
+        Conditional=XSLT,
+        Constructor
+    ] XSLTProcessor {
+        
+        [Custom] void importStylesheet(in Node stylesheet);
+        [Custom] DocumentFragment transformToFragment(in Node source, in Document docVal);
+        [Custom] Document transformToDocument(in Node source);
+
+        [Custom] void setParameter(in DOMString namespaceURI, in DOMString localName, in DOMString value);
+        [Custom, TreatReturnedNullStringAs=Undefined] DOMString getParameter(in DOMString namespaceURI, in DOMString localName);
+        [Custom] void removeParameter(in DOMString namespaceURI, in DOMString localName);
+        void clearParameters();
+
+        void reset();
+
+    };
+
+}
diff --git a/elemental/src/elemental/Elemental.gwt.xml b/elemental/src/elemental/Elemental.gwt.xml
new file mode 100644
index 0000000..c388e65
--- /dev/null
+++ b/elemental/src/elemental/Elemental.gwt.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<module>
+  <inherits name="com.google.gwt.core.Core" />
+
+  <!-- Enables use of ClientBundle -->
+  <inherits name="com.google.gwt.resources.Resources" />
+  <set-configuration-property name="user.agent.runtimeWarning" value="false" />
+  <set-property name="user.agent" value="safari" />
+  <source path="client" />
+  <source path="js" />
+  <source path='canvas'/>
+  <source path='css'/>
+  <source path='dom'/>
+  <source path='events'/>
+  <source path='html'/>
+  <source path='json'/>
+  <source path='ranges'/>
+  <source path='stylesheets'/>
+  <source path='svg'/>
+  <source path='traversal'/>
+  <source path='xpath'/>
+  <source path='xml'/>
+  <source path='util'/>
+  <super-source path="super"/>
+</module>
diff --git a/elemental/src/elemental/client/Browser.java b/elemental/src/elemental/client/Browser.java
new file mode 100644
index 0000000..5786b70
--- /dev/null
+++ b/elemental/src/elemental/client/Browser.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.client;
+
+import elemental.dom.Document;
+import elemental.html.Window;
+import elemental.js.JsBrowser;
+
+/**
+ * Entry-point for getting the access to browser globals.
+ */
+public class Browser {
+
+  /**
+   * Provides limited user agent information for the current browser. The API is
+   * structured such that info can either be determined at runtime or
+   * constrained at compile time through GWT permutations.
+   * 
+   * TODO(knorton): Add the gwt.xml file that enables permutations.
+   */
+  public interface Info {
+    
+    /**
+     * Indicates whether the browser is a supported version of Gecko.
+     */
+    boolean isGecko();
+
+    /**
+     * Indicates whether the platform is Linux.
+     */
+    boolean isLinux();
+
+    /**
+     * Indicates whether the platform is Macintosh.
+     */
+    boolean isMac();
+    
+    /**
+     * Indicates whether the browser is one of the supported browsers.
+     */
+    boolean isSupported();
+    
+    /**
+     * Indicates whether the browser is a supported version of WebKit.
+     */
+    boolean isWebKit();
+    
+    /**
+     * Indicates whether the platform is Windows.
+     */
+    boolean isWindows();
+  }
+
+  /**
+   * Decodes a URI as specified in the ECMA-262, 5th edition specification,
+   * section 15.1.3.1.
+   * 
+   * @see "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf"
+   */
+  public static native String decodeURI(String encodedURI) /*-{
+    return decodeURI(encodedURI);
+  }-*/;
+
+  /**
+   * Encodes a URI compoment as specified in the ECMA-262, 5th edition specification,
+   * section 15.1.3.1.
+   * 
+   * @see "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf"
+   */
+  public static native String decodeURIComponent(String encodedUriComponent) /*-{
+    return decodeURIComponent(encodedUriComponent);
+  }-*/;
+
+  /**
+   * Encodes a URI as specified in the ECMA-262, 5th edition specification,
+   * section 15.1.3.1.
+   * 
+   * @see "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf"
+   */
+  public static native String encodeURI(String uri) /*-{
+    return encodeURI(uri);
+  }-*/;
+
+  /**
+   * Encodes a URI component as specified in the ECMA-262, 5th edition specification,
+   * section 15.1.3.1.
+   * 
+   * @see "http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf"
+   */
+  public static native String encodeURIComponent(String uriComponent) /*-{
+    return encodeURIComponent(uriComponent);
+  }-*/;
+
+  /**
+   * Gets the document within which this script is running.
+   */
+  public static Document getDocument() {
+    return JsBrowser.getDocument();
+  }
+
+  /**
+   * Gets information about the current browser.
+   */
+  public static Info getInfo() {
+    return JsBrowser.getInfo();
+  }
+
+  /**
+   * Gets the window within which this script is running.
+   */
+  public static Window getWindow() {
+    return JsBrowser.getWindow();
+  }
+
+  // Non-instantiable.
+  private Browser() {
+  }
+}
diff --git a/elemental/src/elemental/css/CSSCharsetRule.java b/elemental/src/elemental/css/CSSCharsetRule.java
new file mode 100644
index 0000000..2653bfb
--- /dev/null
+++ b/elemental/src/elemental/css/CSSCharsetRule.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSCharsetRule extends CSSRule {
+
+  String getEncoding();
+
+  void setEncoding(String arg);
+}
diff --git a/elemental/src/elemental/css/CSSFontFaceRule.java b/elemental/src/elemental/css/CSSFontFaceRule.java
new file mode 100644
index 0000000..3a2dd97
--- /dev/null
+++ b/elemental/src/elemental/css/CSSFontFaceRule.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSFontFaceRule extends CSSRule {
+
+  CSSStyleDeclaration getStyle();
+}
diff --git a/elemental/src/elemental/css/CSSImportRule.java b/elemental/src/elemental/css/CSSImportRule.java
new file mode 100644
index 0000000..4274d98
--- /dev/null
+++ b/elemental/src/elemental/css/CSSImportRule.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+import elemental.stylesheets.MediaList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSImportRule extends CSSRule {
+
+  String getHref();
+
+  MediaList getMedia();
+
+  CSSStyleSheet getStyleSheet();
+}
diff --git a/elemental/src/elemental/css/CSSKeyframeRule.java b/elemental/src/elemental/css/CSSKeyframeRule.java
new file mode 100644
index 0000000..d703a6c
--- /dev/null
+++ b/elemental/src/elemental/css/CSSKeyframeRule.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSKeyframeRule extends CSSRule {
+
+  String getKeyText();
+
+  void setKeyText(String arg);
+
+  CSSStyleDeclaration getStyle();
+}
diff --git a/elemental/src/elemental/css/CSSKeyframesRule.java b/elemental/src/elemental/css/CSSKeyframesRule.java
new file mode 100644
index 0000000..04f7c98
--- /dev/null
+++ b/elemental/src/elemental/css/CSSKeyframesRule.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSKeyframesRule extends CSSRule {
+
+  CSSRuleList getCssRules();
+
+  String getName();
+
+  void setName(String arg);
+
+  void deleteRule(String key);
+
+  CSSKeyframeRule findRule(String key);
+
+  void insertRule(String rule);
+}
diff --git a/elemental/src/elemental/css/CSSMatrix.java b/elemental/src/elemental/css/CSSMatrix.java
new file mode 100644
index 0000000..3e8e6d3a
--- /dev/null
+++ b/elemental/src/elemental/css/CSSMatrix.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSMatrix {
+
+  double getA();
+
+  void setA(double arg);
+
+  double getB();
+
+  void setB(double arg);
+
+  double getC();
+
+  void setC(double arg);
+
+  double getD();
+
+  void setD(double arg);
+
+  double getE();
+
+  void setE(double arg);
+
+  double getF();
+
+  void setF(double arg);
+
+  double getM11();
+
+  void setM11(double arg);
+
+  double getM12();
+
+  void setM12(double arg);
+
+  double getM13();
+
+  void setM13(double arg);
+
+  double getM14();
+
+  void setM14(double arg);
+
+  double getM21();
+
+  void setM21(double arg);
+
+  double getM22();
+
+  void setM22(double arg);
+
+  double getM23();
+
+  void setM23(double arg);
+
+  double getM24();
+
+  void setM24(double arg);
+
+  double getM31();
+
+  void setM31(double arg);
+
+  double getM32();
+
+  void setM32(double arg);
+
+  double getM33();
+
+  void setM33(double arg);
+
+  double getM34();
+
+  void setM34(double arg);
+
+  double getM41();
+
+  void setM41(double arg);
+
+  double getM42();
+
+  void setM42(double arg);
+
+  double getM43();
+
+  void setM43(double arg);
+
+  double getM44();
+
+  void setM44(double arg);
+
+  CSSMatrix inverse();
+
+  CSSMatrix multiply(CSSMatrix secondMatrix);
+
+  CSSMatrix rotate(double rotX, double rotY, double rotZ);
+
+  CSSMatrix rotateAxisAngle(double x, double y, double z, double angle);
+
+  CSSMatrix scale(double scaleX, double scaleY, double scaleZ);
+
+  void setMatrixValue(String string);
+
+  CSSMatrix skewX(double angle);
+
+  CSSMatrix skewY(double angle);
+
+  CSSMatrix translate(double x, double y, double z);
+}
diff --git a/elemental/src/elemental/css/CSSMediaRule.java b/elemental/src/elemental/css/CSSMediaRule.java
new file mode 100644
index 0000000..1e035e5
--- /dev/null
+++ b/elemental/src/elemental/css/CSSMediaRule.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+import elemental.stylesheets.MediaList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * An object representing a single CSS media rule.&nbsp;<code>CSSMediaRule</code>&nbsp;implements the&nbsp;<code><a href="https://developer.mozilla.org/en/DOM/CSSRule" rel="custom">CSSRule</a></code>&nbsp;interface.
+  */
+public interface CSSMediaRule extends CSSRule {
+
+
+  /**
+    * Returns a <code><a title="en/DOM/CSSRuleList" rel="internal" href="https://developer.mozilla.org/en/DOM/CSSRuleList">CSSRuleList</a></code> of the CSS rules in the media rule.
+    */
+  CSSRuleList getCssRules();
+
+
+  /**
+    * Specifies the intended destination medium for style information.
+    */
+  MediaList getMedia();
+
+
+  /**
+    * Deletes a rule from the style sheet.
+    */
+  void deleteRule(int index);
+
+
+  /**
+    * Inserts a new style rule into the current style sheet.
+    */
+  int insertRule(String rule, int index);
+}
diff --git a/elemental/src/elemental/css/CSSPageRule.java b/elemental/src/elemental/css/CSSPageRule.java
new file mode 100644
index 0000000..5f34d05
--- /dev/null
+++ b/elemental/src/elemental/css/CSSPageRule.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSPageRule extends CSSRule {
+
+  String getSelectorText();
+
+  void setSelectorText(String arg);
+
+  CSSStyleDeclaration getStyle();
+}
diff --git a/elemental/src/elemental/css/CSSPrimitiveValue.java b/elemental/src/elemental/css/CSSPrimitiveValue.java
new file mode 100644
index 0000000..4bdeeff
--- /dev/null
+++ b/elemental/src/elemental/css/CSSPrimitiveValue.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSPrimitiveValue extends CSSValue {
+
+    static final int CSS_ATTR = 22;
+
+    static final int CSS_CM = 6;
+
+    static final int CSS_COUNTER = 23;
+
+    static final int CSS_DEG = 11;
+
+    static final int CSS_DIMENSION = 18;
+
+    static final int CSS_EMS = 3;
+
+    static final int CSS_EXS = 4;
+
+    static final int CSS_GRAD = 13;
+
+    static final int CSS_HZ = 16;
+
+    static final int CSS_IDENT = 21;
+
+    static final int CSS_IN = 8;
+
+    static final int CSS_KHZ = 17;
+
+    static final int CSS_MM = 7;
+
+    static final int CSS_MS = 14;
+
+    static final int CSS_NUMBER = 1;
+
+    static final int CSS_PC = 10;
+
+    static final int CSS_PERCENTAGE = 2;
+
+    static final int CSS_PT = 9;
+
+    static final int CSS_PX = 5;
+
+    static final int CSS_RAD = 12;
+
+    static final int CSS_RECT = 24;
+
+    static final int CSS_RGBCOLOR = 25;
+
+    static final int CSS_S = 15;
+
+    static final int CSS_STRING = 19;
+
+    static final int CSS_UNKNOWN = 0;
+
+    static final int CSS_URI = 20;
+
+    static final int CSS_VH = 27;
+
+    static final int CSS_VMIN = 28;
+
+    static final int CSS_VW = 26;
+
+  int getPrimitiveType();
+
+  Counter getCounterValue();
+
+  float getFloatValue(int unitType);
+
+  RGBColor getRGBColorValue();
+
+  Rect getRectValue();
+
+  String getStringValue();
+
+  void setFloatValue(int unitType, float floatValue);
+
+  void setStringValue(int stringType, String stringValue);
+}
diff --git a/elemental/src/elemental/css/CSSRule.java b/elemental/src/elemental/css/CSSRule.java
new file mode 100644
index 0000000..5306268
--- /dev/null
+++ b/elemental/src/elemental/css/CSSRule.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>An object implementing the <code>CSSRule</code> DOM interface represents a single CSS rule. References to a <code>CSSRule</code>-implementing object may be obtained by looking at a <a title="en/DOM/stylesheet" rel="internal" href="https://developer.mozilla.org/en/DOM/CSSStyleSheet">CSS style sheet's</a> <code><a title="en/DOM/CSSStyleSheet/cssRules" rel="internal" href="https://developer.mozilla.org/en/DOM/CSSStyleSheet">cssRules</a></code> list.</p>
+<p>There are several kinds of rules. The <code>CSSRule</code> interface specifies the properties common to all rules, while properties unique to specific rule types are specified in the more specialized interfaces for those rules' respective types.</p>
+  */
+public interface CSSRule {
+
+    static final int CHARSET_RULE = 2;
+
+    static final int FONT_FACE_RULE = 5;
+
+    static final int IMPORT_RULE = 3;
+
+    static final int MEDIA_RULE = 4;
+
+    static final int PAGE_RULE = 6;
+
+    static final int STYLE_RULE = 1;
+
+    static final int UNKNOWN_RULE = 0;
+
+    static final int WEBKIT_KEYFRAMES_RULE = 7;
+
+    static final int WEBKIT_KEYFRAME_RULE = 8;
+
+
+  /**
+    * Returns the textual representation of the rule, e.g. <code>"h1,h2 { font-size: 16pt }"</code>
+    */
+  String getCssText();
+
+  void setCssText(String arg);
+
+
+  /**
+    * Returns the containing rule, otherwise <code>null</code>. E.g. if this rule is a style rule inside an <code><a title="en/CSS/@media" rel="internal" href="https://developer.mozilla.org/en/CSS/@media">@media</a></code> block, the parent rule would be that <code><a title="en/DOM/CSSMediaRule" rel="internal" href="https://developer.mozilla.org/en/DOM/CSSMediaRule">CSSMediaRule</a></code>.
+    */
+  CSSRule getParentRule();
+
+
+  /**
+    * Returns the <code><a title="en/DOM/CSSStyleSheet" rel="internal" href="https://developer.mozilla.org/en/DOM/CSSStyleSheet">CSSStyleSheet</a></code> object for the style sheet that contains this rule
+    */
+  CSSStyleSheet getParentStyleSheet();
+
+
+  /**
+    * One of the <a rel="custom" href="https://developer.mozilla.org/en/DOM/cssRule#Type_constants">Type constants</a>&nbsp;indicating the type of CSS&nbsp;rule.
+    */
+  int getType();
+}
diff --git a/elemental/src/elemental/css/CSSRuleList.java b/elemental/src/elemental/css/CSSRuleList.java
new file mode 100644
index 0000000..b09b67b
--- /dev/null
+++ b/elemental/src/elemental/css/CSSRuleList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * A <code>CSSRuleList</code> is an array-like object containing an ordered collection of <code><a title="en/DOM/cssRule" rel="internal" href="https://developer.mozilla.org/en/DOM/cssRule">CSSRule</a></code> objects.
+  */
+public interface CSSRuleList {
+
+  int getLength();
+
+  CSSRule item(int index);
+}
diff --git a/elemental/src/elemental/css/CSSStyleDeclaration.java b/elemental/src/elemental/css/CSSStyleDeclaration.java
new file mode 100644
index 0000000..17f4aa4
--- /dev/null
+++ b/elemental/src/elemental/css/CSSStyleDeclaration.java
@@ -0,0 +1,1259 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * $CLASS_JAVADOC
+  */
+public interface CSSStyleDeclaration {
+
+
+  /**
+    *  Textual representation of the declaration block. Setting this attribute changes the style.
+    */
+  String getCssText();
+
+  void setCssText(String arg);
+
+
+  /**
+    *  The number of properties. See the <strong>item</strong> method below.
+    */
+  int getLength();
+
+
+  /**
+    *  The containing <code><a href="https://developer.mozilla.org/en/DOM/cssRule" rel="internal" title="en/DOM/cssRule">cssRule</a>.</code>
+    */
+  CSSRule getParentRule();
+
+
+  /**
+    * <span>Only supported via getComputedStyle.<br> </span>Returns a <a class="external" title="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue" rel="external" href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSValue" target="_blank">CSSValue</a>, or <code>null</code> for <a title="en/Guide to Shorthand CSS" rel="internal" href="https://developer.mozilla.org/en/Guide_to_Shorthand_CSS">Shorthand properties</a>.<br> Example: <em>cssString</em>= window.getComputedStyle(<em>elem</em>, <code>null</code>).getPropertyCSSValue('color').cssText;<br> Note: Gecko 1.9 returns null unless using <a title="en/DOM/window.getComputedStyle" rel="internal" href="https://developer.mozilla.org/en/DOM/window.getComputedStyle">getComputedStyle()</a>.<br> Note: this method may be <a class="external" title="http://lists.w3.org/Archives/Public/www-style/2003Oct/0347.html" rel="external" href="http://lists.w3.org/Archives/Public/www-style/2003Oct/0347.html" target="_blank">deprecated by the W3C</a>.
+    */
+  CSSValue getPropertyCSSValue(String propertyName);
+
+
+  /**
+    *  Returns the optional priority, "important".<br> Example: <em>priString</em>= <em>styleObj</em>.getPropertyPriority('color')
+    */
+  String getPropertyPriority(String propertyName);
+
+  String getPropertyShorthand(String propertyName);
+
+
+  /**
+    *  Returns the property value.<br> Example: <em>valString</em>= <em>styleObj</em>.getPropertyValue('color')
+    */
+  String getPropertyValue(String propertyName);
+
+  boolean isPropertyImplicit(String propertyName);
+
+
+  /**
+    *  Returns a property name.<br> Example: <em>nameString</em>= <em>styleObj</em>.item(0)<br> Alternative: <em>nameString</em>= <em>styleObj</em>[0]
+    */
+  String item(int index);
+
+
+  /**
+    *  Returns the value deleted.<br> Example: <em>valString</em>= <em>styleObj</em>.removeProperty('color')
+    */
+  String removeProperty(String propertyName);
+
+
+  /**
+    *  No return.<br> Example: <em>styleObj</em>.setProperty('color', 'red', 'important')
+    */
+  void setProperty(String propertyName, String value);
+
+
+  /**
+    *  No return.<br> Example: <em>styleObj</em>.setProperty('color', 'red', 'important')
+    */
+  void setProperty(String propertyName, String value, String priority);
+
+public interface Unit {
+  public static final String PX = "px";
+  public static final String PCT = "%";
+  public static final String EM = "em";
+  public static final String EX = "ex";
+  public static final String PT = "pt";
+  public static final String PC = "pc";
+  public static final String IN = "in";
+  public static final String CM = "cm";
+  public static final String MM = "mm";
+}
+
+String getColor();
+void setColor(String value);
+void clearColor();
+String getDirection();
+void setDirection(String value);
+void clearDirection();
+
+public interface Display {
+  public static final String NONE = "none";
+  public static final String BLOCK = "block";
+  public static final String INLINE = "inline";
+  public static final String INLINE_BLOCK = "inline-block";
+}
+
+String getDisplay();
+void setDisplay(String value);
+void clearDisplay();
+String getFont();
+void setFont(String value);
+void clearFont();
+String getFontFamily();
+void setFontFamily(String value);
+void clearFontFamily();
+String getFontSize();
+void setFontSize(String value);
+void clearFontSize();
+void setFontSize(double value, String unit);
+
+public interface FontStyle {
+  public static final String NORMAL = "normal";
+  public static final String ITALIC = "italic";
+  public static final String OBLIQUE = "oblique";
+}
+
+String getFontStyle();
+void setFontStyle(String value);
+void clearFontStyle();
+
+public interface FontWeight {
+  public static final String NORMAL = "normal";
+  public static final String BOLD = "bold";
+  public static final String BOLDER = "bolder";
+  public static final String LIGHTER = "lighter";
+}
+
+String getFontWeight();
+void setFontWeight(String value);
+void clearFontWeight();
+String getFontVariant();
+void setFontVariant(String value);
+void clearFontVariant();
+String getTextRendering();
+void setTextRendering(String value);
+void clearTextRendering();
+String getWebkitFontFeatureSettings();
+void setWebkitFontFeatureSettings(String value);
+void clearWebkitFontFeatureSettings();
+String getWebkitFontKerning();
+void setWebkitFontKerning(String value);
+void clearWebkitFontKerning();
+String getWebkitFontSmoothing();
+void setWebkitFontSmoothing(String value);
+void clearWebkitFontSmoothing();
+String getWebkitFontVariantLigatures();
+void setWebkitFontVariantLigatures(String value);
+void clearWebkitFontVariantLigatures();
+String getWebkitLocale();
+void setWebkitLocale(String value);
+void clearWebkitLocale();
+String getWebkitTextOrientation();
+void setWebkitTextOrientation(String value);
+void clearWebkitTextOrientation();
+String getWebkitTextSizeAdjust();
+void setWebkitTextSizeAdjust(String value);
+void clearWebkitTextSizeAdjust();
+String getWebkitWritingMode();
+void setWebkitWritingMode(String value);
+void clearWebkitWritingMode();
+String getZoom();
+void setZoom(String value);
+void clearZoom();
+String getLineHeight();
+void setLineHeight(String value);
+void clearLineHeight();
+String getBackground();
+void setBackground(String value);
+void clearBackground();
+String getBackgroundAttachment();
+void setBackgroundAttachment(String value);
+void clearBackgroundAttachment();
+String getBackgroundClip();
+void setBackgroundClip(String value);
+void clearBackgroundClip();
+String getBackgroundColor();
+void setBackgroundColor(String value);
+void clearBackgroundColor();
+String getBackgroundImage();
+void setBackgroundImage(String value);
+void clearBackgroundImage();
+String getBackgroundOrigin();
+void setBackgroundOrigin(String value);
+void clearBackgroundOrigin();
+String getBackgroundPosition();
+void setBackgroundPosition(String value);
+void clearBackgroundPosition();
+String getBackgroundPositionX();
+void setBackgroundPositionX(String value);
+void clearBackgroundPositionX();
+String getBackgroundPositionY();
+void setBackgroundPositionY(String value);
+void clearBackgroundPositionY();
+String getBackgroundRepeat();
+void setBackgroundRepeat(String value);
+void clearBackgroundRepeat();
+String getBackgroundRepeatX();
+void setBackgroundRepeatX(String value);
+void clearBackgroundRepeatX();
+String getBackgroundRepeatY();
+void setBackgroundRepeatY(String value);
+void clearBackgroundRepeatY();
+String getBackgroundSize();
+void setBackgroundSize(String value);
+void clearBackgroundSize();
+String getBorder();
+void setBorder(String value);
+void clearBorder();
+String getBorderBottom();
+void setBorderBottom(String value);
+void clearBorderBottom();
+String getBorderBottomColor();
+void setBorderBottomColor(String value);
+void clearBorderBottomColor();
+String getBorderBottomLeftRadius();
+void setBorderBottomLeftRadius(String value);
+void clearBorderBottomLeftRadius();
+String getBorderBottomRightRadius();
+void setBorderBottomRightRadius(String value);
+void clearBorderBottomRightRadius();
+String getBorderBottomStyle();
+void setBorderBottomStyle(String value);
+void clearBorderBottomStyle();
+String getBorderBottomWidth();
+void setBorderBottomWidth(String value);
+void clearBorderBottomWidth();
+String getBorderCollapse();
+void setBorderCollapse(String value);
+void clearBorderCollapse();
+String getBorderColor();
+void setBorderColor(String value);
+void clearBorderColor();
+String getBorderImage();
+void setBorderImage(String value);
+void clearBorderImage();
+String getBorderImageOutset();
+void setBorderImageOutset(String value);
+void clearBorderImageOutset();
+String getBorderImageRepeat();
+void setBorderImageRepeat(String value);
+void clearBorderImageRepeat();
+String getBorderImageSlice();
+void setBorderImageSlice(String value);
+void clearBorderImageSlice();
+String getBorderImageSource();
+void setBorderImageSource(String value);
+void clearBorderImageSource();
+String getBorderImageWidth();
+void setBorderImageWidth(String value);
+void clearBorderImageWidth();
+String getBorderLeft();
+void setBorderLeft(String value);
+void clearBorderLeft();
+String getBorderLeftColor();
+void setBorderLeftColor(String value);
+void clearBorderLeftColor();
+String getBorderLeftStyle();
+void setBorderLeftStyle(String value);
+void clearBorderLeftStyle();
+String getBorderLeftWidth();
+void setBorderLeftWidth(String value);
+void clearBorderLeftWidth();
+String getBorderRadius();
+void setBorderRadius(String value);
+void clearBorderRadius();
+String getBorderRight();
+void setBorderRight(String value);
+void clearBorderRight();
+String getBorderRightColor();
+void setBorderRightColor(String value);
+void clearBorderRightColor();
+String getBorderRightStyle();
+void setBorderRightStyle(String value);
+void clearBorderRightStyle();
+String getBorderRightWidth();
+void setBorderRightWidth(String value);
+void clearBorderRightWidth();
+String getBorderSpacing();
+void setBorderSpacing(String value);
+void clearBorderSpacing();
+
+public interface BorderStyle {
+  public static final String NONE = "none";
+  public static final String HIDDEN = "hidden";
+  public static final String DOTTED = "dotted";
+  public static final String DASHED = "dashed";
+  public static final String SOLID = "solid";
+}
+
+String getBorderStyle();
+void setBorderStyle(String value);
+void clearBorderStyle();
+String getBorderTop();
+void setBorderTop(String value);
+void clearBorderTop();
+String getBorderTopColor();
+void setBorderTopColor(String value);
+void clearBorderTopColor();
+String getBorderTopLeftRadius();
+void setBorderTopLeftRadius(String value);
+void clearBorderTopLeftRadius();
+String getBorderTopRightRadius();
+void setBorderTopRightRadius(String value);
+void clearBorderTopRightRadius();
+String getBorderTopStyle();
+void setBorderTopStyle(String value);
+void clearBorderTopStyle();
+String getBorderTopWidth();
+void setBorderTopWidth(String value);
+void clearBorderTopWidth();
+String getBorderWidth();
+void setBorderWidth(String value);
+void clearBorderWidth();
+void setBorderWidth(double value, String unit);
+String getBottom();
+void setBottom(String value);
+void clearBottom();
+void setBottom(double value, String unit);
+String getBoxShadow();
+void setBoxShadow(String value);
+void clearBoxShadow();
+String getBoxSizing();
+void setBoxSizing(String value);
+void clearBoxSizing();
+String getCaptionSide();
+void setCaptionSide(String value);
+void clearCaptionSide();
+String getClear();
+void setClear(String value);
+void clearClear();
+String getClip();
+void setClip(String value);
+void clearClip();
+String getContent();
+void setContent(String value);
+void clearContent();
+String getCounterIncrement();
+void setCounterIncrement(String value);
+void clearCounterIncrement();
+String getCounterReset();
+void setCounterReset(String value);
+void clearCounterReset();
+
+public interface Cursor {
+  public static final String DEFAULT = "default";
+  public static final String AUTO = "auto";
+  public static final String CROSSHAIR = "crosshair";
+  public static final String POINTER = "pointer";
+  public static final String MOVE = "move";
+  public static final String E_RESIZE = "e-resize";
+  public static final String NE_RESIZE = "ne-resize";
+  public static final String NW_RESIZE = "nw-resize";
+  public static final String N_RESIZE = "n-resize";
+  public static final String SE_RESIZE = "se-resize";
+  public static final String SW_RESIZE = "sw-resize";
+  public static final String S_RESIZE = "s-resize";
+  public static final String W_RESIZE = "w-resize";
+  public static final String TEXT = "text";
+  public static final String WAIT = "wait";
+  public static final String HELP = "help";
+  public static final String COL_RESIZE = "col-resize";
+  public static final String ROW_RESIZE = "row-resize";
+}
+
+String getCursor();
+void setCursor(String value);
+void clearCursor();
+String getEmptyCells();
+void setEmptyCells(String value);
+void clearEmptyCells();
+String getFloat();
+void setFloat(String value);
+void clearFloat();
+String getFontStretch();
+void setFontStretch(String value);
+void clearFontStretch();
+String getHeight();
+void setHeight(String value);
+void clearHeight();
+void setHeight(double value, String unit);
+String getImageRendering();
+void setImageRendering(String value);
+void clearImageRendering();
+String getLeft();
+void setLeft(String value);
+void clearLeft();
+void setLeft(double value, String unit);
+String getLetterSpacing();
+void setLetterSpacing(String value);
+void clearLetterSpacing();
+String getListStyle();
+void setListStyle(String value);
+void clearListStyle();
+
+public interface ListStyleType {
+  public static final String NONE = "none";
+  public static final String DISC = "disc";
+  public static final String CIRCLE = "circle";
+  public static final String SQUARE = "square";
+  public static final String DECIMAL = "decimal";
+  public static final String LOWER_ALPHA = "lower-alpha";
+  public static final String UPPER_ALPHA = "upper-alpha";
+  public static final String LOWER_ROMAN = "lower-roman";
+  public static final String UPPER_ROMAN = "upper-roman";
+}
+
+String getListStyleType();
+void setListStyleType(String value);
+void clearListStyleType();
+String getListStyleImage();
+void setListStyleImage(String value);
+void clearListStyleImage();
+String getListStylePosition();
+void setListStylePosition(String value);
+void clearListStylePosition();
+String getMargin();
+void setMargin(String value);
+void clearMargin();
+void setMargin(double value, String unit);
+String getMarginBottom();
+void setMarginBottom(String value);
+void clearMarginBottom();
+void setMarginBottom(double value, String unit);
+String getMarginLeft();
+void setMarginLeft(String value);
+void clearMarginLeft();
+void setMarginLeft(double value, String unit);
+String getMarginRight();
+void setMarginRight(String value);
+void clearMarginRight();
+void setMarginRight(double value, String unit);
+String getMarginTop();
+void setMarginTop(String value);
+void clearMarginTop();
+void setMarginTop(double value, String unit);
+String getMaxHeight();
+void setMaxHeight(String value);
+void clearMaxHeight();
+String getMaxWidth();
+void setMaxWidth(String value);
+void clearMaxWidth();
+String getMinHeight();
+void setMinHeight(String value);
+void clearMinHeight();
+String getMinWidth();
+void setMinWidth(String value);
+void clearMinWidth();
+double getOpacity();
+void setOpacity(double value);
+void clearOpacity();
+String getOrphans();
+void setOrphans(String value);
+void clearOrphans();
+String getOutline();
+void setOutline(String value);
+void clearOutline();
+String getOutlineColor();
+void setOutlineColor(String value);
+void clearOutlineColor();
+String getOutlineOffset();
+void setOutlineOffset(String value);
+void clearOutlineOffset();
+String getOutlineStyle();
+void setOutlineStyle(String value);
+void clearOutlineStyle();
+String getOutlineWidth();
+void setOutlineWidth(String value);
+void clearOutlineWidth();
+
+public interface Overflow {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String SCROLL = "scroll";
+  public static final String AUTO = "auto";
+}
+
+String getOverflow();
+void setOverflow(String value);
+void clearOverflow();
+
+public interface OverflowX {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String SCROLL = "scroll";
+  public static final String AUTO = "auto";
+}
+
+String getOverflowX();
+void setOverflowX(String value);
+void clearOverflowX();
+
+public interface OverflowY {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+  public static final String SCROLL = "scroll";
+  public static final String AUTO = "auto";
+}
+
+String getOverflowY();
+void setOverflowY(String value);
+void clearOverflowY();
+String getPadding();
+void setPadding(String value);
+void clearPadding();
+void setPadding(double value, String unit);
+String getPaddingBottom();
+void setPaddingBottom(String value);
+void clearPaddingBottom();
+void setPaddingBottom(double value, String unit);
+String getPaddingLeft();
+void setPaddingLeft(String value);
+void clearPaddingLeft();
+void setPaddingLeft(double value, String unit);
+String getPaddingRight();
+void setPaddingRight(String value);
+void clearPaddingRight();
+void setPaddingRight(double value, String unit);
+String getPaddingTop();
+void setPaddingTop(String value);
+void clearPaddingTop();
+void setPaddingTop(double value, String unit);
+String getPage();
+void setPage(String value);
+void clearPage();
+String getPageBreakAfter();
+void setPageBreakAfter(String value);
+void clearPageBreakAfter();
+String getPageBreakBefore();
+void setPageBreakBefore(String value);
+void clearPageBreakBefore();
+String getPageBreakInside();
+void setPageBreakInside(String value);
+void clearPageBreakInside();
+String getPointerEvents();
+void setPointerEvents(String value);
+void clearPointerEvents();
+
+public interface Position {
+  public static final String STATIC = "static";
+  public static final String RELATIVE = "relative";
+  public static final String ABSOLUTE = "absolute";
+  public static final String FIXED = "fixed";
+}
+
+String getPosition();
+void setPosition(String value);
+void clearPosition();
+String getQuotes();
+void setQuotes(String value);
+void clearQuotes();
+String getResize();
+void setResize(String value);
+void clearResize();
+String getRight();
+void setRight(String value);
+void clearRight();
+void setRight(double value, String unit);
+String getSize();
+void setSize(String value);
+void clearSize();
+String getSrc();
+void setSrc(String value);
+void clearSrc();
+String getSpeak();
+void setSpeak(String value);
+void clearSpeak();
+String getTableLayout();
+void setTableLayout(String value);
+void clearTableLayout();
+String getTabSize();
+void setTabSize(String value);
+void clearTabSize();
+String getTextAlign();
+void setTextAlign(String value);
+void clearTextAlign();
+
+public interface TextDecoration {
+  public static final String NONE = "none";
+  public static final String UNDERLINE = "underline";
+  public static final String OVERLINE = "overline";
+  public static final String LINE_THROUGH = "line-through";
+}
+
+String getTextDecoration();
+void setTextDecoration(String value);
+void clearTextDecoration();
+String getTextIndent();
+void setTextIndent(String value);
+void clearTextIndent();
+String getTextLineThrough();
+void setTextLineThrough(String value);
+void clearTextLineThrough();
+String getTextLineThroughColor();
+void setTextLineThroughColor(String value);
+void clearTextLineThroughColor();
+String getTextLineThroughMode();
+void setTextLineThroughMode(String value);
+void clearTextLineThroughMode();
+String getTextLineThroughStyle();
+void setTextLineThroughStyle(String value);
+void clearTextLineThroughStyle();
+String getTextLineThroughWidth();
+void setTextLineThroughWidth(String value);
+void clearTextLineThroughWidth();
+String getTextOverflow();
+void setTextOverflow(String value);
+void clearTextOverflow();
+String getTextOverline();
+void setTextOverline(String value);
+void clearTextOverline();
+String getTextOverlineColor();
+void setTextOverlineColor(String value);
+void clearTextOverlineColor();
+String getTextOverlineMode();
+void setTextOverlineMode(String value);
+void clearTextOverlineMode();
+String getTextOverlineStyle();
+void setTextOverlineStyle(String value);
+void clearTextOverlineStyle();
+String getTextOverlineWidth();
+void setTextOverlineWidth(String value);
+void clearTextOverlineWidth();
+String getTextShadow();
+void setTextShadow(String value);
+void clearTextShadow();
+String getTextTransform();
+void setTextTransform(String value);
+void clearTextTransform();
+String getTextUnderline();
+void setTextUnderline(String value);
+void clearTextUnderline();
+String getTextUnderlineColor();
+void setTextUnderlineColor(String value);
+void clearTextUnderlineColor();
+String getTextUnderlineMode();
+void setTextUnderlineMode(String value);
+void clearTextUnderlineMode();
+String getTextUnderlineStyle();
+void setTextUnderlineStyle(String value);
+void clearTextUnderlineStyle();
+String getTextUnderlineWidth();
+void setTextUnderlineWidth(String value);
+void clearTextUnderlineWidth();
+String getTop();
+void setTop(String value);
+void clearTop();
+void setTop(double value, String unit);
+String getUnicodeBidi();
+void setUnicodeBidi(String value);
+void clearUnicodeBidi();
+String getUnicodeRange();
+void setUnicodeRange(String value);
+void clearUnicodeRange();
+String getVerticalAlign();
+void setVerticalAlign(String value);
+void clearVerticalAlign();
+
+public interface Visibility {
+  public static final String VISIBLE = "visible";
+  public static final String HIDDEN = "hidden";
+}
+
+String getVisibility();
+void setVisibility(String value);
+void clearVisibility();
+
+public interface WhiteSpace {
+  public static final String PRE = "pre";
+  public static final String NOWRAP = "nowrap";
+  public static final String PRE_WRAP = "pre-wrap";
+  public static final String PRE_LINE = "pre-line";
+}
+
+String getWhiteSpace();
+void setWhiteSpace(String value);
+void clearWhiteSpace();
+String getWidows();
+void setWidows(String value);
+void clearWidows();
+String getWidth();
+void setWidth(String value);
+void clearWidth();
+void setWidth(double value, String unit);
+String getWordBreak();
+void setWordBreak(String value);
+void clearWordBreak();
+String getWordSpacing();
+void setWordSpacing(String value);
+void clearWordSpacing();
+String getWordWrap();
+void setWordWrap(String value);
+void clearWordWrap();
+int getZIndex();
+void setZIndex(int value);
+void clearZIndex();
+String getWebkitAnimation();
+void setWebkitAnimation(String value);
+void clearWebkitAnimation();
+String getWebkitAnimationDelay();
+void setWebkitAnimationDelay(String value);
+void clearWebkitAnimationDelay();
+String getWebkitAnimationDirection();
+void setWebkitAnimationDirection(String value);
+void clearWebkitAnimationDirection();
+String getWebkitAnimationDuration();
+void setWebkitAnimationDuration(String value);
+void clearWebkitAnimationDuration();
+String getWebkitAnimationFillMode();
+void setWebkitAnimationFillMode(String value);
+void clearWebkitAnimationFillMode();
+String getWebkitAnimationIterationCount();
+void setWebkitAnimationIterationCount(String value);
+void clearWebkitAnimationIterationCount();
+String getWebkitAnimationName();
+void setWebkitAnimationName(String value);
+void clearWebkitAnimationName();
+String getWebkitAnimationPlayState();
+void setWebkitAnimationPlayState(String value);
+void clearWebkitAnimationPlayState();
+String getWebkitAnimationTimingFunction();
+void setWebkitAnimationTimingFunction(String value);
+void clearWebkitAnimationTimingFunction();
+String getWebkitAppearance();
+void setWebkitAppearance(String value);
+void clearWebkitAppearance();
+String getWebkitAspectRatio();
+void setWebkitAspectRatio(String value);
+void clearWebkitAspectRatio();
+String getWebkitBackfaceVisibility();
+void setWebkitBackfaceVisibility(String value);
+void clearWebkitBackfaceVisibility();
+String getWebkitBackgroundClip();
+void setWebkitBackgroundClip(String value);
+void clearWebkitBackgroundClip();
+String getWebkitBackgroundComposite();
+void setWebkitBackgroundComposite(String value);
+void clearWebkitBackgroundComposite();
+String getWebkitBackgroundOrigin();
+void setWebkitBackgroundOrigin(String value);
+void clearWebkitBackgroundOrigin();
+String getWebkitBackgroundSize();
+void setWebkitBackgroundSize(String value);
+void clearWebkitBackgroundSize();
+String getWebkitBorderAfter();
+void setWebkitBorderAfter(String value);
+void clearWebkitBorderAfter();
+String getWebkitBorderAfterColor();
+void setWebkitBorderAfterColor(String value);
+void clearWebkitBorderAfterColor();
+String getWebkitBorderAfterStyle();
+void setWebkitBorderAfterStyle(String value);
+void clearWebkitBorderAfterStyle();
+String getWebkitBorderAfterWidth();
+void setWebkitBorderAfterWidth(String value);
+void clearWebkitBorderAfterWidth();
+String getWebkitBorderBefore();
+void setWebkitBorderBefore(String value);
+void clearWebkitBorderBefore();
+String getWebkitBorderBeforeColor();
+void setWebkitBorderBeforeColor(String value);
+void clearWebkitBorderBeforeColor();
+String getWebkitBorderBeforeStyle();
+void setWebkitBorderBeforeStyle(String value);
+void clearWebkitBorderBeforeStyle();
+String getWebkitBorderBeforeWidth();
+void setWebkitBorderBeforeWidth(String value);
+void clearWebkitBorderBeforeWidth();
+String getWebkitBorderEnd();
+void setWebkitBorderEnd(String value);
+void clearWebkitBorderEnd();
+String getWebkitBorderEndColor();
+void setWebkitBorderEndColor(String value);
+void clearWebkitBorderEndColor();
+String getWebkitBorderEndStyle();
+void setWebkitBorderEndStyle(String value);
+void clearWebkitBorderEndStyle();
+String getWebkitBorderEndWidth();
+void setWebkitBorderEndWidth(String value);
+void clearWebkitBorderEndWidth();
+String getWebkitBorderFit();
+void setWebkitBorderFit(String value);
+void clearWebkitBorderFit();
+String getWebkitBorderHorizontalSpacing();
+void setWebkitBorderHorizontalSpacing(String value);
+void clearWebkitBorderHorizontalSpacing();
+String getWebkitBorderImage();
+void setWebkitBorderImage(String value);
+void clearWebkitBorderImage();
+String getWebkitBorderRadius();
+void setWebkitBorderRadius(String value);
+void clearWebkitBorderRadius();
+String getWebkitBorderStart();
+void setWebkitBorderStart(String value);
+void clearWebkitBorderStart();
+String getWebkitBorderStartColor();
+void setWebkitBorderStartColor(String value);
+void clearWebkitBorderStartColor();
+String getWebkitBorderStartStyle();
+void setWebkitBorderStartStyle(String value);
+void clearWebkitBorderStartStyle();
+String getWebkitBorderStartWidth();
+void setWebkitBorderStartWidth(String value);
+void clearWebkitBorderStartWidth();
+String getWebkitBorderVerticalSpacing();
+void setWebkitBorderVerticalSpacing(String value);
+void clearWebkitBorderVerticalSpacing();
+String getWebkitBoxAlign();
+void setWebkitBoxAlign(String value);
+void clearWebkitBoxAlign();
+String getWebkitBoxDirection();
+void setWebkitBoxDirection(String value);
+void clearWebkitBoxDirection();
+String getWebkitBoxFlex();
+void setWebkitBoxFlex(String value);
+void clearWebkitBoxFlex();
+String getWebkitBoxFlexGroup();
+void setWebkitBoxFlexGroup(String value);
+void clearWebkitBoxFlexGroup();
+String getWebkitBoxLines();
+void setWebkitBoxLines(String value);
+void clearWebkitBoxLines();
+String getWebkitBoxOrdinalGroup();
+void setWebkitBoxOrdinalGroup(String value);
+void clearWebkitBoxOrdinalGroup();
+String getWebkitBoxOrient();
+void setWebkitBoxOrient(String value);
+void clearWebkitBoxOrient();
+String getWebkitBoxPack();
+void setWebkitBoxPack(String value);
+void clearWebkitBoxPack();
+String getWebkitBoxReflect();
+void setWebkitBoxReflect(String value);
+void clearWebkitBoxReflect();
+String getWebkitBoxShadow();
+void setWebkitBoxShadow(String value);
+void clearWebkitBoxShadow();
+String getWebkitColorCorrection();
+void setWebkitColorCorrection(String value);
+void clearWebkitColorCorrection();
+String getWebkitColumnAxis();
+void setWebkitColumnAxis(String value);
+void clearWebkitColumnAxis();
+String getWebkitColumnBreakAfter();
+void setWebkitColumnBreakAfter(String value);
+void clearWebkitColumnBreakAfter();
+String getWebkitColumnBreakBefore();
+void setWebkitColumnBreakBefore(String value);
+void clearWebkitColumnBreakBefore();
+String getWebkitColumnBreakInside();
+void setWebkitColumnBreakInside(String value);
+void clearWebkitColumnBreakInside();
+String getWebkitColumnCount();
+void setWebkitColumnCount(String value);
+void clearWebkitColumnCount();
+String getWebkitColumnGap();
+void setWebkitColumnGap(String value);
+void clearWebkitColumnGap();
+String getWebkitColumnRule();
+void setWebkitColumnRule(String value);
+void clearWebkitColumnRule();
+String getWebkitColumnRuleColor();
+void setWebkitColumnRuleColor(String value);
+void clearWebkitColumnRuleColor();
+String getWebkitColumnRuleStyle();
+void setWebkitColumnRuleStyle(String value);
+void clearWebkitColumnRuleStyle();
+String getWebkitColumnRuleWidth();
+void setWebkitColumnRuleWidth(String value);
+void clearWebkitColumnRuleWidth();
+String getWebkitColumnSpan();
+void setWebkitColumnSpan(String value);
+void clearWebkitColumnSpan();
+String getWebkitColumnWidth();
+void setWebkitColumnWidth(String value);
+void clearWebkitColumnWidth();
+String getWebkitColumns();
+void setWebkitColumns(String value);
+void clearWebkitColumns();
+String getWebkitFilter();
+void setWebkitFilter(String value);
+void clearWebkitFilter();
+String getWebkitFlex();
+void setWebkitFlex(String value);
+void clearWebkitFlex();
+String getWebkitFlexAlign();
+void setWebkitFlexAlign(String value);
+void clearWebkitFlexAlign();
+String getWebkitFlexDirection();
+void setWebkitFlexDirection(String value);
+void clearWebkitFlexDirection();
+String getWebkitFlexFlow();
+void setWebkitFlexFlow(String value);
+void clearWebkitFlexFlow();
+String getWebkitFlexItemAlign();
+void setWebkitFlexItemAlign(String value);
+void clearWebkitFlexItemAlign();
+String getWebkitFlexLinePack();
+void setWebkitFlexLinePack(String value);
+void clearWebkitFlexLinePack();
+String getWebkitFlexOrder();
+void setWebkitFlexOrder(String value);
+void clearWebkitFlexOrder();
+String getWebkitFlexPack();
+void setWebkitFlexPack(String value);
+void clearWebkitFlexPack();
+String getWebkitFlexWrap();
+void setWebkitFlexWrap(String value);
+void clearWebkitFlexWrap();
+String getWebkitFontSizeDelta();
+void setWebkitFontSizeDelta(String value);
+void clearWebkitFontSizeDelta();
+String getWebkitGridColumns();
+void setWebkitGridColumns(String value);
+void clearWebkitGridColumns();
+String getWebkitGridRows();
+void setWebkitGridRows(String value);
+void clearWebkitGridRows();
+String getWebkitGridColumn();
+void setWebkitGridColumn(String value);
+void clearWebkitGridColumn();
+String getWebkitGridRow();
+void setWebkitGridRow(String value);
+void clearWebkitGridRow();
+String getWebkitHighlight();
+void setWebkitHighlight(String value);
+void clearWebkitHighlight();
+String getWebkitHyphenateCharacter();
+void setWebkitHyphenateCharacter(String value);
+void clearWebkitHyphenateCharacter();
+String getWebkitHyphenateLimitAfter();
+void setWebkitHyphenateLimitAfter(String value);
+void clearWebkitHyphenateLimitAfter();
+String getWebkitHyphenateLimitBefore();
+void setWebkitHyphenateLimitBefore(String value);
+void clearWebkitHyphenateLimitBefore();
+String getWebkitHyphenateLimitLines();
+void setWebkitHyphenateLimitLines(String value);
+void clearWebkitHyphenateLimitLines();
+String getWebkitHyphens();
+void setWebkitHyphens(String value);
+void clearWebkitHyphens();
+String getWebkitLineBoxContain();
+void setWebkitLineBoxContain(String value);
+void clearWebkitLineBoxContain();
+String getWebkitLineAlign();
+void setWebkitLineAlign(String value);
+void clearWebkitLineAlign();
+String getWebkitLineBreak();
+void setWebkitLineBreak(String value);
+void clearWebkitLineBreak();
+String getWebkitLineClamp();
+void setWebkitLineClamp(String value);
+void clearWebkitLineClamp();
+String getWebkitLineGrid();
+void setWebkitLineGrid(String value);
+void clearWebkitLineGrid();
+String getWebkitLineSnap();
+void setWebkitLineSnap(String value);
+void clearWebkitLineSnap();
+String getWebkitLogicalWidth();
+void setWebkitLogicalWidth(String value);
+void clearWebkitLogicalWidth();
+String getWebkitLogicalHeight();
+void setWebkitLogicalHeight(String value);
+void clearWebkitLogicalHeight();
+String getWebkitMarginAfterCollapse();
+void setWebkitMarginAfterCollapse(String value);
+void clearWebkitMarginAfterCollapse();
+String getWebkitMarginBeforeCollapse();
+void setWebkitMarginBeforeCollapse(String value);
+void clearWebkitMarginBeforeCollapse();
+String getWebkitMarginBottomCollapse();
+void setWebkitMarginBottomCollapse(String value);
+void clearWebkitMarginBottomCollapse();
+String getWebkitMarginTopCollapse();
+void setWebkitMarginTopCollapse(String value);
+void clearWebkitMarginTopCollapse();
+String getWebkitMarginCollapse();
+void setWebkitMarginCollapse(String value);
+void clearWebkitMarginCollapse();
+String getWebkitMarginAfter();
+void setWebkitMarginAfter(String value);
+void clearWebkitMarginAfter();
+String getWebkitMarginBefore();
+void setWebkitMarginBefore(String value);
+void clearWebkitMarginBefore();
+String getWebkitMarginEnd();
+void setWebkitMarginEnd(String value);
+void clearWebkitMarginEnd();
+String getWebkitMarginStart();
+void setWebkitMarginStart(String value);
+void clearWebkitMarginStart();
+String getWebkitMarquee();
+void setWebkitMarquee(String value);
+void clearWebkitMarquee();
+String getWebkitMarqueeDirection();
+void setWebkitMarqueeDirection(String value);
+void clearWebkitMarqueeDirection();
+String getWebkitMarqueeIncrement();
+void setWebkitMarqueeIncrement(String value);
+void clearWebkitMarqueeIncrement();
+String getWebkitMarqueeRepetition();
+void setWebkitMarqueeRepetition(String value);
+void clearWebkitMarqueeRepetition();
+String getWebkitMarqueeSpeed();
+void setWebkitMarqueeSpeed(String value);
+void clearWebkitMarqueeSpeed();
+String getWebkitMarqueeStyle();
+void setWebkitMarqueeStyle(String value);
+void clearWebkitMarqueeStyle();
+String getWebkitMask();
+void setWebkitMask(String value);
+void clearWebkitMask();
+String getWebkitMaskAttachment();
+void setWebkitMaskAttachment(String value);
+void clearWebkitMaskAttachment();
+String getWebkitMaskBoxImage();
+void setWebkitMaskBoxImage(String value);
+void clearWebkitMaskBoxImage();
+String getWebkitMaskBoxImageOutset();
+void setWebkitMaskBoxImageOutset(String value);
+void clearWebkitMaskBoxImageOutset();
+String getWebkitMaskBoxImageRepeat();
+void setWebkitMaskBoxImageRepeat(String value);
+void clearWebkitMaskBoxImageRepeat();
+String getWebkitMaskBoxImageSlice();
+void setWebkitMaskBoxImageSlice(String value);
+void clearWebkitMaskBoxImageSlice();
+String getWebkitMaskBoxImageSource();
+void setWebkitMaskBoxImageSource(String value);
+void clearWebkitMaskBoxImageSource();
+String getWebkitMaskBoxImageWidth();
+void setWebkitMaskBoxImageWidth(String value);
+void clearWebkitMaskBoxImageWidth();
+String getWebkitMaskClip();
+void setWebkitMaskClip(String value);
+void clearWebkitMaskClip();
+String getWebkitMaskComposite();
+void setWebkitMaskComposite(String value);
+void clearWebkitMaskComposite();
+String getWebkitMaskImage();
+void setWebkitMaskImage(String value);
+void clearWebkitMaskImage();
+String getWebkitMaskOrigin();
+void setWebkitMaskOrigin(String value);
+void clearWebkitMaskOrigin();
+String getWebkitMaskPosition();
+void setWebkitMaskPosition(String value);
+void clearWebkitMaskPosition();
+String getWebkitMaskPositionX();
+void setWebkitMaskPositionX(String value);
+void clearWebkitMaskPositionX();
+String getWebkitMaskPositionY();
+void setWebkitMaskPositionY(String value);
+void clearWebkitMaskPositionY();
+String getWebkitMaskRepeat();
+void setWebkitMaskRepeat(String value);
+void clearWebkitMaskRepeat();
+String getWebkitMaskRepeatX();
+void setWebkitMaskRepeatX(String value);
+void clearWebkitMaskRepeatX();
+String getWebkitMaskRepeatY();
+void setWebkitMaskRepeatY(String value);
+void clearWebkitMaskRepeatY();
+String getWebkitMaskSize();
+void setWebkitMaskSize(String value);
+void clearWebkitMaskSize();
+String getWebkitMatchNearestMailBlockquoteColor();
+void setWebkitMatchNearestMailBlockquoteColor(String value);
+void clearWebkitMatchNearestMailBlockquoteColor();
+String getWebkitMaxLogicalWidth();
+void setWebkitMaxLogicalWidth(String value);
+void clearWebkitMaxLogicalWidth();
+String getWebkitMaxLogicalHeight();
+void setWebkitMaxLogicalHeight(String value);
+void clearWebkitMaxLogicalHeight();
+String getWebkitMinLogicalWidth();
+void setWebkitMinLogicalWidth(String value);
+void clearWebkitMinLogicalWidth();
+String getWebkitMinLogicalHeight();
+void setWebkitMinLogicalHeight(String value);
+void clearWebkitMinLogicalHeight();
+String getWebkitNbspMode();
+void setWebkitNbspMode(String value);
+void clearWebkitNbspMode();
+String getWebkitPaddingAfter();
+void setWebkitPaddingAfter(String value);
+void clearWebkitPaddingAfter();
+String getWebkitPaddingBefore();
+void setWebkitPaddingBefore(String value);
+void clearWebkitPaddingBefore();
+String getWebkitPaddingEnd();
+void setWebkitPaddingEnd(String value);
+void clearWebkitPaddingEnd();
+String getWebkitPaddingStart();
+void setWebkitPaddingStart(String value);
+void clearWebkitPaddingStart();
+String getWebkitPerspective();
+void setWebkitPerspective(String value);
+void clearWebkitPerspective();
+String getWebkitPerspectiveOrigin();
+void setWebkitPerspectiveOrigin(String value);
+void clearWebkitPerspectiveOrigin();
+String getWebkitPerspectiveOriginX();
+void setWebkitPerspectiveOriginX(String value);
+void clearWebkitPerspectiveOriginX();
+String getWebkitPerspectiveOriginY();
+void setWebkitPerspectiveOriginY(String value);
+void clearWebkitPerspectiveOriginY();
+String getWebkitPrintColorAdjust();
+void setWebkitPrintColorAdjust(String value);
+void clearWebkitPrintColorAdjust();
+String getWebkitRtlOrdering();
+void setWebkitRtlOrdering(String value);
+void clearWebkitRtlOrdering();
+String getWebkitTextCombine();
+void setWebkitTextCombine(String value);
+void clearWebkitTextCombine();
+String getWebkitTextDecorationsInEffect();
+void setWebkitTextDecorationsInEffect(String value);
+void clearWebkitTextDecorationsInEffect();
+String getWebkitTextEmphasis();
+void setWebkitTextEmphasis(String value);
+void clearWebkitTextEmphasis();
+String getWebkitTextEmphasisColor();
+void setWebkitTextEmphasisColor(String value);
+void clearWebkitTextEmphasisColor();
+String getWebkitTextEmphasisPosition();
+void setWebkitTextEmphasisPosition(String value);
+void clearWebkitTextEmphasisPosition();
+String getWebkitTextEmphasisStyle();
+void setWebkitTextEmphasisStyle(String value);
+void clearWebkitTextEmphasisStyle();
+String getWebkitTextFillColor();
+void setWebkitTextFillColor(String value);
+void clearWebkitTextFillColor();
+String getWebkitTextSecurity();
+void setWebkitTextSecurity(String value);
+void clearWebkitTextSecurity();
+String getWebkitTextStroke();
+void setWebkitTextStroke(String value);
+void clearWebkitTextStroke();
+String getWebkitTextStrokeColor();
+void setWebkitTextStrokeColor(String value);
+void clearWebkitTextStrokeColor();
+String getWebkitTextStrokeWidth();
+void setWebkitTextStrokeWidth(String value);
+void clearWebkitTextStrokeWidth();
+String getWebkitTransform();
+void setWebkitTransform(String value);
+void clearWebkitTransform();
+String getWebkitTransformOrigin();
+void setWebkitTransformOrigin(String value);
+void clearWebkitTransformOrigin();
+String getWebkitTransformOriginX();
+void setWebkitTransformOriginX(String value);
+void clearWebkitTransformOriginX();
+String getWebkitTransformOriginY();
+void setWebkitTransformOriginY(String value);
+void clearWebkitTransformOriginY();
+String getWebkitTransformOriginZ();
+void setWebkitTransformOriginZ(String value);
+void clearWebkitTransformOriginZ();
+String getWebkitTransformStyle();
+void setWebkitTransformStyle(String value);
+void clearWebkitTransformStyle();
+String getWebkitTransition();
+void setWebkitTransition(String value);
+void clearWebkitTransition();
+String getWebkitTransitionDelay();
+void setWebkitTransitionDelay(String value);
+void clearWebkitTransitionDelay();
+String getWebkitTransitionDuration();
+void setWebkitTransitionDuration(String value);
+void clearWebkitTransitionDuration();
+String getWebkitTransitionProperty();
+void setWebkitTransitionProperty(String value);
+void clearWebkitTransitionProperty();
+String getWebkitTransitionTimingFunction();
+void setWebkitTransitionTimingFunction(String value);
+void clearWebkitTransitionTimingFunction();
+String getWebkitUserDrag();
+void setWebkitUserDrag(String value);
+void clearWebkitUserDrag();
+String getWebkitUserModify();
+void setWebkitUserModify(String value);
+void clearWebkitUserModify();
+String getWebkitUserSelect();
+void setWebkitUserSelect(String value);
+void clearWebkitUserSelect();
+String getWebkitFlowInto();
+void setWebkitFlowInto(String value);
+void clearWebkitFlowInto();
+String getWebkitFlowFrom();
+void setWebkitFlowFrom(String value);
+void clearWebkitFlowFrom();
+String getWebkitRegionOverflow();
+void setWebkitRegionOverflow(String value);
+void clearWebkitRegionOverflow();
+String getWebkitShapeInside();
+void setWebkitShapeInside(String value);
+void clearWebkitShapeInside();
+String getWebkitShapeOutside();
+void setWebkitShapeOutside(String value);
+void clearWebkitShapeOutside();
+String getWebkitWrapMargin();
+void setWebkitWrapMargin(String value);
+void clearWebkitWrapMargin();
+String getWebkitWrapPadding();
+void setWebkitWrapPadding(String value);
+void clearWebkitWrapPadding();
+String getWebkitRegionBreakAfter();
+void setWebkitRegionBreakAfter(String value);
+void clearWebkitRegionBreakAfter();
+String getWebkitRegionBreakBefore();
+void setWebkitRegionBreakBefore(String value);
+void clearWebkitRegionBreakBefore();
+String getWebkitRegionBreakInside();
+void setWebkitRegionBreakInside(String value);
+void clearWebkitRegionBreakInside();
+String getWebkitWrapFlow();
+void setWebkitWrapFlow(String value);
+void clearWebkitWrapFlow();
+String getWebkitWrapThrough();
+void setWebkitWrapThrough(String value);
+void clearWebkitWrapThrough();
+String getWebkitWrap();
+void setWebkitWrap(String value);
+void clearWebkitWrap();
+String getWebkitTapHighlightColor();
+void setWebkitTapHighlightColor(String value);
+void clearWebkitTapHighlightColor();
+String getWebkitDashboardRegion();
+void setWebkitDashboardRegion(String value);
+void clearWebkitDashboardRegion();
+String getWebkitOverflowScrolling();
+void setWebkitOverflowScrolling(String value);
+void clearWebkitOverflowScrolling();
+}
diff --git a/elemental/src/elemental/css/CSSStyleRule.java b/elemental/src/elemental/css/CSSStyleRule.java
new file mode 100644
index 0000000..577b0c5
--- /dev/null
+++ b/elemental/src/elemental/css/CSSStyleRule.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * An object representing a single CSS style rule. <code>CSSStyleRule</code> implements the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/CSSRule">CSSRule</a></code>
+ interface.
+  */
+public interface CSSStyleRule extends CSSRule {
+
+
+  /**
+    * Gets/sets the textual representation of the selector for this rule, e.g. <code>"h1,h2"</code>.
+    */
+  String getSelectorText();
+
+  void setSelectorText(String arg);
+
+
+  /**
+    * Returns the <code><a title="en/DOM/CSSStyleDeclaration" rel="internal" href="https://developer.mozilla.org/en/DOM/CSSStyleDeclaration">CSSStyleDeclaration</a></code> object for the rule. <strong>Read only.</strong>
+    */
+  CSSStyleDeclaration getStyle();
+}
diff --git a/elemental/src/elemental/css/CSSStyleSheet.java b/elemental/src/elemental/css/CSSStyleSheet.java
new file mode 100644
index 0000000..91f1ccc
--- /dev/null
+++ b/elemental/src/elemental/css/CSSStyleSheet.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+import elemental.stylesheets.StyleSheet;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>An object implementing the <code>CSSStyleSheet</code> interface represents a single <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a> style sheet.</p>
+<p>A CSS style sheet consists of CSS rules, each of which can be manipulated through an object that corresponds to that rule and that implements the <code><a title="en/DOM/cssRule" rel="internal" href="https://developer.mozilla.org/en/DOM/cssRule">CSSRule</a></code> interface. The <code>CSSStyleSheet</code> itself lets you examine and modify its corresponding style sheet, including its list of rules.</p>
+<p>In practice, every <code>CSSStyleSheet</code> also implements the more generic <code><a title="en/DOM/StyleSheet" rel="internal" href="https://developer.mozilla.org/en/DOM/stylesheet">StyleSheet</a></code> interface. A list of <code>CSSStyleSheet</code>-implementing objects corresponding to the style sheets for a given document can be reached by the <code><a title="en/DOM/document.styleSheets" rel="internal" href="https://developer.mozilla.org/en/DOM/document.styleSheets">document.styleSheets</a></code> property, if the document is styled by an external CSS style sheet or an inline <code><a title="en/HTML/element/style" rel="internal" href="https://developer.mozilla.org/en/HTML/Element/style">style</a></code> element.</p>
+  */
+public interface CSSStyleSheet extends StyleSheet {
+
+
+  /**
+    * Returns a <code><a title="en/DOM/CSSRuleList" rel="internal" href="https://developer.mozilla.org/en/DOM/CSSRuleList">CSSRuleList</a></code> of the CSS rules in the style sheet.
+    */
+  CSSRuleList getCssRules();
+
+
+  /**
+    * If this style sheet is imported into the document using an <code><a title="en/CSS/@import" rel="internal" href="https://developer.mozilla.org/en/CSS/@import">@import</a></code> rule, the <code>ownerRule</code> property will return that <code><a title="en/DOM/CSSImportRule" rel="internal" href="https://developer.mozilla.org/en/DOM/CSSImportRule" class="new ">CSSImportRule</a></code>, otherwise it returns <code>null</code>.
+    */
+  CSSRule getOwnerRule();
+
+  CSSRuleList getRules();
+
+  int addRule(String selector, String style);
+
+  int addRule(String selector, String style, int index);
+
+
+  /**
+    * Deletes a rule from the style sheet.
+    */
+  void deleteRule(int index);
+
+
+  /**
+    * Inserts a new style rule into the current style sheet.
+    */
+  int insertRule(String rule, int index);
+
+  void removeRule(int index);
+}
diff --git a/elemental/src/elemental/css/CSSTransformValue.java b/elemental/src/elemental/css/CSSTransformValue.java
new file mode 100644
index 0000000..cd1fe50
--- /dev/null
+++ b/elemental/src/elemental/css/CSSTransformValue.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSTransformValue extends CSSValueList {
+
+    static final int CSS_MATRIX = 11;
+
+    static final int CSS_MATRIX3D = 21;
+
+    static final int CSS_PERSPECTIVE = 20;
+
+    static final int CSS_ROTATE = 4;
+
+    static final int CSS_ROTATE3D = 17;
+
+    static final int CSS_ROTATEX = 14;
+
+    static final int CSS_ROTATEY = 15;
+
+    static final int CSS_ROTATEZ = 16;
+
+    static final int CSS_SCALE = 5;
+
+    static final int CSS_SCALE3D = 19;
+
+    static final int CSS_SCALEX = 6;
+
+    static final int CSS_SCALEY = 7;
+
+    static final int CSS_SCALEZ = 18;
+
+    static final int CSS_SKEW = 8;
+
+    static final int CSS_SKEWX = 9;
+
+    static final int CSS_SKEWY = 10;
+
+    static final int CSS_TRANSLATE = 1;
+
+    static final int CSS_TRANSLATE3D = 13;
+
+    static final int CSS_TRANSLATEX = 2;
+
+    static final int CSS_TRANSLATEY = 3;
+
+    static final int CSS_TRANSLATEZ = 12;
+
+  int getOperationType();
+}
diff --git a/elemental/src/elemental/css/CSSUnknownRule.java b/elemental/src/elemental/css/CSSUnknownRule.java
new file mode 100644
index 0000000..7f081f0
--- /dev/null
+++ b/elemental/src/elemental/css/CSSUnknownRule.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSUnknownRule extends CSSRule {
+}
diff --git a/elemental/src/elemental/css/CSSValue.java b/elemental/src/elemental/css/CSSValue.java
new file mode 100644
index 0000000..1a43687
--- /dev/null
+++ b/elemental/src/elemental/css/CSSValue.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSValue {
+
+    static final int CSS_CUSTOM = 3;
+
+    static final int CSS_INHERIT = 0;
+
+    static final int CSS_PRIMITIVE_VALUE = 1;
+
+    static final int CSS_VALUE_LIST = 2;
+
+  String getCssText();
+
+  void setCssText(String arg);
+
+  int getCssValueType();
+}
diff --git a/elemental/src/elemental/css/CSSValueList.java b/elemental/src/elemental/css/CSSValueList.java
new file mode 100644
index 0000000..b1c4e04
--- /dev/null
+++ b/elemental/src/elemental/css/CSSValueList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CSSValueList extends CSSValue {
+
+  int getLength();
+
+  CSSValue item(int index);
+}
diff --git a/elemental/src/elemental/css/Counter.java b/elemental/src/elemental/css/Counter.java
new file mode 100644
index 0000000..3f2ddfb
--- /dev/null
+++ b/elemental/src/elemental/css/Counter.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * CSS counters are an implementation of <a class="external" rel="external" href="http://www.w3.org/TR/CSS21/generate.html#counters" title="http://www.w3.org/TR/CSS21/generate.html#counters" target="_blank">Automatic counters and numbering</a> in CSS 2.1. The value of a counter is manipulated through the use of <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/counter-reset">counter-reset</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/counter-increment">counter-increment</a></code>
+ and is displayed on a page using the <code>counter()</code> or <code>counters()</code> function of the <code><a title="en/CSS/content" rel="internal" href="https://developer.mozilla.org/en/CSS/content">content</a></code> property.
+  */
+public interface Counter {
+
+  String getIdentifier();
+
+  String getListStyle();
+
+  String getSeparator();
+}
diff --git a/elemental/src/elemental/css/RGBColor.java b/elemental/src/elemental/css/RGBColor.java
new file mode 100644
index 0000000..61a1892
--- /dev/null
+++ b/elemental/src/elemental/css/RGBColor.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface RGBColor {
+
+  CSSPrimitiveValue getBlue();
+
+  CSSPrimitiveValue getGreen();
+
+  CSSPrimitiveValue getRed();
+}
diff --git a/elemental/src/elemental/css/Rect.java b/elemental/src/elemental/css/Rect.java
new file mode 100644
index 0000000..4eec5ab
--- /dev/null
+++ b/elemental/src/elemental/css/Rect.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>rect</code> element is an SVG basic shape, used to create rectangles based on the position of a corner and their width and height. It may also be used to create rectangles with rounded corners.
+  */
+public interface Rect {
+
+  CSSPrimitiveValue getBottom();
+
+  CSSPrimitiveValue getLeft();
+
+  CSSPrimitiveValue getRight();
+
+  CSSPrimitiveValue getTop();
+}
diff --git a/elemental/src/elemental/css/WebKitCSSFilterValue.java b/elemental/src/elemental/css/WebKitCSSFilterValue.java
new file mode 100644
index 0000000..cf6a1f8
--- /dev/null
+++ b/elemental/src/elemental/css/WebKitCSSFilterValue.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebKitCSSFilterValue extends CSSValueList {
+
+    static final int CSS_FILTER_BLUR = 10;
+
+    static final int CSS_FILTER_BRIGHTNESS = 8;
+
+    static final int CSS_FILTER_CONTRAST = 9;
+
+    static final int CSS_FILTER_CUSTOM = 12;
+
+    static final int CSS_FILTER_DROP_SHADOW = 11;
+
+    static final int CSS_FILTER_GRAYSCALE = 2;
+
+    static final int CSS_FILTER_HUE_ROTATE = 5;
+
+    static final int CSS_FILTER_INVERT = 6;
+
+    static final int CSS_FILTER_OPACITY = 7;
+
+    static final int CSS_FILTER_REFERENCE = 1;
+
+    static final int CSS_FILTER_SATURATE = 4;
+
+    static final int CSS_FILTER_SEPIA = 3;
+
+  int getOperationType();
+}
diff --git a/elemental/src/elemental/css/WebKitCSSKeyframeRule.java b/elemental/src/elemental/css/WebKitCSSKeyframeRule.java
new file mode 100644
index 0000000..37c7862
--- /dev/null
+++ b/elemental/src/elemental/css/WebKitCSSKeyframeRule.java
@@ -0,0 +1,16 @@
+
+package elemental.css;
+
+import elemental.events.*;
+
+/**
+  * 
+  */
+public interface WebKitCSSKeyframeRule extends CSSRule {
+
+  String getKeyText();
+
+  void setKeyText(String arg);
+
+  CSSStyleDeclaration getStyle();
+}
diff --git a/elemental/src/elemental/css/WebKitCSSKeyframesRule.java b/elemental/src/elemental/css/WebKitCSSKeyframesRule.java
new file mode 100644
index 0000000..b1180d4
--- /dev/null
+++ b/elemental/src/elemental/css/WebKitCSSKeyframesRule.java
@@ -0,0 +1,22 @@
+
+package elemental.css;
+
+import elemental.events.*;
+
+/**
+  * 
+  */
+public interface WebKitCSSKeyframesRule extends CSSRule {
+
+  CSSRuleList getCssRules();
+
+  String getName();
+
+  void setName(String arg);
+
+  void deleteRule(String key);
+
+  WebKitCSSKeyframeRule findRule(String key);
+
+  void insertRule(String rule);
+}
diff --git a/elemental/src/elemental/css/WebKitCSSMatrix.java b/elemental/src/elemental/css/WebKitCSSMatrix.java
new file mode 100644
index 0000000..4222adb
--- /dev/null
+++ b/elemental/src/elemental/css/WebKitCSSMatrix.java
@@ -0,0 +1,118 @@
+
+package elemental.css;
+
+import elemental.events.*;
+
+/**
+  * 
+  */
+public interface WebKitCSSMatrix {
+
+  double getA();
+
+  void setA(double arg);
+
+  double getB();
+
+  void setB(double arg);
+
+  double getC();
+
+  void setC(double arg);
+
+  double getD();
+
+  void setD(double arg);
+
+  double getE();
+
+  void setE(double arg);
+
+  double getF();
+
+  void setF(double arg);
+
+  double getM11();
+
+  void setM11(double arg);
+
+  double getM12();
+
+  void setM12(double arg);
+
+  double getM13();
+
+  void setM13(double arg);
+
+  double getM14();
+
+  void setM14(double arg);
+
+  double getM21();
+
+  void setM21(double arg);
+
+  double getM22();
+
+  void setM22(double arg);
+
+  double getM23();
+
+  void setM23(double arg);
+
+  double getM24();
+
+  void setM24(double arg);
+
+  double getM31();
+
+  void setM31(double arg);
+
+  double getM32();
+
+  void setM32(double arg);
+
+  double getM33();
+
+  void setM33(double arg);
+
+  double getM34();
+
+  void setM34(double arg);
+
+  double getM41();
+
+  void setM41(double arg);
+
+  double getM42();
+
+  void setM42(double arg);
+
+  double getM43();
+
+  void setM43(double arg);
+
+  double getM44();
+
+  void setM44(double arg);
+
+  WebKitCSSMatrix inverse();
+
+  WebKitCSSMatrix multiply(WebKitCSSMatrix secondMatrix);
+
+  WebKitCSSMatrix rotate(double rotX, double rotY, double rotZ);
+
+  WebKitCSSMatrix rotateAxisAngle(double x, double y, double z, double angle);
+
+  WebKitCSSMatrix scale(double scaleX, double scaleY, double scaleZ);
+
+  void setMatrixValue(String string);
+
+  WebKitCSSMatrix skewX(double angle);
+
+  WebKitCSSMatrix skewY(double angle);
+
+  String toString();
+
+  WebKitCSSMatrix translate(double x, double y, double z);
+}
diff --git a/elemental/src/elemental/css/WebKitCSSRegionRule.java b/elemental/src/elemental/css/WebKitCSSRegionRule.java
new file mode 100644
index 0000000..200b9db
--- /dev/null
+++ b/elemental/src/elemental/css/WebKitCSSRegionRule.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.css;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebKitCSSRegionRule extends CSSRule {
+
+  CSSRuleList getCssRules();
+}
diff --git a/elemental/src/elemental/css/WebKitCSSTransformValue.java b/elemental/src/elemental/css/WebKitCSSTransformValue.java
new file mode 100644
index 0000000..de7d607
--- /dev/null
+++ b/elemental/src/elemental/css/WebKitCSSTransformValue.java
@@ -0,0 +1,54 @@
+
+package elemental.css;
+
+import elemental.events.*;
+
+/**
+  * 
+  */
+public interface WebKitCSSTransformValue extends CSSValueList {
+
+    static final int CSS_MATRIX = 11;
+
+    static final int CSS_MATRIX3D = 21;
+
+    static final int CSS_PERSPECTIVE = 20;
+
+    static final int CSS_ROTATE = 4;
+
+    static final int CSS_ROTATE3D = 17;
+
+    static final int CSS_ROTATEX = 14;
+
+    static final int CSS_ROTATEY = 15;
+
+    static final int CSS_ROTATEZ = 16;
+
+    static final int CSS_SCALE = 5;
+
+    static final int CSS_SCALE3D = 19;
+
+    static final int CSS_SCALEX = 6;
+
+    static final int CSS_SCALEY = 7;
+
+    static final int CSS_SCALEZ = 18;
+
+    static final int CSS_SKEW = 8;
+
+    static final int CSS_SKEWX = 9;
+
+    static final int CSS_SKEWY = 10;
+
+    static final int CSS_TRANSLATE = 1;
+
+    static final int CSS_TRANSLATE3D = 13;
+
+    static final int CSS_TRANSLATEX = 2;
+
+    static final int CSS_TRANSLATEY = 3;
+
+    static final int CSS_TRANSLATEZ = 12;
+
+  int getOperationType();
+}
diff --git a/elemental/src/elemental/dom/Attr.java b/elemental/src/elemental/dom/Attr.java
new file mode 100644
index 0000000..730cf10
--- /dev/null
+++ b/elemental/src/elemental/dom/Attr.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>This type represents a DOM&nbsp;element's attribute as an object. In most DOM methods, you will probably directly retrieve the attribute as a string (e.g., <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Element.getAttribute">Element.getAttribute()</a></code>
+, but certain functions (e.g., <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Element.getAttributeNode">Element.getAttributeNode()</a></code>
+)&nbsp;or means of iterating give <code>Attr</code> types.</p>
+<div class="warning"><strong>Warning:</strong> In DOM Core 1, 2 and 3, Attr inherited from Node. This is no longer the case in <a class="external" rel="external" href="http://www.w3.org/TR/dom/" title="http://www.w3.org/TR/dom/" target="_blank">DOM4</a>. In order to bring the implementation of <code>Attr</code> up to specification, work is underway to change it to no longer inherit from <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+. You should not be using any <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+ properties or methods on <code>Attr</code> objects. Starting in Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, the ones that are going to be removed output warning messages to the console. You should revise your code accordingly. See <a rel="custom" href="https://developer.mozilla.org/en/DOM/Attr#Deprecated_properties_and_methods">Deprecated properties and methods</a> for a complete list.</div>
+  */
+public interface Attr extends Node {
+
+
+  /**
+    * Indicates whether the attribute is an "ID attribute". An "ID attribute" being an attribute which value is expected to be unique across a DOM Document. In HTML DOM, "id" is the only ID attribute, but XML documents could define others. Whether or not an attribute is unique is often determined by a DTD or other schema description.
+    */
+  boolean isId();
+
+
+  /**
+    * The attribute's name.
+    */
+  String getName();
+
+
+  /**
+    * This property has been deprecated and will be removed in the future. Since you can only get Attr objects from elements, you should already know th
+    */
+  Element getOwnerElement();
+
+
+  /**
+    * This property has been deprecated and will be removed in the future; it now always returns <code>true</code>.
+    */
+  boolean isSpecified();
+
+
+  /**
+    * The attribute's value.
+    */
+  String getValue();
+
+  void setValue(String arg);
+}
diff --git a/elemental/src/elemental/dom/CDATASection.java b/elemental/src/elemental/dom/CDATASection.java
new file mode 100644
index 0000000..c165f20
--- /dev/null
+++ b/elemental/src/elemental/dom/CDATASection.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>A CDATA Section can be used within XML to include extended portions of unescaped text, such that the symbols &lt; and &amp; do not need escaping as they normally do within XML when used as text.</p>
+<p>It takes the form:</p>
+<pre class="eval">&lt;![CDATA[  ... ]]&gt;
+</pre>
+<p>For example:</p>
+<pre class="eval">&lt;foo&gt;Here is a CDATA section: &lt;![CDATA[  &lt; &gt; &amp; ]]&gt; with all kinds of unescaped text. &lt;/foo&gt;
+</pre>
+<p>The only sequence which is not allowed within a CDATA section is the closing sequence of a CDATA section itself:</p>
+<pre class="eval">&lt;![CDATA[  ]]&gt; will cause an error   ]]&gt;
+</pre>
+<p>Note that CDATA sections should not be used (without hiding) within HTML.</p>
+<p>As a CDATASection has no properties or methods unique to itself and only directly implements the Text interface, one can refer to <a title="En/DOM/Text" rel="internal" href="https://developer.mozilla.org/En/DOM/Text">Text</a> to find its properties and methods.</p>
+  */
+public interface CDATASection extends Text {
+}
diff --git a/elemental/src/elemental/dom/CharacterData.java b/elemental/src/elemental/dom/CharacterData.java
new file mode 100644
index 0000000..3ad91af
--- /dev/null
+++ b/elemental/src/elemental/dom/CharacterData.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <code><a title="En/DOM/Text" rel="internal" href="https://developer.mozilla.org/En/DOM/Text">Text</a></code>, <code><a title="En/DOM/Comment" rel="internal" href="https://developer.mozilla.org/En/DOM/Comment">Comment</a></code>, and <code><a title="en/DOM/CDATASection" rel="internal" href="https://developer.mozilla.org/en/DOM/CDATASection">CDATASection</a></code> all implement CharacterData, which in turn also implements <code><a class="internal" title="En/DOM/Node" rel="internal" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>. See <code>Node</code> for the remaining methods, properties, and constants.
+  */
+public interface CharacterData extends Node {
+
+  String getData();
+
+  void setData(String arg);
+
+  int getLength();
+
+  void appendData(String data);
+
+  void deleteData(int offset, int length);
+
+  void insertData(int offset, String data);
+
+  void replaceData(int offset, int length, String data);
+
+  String substringData(int offset, int length);
+}
diff --git a/elemental/src/elemental/dom/Clipboard.java b/elemental/src/elemental/dom/Clipboard.java
new file mode 100644
index 0000000..d4e347a
--- /dev/null
+++ b/elemental/src/elemental/dom/Clipboard.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.html.FileList;
+import elemental.util.Indexable;
+import elemental.html.ImageElement;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div>
+
+<a rel="custom" href="http://mxr.mozilla.org/mozilla-central/source/widget/public/nsIClipboard.idl"><code>widget/public/nsIClipboard.idl</code></a><span><a rel="internal" href="https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces" title="en/Interfaces/About_Scriptable_Interfaces">Scriptable</a></span></div><span>This interface supports basic clipboard operations such as: setting, retrieving, emptying, matching and supporting clipboard data.</span><div>Inherits from: <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsISupports">nsISupports</a></code>
+<span>Last changed in Gecko 1.8 (Firefox 1.5 / Thunderbird 1.5 / SeaMonkey 1.0)
+</span></div>
+  */
+public interface Clipboard {
+
+  String getDropEffect();
+
+  void setDropEffect(String arg);
+
+  String getEffectAllowed();
+
+  void setEffectAllowed(String arg);
+
+  FileList getFiles();
+
+  DataTransferItemList getItems();
+
+  Indexable getTypes();
+
+  void clearData();
+
+  void clearData(String type);
+
+
+  /**
+    * <p>This method retrieves data from the clipboard into a transferable.</p>
+
+<div id="section_8"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>aTransferable</code></dt> <dd>The transferable to receive data from the clipboard.</dd> <dt><code>aWhichClipboard</code></dt> <dd>Specifies the clipboard to which this operation applies.</dd>
+</dl>
+</div>
+    */
+  String getData(String type);
+
+
+  /**
+    * <p>This method sets the data from a transferable on the native clipboard.</p>
+
+<div id="section_13"><span id="Parameters_5"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>aTransferable</code></dt> <dd>The transferable containing the data to put on the clipboard.</dd> <dt><code>anOwner</code></dt> <dd>The owner of the transferable.</dd> <dt><code>aWhichClipboard</code></dt> <dd>Specifies the clipboard to which this operation applies.</dd>
+</dl>
+</div>
+    */
+  boolean setData(String type, String data);
+
+  void setDragImage(ImageElement image, int x, int y);
+}
diff --git a/elemental/src/elemental/dom/Comment.java b/elemental/src/elemental/dom/Comment.java
new file mode 100644
index 0000000..98e4e50
--- /dev/null
+++ b/elemental/src/elemental/dom/Comment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>A comment is used to add notations within markup; although it is generally not displayed, it is still available to be read in the source view (in Firefox:&nbsp;View -&gt; Page Source).&nbsp; These are represented in HTML and XML as content between <code>&lt;!--</code> and&nbsp; <code>--&gt; . </code>In XML, the character sequence "--" cannot be used within a comment.</p>
+<p>A comment has no special properties or methods of its own, but inherits those of <a title="En/DOM/CharacterData" rel="internal" href="https://developer.mozilla.org/En/DOM/CharacterData">CharacterData</a> (which inherits from <a title="en/DOM/Node" rel="internal" href="https://developer.mozilla.org/en/DOM/Node">Node</a>).</p>
+  */
+public interface Comment extends CharacterData {
+}
diff --git a/elemental/src/elemental/dom/Coordinates.java b/elemental/src/elemental/dom/Coordinates.java
new file mode 100644
index 0000000..ee97129
--- /dev/null
+++ b/elemental/src/elemental/dom/Coordinates.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface Coordinates {
+
+  double getAccuracy();
+
+  double getAltitude();
+
+  double getAltitudeAccuracy();
+
+  double getHeading();
+
+  double getLatitude();
+
+  double getLongitude();
+
+  double getSpeed();
+}
diff --git a/elemental/src/elemental/dom/DOMError.java b/elemental/src/elemental/dom/DOMError.java
new file mode 100644
index 0000000..ad63a0c
--- /dev/null
+++ b/elemental/src/elemental/dom/DOMError.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMError {
+
+  String getName();
+}
diff --git a/elemental/src/elemental/dom/DOMException.java b/elemental/src/elemental/dom/DOMException.java
new file mode 100644
index 0000000..4e457b9
--- /dev/null
+++ b/elemental/src/elemental/dom/DOMException.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The following are the <strong>DOMException</strong> codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col">Code</th> <th scope="col">'Abstract' Constant name</th> </tr> </thead> <tbody> <tr> <th colspan="2">Level 1</th> </tr> <tr> <td><code>1</code></td> <td><code>INDEX_SIZE_ERR</code></td> </tr> <tr> <td><code>2</code></td> <td><code>DOMSTRING_SIZE_ERR</code></td> </tr> <tr> <td><code>3</code></td> <td><code>HIERARCHY_REQUEST_ERR</code></td> </tr> <tr> <td><code>4</code></td> <td><code>WRONG_DOCUMENT_ERR</code></td> </tr> <tr> <td><code>5</code></td> <td><code>INVALID_CHARACTER_ERR</code></td> </tr> <tr> <td><code>6</code></td> <td><code>NO_DATA_ALLOWED_ERR</code></td> </tr> <tr> <td><code>7</code></td> <td><code>NO_MODIFICATION_ALLOWED_ERR</code></td> </tr> <tr> <td><code>8</code></td> <td><code>NOT_FOUND_ERR</code></td> </tr> <tr> <td><code>9</code></td> <td><code>NOT_SUPPORTED_ERR</code></td> </tr> <tr> <td><code>10</code></td> <td><code>INUSE_ATTRIBUTE_ERR</code></td> </tr> <tr> <th colspan="2">Level 2</th> </tr> <tr> <td><code>11</code></td> <td><code>INVALID_STATE_ERR</code></td> </tr> <tr> <td><code>12</code></td> <td><code>SYNTAX_ERR</code></td> </tr> <tr> <td><code>13</code></td> <td><code>INVALID_MODIFICATION_ERR</code></td> </tr> <tr> <td><code>14</code></td> <td><code>NAMESPACE_ERR</code></td> </tr> <tr> <td><code>15</code></td> <td><code>INVALID_ACCESS_ERR</code></td> </tr> <tr> <th colspan="2"><strong>Level 3</strong></th> </tr> <tr> <td><code>16</code></td> <td><code>VALIDATION_ERR</code></td> </tr> <tr> <td><code>17</code></td> <td><code>TYPE_MISMATCH_ERR</code></td> </tr> </tbody>
+</table>
+  */
+public interface DOMException {
+
+    static final int ABORT_ERR = 20;
+
+    static final int DATA_CLONE_ERR = 25;
+
+    static final int DOMSTRING_SIZE_ERR = 2;
+
+    static final int HIERARCHY_REQUEST_ERR = 3;
+
+    static final int INDEX_SIZE_ERR = 1;
+
+    static final int INUSE_ATTRIBUTE_ERR = 10;
+
+    static final int INVALID_ACCESS_ERR = 15;
+
+    static final int INVALID_CHARACTER_ERR = 5;
+
+    static final int INVALID_MODIFICATION_ERR = 13;
+
+    static final int INVALID_NODE_TYPE_ERR = 24;
+
+    static final int INVALID_STATE_ERR = 11;
+
+    static final int NAMESPACE_ERR = 14;
+
+    static final int NETWORK_ERR = 19;
+
+    static final int NOT_FOUND_ERR = 8;
+
+    static final int NOT_SUPPORTED_ERR = 9;
+
+    static final int NO_DATA_ALLOWED_ERR = 6;
+
+    static final int NO_MODIFICATION_ALLOWED_ERR = 7;
+
+    static final int QUOTA_EXCEEDED_ERR = 22;
+
+    static final int SECURITY_ERR = 18;
+
+    static final int SYNTAX_ERR = 12;
+
+    static final int TIMEOUT_ERR = 23;
+
+    static final int TYPE_MISMATCH_ERR = 17;
+
+    static final int URL_MISMATCH_ERR = 21;
+
+    static final int VALIDATION_ERR = 16;
+
+    static final int WRONG_DOCUMENT_ERR = 4;
+
+  int getCode();
+
+  String getMessage();
+
+  String getName();
+}
diff --git a/elemental/src/elemental/dom/DOMImplementation.java b/elemental/src/elemental/dom/DOMImplementation.java
new file mode 100644
index 0000000..b12d41d
--- /dev/null
+++ b/elemental/src/elemental/dom/DOMImplementation.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.css.CSSStyleSheet;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Provides methods which are not dependent on any particular DOM instances. Returned by <code><a title="En/DOM/Document.implementation" class="internal" rel="internal" href="https://developer.mozilla.org/en/DOM/document.implementation">document.implementation</a></code>.
+  */
+public interface DOMImplementation {
+
+  CSSStyleSheet createCSSStyleSheet(String title, String media);
+
+  Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype);
+
+  DocumentType createDocumentType(String qualifiedName, String publicId, String systemId);
+
+  Document createHTMLDocument(String title);
+
+  boolean hasFeature(String feature, String version);
+}
diff --git a/elemental/src/elemental/dom/DOMSettableTokenList.java b/elemental/src/elemental/dom/DOMSettableTokenList.java
new file mode 100644
index 0000000..17aa397
--- /dev/null
+++ b/elemental/src/elemental/dom/DOMSettableTokenList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMSettableTokenList extends DOMTokenList {
+
+  String getValue();
+
+  void setValue(String arg);
+}
diff --git a/elemental/src/elemental/dom/DOMStringList.java b/elemental/src/elemental/dom/DOMStringList.java
new file mode 100644
index 0000000..aa9b1b2
--- /dev/null
+++ b/elemental/src/elemental/dom/DOMStringList.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMStringList extends Indexable {
+
+  int getLength();
+
+  boolean contains(String string);
+
+  String item(int index);
+}
diff --git a/elemental/src/elemental/dom/DOMStringMap.java b/elemental/src/elemental/dom/DOMStringMap.java
new file mode 100644
index 0000000..b7919b3
--- /dev/null
+++ b/elemental/src/elemental/dom/DOMStringMap.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMStringMap {
+}
diff --git a/elemental/src/elemental/dom/DOMTokenList.java b/elemental/src/elemental/dom/DOMTokenList.java
new file mode 100644
index 0000000..0c06975
--- /dev/null
+++ b/elemental/src/elemental/dom/DOMTokenList.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * This type represents a set of space-separated tokens. Commonly returned by <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element.classList">HTMLElement.classList</a></code>
+, HTMLLinkElement.relList, HTMLAnchorElement.relList or HTMLAreaElement.relList. It is indexed beginning with 0 as with JavaScript arrays. DOMTokenList is always case-sensitive.
+  */
+public interface DOMTokenList {
+
+  int getLength();
+
+  void add(String token);
+
+  boolean contains(String token);
+
+  String item(int index);
+
+  void remove(String token);
+
+  boolean toggle(String token);
+}
diff --git a/elemental/src/elemental/dom/DataTransferItem.java b/elemental/src/elemental/dom/DataTransferItem.java
new file mode 100644
index 0000000..d711d07
--- /dev/null
+++ b/elemental/src/elemental/dom/DataTransferItem.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.html.Blob;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DataTransferItem {
+
+  String getKind();
+
+  String getType();
+
+  Blob getAsFile();
+
+  void getAsString();
+
+  void getAsString(StringCallback callback);
+}
diff --git a/elemental/src/elemental/dom/DataTransferItemList.java b/elemental/src/elemental/dom/DataTransferItemList.java
new file mode 100644
index 0000000..bd3f4ee
--- /dev/null
+++ b/elemental/src/elemental/dom/DataTransferItemList.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.html.File;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DataTransferItemList {
+
+  int getLength();
+
+  void add(File file);
+
+  void add(String data, String type);
+
+  void clear();
+
+  DataTransferItem item(int index);
+}
diff --git a/elemental/src/elemental/dom/DeviceMotionEvent.java b/elemental/src/elemental/dom/DeviceMotionEvent.java
new file mode 100644
index 0000000..d54f4c5
--- /dev/null
+++ b/elemental/src/elemental/dom/DeviceMotionEvent.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * A <code>DeviceMotionEvent</code> object describes an event that indicates the amount of physical motion of the device that has occurred, and is fired at a set interval (rather than in response to motion). It provides information about the rate of rotation, as well as acceleration along all three axes.
+  */
+public interface DeviceMotionEvent extends Event {
+
+
+  /**
+    * The interval, in milliseconds, at which the <code>DeviceMotionEvent</code> is fired. The next event will be fired in approximately this amount of time.
+    */
+  double getInterval();
+}
diff --git a/elemental/src/elemental/dom/DeviceOrientationEvent.java b/elemental/src/elemental/dom/DeviceOrientationEvent.java
new file mode 100644
index 0000000..f603227
--- /dev/null
+++ b/elemental/src/elemental/dom/DeviceOrientationEvent.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * A <code>DeviceOrientationEvent</code> object describes an event that provides information about the current orientation of the device as compared to the Earth coordinate frame. See <a title="Orientation and motion data explained" rel="internal" href="https://developer.mozilla.org/en/DOM/Orientation_and_motion_data_explained">Orientation and motion data explained</a> for details.
+  */
+public interface DeviceOrientationEvent extends Event {
+
+
+  /**
+    * This attribute's value is <code>true</code> if the orientation is provided as a difference between the device coordinate frame and the Earth coordinate frame; if the device can't detect the Earth coordinate frame, this value is <code>false</code>. <strong>Read only.</strong>
+    */
+  boolean isAbsolute();
+
+
+  /**
+    * The current orientation of the device around the Z axis; that is, how far the device is rotated around a line perpendicular to the device. <strong>Read only.</strong>
+    */
+  double getAlpha();
+
+
+  /**
+    * The current orientation of the device around the X axis; that is, how far the device is tipped forward or backward. <strong>Read only.</strong>
+    */
+  double getBeta();
+
+
+  /**
+    * <dl><dd>The current orientation of the device around the Y axis; that is, how far the device is turned left or right. <strong>Read only.</strong></dd>
+</dl>
+<div class="note"><strong>Note:</strong> If the browser is not able to provide notification information, all values are 0.</div>
+    */
+  double getGamma();
+
+  void initDeviceOrientationEvent(String type, boolean bubbles, boolean cancelable, double alpha, double beta, double gamma, boolean absolute);
+}
diff --git a/elemental/src/elemental/dom/Document.java b/elemental/src/elemental/dom/Document.java
new file mode 100644
index 0000000..570820d
--- /dev/null
+++ b/elemental/src/elemental/dom/Document.java
@@ -0,0 +1,1197 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.html.HTMLAllCollection;
+import elemental.stylesheets.StyleSheetList;
+import elemental.html.CanvasRenderingContext;
+import elemental.events.EventTarget;
+import elemental.html.HTMLCollection;
+import elemental.traversal.NodeFilter;
+import elemental.css.CSSStyleDeclaration;
+import elemental.events.Touch;
+import elemental.xpath.XPathNSResolver;
+import elemental.xpath.XPathResult;
+import elemental.ranges.Range;
+import elemental.html.Location;
+import elemental.html.Selection;
+import elemental.html.Window;
+import elemental.xpath.XPathExpression;
+import elemental.traversal.NodeIterator;
+import elemental.events.Event;
+import elemental.traversal.TreeWalker;
+import elemental.html.HeadElement;
+import elemental.events.TouchList;
+import elemental.events.EventListener;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+import elemental.svg.*;
+
+import java.util.Date;
+
+/**
+  * <p>Each web page loaded in the browser has its own <strong>document</strong> object. This object serves as an entry point to the web page's content (the <a title="en/Using_the_W3C_DOM_Level_1_Core" rel="internal" href="https://developer.mozilla.org/en/Using_the_W3C_DOM_Level_1_Core">DOM tree</a>, including elements such as <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body">&lt;body&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/table">&lt;table&gt;</a></code>
+) and provides functionality global to the document (such as obtaining the page's URL and creating new elements in the document).</p>
+<p>A document object can be obtained from various APIs:</p>
+<ul> <li>Most commonly, you work with the document the script is running in by using <code>document</code> in document's <a title="en/HTML/Element/Script" rel="internal" href="https://developer.mozilla.org/En/HTML/Element/Script">scripts</a>. (The same document can also be referred to as <a title="window.document" rel="internal" href="https://developer.mozilla.org/en/DOM/window.document"><code>window.document</code></a>.)</li> <li>The document of an iframe via the iframe's <code><a title="en/DOM/HTMLIFrameElement#Properties" rel="internal" href="https://developer.mozilla.org/en/DOM/HTMLIFrameElement#Properties">contentDocument</a></code> property.</li> <li>The <a title="en/XMLHttpRequest#Attributes" rel="internal" href="https://developer.mozilla.org/en/nsIXMLHttpRequest#Attributes"><code>responseXML</code> of an <code>XMLHttpRequest</code> object</a>.</li> <li>The document, that given node or element belongs to, can be retrieved using the node's <code><a title="en/DOM/Node.ownerDocument" rel="internal" href="https://developer.mozilla.org/En/DOM/Node.ownerDocument">ownerDocument</a></code> property.</li> <li>...and more.</li>
+</ul>
+<p>Depending on the kind of the document (e.g. <a title="en/HTML" rel="internal" href="https://developer.mozilla.org/en/HTML">HTML</a> or <a title="en/XML" rel="internal" href="https://developer.mozilla.org/en/XML">XML</a>) different APIs may be available on the document object. This theoretical availability of APIs is usually described in terms of <em>implementing interfaces</em> defined in the relevant W3C DOM specifications:</p>
+<ul> <li>All document objects implement the DOM Core <a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-Core/core.html#i-Document" title="http://www.w3.org/TR/DOM-Level-2-Core/core.html#i-Document" target="_blank"><code>Document</code></a> and <code><a title="en/DOM/Node" rel="internal" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code> interfaces, meaning that the "core" properties and methods are available for all kinds of documents.</li> <li>In addition to the generalized DOM Core document interface, HTML documents also implement the <code><a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268" target="_blank">HTMLDocument</a></code> interface, which is a more specialized interface for dealing with HTML documents (e.g., <a title="en/DOM/document.cookie" rel="internal" href="https://developer.mozilla.org/en/DOM/document.cookie">document.cookie</a>, <a title="en/DOM/document.alinkColor" rel="internal" href="https://developer.mozilla.org/en/DOM/document.alinkColor">document.alinkColor</a>).</li> <li><a title="en/XUL" rel="internal" href="https://developer.mozilla.org/en/XUL">XUL</a> documents (available to Mozilla add-on and application developers) implement their own additions to the core Document functionality.</li>
+</ul>
+<p>Methods or properties listed here that are part of a more specialized interface have an asterisk (*) next to them and have additional information in the&nbsp; Availability column.</p>
+<p>Note that some APIs listed below are not available in all browsers for various reasons:</p>
+<ul> <li><strong>Obsolete</strong>: on its way of being removed from supporting browsers.</li> <li><strong>Non-standard</strong>: either an experimental feature not (yet?) agreed upon by all vendors, or a feature targeted specifically at the code running in a specific browser (e.g. Mozilla has a few DOM APIs created for its add-ons and application development).</li> <li>Part of a completed or an emerging standard, but not (yet?) implemented in all browsers or implemented in the newest versions of the browsers.</li>
+</ul>
+<p>Detailed browser compatibility tables are located at the pages describing each property or method.</p>
+  */
+public interface Document extends Node, NodeSelector {
+
+/**
+ * Contains the set of standard values used with {@link #createEvent}.
+ */
+public interface Events {
+  public static final String CUSTOM = "CustomEvent";
+  public static final String KEYBOARD = "KeyboardEvent";
+  public static final String MESSAGE = "MessageEvent";
+  public static final String MOUSE = "MouseEvent";
+  public static final String MUTATION = "MutationEvent";
+  public static final String OVERFLOW = "OverflowEvent";
+  public static final String PAGE_TRANSITION = "PageTransitionEvent";
+  public static final String PROGRESS = "ProgressEvent";
+  public static final String STORAGE = "StorageEvent";
+  public static final String TEXT = "TextEvent";
+  public static final String UI = "UIEvent";
+  public static final String WEBKIT_ANIMATION = "WebKitAnimationEvent";
+  public static final String WEBKIT_TRANSITION = "WebKitTransitionEvent";
+  public static final String WHEEL = "WheelEvent";
+  public static final String SVGS = "SVGEvents";
+  public static final String SVG_ZOOMS = "SVGZoomEvents";
+  public static final String TOUCH = "TouchEvent";
+}
+
+/**
+ * Contains the set of standard values returned by {@link #readyState}.
+ */
+public interface ReadyState {
+
+  /**
+   * Indicates the document is still loading and parsing.
+   */
+  public static final String LOADING = "loading";
+
+  /**
+   * Indicates the document is finished parsing but is still loading
+   * subresources.
+   */
+  public static final String INTERACTIVE = "interactive";
+
+  /**
+   * Indicates the document and all subresources have been loaded.
+   */
+  public static final String COMPLETE = "complete";
+}
+
+
+  /**
+    * Returns a string containing the URL of the current document.
+    */
+  String getURL();
+
+
+  /**
+    * Returns the currently focused element
+    */
+  Element getActiveElement();
+
+
+  /**
+    * Returns or sets the color of active links in the document body.
+    */
+  String getAlinkColor();
+
+  void setAlinkColor(String arg);
+
+  HTMLAllCollection getAll();
+
+  void setAll(HTMLAllCollection arg);
+
+
+  /**
+    * Returns a list of all of the anchors in the document.
+    */
+  HTMLCollection getAnchors();
+
+
+  /**
+    * Returns an ordered list of the applets within a document.
+    */
+  HTMLCollection getApplets();
+
+
+  /**
+    * Gets/sets the background color of the current document.
+    */
+  String getBgColor();
+
+  void setBgColor(String arg);
+
+
+  /**
+    * Returns the BODY node of the current document.
+    */
+  Element getBody();
+
+  void setBody(Element arg);
+
+
+  /**
+    * Returns the character set being used by the document.
+    */
+  String getCharacterSet();
+
+  String getCharset();
+
+  void setCharset(String arg);
+
+
+  /**
+    * Indicates whether the document is rendered in Quirks or Strict mode.
+    */
+  String getCompatMode();
+
+
+  /**
+    * Returns a semicolon-separated list of the cookies for that document or sets a single cookie.
+    */
+  String getCookie();
+
+  void setCookie(String arg);
+
+  String getDefaultCharset();
+
+
+  /**
+    * Returns a reference to the window object.
+    */
+  Window getDefaultView();
+
+
+  /**
+    * Gets/sets WYSYWIG editing capability of <a title="en/Midas" rel="internal" href="https://developer.mozilla.org/en/Midas">Midas</a>. It can only be used for HTML documents.
+    */
+  String getDesignMode();
+
+  void setDesignMode(String arg);
+
+
+  /**
+    * Gets/sets directionality (rtl/ltr) of the document
+    */
+  String getDir();
+
+  void setDir(String arg);
+
+
+  /**
+    * Returns the Document Type Definition (DTD) of the current document.
+    */
+  DocumentType getDoctype();
+
+
+  /**
+    * Returns the Element that is a direct child of document. For HTML documents, this is normally the HTML element.
+    */
+  Element getDocumentElement();
+
+
+  /**
+    * Returns the document location.
+    */
+  String getDocumentURI();
+
+  void setDocumentURI(String arg);
+
+
+  /**
+    * Returns the domain of the current document.
+    */
+  String getDomain();
+
+  void setDomain(String arg);
+
+
+  /**
+    * Returns a list of the embedded OBJECTS within the current document.
+    */
+  HTMLCollection getEmbeds();
+
+
+  /**
+    * Gets/sets the foreground color, or text color, of the current document.
+    */
+  String getFgColor();
+
+  void setFgColor(String arg);
+
+
+  /**
+    * Returns a list of the FORM elements within the current document.
+    */
+  HTMLCollection getForms();
+
+
+  /**
+    * Returns the HEAD node of the current document.
+    */
+  HeadElement getHead();
+
+
+  /**
+    * Gets/sets the height of the current document.
+    */
+  int getHeight();
+
+
+  /**
+    * Returns a list of the images in the current document.
+    */
+  HTMLCollection getImages();
+
+
+  /**
+    * Returns the DOM implementation associated with the current document.
+    */
+  DOMImplementation getImplementation();
+
+
+  /**
+    * Returns the encoding used when the document was parsed.
+    */
+  String getInputEncoding();
+
+
+  /**
+    * Returns the date on which the document was last modified.
+    */
+  String getLastModified();
+
+
+  /**
+    * Gets/sets the color of hyperlinks in the document.
+    */
+  String getLinkColor();
+
+  void setLinkColor(String arg);
+
+
+  /**
+    * Returns a list of all the hyperlinks in the document.
+    */
+  HTMLCollection getLinks();
+
+
+  /**
+    * Returns the URI of the current document.
+    */
+  Location getLocation();
+
+  void setLocation(Location arg);
+
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+  EventListener getOnbeforecopy();
+
+  void setOnbeforecopy(EventListener arg);
+
+  EventListener getOnbeforecut();
+
+  void setOnbeforecut(EventListener arg);
+
+  EventListener getOnbeforepaste();
+
+  void setOnbeforepaste(EventListener arg);
+
+  EventListener getOnblur();
+
+  void setOnblur(EventListener arg);
+
+  EventListener getOnchange();
+
+  void setOnchange(EventListener arg);
+
+  EventListener getOnclick();
+
+  void setOnclick(EventListener arg);
+
+  EventListener getOncontextmenu();
+
+  void setOncontextmenu(EventListener arg);
+
+  EventListener getOncopy();
+
+  void setOncopy(EventListener arg);
+
+  EventListener getOncut();
+
+  void setOncut(EventListener arg);
+
+  EventListener getOndblclick();
+
+  void setOndblclick(EventListener arg);
+
+  EventListener getOndrag();
+
+  void setOndrag(EventListener arg);
+
+  EventListener getOndragend();
+
+  void setOndragend(EventListener arg);
+
+  EventListener getOndragenter();
+
+  void setOndragenter(EventListener arg);
+
+  EventListener getOndragleave();
+
+  void setOndragleave(EventListener arg);
+
+  EventListener getOndragover();
+
+  void setOndragover(EventListener arg);
+
+  EventListener getOndragstart();
+
+  void setOndragstart(EventListener arg);
+
+  EventListener getOndrop();
+
+  void setOndrop(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnfocus();
+
+  void setOnfocus(EventListener arg);
+
+  EventListener getOninput();
+
+  void setOninput(EventListener arg);
+
+  EventListener getOninvalid();
+
+  void setOninvalid(EventListener arg);
+
+  EventListener getOnkeydown();
+
+  void setOnkeydown(EventListener arg);
+
+  EventListener getOnkeypress();
+
+  void setOnkeypress(EventListener arg);
+
+  EventListener getOnkeyup();
+
+  void setOnkeyup(EventListener arg);
+
+  EventListener getOnload();
+
+  void setOnload(EventListener arg);
+
+  EventListener getOnmousedown();
+
+  void setOnmousedown(EventListener arg);
+
+  EventListener getOnmousemove();
+
+  void setOnmousemove(EventListener arg);
+
+  EventListener getOnmouseout();
+
+  void setOnmouseout(EventListener arg);
+
+  EventListener getOnmouseover();
+
+  void setOnmouseover(EventListener arg);
+
+  EventListener getOnmouseup();
+
+  void setOnmouseup(EventListener arg);
+
+  EventListener getOnmousewheel();
+
+  void setOnmousewheel(EventListener arg);
+
+  EventListener getOnpaste();
+
+  void setOnpaste(EventListener arg);
+
+
+  /**
+    * <dl><dd>Returns the event handling code for the <code>readystatechange</code> event.</dd>
+</dl>
+<div class="geckoVersionNote"> <p>
+</p><div class="geckoVersionHeading">Gecko 9.0 note<div>(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+</div></div>
+<p></p> <p>Starting in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+, you can now use the syntax <code>if ("onabort" in document)</code> to determine whether or not a given event handler property exists. This is because event handler interfaces have been updated to be proper web IDL interfaces. See <a title="en/DOM/DOM event handlers" rel="internal" href="https://developer.mozilla.org/en/DOM/DOM_event_handlers">DOM event handlers</a> for details.</p>
+</div>
+    */
+  EventListener getOnreadystatechange();
+
+  void setOnreadystatechange(EventListener arg);
+
+  EventListener getOnreset();
+
+  void setOnreset(EventListener arg);
+
+  EventListener getOnscroll();
+
+  void setOnscroll(EventListener arg);
+
+  EventListener getOnsearch();
+
+  void setOnsearch(EventListener arg);
+
+  EventListener getOnselect();
+
+  void setOnselect(EventListener arg);
+
+  EventListener getOnselectionchange();
+
+  void setOnselectionchange(EventListener arg);
+
+  EventListener getOnselectstart();
+
+  void setOnselectstart(EventListener arg);
+
+  EventListener getOnsubmit();
+
+  void setOnsubmit(EventListener arg);
+
+  EventListener getOntouchcancel();
+
+  void setOntouchcancel(EventListener arg);
+
+  EventListener getOntouchend();
+
+  void setOntouchend(EventListener arg);
+
+  EventListener getOntouchmove();
+
+  void setOntouchmove(EventListener arg);
+
+  EventListener getOntouchstart();
+
+  void setOntouchstart(EventListener arg);
+
+  EventListener getOnwebkitfullscreenchange();
+
+  void setOnwebkitfullscreenchange(EventListener arg);
+
+  EventListener getOnwebkitfullscreenerror();
+
+  void setOnwebkitfullscreenerror(EventListener arg);
+
+
+  /**
+    * Returns a list of the available plugins.
+    */
+  HTMLCollection getPlugins();
+
+  String getPreferredStylesheetSet();
+
+
+  /**
+    * Returns loading status of the document
+    */
+  String getReadyState();
+
+
+  /**
+    * Returns the URI of the page that linked to this page.
+    */
+  String getReferrer();
+
+
+  /**
+    * Returns all the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/script">&lt;script&gt;</a></code>
+ elements on the document.
+    */
+  HTMLCollection getScripts();
+
+  String getSelectedStylesheetSet();
+
+  void setSelectedStylesheetSet(String arg);
+
+
+  /**
+    * Returns a list of the stylesheet objects on the current document.
+    */
+  StyleSheetList getStyleSheets();
+
+
+  /**
+    * Returns the title of the current document.
+    */
+  String getTitle();
+
+  void setTitle(String arg);
+
+
+  /**
+    * Gets/sets the color of visited hyperlinks.
+    */
+  String getVlinkColor();
+
+  void setVlinkColor(String arg);
+
+  Element getWebkitCurrentFullScreenElement();
+
+  boolean isWebkitFullScreenKeyboardInputAllowed();
+
+  Element getWebkitFullscreenElement();
+
+  boolean isWebkitFullscreenEnabled();
+
+  boolean isWebkitHidden();
+
+  boolean isWebkitIsFullScreen();
+
+  String getWebkitVisibilityState();
+
+
+  /**
+    * Returns the width of the current document.
+    */
+  int getWidth();
+
+
+  /**
+    * Returns the encoding as determined by the XML declaration.<br> <div class="note">Firefox 10 and later don't implement it anymore.</div>
+    */
+  String getXmlEncoding();
+
+
+  /**
+    * Returns <code>true</code> if the XML declaration specifies the document is standalone (<em>e.g.,</em> An external part of the DTD affects the document's content), else <code>false</code>.
+    */
+  boolean isXmlStandalone();
+
+  void setXmlStandalone(boolean arg);
+
+
+  /**
+    * Returns the version number as specified in the XML declaration or <code>"1.0"</code> if the declaration is absent.
+    */
+  String getXmlVersion();
+
+  void setXmlVersion(String arg);
+
+
+  /**
+    * <dd>Adopt node from an external document</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.appendChild">Node.appendChild</a></code>
+</dt> <dd>Adds a node to the end of the list of children of a specified parent node.</dd>
+    */
+  Node adoptNode(Node source);
+
+  Range caretRangeFromPoint(int x, int y);
+
+
+  /**
+    * Creates a new attribute node and returns it.
+    */
+  Attr createAttribute(String name);
+
+
+  /**
+    * Creates a new attribute node in a given namespace and returns it.
+    */
+  Attr createAttributeNS(String namespaceURI, String qualifiedName);
+
+
+  /**
+    * Creates a new CDATA node and returns it.
+    */
+  CDATASection createCDATASection(String data);
+
+
+  /**
+    * Creates a new comment node and returns it.
+    */
+  Comment createComment(String data);
+
+
+  /**
+    * Creates a new document fragment.
+    */
+  DocumentFragment createDocumentFragment();
+
+
+  /**
+    * Creates a new element with the given tag name.
+    */
+  Element createElement(String tagName);
+
+
+  /**
+    * Creates a new element with the given tag name and namespace URI.
+    */
+  Element createElementNS(String namespaceURI, String qualifiedName);
+
+
+  /**
+    * Creates a new entity reference object and returns it.
+    */
+  EntityReference createEntityReference(String name);
+
+
+  /**
+    * Creates an event.
+    */
+  Event createEvent(String eventType);
+
+
+  /**
+    * Compiles an <code><a title="en/XPathExpression" rel="internal" href="https://developer.mozilla.org/en/XPathExpression">XPathExpression</a></code> which can then be used for (repeated) evaluations.
+    */
+  XPathExpression createExpression(String expression, XPathNSResolver resolver);
+
+
+  /**
+    * Creates an XPathNSResolver.
+    */
+  XPathNSResolver createNSResolver(Node nodeResolver);
+
+  NodeIterator createNodeIterator(Node root, int whatToShow, NodeFilter filter, boolean expandEntityReferences);
+
+
+  /**
+    * Creates a new processing instruction element and returns it.
+    */
+  ProcessingInstruction createProcessingInstruction(String target, String data);
+
+
+  /**
+    * Creates a Range object.
+    */
+  Range createRange();
+
+
+  /**
+    * Creates a text node.
+    */
+  Text createTextNode(String data);
+
+  Touch createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, float webkitRotationAngle, float webkitForce);
+
+  TouchList createTouchList();
+
+
+  /**
+    * Creates a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/treeWalker">treeWalker</a></code>
+ object.
+    */
+  TreeWalker createTreeWalker(Node root, int whatToShow, NodeFilter filter, boolean expandEntityReferences);
+
+
+  /**
+    * Returns the element visible at the specified coordinates.
+    */
+  Element elementFromPoint(int x, int y);
+
+
+  /**
+    * Evaluates an XPath expression.
+    */
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult);
+
+
+  /**
+    * Executes a <a title="en/Midas" rel="internal" href="https://developer.mozilla.org/en/Midas">Midas</a> command.
+    */
+  boolean execCommand(String command, boolean userInterface, String value);
+
+  CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height);
+
+
+  /**
+    * Returns an object reference to the identified element.
+    */
+  Element getElementById(String elementId);
+
+
+  /**
+    * Returns a list of elements with the given class name.
+    */
+  NodeList getElementsByClassName(String tagname);
+
+
+  /**
+    * Returns a list of elements with the given name.
+    */
+  NodeList getElementsByName(String elementName);
+
+
+  /**
+    * Returns a list of elements with the given tag name.
+    */
+  NodeList getElementsByTagName(String tagname);
+
+
+  /**
+    * <dd>Returns a list of elements with the given tag name and namespace.</dd> <dt><code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Node.getFeature" class="new">Node.getFeature</a></code>
+</dt>
+    */
+  NodeList getElementsByTagNameNS(String namespaceURI, String localName);
+
+  CSSStyleDeclaration getOverrideStyle(Element element, String pseudoElement);
+
+
+  /**
+    * <dd>Returns a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Selection">Selection</a></code>
+ object related to text selected in the document.</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.getUserData">Node.getUserData</a></code>
+</dt> <dd>Returns any data previously set on the node via setUserData() by key</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.hasAttributes">Node.hasAttributes</a></code>
+</dt> <dd>Indicates whether the node possesses attributes</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.hasChildNodes">Node.hasChildNodes</a></code>
+</dt> <dd>Returns a Boolean value indicating whether the current element has child nodes or not.</dd>
+    */
+  Selection getSelection();
+
+
+  /**
+    * <dd>Returns a clone of a node from an external document</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.insertBefore">Node.insertBefore</a></code>
+</dt> <dd>Inserts the specified node before a reference node as a child of the current node.</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.isDefaultNamespace">Node.isDefaultNamespace</a></code>
+</dt> <dd>Returns true if the namespace is the default namespace on the given node</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.isEqualNode">Node.isEqualNode</a></code>
+</dt> <dd>Indicates whether the node is equal to the given node</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.isSameNode">Node.isSameNode</a></code>
+</dt> <dd>Indicates whether the node is the same as the given node</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.isSupported">Node.isSupported</a></code>
+</dt> <dd>Tests whether the DOM implementation implements a specific feature and that feature is supported by this node or document</dd>
+    */
+  Node importNode(Node importedNode);
+
+
+  /**
+    * <dd>Returns a clone of a node from an external document</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.insertBefore">Node.insertBefore</a></code>
+</dt> <dd>Inserts the specified node before a reference node as a child of the current node.</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.isDefaultNamespace">Node.isDefaultNamespace</a></code>
+</dt> <dd>Returns true if the namespace is the default namespace on the given node</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.isEqualNode">Node.isEqualNode</a></code>
+</dt> <dd>Indicates whether the node is equal to the given node</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.isSameNode">Node.isSameNode</a></code>
+</dt> <dd>Indicates whether the node is the same as the given node</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.isSupported">Node.isSupported</a></code>
+</dt> <dd>Tests whether the DOM implementation implements a specific feature and that feature is supported by this node or document</dd>
+    */
+  Node importNode(Node importedNode, boolean deep);
+
+
+  /**
+    * Returns true if the <a title="en/Midas" rel="internal" href="https://developer.mozilla.org/en/Midas">Midas</a> command can be executed on the current range.
+    */
+  boolean queryCommandEnabled(String command);
+
+
+  /**
+    * Returns true if the <a title="en/Midas" rel="internal" href="https://developer.mozilla.org/en/Midas">Midas</a> command is in a indeterminate state on the current range.
+    */
+  boolean queryCommandIndeterm(String command);
+
+
+  /**
+    * Returns true if the <a title="en/Midas" rel="internal" href="https://developer.mozilla.org/en/Midas">Midas</a> command has been executed on the current range.
+    */
+  boolean queryCommandState(String command);
+
+  boolean queryCommandSupported(String command);
+
+
+  /**
+    * Returns the current value of the current range for <a title="en/Midas" rel="internal" href="https://developer.mozilla.org/en/Midas">Midas</a> command. As of Firefox 2.0.0.2, queryCommandValue will return an empty string when a command value has not been explicitly set.
+    */
+  String queryCommandValue(String command);
+
+
+  /**
+    * Returns the first Element node within the document, in document order, that matches the specified selectors.
+    */
+  Element querySelector(String selectors);
+
+
+  /**
+    * Returns a list of all the Element nodes within the document that match the specified selectors.
+    */
+  NodeList querySelectorAll(String selectors);
+
+  void webkitCancelFullScreen();
+
+  void webkitExitFullscreen();
+
+  void captureEvents();
+
+
+  /**
+    * <dd>In majority of modern browsers, including recent versions of Firefox and Internet Explorer, this method does nothing.</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.cloneNode">Node.cloneNode</a></code>
+</dt> <dd>Makes a copy of a node or document</dd>
+    */
+  void clear();
+
+
+  /**
+    * <dd>Closes a document stream for writing.</dd> <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.compareDocumentPosition">Node.compareDocumentPosition</a></code>
+</dt> <dd>Compares the position of the current node against another node in any other document.</dd>
+    */
+  void close();
+
+
+  /**
+    * Returns <code>true</code> if the focus is currently located anywhere inside the specified document.
+    */
+  boolean hasFocus();
+
+
+  /**
+    * Opens a document stream for writing.
+    */
+  void open();
+
+
+  /**
+    * <dt><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.removeChild">Node.removeChild</a></code>
+</dt> <dd>Removes a child node from the DOM</dd>
+    */
+  void releaseEvents();
+
+
+  /**
+    * Writes text to a document.
+    */
+  void write(String text);
+
+
+  /**
+    * Write a line of text to a document.
+    */
+  void writeln(String text);
+
+  AnchorElement createAnchorElement();
+
+  AppletElement createAppletElement();
+
+  AreaElement createAreaElement();
+
+  AudioElement createAudioElement();
+
+  BRElement createBRElement();
+
+  BaseElement createBaseElement();
+
+  BaseFontElement createBaseFontElement();
+
+  BodyElement createBodyElement();
+
+  ButtonElement createButtonElement();
+
+  CanvasElement createCanvasElement();
+
+  ContentElement createContentElement();
+
+  DListElement createDListElement();
+
+  DetailsElement createDetailsElement();
+
+  DirectoryElement createDirectoryElement();
+
+  DivElement createDivElement();
+
+  EmbedElement createEmbedElement();
+
+  FieldSetElement createFieldSetElement();
+
+  FontElement createFontElement();
+
+  FormElement createFormElement();
+
+  FrameElement createFrameElement();
+
+  FrameSetElement createFrameSetElement();
+
+  HRElement createHRElement();
+
+  HeadElement createHeadElement();
+
+  HeadingElement createHeadingElement();
+
+  HtmlElement createHtmlElement();
+
+  IFrameElement createIFrameElement();
+
+  ImageElement createImageElement();
+
+  InputElement createInputElement();
+
+  KeygenElement createKeygenElement();
+
+  LIElement createLIElement();
+
+  LabelElement createLabelElement();
+
+  LegendElement createLegendElement();
+
+  LinkElement createLinkElement();
+
+  MapElement createMapElement();
+
+  MarqueeElement createMarqueeElement();
+
+  MediaElement createMediaElement();
+
+  MenuElement createMenuElement();
+
+  MetaElement createMetaElement();
+
+  MeterElement createMeterElement();
+
+  ModElement createModElement();
+
+  OListElement createOListElement();
+
+  ObjectElement createObjectElement();
+
+  OptGroupElement createOptGroupElement();
+
+  OptionElement createOptionElement();
+
+  OutputElement createOutputElement();
+
+  ParagraphElement createParagraphElement();
+
+  ParamElement createParamElement();
+
+  PreElement createPreElement();
+
+  ProgressElement createProgressElement();
+
+  QuoteElement createQuoteElement();
+
+  SVGAElement createSVGAElement();
+
+  SVGAltGlyphDefElement createSVGAltGlyphDefElement();
+
+  SVGAltGlyphElement createSVGAltGlyphElement();
+
+  SVGAltGlyphItemElement createSVGAltGlyphItemElement();
+
+  SVGAnimateColorElement createSVGAnimateColorElement();
+
+  SVGAnimateElement createSVGAnimateElement();
+
+  SVGAnimateMotionElement createSVGAnimateMotionElement();
+
+  SVGAnimateTransformElement createSVGAnimateTransformElement();
+
+  SVGAnimationElement createSVGAnimationElement();
+
+  SVGCircleElement createSVGCircleElement();
+
+  SVGClipPathElement createSVGClipPathElement();
+
+  SVGComponentTransferFunctionElement createSVGComponentTransferFunctionElement();
+
+  SVGCursorElement createSVGCursorElement();
+
+  SVGDefsElement createSVGDefsElement();
+
+  SVGDescElement createSVGDescElement();
+
+  SVGEllipseElement createSVGEllipseElement();
+
+  SVGFEBlendElement createSVGFEBlendElement();
+
+  SVGFEColorMatrixElement createSVGFEColorMatrixElement();
+
+  SVGFEComponentTransferElement createSVGFEComponentTransferElement();
+
+  SVGFECompositeElement createSVGFECompositeElement();
+
+  SVGFEConvolveMatrixElement createSVGFEConvolveMatrixElement();
+
+  SVGFEDiffuseLightingElement createSVGFEDiffuseLightingElement();
+
+  SVGFEDisplacementMapElement createSVGFEDisplacementMapElement();
+
+  SVGFEDistantLightElement createSVGFEDistantLightElement();
+
+  SVGFEDropShadowElement createSVGFEDropShadowElement();
+
+  SVGFEFloodElement createSVGFEFloodElement();
+
+  SVGFEFuncAElement createSVGFEFuncAElement();
+
+  SVGFEFuncBElement createSVGFEFuncBElement();
+
+  SVGFEFuncGElement createSVGFEFuncGElement();
+
+  SVGFEFuncRElement createSVGFEFuncRElement();
+
+  SVGFEGaussianBlurElement createSVGFEGaussianBlurElement();
+
+  SVGFEImageElement createSVGFEImageElement();
+
+  SVGFEMergeElement createSVGFEMergeElement();
+
+  SVGFEMergeNodeElement createSVGFEMergeNodeElement();
+
+  SVGFEMorphologyElement createSVGFEMorphologyElement();
+
+  SVGFEOffsetElement createSVGFEOffsetElement();
+
+  SVGFEPointLightElement createSVGFEPointLightElement();
+
+  SVGFESpecularLightingElement createSVGFESpecularLightingElement();
+
+  SVGFESpotLightElement createSVGFESpotLightElement();
+
+  SVGFETileElement createSVGFETileElement();
+
+  SVGFETurbulenceElement createSVGFETurbulenceElement();
+
+  SVGFilterElement createSVGFilterElement();
+
+  SVGFontElement createSVGFontElement();
+
+  SVGFontFaceElement createSVGFontFaceElement();
+
+  SVGFontFaceFormatElement createSVGFontFaceFormatElement();
+
+  SVGFontFaceNameElement createSVGFontFaceNameElement();
+
+  SVGFontFaceSrcElement createSVGFontFaceSrcElement();
+
+  SVGFontFaceUriElement createSVGFontFaceUriElement();
+
+  SVGForeignObjectElement createSVGForeignObjectElement();
+
+  SVGGElement createSVGGElement();
+
+  SVGGlyphElement createSVGGlyphElement();
+
+  SVGGlyphRefElement createSVGGlyphRefElement();
+
+  SVGGradientElement createSVGGradientElement();
+
+  SVGHKernElement createSVGHKernElement();
+
+  SVGImageElement createSVGImageElement();
+
+  SVGLineElement createSVGLineElement();
+
+  SVGLinearGradientElement createSVGLinearGradientElement();
+
+  SVGMPathElement createSVGMPathElement();
+
+  SVGMarkerElement createSVGMarkerElement();
+
+  SVGMaskElement createSVGMaskElement();
+
+  SVGMetadataElement createSVGMetadataElement();
+
+  SVGMissingGlyphElement createSVGMissingGlyphElement();
+
+  SVGPathElement createSVGPathElement();
+
+  SVGPatternElement createSVGPatternElement();
+
+  SVGPolygonElement createSVGPolygonElement();
+
+  SVGPolylineElement createSVGPolylineElement();
+
+  SVGRadialGradientElement createSVGRadialGradientElement();
+
+  SVGRectElement createSVGRectElement();
+
+  SVGSVGElement createSVGElement();
+
+  SVGScriptElement createSVGScriptElement();
+
+  SVGSetElement createSVGSetElement();
+
+  SVGStopElement createSVGStopElement();
+
+  SVGStyleElement createSVGStyleElement();
+
+  SVGSwitchElement createSVGSwitchElement();
+
+  SVGSymbolElement createSVGSymbolElement();
+
+  SVGTRefElement createSVGTRefElement();
+
+  SVGTSpanElement createSVGTSpanElement();
+
+  SVGTextContentElement createSVGTextContentElement();
+
+  SVGTextElement createSVGTextElement();
+
+  SVGTextPathElement createSVGTextPathElement();
+
+  SVGTextPositioningElement createSVGTextPositioningElement();
+
+  SVGTitleElement createSVGTitleElement();
+
+  SVGUseElement createSVGUseElement();
+
+  SVGVKernElement createSVGVKernElement();
+
+  SVGViewElement createSVGViewElement();
+
+  ScriptElement createScriptElement();
+
+  SelectElement createSelectElement();
+
+  ShadowElement createShadowElement();
+
+  SourceElement createSourceElement();
+
+  SpanElement createSpanElement();
+
+  StyleElement createStyleElement();
+
+  TableCaptionElement createTableCaptionElement();
+
+  TableCellElement createTableCellElement();
+
+  TableColElement createTableColElement();
+
+  TableElement createTableElement();
+
+  TableRowElement createTableRowElement();
+
+  TableSectionElement createTableSectionElement();
+
+  TextAreaElement createTextAreaElement();
+
+  TitleElement createTitleElement();
+
+  TrackElement createTrackElement();
+
+  UListElement createUListElement();
+
+  UnknownElement createUnknownElement();
+
+  VideoElement createVideoElement();
+}
diff --git a/elemental/src/elemental/dom/DocumentFragment.java b/elemental/src/elemental/dom/DocumentFragment.java
new file mode 100644
index 0000000..b7c8b61
--- /dev/null
+++ b/elemental/src/elemental/dom/DocumentFragment.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>DocumentFragment has no properties or methods of its own, but inherits from <a title="En/DOM/Node" class="internal" rel="internal" href="https://developer.mozilla.org/En/DOM/Node"><code>Node</code></a>. </p>
+<p>A <code><a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-B63ED1A3" title="http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-B63ED1A3" target="_blank">DocumentFragment</a></code> is a minimal document object that has no parent. It is used as a light-weight version of document to store well-formed or potentially non-well-formed fragments of XML.</p>
+<p>See <a title="En/DOM/Node" class="internal" rel="internal" href="https://developer.mozilla.org/En/DOM/Node"><code>Node</code></a> for a listing of its properties, constants and methods.</p>
+<p>Various other methods can take a document fragment as an argument (e.g., any <code><a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247" title="http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247" target="_blank">Node</a></code> interface methods such as <code><a title="En/DOM/Node.appendChild" rel="internal" href="https://developer.mozilla.org/En/DOM/Node.appendChild">appendChild</a></code> and <code><a title="En/DOM/Node.insertBefore" rel="internal" href="https://developer.mozilla.org/En/DOM/Node.insertBefore">insertBefore</a></code>), in which case the children of the fragment are appended or inserted, not the fragment itself.</p>
+  */
+public interface DocumentFragment extends Node, NodeSelector {
+
+  Element querySelector(String selectors);
+
+  NodeList querySelectorAll(String selectors);
+}
diff --git a/elemental/src/elemental/dom/DocumentType.java b/elemental/src/elemental/dom/DocumentType.java
new file mode 100644
index 0000000..d298c3c
--- /dev/null
+++ b/elemental/src/elemental/dom/DocumentType.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><span>NOTE:&nbsp;This interface is not fully supported in Mozilla at present, including for indicating internalSubset information which Gecko generally does otherwise support.</span></p>
+<p><code>DocumentType</code> inherits <a title="en/DOM/Node" rel="internal" href="https://developer.mozilla.org/en/DOM/Node">Node</a>'s properties, methods, and constants as well as the following properties of its own:</p>
+  */
+public interface DocumentType extends Node {
+
+  NamedNodeMap getEntities();
+
+  String getInternalSubset();
+
+  String getName();
+
+  NamedNodeMap getNotations();
+
+  String getPublicId();
+
+  String getSystemId();
+}
diff --git a/elemental/src/elemental/dom/Element.java b/elemental/src/elemental/dom/Element.java
new file mode 100644
index 0000000..4eda4b4
--- /dev/null
+++ b/elemental/src/elemental/dom/Element.java
@@ -0,0 +1,771 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.html.HTMLCollection;
+import elemental.util.Mappable;
+import elemental.events.EventListener;
+import elemental.html.ClientRect;
+import elemental.css.CSSStyleDeclaration;
+import elemental.html.ClientRectList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>This chapter provides a brief reference for the general methods, properties, and events available to most HTML and XML elements in the Gecko DOM.</p>
+<p>Various W3C specifications apply to elements:</p>
+<ul> <li><a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-Core/" title="http://www.w3.org/TR/DOM-Level-2-Core/" target="_blank">DOM Core Specification</a>—describes the core interfaces shared by most DOM objects in HTML and XML documents</li> <li><a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/" title="http://www.w3.org/TR/DOM-Level-2-HTML/" target="_blank">DOM HTML Specification</a>—describes interfaces for objects in HTML and XHTML documents that build on the core specification</li> <li><a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-Events/" title="http://www.w3.org/TR/DOM-Level-2-Events/" target="_blank">DOM Events Specification</a>—describes events shared by most DOM objects, building on the DOM Core and <a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-Views/" title="http://www.w3.org/TR/DOM-Level-2-Views/" target="_blank">Views</a> specifications</li> <li><a class="external" title="http://www.w3.org/TR/ElementTraversal/" rel="external" href="http://www.w3.org/TR/ElementTraversal/" target="_blank">Element Traversal Specification</a>—describes the new attributes that allow traversal of elements in the DOM&nbsp;tree 
+<span>New in <a rel="custom" href="https://developer.mozilla.org/en/Firefox_3.5_for_developers">Firefox 3.5</a></span>
+</li>
+</ul>
+<p>The articles listed here span the above and include links to the appropriate W3C DOM specification.</p>
+<p>While these interfaces are generally shared by most HTML and XML elements, there are more specialized interfaces for particular objects listed in the DOM HTML Specification. Note, however, that these HTML&nbsp;interfaces are "only for [HTML 4.01] and [XHTML 1.0] documents and are not guaranteed to work with any future version of XHTML." The HTML 5 draft does state it aims for backwards compatibility with these HTML&nbsp;interfaces but says of them that "some features that were formerly deprecated, poorly supported, rarely used or considered unnecessary have been removed." One can avoid the potential conflict by moving entirely to DOM&nbsp;XML attribute methods such as <code>getAttribute()</code>.</p>
+<p><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLHtmlElement">Html</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLHeadElement">Head</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLLinkElement">Link</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLTitleElement">Title</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLMetaElement">Meta</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLBaseElement">Base</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/HTMLIsIndexElement" class="new">IsIndex</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLStyleElement">Style</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLBodyElement">Body</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLFormElement">Form</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLSelectElement">Select</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/HTMLOptGroupElement" class="new">OptGroup</a></code>
+, <a title="en/HTML/Element/HTMLOptionElement" rel="internal" href="https://developer.mozilla.org/en/HTML/Element/HTMLOptionElement" class="new ">Option</a>, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLInputElement">Input</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLTextAreaElement">TextArea</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLButtonElement">Button</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLLabelElement">Label</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLFieldSetElement">FieldSet</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLLegendElement">Legend</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/HTMLUListElement" class="new">UList</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/OList" class="new">OList</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/DList" class="new">DList</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Directory" class="new">Directory</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Menu" class="new">Menu</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/LI" class="new">LI</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Div" class="new">Div</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Paragraph" class="new">Paragraph</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Heading" class="new">Heading</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Quote" class="new">Quote</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Pre" class="new">Pre</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/BR" class="new">BR</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/BaseFont" class="new">BaseFont</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Font" class="new">Font</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/HR" class="new">HR</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Mod" class="new">Mod</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLAnchorElement">Anchor</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Image" class="new">Image</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLObjectElement">Object</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Param" class="new">Param</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Applet" class="new">Applet</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Map" class="new">Map</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Area" class="new">Area</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Script" class="new">Script</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLTableElement">Table</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableCaption" class="new">TableCaption</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableCol" class="new">TableCol</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableSection" class="new">TableSection</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLTableRowElement">TableRow</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/TableCell" class="new">TableCell</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/FrameSet" class="new">FrameSet</a></code>
+, <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Frame" class="new">Frame</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/HTMLIFrameElement">IFrame</a></code>
+</p>
+  */
+public interface Element extends Node, NodeSelector, ElementTraversal {
+
+    static final int ALLOW_KEYBOARD_INPUT = 1;
+
+  String getAccessKey();
+
+  void setAccessKey(String arg);
+
+
+  /**
+    * The number of child nodes that are elements.
+    */
+  int getChildElementCount();
+
+
+  /**
+    * A live <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIDOMNodeList&amp;ident=nsIDOMNodeList" class="new">nsIDOMNodeList</a></code>
+ of the current child elements.
+    */
+  HTMLCollection getChildren();
+
+
+  /**
+    * Token list of class attribute
+    */
+  DOMTokenList getClassList();
+
+
+  /**
+    * Gets/sets the class of the element.
+    */
+  String getClassName();
+
+  void setClassName(String arg);
+
+
+  /**
+    * The inner height of an element.
+    */
+  int getClientHeight();
+
+
+  /**
+    * The width of the left border of an element.
+    */
+  int getClientLeft();
+
+
+  /**
+    * The width of the top border of an element.
+    */
+  int getClientTop();
+
+
+  /**
+    * The inner width of an element.
+    */
+  int getClientWidth();
+
+
+  /**
+    * Gets/sets whether or not the element is editable.
+    */
+  String getContentEditable();
+
+  void setContentEditable(String arg);
+
+
+  /**
+    * Allows access to read and write custom data attributes on the element.
+    */
+  Mappable getDataset();
+
+
+  /**
+    * Gets/sets the directionality of the element.
+    */
+  String getDir();
+
+  void setDir(String arg);
+
+  boolean isDraggable();
+
+  void setDraggable(boolean arg);
+
+
+  /**
+    * The first direct child element of an element, or <code>null</code> if the element has no child elements.
+    */
+  Element getFirstElementChild();
+
+  boolean isHidden();
+
+  void setHidden(boolean arg);
+
+
+  /**
+    * Gets/sets the id of the element.
+    */
+  String getId();
+
+  void setId(String arg);
+
+
+  /**
+    * Gets/sets the markup of the element's content.
+    */
+  String getInnerHTML();
+
+  void setInnerHTML(String arg);
+
+  String getInnerText();
+
+  void setInnerText(String arg);
+
+
+  /**
+    * Indicates whether or not the content of the element can be edited. Read only.
+    */
+  boolean isContentEditable();
+
+
+  /**
+    * Gets/sets the language of an element's attributes, text, and element contents.
+    */
+  String getLang();
+
+  void setLang(String arg);
+
+
+  /**
+    * The last direct child element of an element, or <code>null</code> if the element has no child elements.
+    */
+  Element getLastElementChild();
+
+
+  /**
+    * The element immediately following the given one in the tree, or <code>null</code> if there's no sibling node.
+    */
+  Element getNextElementSibling();
+
+
+  /**
+    * The height of an element, relative to the layout.
+    */
+  int getOffsetHeight();
+
+
+  /**
+    * The distance from this element's left border to its <code>offsetParent</code>'s left border.
+    */
+  int getOffsetLeft();
+
+
+  /**
+    * The element from which all offset calculations are currently computed.
+    */
+  Element getOffsetParent();
+
+
+  /**
+    * The distance from this element's top border to its <code>offsetParent</code>'s top border.
+    */
+  int getOffsetTop();
+
+
+  /**
+    * The width of an element, relative to the layout.
+    */
+  int getOffsetWidth();
+
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+  EventListener getOnbeforecopy();
+
+  void setOnbeforecopy(EventListener arg);
+
+  EventListener getOnbeforecut();
+
+  void setOnbeforecut(EventListener arg);
+
+  EventListener getOnbeforepaste();
+
+  void setOnbeforepaste(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the blur event.
+    */
+  EventListener getOnblur();
+
+  void setOnblur(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the change event.
+    */
+  EventListener getOnchange();
+
+  void setOnchange(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the click event.
+    */
+  EventListener getOnclick();
+
+  void setOnclick(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the contextmenu event.
+    */
+  EventListener getOncontextmenu();
+
+  void setOncontextmenu(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the copy event.
+    */
+  EventListener getOncopy();
+
+  void setOncopy(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the cut event.
+    */
+  EventListener getOncut();
+
+  void setOncut(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the dblclick event.
+    */
+  EventListener getOndblclick();
+
+  void setOndblclick(EventListener arg);
+
+  EventListener getOndrag();
+
+  void setOndrag(EventListener arg);
+
+  EventListener getOndragend();
+
+  void setOndragend(EventListener arg);
+
+  EventListener getOndragenter();
+
+  void setOndragenter(EventListener arg);
+
+  EventListener getOndragleave();
+
+  void setOndragleave(EventListener arg);
+
+  EventListener getOndragover();
+
+  void setOndragover(EventListener arg);
+
+  EventListener getOndragstart();
+
+  void setOndragstart(EventListener arg);
+
+  EventListener getOndrop();
+
+  void setOndrop(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the focus event.
+    */
+  EventListener getOnfocus();
+
+  void setOnfocus(EventListener arg);
+
+  EventListener getOninput();
+
+  void setOninput(EventListener arg);
+
+  EventListener getOninvalid();
+
+  void setOninvalid(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the keydown event.
+    */
+  EventListener getOnkeydown();
+
+  void setOnkeydown(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the keypress event.
+    */
+  EventListener getOnkeypress();
+
+  void setOnkeypress(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the keyup event.
+    */
+  EventListener getOnkeyup();
+
+  void setOnkeyup(EventListener arg);
+
+  EventListener getOnload();
+
+  void setOnload(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the mousedown event.
+    */
+  EventListener getOnmousedown();
+
+  void setOnmousedown(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the mousemove event.
+    */
+  EventListener getOnmousemove();
+
+  void setOnmousemove(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the mouseout event.
+    */
+  EventListener getOnmouseout();
+
+  void setOnmouseout(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the mouseover event.
+    */
+  EventListener getOnmouseover();
+
+  void setOnmouseover(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the mouseup event.
+    */
+  EventListener getOnmouseup();
+
+  void setOnmouseup(EventListener arg);
+
+  EventListener getOnmousewheel();
+
+  void setOnmousewheel(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the paste event.
+    */
+  EventListener getOnpaste();
+
+  void setOnpaste(EventListener arg);
+
+  EventListener getOnreset();
+
+  void setOnreset(EventListener arg);
+
+
+  /**
+    * Returns the event handling code for the scroll event.
+    */
+  EventListener getOnscroll();
+
+  void setOnscroll(EventListener arg);
+
+  EventListener getOnsearch();
+
+  void setOnsearch(EventListener arg);
+
+  EventListener getOnselect();
+
+  void setOnselect(EventListener arg);
+
+  EventListener getOnselectstart();
+
+  void setOnselectstart(EventListener arg);
+
+  EventListener getOnsubmit();
+
+  void setOnsubmit(EventListener arg);
+
+  EventListener getOntouchcancel();
+
+  void setOntouchcancel(EventListener arg);
+
+  EventListener getOntouchend();
+
+  void setOntouchend(EventListener arg);
+
+  EventListener getOntouchmove();
+
+  void setOntouchmove(EventListener arg);
+
+  EventListener getOntouchstart();
+
+  void setOntouchstart(EventListener arg);
+
+  EventListener getOnwebkitfullscreenchange();
+
+  void setOnwebkitfullscreenchange(EventListener arg);
+
+  EventListener getOnwebkitfullscreenerror();
+
+  void setOnwebkitfullscreenerror(EventListener arg);
+
+
+  /**
+    * Gets the markup of the element including its content. When used as a setter, replaces the element with nodes parsed from the given string.
+    */
+  String getOuterHTML();
+
+  void setOuterHTML(String arg);
+
+  String getOuterText();
+
+  void setOuterText(String arg);
+
+
+  /**
+    * The element immediately preceding the given one in the tree, or <code>null</code> if there is no sibling element.
+    */
+  Element getPreviousElementSibling();
+
+
+  /**
+    * The scroll view height of an element.
+    */
+  int getScrollHeight();
+
+
+  /**
+    * Gets/sets the left scroll offset of an element.
+    */
+  int getScrollLeft();
+
+  void setScrollLeft(int arg);
+
+
+  /**
+    * Gets/sets the top scroll offset of an element.
+    */
+  int getScrollTop();
+
+  void setScrollTop(int arg);
+
+
+  /**
+    * The scroll view width of an element.
+    */
+  int getScrollWidth();
+
+
+  /**
+    * Controls <a title="en/Controlling_spell_checking_in_HTML_forms" rel="internal" href="https://developer.mozilla.org/en/HTML/Controlling_spell_checking_in_HTML_forms">spell-checking</a> (present on all HTML&nbsp;elements)
+    */
+  boolean isSpellcheck();
+
+  void setSpellcheck(boolean arg);
+
+
+  /**
+    * An object representing the declarations of an element's style attributes.
+    */
+  CSSStyleDeclaration getStyle();
+
+
+  /**
+    * Gets/sets the position of the element in the tabbing order.
+    */
+  int getTabIndex();
+
+  void setTabIndex(int arg);
+
+
+  /**
+    * The name of the tag for the given element.
+    */
+  String getTagName();
+
+
+  /**
+    * A string that appears in a popup box when mouse is over the element.
+    */
+  String getTitle();
+
+  void setTitle(String arg);
+
+  boolean isTranslate();
+
+  void setTranslate(boolean arg);
+
+  String getWebkitRegionOverflow();
+
+  String getWebkitdropzone();
+
+  void setWebkitdropzone(String arg);
+
+
+  /**
+    *  Removes keyboard focus from the current element.
+    */
+  void blur();
+
+
+  /**
+    *  Gives keyboard focus to the current element.
+    */
+  void focus();
+
+
+  /**
+    *  Retrieve the value of the named attribute from the current node.
+    */
+  String getAttribute(String name);
+
+
+  /**
+    *  Retrieve the value of the attribute with the specified name and namespace, from the current node.
+    */
+  String getAttributeNS(String namespaceURI, String localName);
+
+
+  /**
+    *  Retrieve the node representation of the named attribute from the current node.
+    */
+  Attr getAttributeNode(String name);
+
+
+  /**
+    *  Retrieve the node representation of the attribute with the specified name and namespace, from the current node.
+    */
+  Attr getAttributeNodeNS(String namespaceURI, String localName);
+
+  ClientRect getBoundingClientRect();
+
+  ClientRectList getClientRects();
+
+  NodeList getElementsByClassName(String name);
+
+
+  /**
+    *  Retrieve a set of all descendant elements, of a particular tag name, from the current element.
+    */
+  NodeList getElementsByTagName(String name);
+
+
+  /**
+    *  Retrieve a set of all descendant elements, of a particular tag name and namespace, from the current element.
+    */
+  NodeList getElementsByTagNameNS(String namespaceURI, String localName);
+
+
+  /**
+    *  Check if the element has the specified attribute, or not.
+    */
+  boolean hasAttribute(String name);
+
+
+  /**
+    *  Check if the element has the specified attribute, in the specified namespace, or not.
+    */
+  boolean hasAttributeNS(String namespaceURI, String localName);
+
+  Element querySelector(String selectors);
+
+  NodeList querySelectorAll(String selectors);
+
+
+  /**
+    *  Remove the named attribute from the current node.
+    */
+  void removeAttribute(String name);
+
+
+  /**
+    *  Remove the attribute with the specified name and namespace, from the current node.
+    */
+  void removeAttributeNS(String namespaceURI, String localName);
+
+
+  /**
+    *  Remove the node representation of the named attribute from the current node.
+    */
+  Attr removeAttributeNode(Attr oldAttr);
+
+  void scrollByLines(int lines);
+
+  void scrollByPages(int pages);
+
+
+  /**
+    *  Scrolls the page until the element gets into the view.
+    */
+  void scrollIntoView();
+
+
+  /**
+    *  Scrolls the page until the element gets into the view.
+    */
+  void scrollIntoView(boolean alignWithTop);
+
+  void scrollIntoViewIfNeeded();
+
+  void scrollIntoViewIfNeeded(boolean centerIfNeeded);
+
+
+  /**
+    *  Set the value of the named attribute from the current node.
+    */
+  void setAttribute(String name, String value);
+
+
+  /**
+    *  Set the value of the attribute with the specified name and namespace, from the current node.
+    */
+  void setAttributeNS(String namespaceURI, String qualifiedName, String value);
+
+
+  /**
+    *  Set the node representation of the named attribute from the current node.
+    */
+  Attr setAttributeNode(Attr newAttr);
+
+
+  /**
+    *  Set the node representation of the attribute with the specified name and namespace, from the current node.
+    */
+  Attr setAttributeNodeNS(Attr newAttr);
+
+
+  /**
+    *  Returns whether or not the element would be selected by the specified selector string.
+    */
+  boolean webkitMatchesSelector(String selectors);
+
+
+  /**
+    *  Asynchronously asks the browser to make the element full-screen.
+    */
+  void webkitRequestFullScreen(int flags);
+
+  void webkitRequestFullscreen();
+
+
+  /**
+    *  Simulates a click on the current element.
+    */
+  void click();
+
+  Element insertAdjacentElement(String where, Element element);
+
+
+  /**
+    *  Parses the text as HTML or XML and inserts the resulting nodes into the tree in the position given.
+    */
+  void insertAdjacentHTML(String where, String html);
+
+  void insertAdjacentText(String where, String text);
+}
diff --git a/elemental/src/elemental/dom/ElementTraversal.java b/elemental/src/elemental/dom/ElementTraversal.java
new file mode 100644
index 0000000..4e5037f
--- /dev/null
+++ b/elemental/src/elemental/dom/ElementTraversal.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ElementTraversal {
+
+  int getChildElementCount();
+
+  Element getFirstElementChild();
+
+  Element getLastElementChild();
+
+  Element getNextElementSibling();
+
+  Element getPreviousElementSibling();
+}
diff --git a/elemental/src/elemental/dom/ElementalMixinBase.java b/elemental/src/elemental/dom/ElementalMixinBase.java
new file mode 100644
index 0000000..7436fbf
--- /dev/null
+++ b/elemental/src/elemental/dom/ElementalMixinBase.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.svg.SVGAnimatedRect;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGAnimatedTransformList;
+import elemental.svg.SVGAnimatedBoolean;
+import elemental.svg.SVGStringList;
+import elemental.svg.SVGRect;
+import elemental.css.CSSValue;
+import elemental.svg.SVGAnimatedLength;
+import elemental.events.EventListener;
+import elemental.svg.SVGMatrix;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedPreserveAspectRatio;
+import elemental.css.CSSStyleDeclaration;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ElementalMixinBase {
+
+  int getChildElementCount();
+
+  SVGAnimatedString getAnimatedClassName();
+
+  SVGAnimatedBoolean getExternalResourcesRequired();
+
+  SVGElement getFarthestViewportElement();
+
+  Element getFirstElementChild();
+
+  SVGAnimatedLength getAnimatedHeight();
+
+  SVGAnimatedString getAnimatedHref();
+
+  Element getLastElementChild();
+
+  SVGElement getNearestViewportElement();
+
+  Element getNextElementSibling();
+
+  SVGAnimatedPreserveAspectRatio getPreserveAspectRatio();
+
+  Element getPreviousElementSibling();
+
+  SVGStringList getRequiredExtensions();
+
+  SVGStringList getRequiredFeatures();
+
+  SVGAnimatedString getAnimatedResult();
+
+  CSSStyleDeclaration getSvgStyle();
+
+  SVGStringList getSystemLanguage();
+
+  SVGAnimatedTransformList getAnimatedTransform();
+
+  SVGAnimatedRect getViewBox();
+
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getAnimatedX();
+
+  String getXmllang();
+
+  void setXmllang(String arg);
+
+  String getXmlspace();
+
+  void setXmlspace(String arg);
+
+  SVGAnimatedLength getAnimatedY();
+
+  int getZoomAndPan();
+
+  void setZoomAndPan(int arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event event);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  SVGRect getBBox();
+
+  SVGMatrix getCTM();
+
+  SVGMatrix getScreenCTM();
+
+  SVGMatrix getTransformToElement(SVGElement element);
+
+  void beginElement();
+
+  void beginElementAt(float offset);
+
+  void endElement();
+
+  void endElementAt(float offset);
+
+  boolean hasExtension(String extension);
+
+  Element querySelector(String selectors);
+
+  NodeList querySelectorAll(String selectors);
+
+  CSSValue getPresentationAttribute(String name);
+}
diff --git a/elemental/src/elemental/dom/Entity.java b/elemental/src/elemental/dom/Entity.java
new file mode 100644
index 0000000..2e0a358
--- /dev/null
+++ b/elemental/src/elemental/dom/Entity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><span>NOTE:&nbsp;This is not implemented in Mozilla</span></p>
+<p>Read-only reference to a DTD entity. Also inherits the methods and properties of <a title="En/DOM/Node" class="internal" rel="internal" href="https://developer.mozilla.org/en/DOM/Node"><code>Node</code></a>.</p>
+  */
+public interface Entity extends Node {
+
+  String getNotationName();
+
+  String getPublicId();
+
+  String getSystemId();
+}
diff --git a/elemental/src/elemental/dom/EntityReference.java b/elemental/src/elemental/dom/EntityReference.java
new file mode 100644
index 0000000..661fc40
--- /dev/null
+++ b/elemental/src/elemental/dom/EntityReference.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><span>NOTE:&nbsp;This is not implemented in Mozilla</span></p>
+<p>Read-only reference to an entity reference in the DOM tree. Has no properties or methods of its own but inherits from <a class="internal" title="En/DOM/Node" rel="internal" href="https://developer.mozilla.org/en/DOM/Node"><code>Node</code></a>.</p>
+  */
+public interface EntityReference extends Node {
+}
diff --git a/elemental/src/elemental/dom/Geolocation.java b/elemental/src/elemental/dom/Geolocation.java
new file mode 100644
index 0000000..af5230d
--- /dev/null
+++ b/elemental/src/elemental/dom/Geolocation.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface Geolocation {
+
+
+  /**
+    * When the <code>clearWatch()</code> method is called, the <code>watch()</code> process stops calling for new position identifiers and cease invoking callbacks.
+    */
+  void clearWatch(int watchId);
+
+
+  /**
+    * <p>Acquires the user's current position via a new position object. If this fails, <code>errorCallback</code> is invoked with an <code>nsIDOMGeoPositionError</code> argument.</p>
+
+<div id="section_8"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>successCallback</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionCallback" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionCallback">nsIDOMGeoPositionCallback</a></code> to be called when the current position is available.</dd>
+</dl>
+<dl> <dt><code>errorCallback</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionErrorCallback" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionErrorCallback"> nsIDOMGeoPositionErrorCallback</a></code> that is called if an error occurs while retrieving the position; this parameter is optional.</dd>
+</dl>
+<dl> <dt><code>options</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionOptions" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionOptions">nsIDOMGeoPositionOptions</a></code> object specifying options; this parameter is optional.</dd>
+</dl>
+</div>
+    */
+  void getCurrentPosition(PositionCallback successCallback);
+
+
+  /**
+    * <p>Acquires the user's current position via a new position object. If this fails, <code>errorCallback</code> is invoked with an <code>nsIDOMGeoPositionError</code> argument.</p>
+
+<div id="section_8"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>successCallback</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionCallback" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionCallback">nsIDOMGeoPositionCallback</a></code> to be called when the current position is available.</dd>
+</dl>
+<dl> <dt><code>errorCallback</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionErrorCallback" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionErrorCallback"> nsIDOMGeoPositionErrorCallback</a></code> that is called if an error occurs while retrieving the position; this parameter is optional.</dd>
+</dl>
+<dl> <dt><code>options</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionOptions" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionOptions">nsIDOMGeoPositionOptions</a></code> object specifying options; this parameter is optional.</dd>
+</dl>
+</div>
+    */
+  void getCurrentPosition(PositionCallback successCallback, PositionErrorCallback errorCallback);
+
+
+  /**
+    * <p>Similar to <a title="En/NsIDOMGeoGeolocation#getCurrentPosition()" class="internal" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation#getCurrentPosition()"><code>getCurrentPosition()</code></a>, except it continues to call the callback with updated position information periodically until <a title="En/NsIDOMGeoGeolocation#clearWatch()" class="internal" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation#clearWatch()"><code>clearWatch()</code></a>&nbsp;is called.</p>
+
+<div id="section_10"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>successCallback</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionCallback" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionCallback">nsIDOMGeoPositionCallback</a></code> that is to be called whenever new position information is available.</dd>
+</dl>
+<dl> <dt><code>errorCallback</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionErrorCallback" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionErrorCallback"> nsIDOMGeoPositionErrorCallback</a></code> to call when an error occurs; this is an optional parameter.</dd>
+</dl>
+<dl> <dt><code>options</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionOptions" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionOptions">nsIDOMGeoPositionOptions</a></code> object specifying options; this parameter is optional.</dd>
+</dl>
+</div><div id="section_11"><span id="Return_value"></span><h6 class="editable">Return value</h6>
+<p>An ID&nbsp;number that can be used to reference the watcher in the future when calling <code><a title="en/nsIDOMGeolocation#clearWatch()" class="internal" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation#clearWatch()">clearWatch()</a></code>.</p>
+</div>
+    */
+  int watchPosition(PositionCallback successCallback);
+
+
+  /**
+    * <p>Similar to <a title="En/NsIDOMGeoGeolocation#getCurrentPosition()" class="internal" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation#getCurrentPosition()"><code>getCurrentPosition()</code></a>, except it continues to call the callback with updated position information periodically until <a title="En/NsIDOMGeoGeolocation#clearWatch()" class="internal" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation#clearWatch()"><code>clearWatch()</code></a>&nbsp;is called.</p>
+
+<div id="section_10"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>successCallback</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionCallback" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionCallback">nsIDOMGeoPositionCallback</a></code> that is to be called whenever new position information is available.</dd>
+</dl>
+<dl> <dt><code>errorCallback</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionErrorCallback" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionErrorCallback"> nsIDOMGeoPositionErrorCallback</a></code> to call when an error occurs; this is an optional parameter.</dd>
+</dl>
+<dl> <dt><code>options</code></dt> <dd>An <code><a class="internal" title="En/NsIDOMGeoPositionOptions" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoPositionOptions">nsIDOMGeoPositionOptions</a></code> object specifying options; this parameter is optional.</dd>
+</dl>
+</div><div id="section_11"><span id="Return_value"></span><h6 class="editable">Return value</h6>
+<p>An ID&nbsp;number that can be used to reference the watcher in the future when calling <code><a title="en/nsIDOMGeolocation#clearWatch()" class="internal" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/NsIDOMGeoGeolocation#clearWatch()">clearWatch()</a></code>.</p>
+</div>
+    */
+  int watchPosition(PositionCallback successCallback, PositionErrorCallback errorCallback);
+}
diff --git a/elemental/src/elemental/dom/Geoposition.java b/elemental/src/elemental/dom/Geoposition.java
new file mode 100644
index 0000000..3882f8c
--- /dev/null
+++ b/elemental/src/elemental/dom/Geoposition.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface Geoposition {
+
+  Coordinates getCoords();
+
+  double getTimestamp();
+}
diff --git a/elemental/src/elemental/dom/LocalMediaStream.java b/elemental/src/elemental/dom/LocalMediaStream.java
new file mode 100644
index 0000000..c94a5a5
--- /dev/null
+++ b/elemental/src/elemental/dom/LocalMediaStream.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface LocalMediaStream extends MediaStream {
+
+  void stop();
+}
diff --git a/elemental/src/elemental/dom/MediaStream.java b/elemental/src/elemental/dom/MediaStream.java
new file mode 100644
index 0000000..95f6e9c
--- /dev/null
+++ b/elemental/src/elemental/dom/MediaStream.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaStream extends EventTarget {
+
+    static final int ENDED = 2;
+
+    static final int LIVE = 1;
+
+  MediaStreamTrackList getAudioTracks();
+
+  String getLabel();
+
+  EventListener getOnended();
+
+  void setOnended(EventListener arg);
+
+  int getReadyState();
+
+  MediaStreamTrackList getVideoTracks();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event event);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/dom/MediaStreamList.java b/elemental/src/elemental/dom/MediaStreamList.java
new file mode 100644
index 0000000..863a9e5
--- /dev/null
+++ b/elemental/src/elemental/dom/MediaStreamList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaStreamList {
+
+  int getLength();
+
+  MediaStream item(int index);
+}
diff --git a/elemental/src/elemental/dom/MediaStreamTrack.java b/elemental/src/elemental/dom/MediaStreamTrack.java
new file mode 100644
index 0000000..bc2df1f
--- /dev/null
+++ b/elemental/src/elemental/dom/MediaStreamTrack.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaStreamTrack {
+
+  boolean isEnabled();
+
+  void setEnabled(boolean arg);
+
+  String getKind();
+
+  String getLabel();
+}
diff --git a/elemental/src/elemental/dom/MediaStreamTrackList.java b/elemental/src/elemental/dom/MediaStreamTrackList.java
new file mode 100644
index 0000000..b789239
--- /dev/null
+++ b/elemental/src/elemental/dom/MediaStreamTrackList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaStreamTrackList {
+
+  int getLength();
+
+  MediaStreamTrack item(int index);
+}
diff --git a/elemental/src/elemental/dom/MutationCallback.java b/elemental/src/elemental/dom/MutationCallback.java
new file mode 100644
index 0000000..47eae6d
--- /dev/null
+++ b/elemental/src/elemental/dom/MutationCallback.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MutationCallback {
+}
diff --git a/elemental/src/elemental/dom/MutationRecord.java b/elemental/src/elemental/dom/MutationRecord.java
new file mode 100644
index 0000000..0cb58c7
--- /dev/null
+++ b/elemental/src/elemental/dom/MutationRecord.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MutationRecord {
+
+  NodeList getAddedNodes();
+
+  String getAttributeName();
+
+  String getAttributeNamespace();
+
+  Node getNextSibling();
+
+  String getOldValue();
+
+  Node getPreviousSibling();
+
+  NodeList getRemovedNodes();
+
+  Node getTarget();
+
+  String getType();
+}
diff --git a/elemental/src/elemental/dom/NamedNodeMap.java b/elemental/src/elemental/dom/NamedNodeMap.java
new file mode 100644
index 0000000..15fd651
--- /dev/null
+++ b/elemental/src/elemental/dom/NamedNodeMap.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * A collection of nodes returned by <a title="En/DOM/Element.attributes" class="internal" rel="internal" href="https://developer.mozilla.org/En/DOM/Node.attributes"><code>Element.attributes</code></a> (also potentially for <code><a title="En/DOM/DocumentType.entities" rel="internal" href="https://developer.mozilla.org/En/DOM/DocumentType.entities" class="new internal">DocumentType.entities</a></code>, <code><a title="En/DOM/DocumentType.notations" rel="internal" href="https://developer.mozilla.org/En/DOM/DocumentType.notations" class="new internal">DocumentType.notations</a></code>). <code>NamedNodeMap</code>s are not in any particular order (unlike <code><a title="En/DOM/NodeList" class="internal" rel="internal" href="https://developer.mozilla.org/En/DOM/NodeList">NodeList</a></code>), although they may be accessed by an index as in an array (they may also be accessed with the <code>item</code>() method). A NamedNodeMap object are live and will thus be auto-updated if changes are made to their contents internally or elsewhere.
+  */
+public interface NamedNodeMap extends Indexable {
+
+  int getLength();
+
+  Node getNamedItem(String name);
+
+  Node getNamedItemNS(String namespaceURI, String localName);
+
+  Node item(int index);
+
+  Node removeNamedItem(String name);
+
+  Node removeNamedItemNS(String namespaceURI, String localName);
+
+  Node setNamedItem(Node node);
+
+  Node setNamedItemNS(Node node);
+}
diff --git a/elemental/src/elemental/dom/Node.java b/elemental/src/elemental/dom/Node.java
new file mode 100644
index 0000000..1ca8412
--- /dev/null
+++ b/elemental/src/elemental/dom/Node.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * A <code>Node</code> is an interface from which a number of DOM types inherit, and allows these various types to be treated (or tested) similarly.<br> The following all inherit this interface and its methods and properties (though they may return null in particular cases where not relevant; or throw an exception when adding children to a node type for which no children can exist): <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Document">Document</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Element">Element</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Attr">Attr</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/CharacterData">CharacterData</a></code>
+ (which <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Text">Text</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Comment">Comment</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/CDATASection">CDATASection</a></code>
+ inherit), <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/ProcessingInstruction">ProcessingInstruction</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DocumentFragment">DocumentFragment</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DocumentType">DocumentType</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Notation">Notation</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Entity">Entity</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/EntityReference">EntityReference</a></code>
+  */
+public interface Node extends EventTarget {
+
+    static final int ATTRIBUTE_NODE = 2;
+
+    static final int CDATA_SECTION_NODE = 4;
+
+    static final int COMMENT_NODE = 8;
+
+    static final int DOCUMENT_FRAGMENT_NODE = 11;
+
+    static final int DOCUMENT_NODE = 9;
+
+    static final int DOCUMENT_POSITION_CONTAINED_BY = 0x10;
+
+    static final int DOCUMENT_POSITION_CONTAINS = 0x08;
+
+    static final int DOCUMENT_POSITION_DISCONNECTED = 0x01;
+
+    static final int DOCUMENT_POSITION_FOLLOWING = 0x04;
+
+    static final int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;
+
+    static final int DOCUMENT_POSITION_PRECEDING = 0x02;
+
+    static final int DOCUMENT_TYPE_NODE = 10;
+
+    static final int ELEMENT_NODE = 1;
+
+    static final int ENTITY_NODE = 6;
+
+    static final int ENTITY_REFERENCE_NODE = 5;
+
+    static final int NOTATION_NODE = 12;
+
+    static final int PROCESSING_INSTRUCTION_NODE = 7;
+
+    static final int TEXT_NODE = 3;
+
+  NamedNodeMap getAttributes();
+
+  String getBaseURI();
+
+  NodeList getChildNodes();
+
+  Node getFirstChild();
+
+  Node getLastChild();
+
+  String getLocalName();
+
+  String getNamespaceURI();
+
+  Node getNextSibling();
+
+  String getNodeName();
+
+  int getNodeType();
+
+  String getNodeValue();
+
+  void setNodeValue(String arg);
+
+  Document getOwnerDocument();
+
+  Element getParentElement();
+
+  Node getParentNode();
+
+  String getPrefix();
+
+  void setPrefix(String arg);
+
+  Node getPreviousSibling();
+
+  String getTextContent();
+
+  void setTextContent(String arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  Node appendChild(Node newChild);
+
+  Node cloneNode(boolean deep);
+
+  int compareDocumentPosition(Node other);
+
+  boolean contains(Node other);
+
+  boolean dispatchEvent(Event event);
+
+  boolean hasAttributes();
+
+  boolean hasChildNodes();
+
+  Node insertBefore(Node newChild, Node refChild);
+
+  boolean isDefaultNamespace(String namespaceURI);
+
+  boolean isEqualNode(Node other);
+
+  boolean isSameNode(Node other);
+
+  boolean isSupported(String feature, String version);
+
+  String lookupNamespaceURI(String prefix);
+
+  String lookupPrefix(String namespaceURI);
+
+  void normalize();
+
+  Node removeChild(Node oldChild);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  Node replaceChild(Node newChild, Node oldChild);
+}
diff --git a/elemental/src/elemental/dom/NodeList.java b/elemental/src/elemental/dom/NodeList.java
new file mode 100644
index 0000000..b97f942
--- /dev/null
+++ b/elemental/src/elemental/dom/NodeList.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * NodeList objects are collections of nodes returned by <a title="document.getElementsByTagName" rel="internal" href="https://developer.mozilla.org/en/DOM/document.getElementsByTagName"><code>getElementsByTagName</code></a>, <a title="document.getElementsByTagNameNS" rel="internal" href="https://developer.mozilla.org/en/DOM/document.getElementsByTagNameNS"><code>getElementsByTagNameNS</code></a>, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.childNodes">Node.childNodes</a></code>
+, <a title="document.querySelectorAll" rel="internal" href="https://developer.mozilla.org/En/DOM/Document.querySelectorAll">querySelectorAll</a>, <a title="document.getElementsByClassName" rel="internal" href="https://developer.mozilla.org/en/DOM/document.getElementsByClassName"><code>getElementsByClassName</code></a>, etc.NodeList objects are collections of nodes returned by <a title="document.getElementsByTagName" rel="internal" href="https://developer.mozilla.org/en/DOM/document.getElementsByTagName"><code>getElementsByTagName</code></a>, <a title="document.getElementsByTagNameNS" rel="internal" href="https://developer.mozilla.org/en/DOM/document.getElementsByTagNameNS"><code>getElementsByTagNameNS</code></a>, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node.childNodes">Node.childNodes</a></code>
+, <a title="document.querySelectorAll" rel="internal" href="https://developer.mozilla.org/En/DOM/Document.querySelectorAll">querySelectorAll</a>, <a title="document.getElementsByClassName" rel="internal" href="https://developer.mozilla.org/en/DOM/document.getElementsByClassName"><code>getElementsByClassName</code></a>, etc.
+  */
+public interface NodeList extends Indexable {
+
+
+  /**
+    * Reflects the number of elements in the NodeList.&nbsp;
+    */
+  int getLength();
+
+
+  /**
+    * Returns an item in the list by its index, or <code>null</code> if out-of-bounds. Equivalent to nodeList[idx]
+    */
+  Node item(int index);
+}
diff --git a/elemental/src/elemental/dom/NodeSelector.java b/elemental/src/elemental/dom/NodeSelector.java
new file mode 100644
index 0000000..984b731
--- /dev/null
+++ b/elemental/src/elemental/dom/NodeSelector.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface NodeSelector {
+
+  Element querySelector(String selectors);
+
+  NodeList querySelectorAll(String selectors);
+}
diff --git a/elemental/src/elemental/dom/Notation.java b/elemental/src/elemental/dom/Notation.java
new file mode 100644
index 0000000..710efe2
--- /dev/null
+++ b/elemental/src/elemental/dom/Notation.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><span>NOTE:&nbsp;This is not implemented in Mozilla</span></p>
+<p>Represents a DTD notation (read-only). May declare format of an unparsed entity or formally declare the document's processing instruction targets. Inherits methods and properties from <a title="En/DOM/Node" class="internal" rel="internal" href="https://developer.mozilla.org/En/DOM/Node"><code>Node</code></a>. Its <code><a title="En/DOM/Node/NodeName" rel="internal" href="https://developer.mozilla.org/En/DOM/Node/NodeName" class="new internal">nodeName</a></code> is the notation name. Has no parent.</p>
+  */
+public interface Notation extends Node {
+
+  String getPublicId();
+
+  String getSystemId();
+}
diff --git a/elemental/src/elemental/dom/PointerLock.java b/elemental/src/elemental/dom/PointerLock.java
new file mode 100644
index 0000000..69f5c67
--- /dev/null
+++ b/elemental/src/elemental/dom/PointerLock.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.html.VoidCallback;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface PointerLock {
+
+  boolean isLocked();
+
+  void lock(Element target);
+
+  void lock(Element target, VoidCallback successCallback);
+
+  void lock(Element target, VoidCallback successCallback, VoidCallback failureCallback);
+
+  void unlock();
+}
diff --git a/elemental/src/elemental/dom/PositionCallback.java b/elemental/src/elemental/dom/PositionCallback.java
new file mode 100644
index 0000000..49816b9
--- /dev/null
+++ b/elemental/src/elemental/dom/PositionCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface PositionCallback {
+  boolean onPositionCallback(Geoposition position);
+}
diff --git a/elemental/src/elemental/dom/PositionError.java b/elemental/src/elemental/dom/PositionError.java
new file mode 100644
index 0000000..952b186
--- /dev/null
+++ b/elemental/src/elemental/dom/PositionError.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface PositionError {
+
+    static final int PERMISSION_DENIED = 1;
+
+    static final int POSITION_UNAVAILABLE = 2;
+
+    static final int TIMEOUT = 3;
+
+  int getCode();
+
+  String getMessage();
+}
diff --git a/elemental/src/elemental/dom/PositionErrorCallback.java b/elemental/src/elemental/dom/PositionErrorCallback.java
new file mode 100644
index 0000000..801a63f
--- /dev/null
+++ b/elemental/src/elemental/dom/PositionErrorCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface PositionErrorCallback {
+  boolean onPositionErrorCallback(PositionError error);
+}
diff --git a/elemental/src/elemental/dom/ProcessingInstruction.java b/elemental/src/elemental/dom/ProcessingInstruction.java
new file mode 100644
index 0000000..5e007c4
--- /dev/null
+++ b/elemental/src/elemental/dom/ProcessingInstruction.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.stylesheets.StyleSheet;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>A processing instruction provides an opportunity for application-specific instructions to be embedded within XML and which can be ignored by XML processors which do not support processing their instructions (outside of their having a place in the DOM).</p>
+<p>A Processing instruction is distinct from a <a title="en/XML/XML_Declaration" rel="internal" href="https://developer.mozilla.org/en/XML/XML_Declaration" class="new ">XML Declaration</a> which is used for other information about the document such as encoding and which appear (if it does) as the first item in the document.</p>
+<p>User-defined processing instructions cannot begin with 'xml', as these are reserved (e.g., as used in &lt;?<a title="en/XML/xml-stylesheet" rel="internal" href="https://developer.mozilla.org/en/XML/xml-stylesheet" class="new ">xml-stylesheet</a>&nbsp;?&gt;).</p>
+<p>Also inherits methods and properties from <a class="internal" title="En/DOM/Node" rel="internal" href="https://developer.mozilla.org/en/DOM/Node"><code>Node</code></a>.</p>
+  */
+public interface ProcessingInstruction extends Node {
+
+  String getData();
+
+  void setData(String arg);
+
+  StyleSheet getSheet();
+
+  String getTarget();
+}
diff --git a/elemental/src/elemental/dom/RequestAnimationFrameCallback.java b/elemental/src/elemental/dom/RequestAnimationFrameCallback.java
new file mode 100644
index 0000000..3ee210e
--- /dev/null
+++ b/elemental/src/elemental/dom/RequestAnimationFrameCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface RequestAnimationFrameCallback {
+  boolean onRequestAnimationFrameCallback(double time);
+}
diff --git a/elemental/src/elemental/dom/ScriptProfile.java b/elemental/src/elemental/dom/ScriptProfile.java
new file mode 100644
index 0000000..6394119
--- /dev/null
+++ b/elemental/src/elemental/dom/ScriptProfile.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ScriptProfile {
+
+  ScriptProfileNode getHead();
+
+  String getTitle();
+
+  int getUid();
+}
diff --git a/elemental/src/elemental/dom/ScriptProfileNode.java b/elemental/src/elemental/dom/ScriptProfileNode.java
new file mode 100644
index 0000000..811ec07
--- /dev/null
+++ b/elemental/src/elemental/dom/ScriptProfileNode.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ScriptProfileNode {
+
+  int getCallUID();
+
+  Indexable getChildren();
+
+  String getFunctionName();
+
+  int getLineNumber();
+
+  int getNumberOfCalls();
+
+  double getSelfTime();
+
+  double getTotalTime();
+
+  String getUrl();
+
+  boolean isVisible();
+}
diff --git a/elemental/src/elemental/dom/ShadowRoot.java b/elemental/src/elemental/dom/ShadowRoot.java
new file mode 100644
index 0000000..c134955
--- /dev/null
+++ b/elemental/src/elemental/dom/ShadowRoot.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.html.Selection;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ShadowRoot extends DocumentFragment {
+
+  Element getActiveElement();
+
+  boolean isApplyAuthorStyles();
+
+  void setApplyAuthorStyles(boolean arg);
+
+  Element getHost();
+
+  String getInnerHTML();
+
+  void setInnerHTML(String arg);
+
+  Element getElementById(String elementId);
+
+  NodeList getElementsByClassName(String className);
+
+  NodeList getElementsByTagName(String tagName);
+
+  NodeList getElementsByTagNameNS(String namespaceURI, String localName);
+
+  Selection getSelection();
+}
diff --git a/elemental/src/elemental/dom/SpeechGrammar.java b/elemental/src/elemental/dom/SpeechGrammar.java
new file mode 100644
index 0000000..1ac90b1
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechGrammar.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechGrammar {
+
+  String getSrc();
+
+  void setSrc(String arg);
+
+  float getWeight();
+
+  void setWeight(float arg);
+}
diff --git a/elemental/src/elemental/dom/SpeechGrammarList.java b/elemental/src/elemental/dom/SpeechGrammarList.java
new file mode 100644
index 0000000..19c616b
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechGrammarList.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechGrammarList {
+
+  int getLength();
+
+  void addFromString(String string);
+
+  void addFromString(String string, float weight);
+
+  void addFromUri(String src);
+
+  void addFromUri(String src, float weight);
+
+  SpeechGrammar item(int index);
+}
diff --git a/elemental/src/elemental/dom/SpeechInputEvent.java b/elemental/src/elemental/dom/SpeechInputEvent.java
new file mode 100644
index 0000000..002923f
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechInputEvent.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechInputEvent extends Event {
+
+  SpeechInputResultList getResults();
+}
diff --git a/elemental/src/elemental/dom/SpeechInputResult.java b/elemental/src/elemental/dom/SpeechInputResult.java
new file mode 100644
index 0000000..16c3fa0
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechInputResult.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechInputResult {
+
+  float getConfidence();
+
+  String getUtterance();
+}
diff --git a/elemental/src/elemental/dom/SpeechInputResultList.java b/elemental/src/elemental/dom/SpeechInputResultList.java
new file mode 100644
index 0000000..0a37645
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechInputResultList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechInputResultList {
+
+  int getLength();
+
+  SpeechInputResult item(int index);
+}
diff --git a/elemental/src/elemental/dom/SpeechRecognition.java b/elemental/src/elemental/dom/SpeechRecognition.java
new file mode 100644
index 0000000..1b59ce2
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechRecognition.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechRecognition extends EventTarget {
+
+  boolean isContinuous();
+
+  void setContinuous(boolean arg);
+
+  SpeechGrammarList getGrammars();
+
+  void setGrammars(SpeechGrammarList arg);
+
+  String getLang();
+
+  void setLang(String arg);
+
+  EventListener getOnaudioend();
+
+  void setOnaudioend(EventListener arg);
+
+  EventListener getOnaudiostart();
+
+  void setOnaudiostart(EventListener arg);
+
+  EventListener getOnend();
+
+  void setOnend(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnnomatch();
+
+  void setOnnomatch(EventListener arg);
+
+  EventListener getOnresult();
+
+  void setOnresult(EventListener arg);
+
+  EventListener getOnresultdeleted();
+
+  void setOnresultdeleted(EventListener arg);
+
+  EventListener getOnsoundend();
+
+  void setOnsoundend(EventListener arg);
+
+  EventListener getOnsoundstart();
+
+  void setOnsoundstart(EventListener arg);
+
+  EventListener getOnspeechend();
+
+  void setOnspeechend(EventListener arg);
+
+  EventListener getOnspeechstart();
+
+  void setOnspeechstart(EventListener arg);
+
+  EventListener getOnstart();
+
+  void setOnstart(EventListener arg);
+
+  void abort();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  void start();
+
+  void stop();
+}
diff --git a/elemental/src/elemental/dom/SpeechRecognitionAlternative.java b/elemental/src/elemental/dom/SpeechRecognitionAlternative.java
new file mode 100644
index 0000000..a85457c
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechRecognitionAlternative.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechRecognitionAlternative {
+
+  float getConfidence();
+
+  String getTranscript();
+}
diff --git a/elemental/src/elemental/dom/SpeechRecognitionError.java b/elemental/src/elemental/dom/SpeechRecognitionError.java
new file mode 100644
index 0000000..650d6c2
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechRecognitionError.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechRecognitionError {
+
+    static final int ABORTED = 2;
+
+    static final int AUDIO_CAPTURE = 3;
+
+    static final int BAD_GRAMMAR = 7;
+
+    static final int LANGUAGE_NOT_SUPPORTED = 8;
+
+    static final int NETWORK = 4;
+
+    static final int NOT_ALLOWED = 5;
+
+    static final int NO_SPEECH = 1;
+
+    static final int OTHER = 0;
+
+    static final int SERVICE_NOT_ALLOWED = 6;
+
+  int getCode();
+
+  String getMessage();
+}
diff --git a/elemental/src/elemental/dom/SpeechRecognitionResult.java b/elemental/src/elemental/dom/SpeechRecognitionResult.java
new file mode 100644
index 0000000..a3927a5
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechRecognitionResult.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechRecognitionResult {
+
+  boolean isFinalValue();
+
+  int getLength();
+
+  SpeechRecognitionAlternative item(int index);
+}
diff --git a/elemental/src/elemental/dom/SpeechRecognitionResultList.java b/elemental/src/elemental/dom/SpeechRecognitionResultList.java
new file mode 100644
index 0000000..b71f755
--- /dev/null
+++ b/elemental/src/elemental/dom/SpeechRecognitionResultList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechRecognitionResultList {
+
+  int getLength();
+
+  SpeechRecognitionResult item(int index);
+}
diff --git a/elemental/src/elemental/dom/StringCallback.java b/elemental/src/elemental/dom/StringCallback.java
new file mode 100644
index 0000000..f7af40d
--- /dev/null
+++ b/elemental/src/elemental/dom/StringCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface StringCallback {
+  boolean onStringCallback(String data);
+}
diff --git a/elemental/src/elemental/dom/Text.java b/elemental/src/elemental/dom/Text.java
new file mode 100644
index 0000000..0020830
--- /dev/null
+++ b/elemental/src/elemental/dom/Text.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>In the <a title="en/DOM" rel="internal" href="https://developer.mozilla.org/en/DOM">DOM</a>, the Text interface represents the textual content of an <a class="internal" title="En/DOM/Element" rel="internal" href="https://developer.mozilla.org/en/DOM/element">Element</a> or <a class="internal" title="En/DOM/Attr" rel="internal" href="https://developer.mozilla.org/En/DOM/Attr">Attr</a>.&nbsp; If an element has no markup within its content, it has a single child implementing Text that contains the element's text.&nbsp; However, if the element contains markup, it is parsed into information items and Text nodes that form its children.</p>
+<p>New documents have a single Text node for each block of text.&nbsp; Over time, more Text nodes may be created as the document's content changes.&nbsp; The <code>Node.normalize()</code>&nbsp;method merges adjacent Text objects back into a single node for each block of text.</p>
+<p>Text also implements the <a title="En/DOM/CharacterData" rel="internal" href="https://developer.mozilla.org/En/DOM/CharacterData">CharacterData</a> interface (which implements the Node interface).</p>
+  */
+public interface Text extends CharacterData {
+
+
+  /**
+    * Returns all text of all Text nodes logically adjacent to this node, concatenated in document order.
+    */
+  String getWholeText();
+
+
+  /**
+    * Replaces the text of the current node and all logically adjacent nodes with the specified text. <div class="note"><strong>Note: </strong>Do not use this method as it has been removed from the standard and is no longer implemented in recent browsers, like Firefox 10.</div>
+    */
+  Text replaceWholeText(String content);
+
+
+  /**
+    * Breaks the node into two nodes at a specified offset.
+    */
+  Text splitText(int offset);
+}
diff --git a/elemental/src/elemental/dom/TimeoutHandler.java b/elemental/src/elemental/dom/TimeoutHandler.java
new file mode 100644
index 0000000..e91f6df
--- /dev/null
+++ b/elemental/src/elemental/dom/TimeoutHandler.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface TimeoutHandler {
+  void onTimeoutHandler();
+}
diff --git a/elemental/src/elemental/dom/WebKitMutationObserver.java b/elemental/src/elemental/dom/WebKitMutationObserver.java
new file mode 100644
index 0000000..04748af
--- /dev/null
+++ b/elemental/src/elemental/dom/WebKitMutationObserver.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebKitMutationObserver {
+
+  void disconnect();
+
+  Indexable takeRecords();
+}
diff --git a/elemental/src/elemental/dom/WebKitNamedFlow.java b/elemental/src/elemental/dom/WebKitNamedFlow.java
new file mode 100644
index 0000000..6e6418c
--- /dev/null
+++ b/elemental/src/elemental/dom/WebKitNamedFlow.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.dom;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebKitNamedFlow {
+
+  NodeList getContentNodes();
+
+  String getName();
+
+  boolean isOverset();
+
+  NodeList getRegionsByContentNode(Node contentNode);
+}
diff --git a/elemental/src/elemental/events/AnimationEvent.java b/elemental/src/elemental/events/AnimationEvent.java
new file mode 100644
index 0000000..f242c54
--- /dev/null
+++ b/elemental/src/elemental/events/AnimationEvent.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AnimationEvent extends Event {
+
+  String getAnimationName();
+
+  double getElapsedTime();
+}
diff --git a/elemental/src/elemental/events/BeforeLoadEvent.java b/elemental/src/elemental/events/BeforeLoadEvent.java
new file mode 100644
index 0000000..2361f7e
--- /dev/null
+++ b/elemental/src/elemental/events/BeforeLoadEvent.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface BeforeLoadEvent extends Event {
+
+  String getUrl();
+}
diff --git a/elemental/src/elemental/events/CloseEvent.java b/elemental/src/elemental/events/CloseEvent.java
new file mode 100644
index 0000000..1314523
--- /dev/null
+++ b/elemental/src/elemental/events/CloseEvent.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * A <code>CloseEvent</code> is sent to clients using WebSockets when the connection is closed. This is delivered to the listener indicated by the <code>WebSocket</code> object's <code>onclose</code> attribute.
+  */
+public interface CloseEvent extends Event {
+
+
+  /**
+    * The WebSocket connection close code provided by the server. See <a title="en/XPCOM_Interface_Reference/nsIWebSocketChannel#Status_codes" rel="internal" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIWebSocketChannel#Status_codes">Status codes</a> for possible values.
+    */
+  int getCode();
+
+
+  /**
+    * A string indicating the reason the server closed the connection. This is specific to the particular server and sub-protocol.
+    */
+  String getReason();
+
+
+  /**
+    * Indicates whether or not the connection was cleanly closed.
+    */
+  boolean isWasClean();
+}
diff --git a/elemental/src/elemental/events/CompositionEvent.java b/elemental/src/elemental/events/CompositionEvent.java
new file mode 100644
index 0000000..e270204
--- /dev/null
+++ b/elemental/src/elemental/events/CompositionEvent.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.html.Window;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><div>
+
+<a rel="custom" href="http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/events/nsIDOMCompositionEvent.idl"><code>dom/interfaces/events/nsIDOMCompositionEvent.idl</code></a><span><a rel="internal" href="https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces" title="en/Interfaces/About_Scriptable_Interfaces">Scriptable</a></span></div><span>An event interface for composition events</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 9.0</div><div title="Introduced in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+"></div><div title="Last changed in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+"></div></div>
+<div>Inherits from: <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIDOMUIEvent&amp;ident=nsIDOMUIEvent" class="new">nsIDOMUIEvent</a></code>
+<span>Last changed in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+</span></div></div>
+<p></p>
+<p>The DOM <code>CompositionEvent</code> represents events that occur due to the user indirectly entering text.</p>
+  */
+public interface CompositionEvent extends UIEvent {
+
+
+  /**
+    * <p>For <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOM_event_reference/compositionstart">compositionstart</a></code>
+ events, this is the currently selected text that will be replaced by the string being composed. This value doesn't change even if content changes the selection range; rather, it indicates the string that was selected when composition started.</p> <p>For <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOM_event_reference/compositionupdate">compositionupdate</a></code>
+, this is the string as it stands currently as editing is ongoing.</p> <p>For <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOM_event_reference/compositionend">compositionend</a></code>
+ events, this is the string as committed to the editor.</p> <p><strong>Read only</strong>.</p>
+    */
+  String getData();
+
+
+  /**
+    * <p>Initializes the attributes of a composition event.</p>
+
+<div id="section_5"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>typeArg</code></dt> <dd>The type of composition event; this will be one of <code>compositionstart</code>, <code>compositionupdate</code>, or <code>compositionend</code>.</dd> <dt><code>canBubbleArg</code></dt> <dd>Whether or not the event can bubble.</dd> <dt><code>cancelableArg</code></dt> <dd>Whether or not the event can be canceled.</dd> <dt><code>viewArg</code></dt> <dd>?</dd> <dt><code>dataArg</code></dt> <dd>The value of the <code>data</code> attribute.</dd> <dt><code>localeArg</code></dt> <dd>The value of the <code>locale</code> attribute.</dd>
+</dl>
+</div>
+    */
+  void initCompositionEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Window viewArg, String dataArg);
+}
diff --git a/elemental/src/elemental/events/CustomEvent.java b/elemental/src/elemental/events/CustomEvent.java
new file mode 100644
index 0000000..9f811d1
--- /dev/null
+++ b/elemental/src/elemental/events/CustomEvent.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The DOM <code>CustomEvent</code> are events initialized by an application for any purpose. It's represented by the <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIDOMCustomEvent&amp;ident=nsIDOMCustomEvent" class="new">nsIDOMCustomEvent</a></code>
+&nbsp;interface, which extends the <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMEvent">nsIDOMEvent</a></code>
+ interface.
+  */
+public interface CustomEvent extends Event {
+
+
+  /**
+    * The data passed when initializing the event.
+    */
+  Object getDetail();
+
+
+  /**
+    * <p>Initializes the event in a manner analogous to the similarly-named method in the DOM Events interfaces.</p>
+
+<div id="section_5"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>type</code></dt> <dd>The name of the event.</dd> <dt><code>canBubble</code></dt> <dd>A boolean indicating whether the event bubbles up through the DOM or not.</dd> <dt><code>cancelable</code></dt> <dd>A boolean indicating whether the event is cancelable.</dd> <dt><code>detail</code></dt> <dd>The data passed when initializing the event.</dd>
+</dl>
+</div>
+    */
+  void initCustomEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Object detailArg);
+}
diff --git a/elemental/src/elemental/events/ErrorEvent.java b/elemental/src/elemental/events/ErrorEvent.java
new file mode 100644
index 0000000..bff90fe
--- /dev/null
+++ b/elemental/src/elemental/events/ErrorEvent.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ErrorEvent extends Event {
+
+  String getFilename();
+
+  int getLineno();
+
+  String getMessage();
+}
diff --git a/elemental/src/elemental/events/Event.java b/elemental/src/elemental/events/Event.java
new file mode 100644
index 0000000..8d418b2
--- /dev/null
+++ b/elemental/src/elemental/events/Event.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.dom.Clipboard;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+
+import java.util.Date;
+
+/**
+  * <p>This chapter describes the DOM Event Model. The <a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event" title="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event" target="_blank">Event</a> interface itself is described, as well as the interfaces for event registration on nodes in the DOM, and <a title="en/DOM/element.addEventListener" rel="internal" href="https://developer.mozilla.org/en/DOM/element.addEventListener">event listeners</a>, and several longer examples that show how the various event interfaces relate to one another.</p>
+<p>There is an excellent diagram that clearly explains the three phases of event flow through the DOM in the <a class="external" title="http://www.w3.org/TR/DOM-Level-3-Events/#dom-event-architecture" rel="external" href="http://www.w3.org/TR/DOM-Level-3-Events/#dom-event-architecture" target="_blank">DOM Level 3 Events draft</a>.</p>
+  */
+public interface Event {
+public static final String CLICK = "click";
+public static final String CONTEXTMENU = "contextmenu";
+public static final String DBLCLICK = "dblclick";
+public static final String CHANGE = "change";
+public static final String MOUSEDOWN = "mousedown";
+public static final String MOUSEMOVE = "mousemove";
+public static final String MOUSEOUT = "mouseout";
+public static final String MOUSEOVER = "mouseover";
+public static final String MOUSEUP = "mouseup";
+public static final String MOUSEWHEEL = "mousewheel";
+public static final String FOCUS = "focus";
+public static final String FOCUSIN = "focusin";
+public static final String FOCUSOUT = "focusout";
+public static final String BLUR = "blur";
+public static final String KEYDOWN = "keydown";
+public static final String KEYPRESS = "keypress";
+public static final String KEYUP = "keyup";
+public static final String SCROLL = "scroll";
+public static final String BEFORECUT = "beforecut";
+public static final String CUT = "cut";
+public static final String BEFORECOPY = "beforecopy";
+public static final String COPY = "copy";
+public static final String BEFOREPASTE = "beforepaste";
+public static final String PASTE = "paste";
+public static final String DRAGENTER = "dragenter";
+public static final String DRAGOVER = "dragover";
+public static final String DRAGLEAVE = "dragleave";
+public static final String DROP = "drop";
+public static final String DRAGSTART = "dragstart";
+public static final String DRAG = "drag";
+public static final String DRAGEND = "dragend";
+public static final String RESIZE = "resize";
+public static final String SELECTSTART = "selectstart";
+public static final String SUBMIT = "submit";
+public static final String ERROR = "error";
+public static final String WEBKITANIMATIONSTART = "webkitAnimationStart";
+public static final String WEBKITANIMATIONITERATION = "webkitAnimationIteration";
+public static final String WEBKITANIMATIONEND = "webkitAnimationEnd";
+public static final String WEBKITTRANSITIONEND = "webkitTransitionEnd";
+public static final String INPUT = "input";
+public static final String INVALID = "invalid";
+public static final String TOUCHSTART = "touchstart";
+public static final String TOUCHMOVE = "touchmove";
+public static final String TOUCHEND = "touchend";
+public static final String TOUCHCANCEL = "touchcancel";
+
+
+    static final int AT_TARGET = 2;
+
+    static final int BUBBLING_PHASE = 3;
+
+    static final int CAPTURING_PHASE = 1;
+
+    static final int NONE = 0;
+
+
+  /**
+    * A boolean indicating whether the event bubbles up through the DOM or not.
+    */
+  boolean isBubbles();
+
+
+  /**
+    * A boolean indicating whether the bubbling of the event has been canceled or not.
+    */
+  boolean isCancelBubble();
+
+  void setCancelBubble(boolean arg);
+
+
+  /**
+    * A boolean indicating whether the event is cancelable.
+    */
+  boolean isCancelable();
+
+  Clipboard getClipboardData();
+
+
+  /**
+    * A reference to the currently registered target for the event.
+    */
+  EventTarget getCurrentTarget();
+
+
+  /**
+    * Indicates whether or not <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/event.preventDefault">event.preventDefault()</a></code>
+ has been called on the event.
+    */
+  boolean isDefaultPrevented();
+
+
+  /**
+    * Indicates which phase of the event flow is being processed.
+    */
+  int getEventPhase();
+
+  boolean isReturnValue();
+
+  void setReturnValue(boolean arg);
+
+  EventTarget getSrcElement();
+
+
+  /**
+    * A reference to the target to which the event was originally dispatched.
+    */
+  EventTarget getTarget();
+
+
+  /**
+    * The time that the event was created.
+    */
+  double getTimeStamp();
+
+
+  /**
+    * The name of the event (case-insensitive).
+    */
+  String getType();
+
+
+  /**
+    * Initializes the value of an Event created through the <code>DocumentEvent</code> interface.
+    */
+  void initEvent(String eventTypeArg, boolean canBubbleArg, boolean cancelableArg);
+
+
+  /**
+    * Cancels the event (if it is cancelable).
+    */
+  void preventDefault();
+
+
+  /**
+    * For this particular event, no other listener will be called. Neither those attached on the same element, nor those attached on elements which will be traversed later (in capture phase, for instance)
+    */
+  void stopImmediatePropagation();
+
+
+  /**
+    * Stops the propagation of events further along in the DOM.
+    */
+  void stopPropagation();
+}
diff --git a/elemental/src/elemental/events/EventException.java b/elemental/src/elemental/events/EventException.java
new file mode 100644
index 0000000..ab2ab7b
--- /dev/null
+++ b/elemental/src/elemental/events/EventException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface EventException {
+
+    static final int DISPATCH_REQUEST_ERR = 1;
+
+    static final int UNSPECIFIED_EVENT_TYPE_ERR = 0;
+
+  int getCode();
+
+  String getMessage();
+
+  String getName();
+}
diff --git a/elemental/src/elemental/events/EventListener.java b/elemental/src/elemental/events/EventListener.java
new file mode 100644
index 0000000..abe150f
--- /dev/null
+++ b/elemental/src/elemental/events/EventListener.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface EventListener {
+
+  void handleEvent(Event evt);
+}
diff --git a/elemental/src/elemental/events/EventRemover.java b/elemental/src/elemental/events/EventRemover.java
new file mode 100644
index 0000000..8e32c33
--- /dev/null
+++ b/elemental/src/elemental/events/EventRemover.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+public interface EventRemover {
+   void remove();
+}
diff --git a/elemental/src/elemental/events/EventTarget.java b/elemental/src/elemental/events/EventTarget.java
new file mode 100644
index 0000000..25d4f9a
--- /dev/null
+++ b/elemental/src/elemental/events/EventTarget.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * An <code>EventTarget</code> is a DOM interface implemented by objects that can receive DOM events and have listeners for them. The most common <code>EventTarget</code>s are <a rel="internal" href="https://developer.mozilla.org/en/DOM/element" title="en/DOM/element">DOM elements</a>, although other objects can be <code>EventTarget</code>s too, for example <a rel="internal" href="https://developer.mozilla.org/en/DOM/document" title="en/DOM/document">document</a>, <a rel="internal" href="https://developer.mozilla.org/en/DOM/window" title="en/DOM/window">window</a>, <a rel="internal" href="https://developer.mozilla.org/en/XMLHttpRequest" title="en/XMLHttpRequest">XMLHttpRequest</a>, and others.
+
+  */
+public interface EventTarget {
+
+
+  /**
+    * 
+Register an event handler of a specific event type on the <code>EventTarget</code>.
+    */
+  EventRemover addEventListener(String type, EventListener listener);
+
+
+  /**
+    * 
+Register an event handler of a specific event type on the <code>EventTarget</code>.
+    */
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+
+  /**
+    * 
+Dispatch an event to this <code>EventTarget</code>.
+    */
+  boolean dispatchEvent(Event event);
+
+
+  /**
+    * 
+Removes an event listener from the <code>EventTarget</code>.
+    */
+  void removeEventListener(String type, EventListener listener);
+
+
+  /**
+    * 
+Removes an event listener from the <code>EventTarget</code>.
+    */
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/events/HashChangeEvent.java b/elemental/src/elemental/events/HashChangeEvent.java
new file mode 100644
index 0000000..85a9db0
--- /dev/null
+++ b/elemental/src/elemental/events/HashChangeEvent.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface HashChangeEvent extends Event {
+
+  String getNewURL();
+
+  String getOldURL();
+
+  void initHashChangeEvent(String type, boolean canBubble, boolean cancelable, String oldURL, String newURL);
+}
diff --git a/elemental/src/elemental/events/KeyboardEvent.java b/elemental/src/elemental/events/KeyboardEvent.java
new file mode 100644
index 0000000..7c7afc1
--- /dev/null
+++ b/elemental/src/elemental/events/KeyboardEvent.java
@@ -0,0 +1,721 @@
+/*
+ * Copyright 2008 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.html.Window;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+
+import java.util.Date;
+
+/**
+  * <div class="deprecatedHeaderTemplate"><p>Deprecated</p></div>
+<p></p>
+<p><code>KeyboardEvent</code> objects describe a user interaction with the keyboard. Each event describes a key; the event type (<code>keydown</code>, <code>keypress</code>, or <code>keyup</code>) identifies what kind of activity was performed.</p>
+<div class="note"><strong>Note:</strong> The <code>KeyboardEvent</code> interface is deprecated in DOM&nbsp;Level 3 in favor of the new <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/TextInput" class="new">TextInput</a></code>
+ interface and the corresponding <code>textinput</code> event, which have improved support for alternate input methods.&nbsp; However, DOM Level 3 <code>textinput</code> events are <a title="https://bugzilla.mozilla.org/show_bug.cgi?id=622245" class=" link-https" rel="external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=622245" target="_blank">not yet implemented</a> in Gecko (as of version 6.0), so code written for Gecko browsers should continue to use <code>KeyboardEvent</code> for now.</div>
+  */
+public interface KeyboardEvent extends UIEvent {
+/**
+ * Defines the standard key locations returned by {@link #getKeyLocation}.
+ */
+public interface KeyLocation {
+
+  /**
+   * The event key is not distinguished as the left or right version
+   * of the key, and did not originate from the numeric keypad (or did not
+   * originate with a virtual key corresponding to the numeric keypad).
+   */
+  public static final int STANDARD = 0;
+
+  /**
+   * The event key is in the left key location.
+   */
+  public static final int LEFT = 1;
+
+  /**
+   * The event key is in the right key location.
+   */
+  public static final int RIGHT = 2;
+
+  /**
+   * The event key originated on the numeric keypad or with a virtual key
+   * corresponding to the numeric keypad.
+   */
+  public static final int NUMPAD = 3;
+
+  /**
+   * The event key originated on a mobile device, either on a physical
+   * keypad or a virtual keyboard.
+   */
+  public static final int MOBILE = 4;
+
+  /**
+   * The event key originated on a game controller or a joystick on a mobile
+   * device.
+   */
+  public static final int JOYSTICK = 5;
+}
+
+/**
+ * Defines the expected key codes returned by {@link #getKeyCode}.
+ *
+ * @see "http://code.google.com/p/closure-library/source/browse/trunk/closure/goog/events/keycodes.js"
+ */
+public interface KeyCode {
+  public static final int BACKSPACE = 8;
+  public static final int TAB = 9;
+  public static final int NUM_CENTER = 12; // NUMLOCK on FF/Safari Mac
+  public static final int ENTER = 13;
+  public static final int SHIFT = 16;
+  public static final int CTRL = 17;
+  public static final int ALT = 18;
+  public static final int PAUSE = 19;
+  public static final int CAPS_LOCK = 20;
+  public static final int ESC = 27;
+  public static final int SPACE = 32;
+  public static final int PAGE_UP = 33; // also NUM_NORTH_EAST
+  public static final int PAGE_DOWN = 34; // also NUM_SOUTH_EAST
+  public static final int END = 35; // also NUM_SOUTH_WEST
+  public static final int HOME = 36; // also NUM_NORTH_WEST
+  public static final int LEFT = 37; // also NUM_WEST
+  public static final int UP = 38; // also NUM_NORTH
+  public static final int RIGHT = 39; // also NUM_EAST
+  public static final int DOWN = 40; // also NUM_SOUTH
+  public static final int PRINT_SCREEN = 44;
+  public static final int INSERT = 45; // also NUM_INSERT
+  public static final int DELETE = 46; // also NUM_DELETE
+  public static final int ZERO = 48;
+  public static final int ONE = 49;
+  public static final int TWO = 50;
+  public static final int THREE = 51;
+  public static final int FOUR = 52;
+  public static final int FIVE = 53;
+  public static final int SIX = 54;
+  public static final int SEVEN = 55;
+  public static final int EIGHT = 56;
+  public static final int NINE = 57;
+  public static final int QUESTION_MARK = 63; // needs localization
+  public static final int A = 65;
+  public static final int B = 66;
+  public static final int C = 67;
+  public static final int D = 68;
+  public static final int E = 69;
+  public static final int F = 70;
+  public static final int G = 71;
+  public static final int H = 72;
+  public static final int I = 73;
+  public static final int J = 74;
+  public static final int K = 75;
+  public static final int L = 76;
+  public static final int M = 77;
+  public static final int N = 78;
+  public static final int O = 79;
+  public static final int P = 80;
+  public static final int Q = 81;
+  public static final int R = 82;
+  public static final int S = 83;
+  public static final int T = 84;
+  public static final int U = 85;
+  public static final int V = 86;
+  public static final int W = 87;
+  public static final int X = 88;
+  public static final int Y = 89;
+  public static final int Z = 90;
+  public static final int META = 91;
+  public static final int CONTEXT_MENU = 93;
+  public static final int NUM_ZERO = 96;
+  public static final int NUM_ONE = 97;
+  public static final int NUM_TWO = 98;
+  public static final int NUM_THREE = 99;
+  public static final int NUM_FOUR = 100;
+  public static final int NUM_FIVE = 101;
+  public static final int NUM_SIX = 102;
+  public static final int NUM_SEVEN = 103;
+  public static final int NUM_EIGHT = 104;
+  public static final int NUM_NINE = 105;
+  public static final int NUM_MULTIPLY = 106;
+  public static final int NUM_PLUS = 107;
+  public static final int NUM_MINUS = 109;
+  public static final int NUM_PERIOD = 110;
+  public static final int NUM_DIVISION = 111;
+  public static final int F1 = 112;
+  public static final int F2 = 113;
+  public static final int F3 = 114;
+  public static final int F4 = 115;
+  public static final int F5 = 116;
+  public static final int F6 = 117;
+  public static final int F7 = 118;
+  public static final int F8 = 119;
+  public static final int F9 = 120;
+  public static final int F10 = 121;
+  public static final int F11 = 122;
+  public static final int F12 = 123;
+  public static final int NUMLOCK = 144;
+  public static final int SEMICOLON = 186; // needs localization
+  public static final int DASH = 189; // needs localization
+  public static final int EQUALS = 187; // needs localization
+  public static final int COMMA = 188; // needs localization
+  public static final int PERIOD = 190; // needs localization
+  public static final int SLASH = 191; // needs localization
+  public static final int APOSTROPHE = 192; // needs localization
+  public static final int SINGLE_QUOTE = 222; // needs localization
+  public static final int OPEN_SQUARE_BRACKET = 219; // needs localization
+  public static final int BACKSLASH = 220;
+  public static final int CLOSE_SQUARE_BRACKET = 221;
+  public static final int WIN_KEY = 224;
+  public static final int WIN_IME = 229;
+}
+
+/**
+ * Defines the standard keyboard identifier names for keys that are returned
+ * by {@link #getKeyboardIdentifier} when the key does not have a direct
+ * unicode mapping.
+ */
+public interface KeyName {
+
+  /** The Accept (Commit, OK) key */
+  public static final String ACCEPT = "Accept";
+
+  /** The Add key */
+  public static final String ADD = "Add";
+
+  /** The Again key */
+  public static final String AGAIN = "Again";
+
+  /** The All Candidates key */
+  public static final String ALL_CANDIDATES = "AllCandidates";
+
+  /** The Alphanumeric key */
+  public static final String ALPHANUMERIC = "Alphanumeric";
+
+  /** The Alt (Menu) key */
+  public static final String ALT = "Alt";
+
+  /** The Alt-Graph key */
+  public static final String ALT_GRAPH = "AltGraph";
+
+  /** The Application key */
+  public static final String APPS = "Apps";
+
+  /** The ATTN key */
+  public static final String ATTN = "Attn";
+
+  /** The Browser Back key */
+  public static final String BROWSER_BACK = "BrowserBack";
+
+  /** The Browser Favorites key */
+  public static final String BROWSER_FAVORTIES = "BrowserFavorites";
+
+  /** The Browser Forward key */
+  public static final String BROWSER_FORWARD = "BrowserForward";
+
+  /** The Browser Home key */
+  public static final String BROWSER_NAME = "BrowserHome";
+
+  /** The Browser Refresh key */
+  public static final String BROWSER_REFRESH = "BrowserRefresh";
+
+  /** The Browser Search key */
+  public static final String BROWSER_SEARCH = "BrowserSearch";
+
+  /** The Browser Stop key */
+  public static final String BROWSER_STOP = "BrowserStop";
+
+  /** The Camera key */
+  public static final String CAMERA = "Camera";
+
+  /** The Caps Lock (Capital) key */
+  public static final String CAPS_LOCK = "CapsLock";
+
+  /** The Clear key */
+  public static final String CLEAR = "Clear";
+
+  /** The Code Input key */
+  public static final String CODE_INPUT = "CodeInput";
+
+  /** The Compose key */
+  public static final String COMPOSE = "Compose";
+
+  /** The Control (Ctrl) key */
+  public static final String CONTROL = "Control";
+
+  /** The Crsel key */
+  public static final String CRSEL = "Crsel";
+
+  /** The Convert key */
+  public static final String CONVERT = "Convert";
+
+  /** The Copy key */
+  public static final String COPY = "Copy";
+
+  /** The Cut key */
+  public static final String CUT = "Cut";
+
+  /** The Decimal key */
+  public static final String DECIMAL = "Decimal";
+
+  /** The Divide key */
+  public static final String DIVIDE = "Divide";
+
+  /** The Down Arrow key */
+  public static final String DOWN = "Down";
+
+  /** The diagonal Down-Left Arrow key */
+  public static final String DOWN_LEFT = "DownLeft";
+
+  /** The diagonal Down-Right Arrow key */
+  public static final String DOWN_RIGHT = "DownRight";
+
+  /** The Eject key */
+  public static final String EJECT = "Eject";
+
+  /** The End key */
+  public static final String END = "End";
+
+  /**
+   * The Enter key. Note: This key value must also be used for the Return
+   *  (Macintosh numpad) key
+   */
+  public static final String ENTER = "Enter";
+
+  /** The Erase EOF key */
+  public static final String ERASE_EOF= "EraseEof";
+
+  /** The Execute key */
+  public static final String EXECUTE = "Execute";
+
+  /** The Exsel key */
+  public static final String EXSEL = "Exsel";
+
+  /** The Function switch key */
+  public static final String FN = "Fn";
+
+  /** The F1 key */
+  public static final String F1 = "F1";
+
+  /** The F2 key */
+  public static final String F2 = "F2";
+
+  /** The F3 key */
+  public static final String F3 = "F3";
+
+  /** The F4 key */
+  public static final String F4 = "F4";
+
+  /** The F5 key */
+  public static final String F5 = "F5";
+
+  /** The F6 key */
+  public static final String F6 = "F6";
+
+  /** The F7 key */
+  public static final String F7 = "F7";
+
+  /** The F8 key */
+  public static final String F8 = "F8";
+
+  /** The F9 key */
+  public static final String F9 = "F9";
+
+  /** The F10 key */
+  public static final String F10 = "F10";
+
+  /** The F11 key */
+  public static final String F11 = "F11";
+
+  /** The F12 key */
+  public static final String F12 = "F12";
+
+  /** The F13 key */
+  public static final String F13 = "F13";
+
+  /** The F14 key */
+  public static final String F14 = "F14";
+
+  /** The F15 key */
+  public static final String F15 = "F15";
+
+  /** The F16 key */
+  public static final String F16 = "F16";
+
+  /** The F17 key */
+  public static final String F17 = "F17";
+
+  /** The F18 key */
+  public static final String F18 = "F18";
+
+  /** The F19 key */
+  public static final String F19 = "F19";
+
+  /** The F20 key */
+  public static final String F20 = "F20";
+
+  /** The F21 key */
+  public static final String F21 = "F21";
+
+  /** The F22 key */
+  public static final String F22 = "F22";
+
+  /** The F23 key */
+  public static final String F23 = "F23";
+
+  /** The F24 key */
+  public static final String F24 = "F24";
+
+  /** The Final Mode (Final) key used on some asian keyboards */
+  public static final String FINAL_MODE = "FinalMode";
+
+  /** The Find key */
+  public static final String FIND = "Find";
+
+  /** The Full-Width Characters key */
+  public static final String FULL_WIDTH = "FullWidth";
+
+  /** The Half-Width Characters key */
+  public static final String HALF_WIDTH = "HalfWidth";
+
+  /** The Hangul (Korean characters) Mode key */
+  public static final String HANGUL_MODE = "HangulMode";
+
+  /** The Hanja (Korean characters) Mode key */
+  public static final String HANJA_MODE = "HanjaMode";
+
+  /** The Help key */
+  public static final String HELP = "Help";
+
+  /** The Hiragana (Japanese Kana characters) key */
+  public static final String HIRAGANA = "Hiragana";
+
+  /** The Home key */
+  public static final String HOME = "Home";
+
+  /** The Insert (Ins) key */
+  public static final String INSERT = "Insert";
+
+  /** The Japanese-Hiragana key */
+  public static final String JAPANESE_HIRAGANA = "JapaneseHiragana";
+
+  /** The Japanese-Katakana key */
+  public static final String JAPANESE_KATAKANA = "JapaneseKatakana";
+
+  /** The Japanese-Romaji key */
+  public static final String JAPANESE_ROMAJI = "JapaneseRomaji";
+
+  /** The Junja Mode key */
+  public static final String JUNJA_MODE = "JunjaMode";
+
+  /** The Kana Mode (Kana Lock) key */
+  public static final String KANA_MODE = "KanaMode";
+
+  /**
+   * The Kanji (Japanese name for ideographic characters of Chinese origin)
+   * Mode key
+   */
+  public static final String KANJI_MODE = "KanjiMode";
+
+  /** The Katakana (Japanese Kana characters) key */
+  public static final String KATAKANA = "Katakana";
+
+  /** The Start Application One key */
+  public static final String LAUNCH_APPLICATION_1 = "LaunchApplication1";
+
+  /** The Start Application Two key */
+  public static final String LAUNCH_APPLICATION_2 = "LaunchApplication2";
+
+  /** The Start Mail key */
+  public static final String LAUNCH_MAIL = "LaunchMail";
+
+  /** The Left Arrow key */
+  public static final String LEFT = "Left";
+
+  /** The Menu key */
+  public static final String MENU = "Menu";
+
+  /**
+   * The Meta key. Note: This key value shall be also used for the Apple
+   * Command key
+   */
+  public static final String META = "Meta";
+
+  /** The Media Next Track key */
+  public static final String MEDIA_NEXT_TRACK = "MediaNextTrack";
+
+  /** The Media Play Pause key */
+  public static final String MEDIA_PAUSE_PLAY = "MediaPlayPause";
+
+  /** The Media Previous Track key */
+  public static final String MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
+
+  /** The Media Stop key */
+  public static final String MEDIA_STOP = "MediaStop";
+
+  /** The Mode Change key */
+  public static final String MODE_CHANGE = "ModeChange";
+
+  /** The Next Candidate function key */
+  public static final String NEXT_CANDIDATE = "NextCandidate";
+
+  /** The Nonconvert (Don't Convert) key */
+  public static final String NON_CONVERT = "Nonconvert";
+
+  /** The Number Lock key */
+  public static final String NUM_LOCK = "NumLock";
+
+  /** The Page Down (Next) key */
+  public static final String PAGE_DOWN = "PageDown";
+
+  /** The Page Up key */
+  public static final String PAGE_UP = "PageUp";
+
+  /** The Paste key */
+  public static final String PASTE = "Paste";
+
+  /** The Pause key */
+  public static final String PAUSE = "Pause";
+
+  /** The Play key */
+  public static final String PLAY = "Play";
+
+  /**
+   * The Power key. Note: Some devices may not expose this key to the
+   * operating environment
+   */
+  public static final String POWER = "Power";
+
+  /** The Previous Candidate function key */
+  public static final String PREVIOUS_CANDIDATE = "PreviousCandidate";
+
+  /** The Print Screen (PrintScrn, SnapShot) key */
+  public static final String PRINT_SCREEN = "PrintScreen";
+
+  /** The Process key */
+  public static final String PROCESS = "Process";
+
+  /** The Props key */
+  public static final String PROPS = "Props";
+
+  /** The Right Arrow key */
+  public static final String RIGHT = "Right";
+
+  /** The Roman Characters function key */
+  public static final String ROMAN_CHARACTERS = "RomanCharacters";
+
+  /** The Scroll Lock key */
+  public static final String SCROLL = "Scroll";
+
+  /** The Select key */
+  public static final String SELECT = "Select";
+
+  /** The Select Media key */
+  public static final String SELECT_MEDIA = "SelectMedia";
+
+  /** The Separator key */
+  public static final String SEPARATOR = "Separator";
+
+  /** The Shift key */
+  public static final String SHIFT = "Shift";
+
+  /** The Soft1 key */
+  public static final String SOFT_1 = "Soft1";
+
+  /** The Soft2 key */
+  public static final String SOFT_2 = "Soft2";
+
+  /** The Soft3 key */
+  public static final String SOFT_3 = "Soft3";
+
+  /** The Soft4 key */
+  public static final String SOFT_4 = "Soft4";
+
+  /** The Stop key */
+  public static final String STOP = "Stop";
+
+  /** The Subtract key */
+  public static final String SUBTRACT = "Subtract";
+
+  /** The Symbol Lock key */
+  public static final String SYMBOL_LOCK = "SymbolLock";
+
+  /** The Up Arrow key */
+  public static final String UP = "Up";
+
+  /** The diagonal Up-Left Arrow key */
+  public static final String UP_LEFT = "UpLeft";
+
+  /** The diagonal Up-Right Arrow key */
+  public static final String UP_RIGHT = "UpRight";
+
+  /** The Undo key */
+  public static final String UNDO = "Undo";
+
+  /** The Volume Down key */
+  public static final String VOLUME_DOWN = "VolumeDown";
+
+  /** The Volume Mute key */
+  public static final String VOLUMN_MUTE = "VolumeMute";
+
+  /** The Volume Up key */
+  public static final String VOLUMN_UP = "VolumeUp";
+
+  /** The Windows Logo key */
+  public static final String WIN = "Win";
+
+  /** The Zoom key */
+  public static final String ZOOM = "Zoom";
+
+  /**
+   * The Backspace (Back) key. Note: This key value shall be also used for the
+   * key labeled 'delete' MacOS keyboards when not modified by the 'Fn' key
+   */
+  public static final String BACKSPACE = "Backspace";
+
+  /** The Horizontal Tabulation (Tab) key */
+  public static final String TAB = "Tab";
+
+  /** The Cancel key */
+  public static final String CANCEL = "Cancel";
+
+  /** The Escape (Esc) key */
+  public static final String ESC = "Esc";
+
+  /** The Space (Spacebar) key:   */
+  public static final String SPACEBAR = "Spacebar";
+
+  /**
+   * The Delete (Del) Key. Note: This key value shall be also used for the key
+   * labeled 'delete' MacOS keyboards when modified by the 'Fn' key
+   */
+  public static final String DEL = "Del";
+
+  /** The Combining Grave Accent (Greek Varia, Dead Grave) key */
+  public static final String DEAD_GRAVE = "DeadGrave";
+
+  /**
+   * The Combining Acute Accent (Stress Mark, Greek Oxia, Tonos, Dead Eacute)
+   * key
+   */
+  public static final String DEAD_EACUTE = "DeadEacute";
+
+  /** The Combining Circumflex Accent (Hat, Dead Circumflex) key */
+  public static final String DEAD_CIRCUMFLEX = "DeadCircumflex";
+
+  /** The Combining Tilde (Dead Tilde) key */
+  public static final String DEAD_TILDE = "DeadTilde";
+
+  /** The Combining Macron (Long, Dead Macron) key */
+  public static final String DEAD_MACRON = "DeadMacron";
+
+  /** The Combining Breve (Short, Dead Breve) key */
+  public static final String DEAD_BREVE = "DeadBreve";
+
+  /** The Combining Dot Above (Derivative, Dead Above Dot) key */
+  public static final String DEAD_ABOVE_DOT = "DeadAboveDot";
+
+  /**
+   * The Combining Diaeresis (Double Dot Abode, Umlaut, Greek Dialytika,
+   * Double Derivative, Dead Diaeresis) key
+   */
+  public static final String DEAD_UMLAUT = "DeadUmlaut";
+
+  /** The Combining Ring Above (Dead Above Ring) key */
+  public static final String DEAD_ABOVE_RING = "DeadAboveRing";
+
+  /** The Combining Double Acute Accent (Dead Doubleacute) key */
+  public static final String DEAD_DOUBLEACUTE = "DeadDoubleacute";
+
+  /** The Combining Caron (Hacek, V Above, Dead Caron) key */
+  public static final String DEAD_CARON = "DeadCaron";
+
+  /** The Combining Cedilla (Dead Cedilla) key */
+  public static final String DEAD_CEDILLA = "DeadCedilla";
+
+  /** The Combining Ogonek (Nasal Hook, Dead Ogonek) key */
+  public static final String DEAD_OGONEK = "DeadOgonek";
+
+  /**
+   * The Combining Greek Ypogegrammeni (Greek Non-Spacing Iota Below, Iota
+   * Subscript, Dead Iota) key
+   */
+  public static final String DEAD_IOTA = "DeadIota";
+
+  /**
+   * The Combining Katakana-Hiragana Voiced Sound Mark (Dead Voiced Sound) key
+   */
+  public static final String DEAD_VOICED_SOUND = "DeadVoicedSound";
+
+  /**
+   * The Combining Katakana-Hiragana Semi-Voiced Sound Mark (Dead Semivoiced
+   * Sound) key
+   */
+  public static final String DEC_SEMIVOICED_SOUND= "DeadSemivoicedSound";
+
+  /**
+   * Key value used when an implementation is unable to identify another key
+   * value, due to either hardware, platform, or software constraints
+   */
+  public static final String UNIDENTIFIED = "Unidentified";
+  }
+
+  int getKeyCode();
+    
+
+  boolean isAltGraphKey();
+
+
+  /**
+    * <code>true</code> if the Alt (or Option, on Mac) key was active when the key event was generated. <strong>Read only.</strong>
+    */
+  boolean isAltKey();
+
+
+  /**
+    * <code>true</code> if the Control key was active when the key event was generated. <strong>Read only.</strong>
+    */
+  boolean isCtrlKey();
+
+  String getKeyIdentifier();
+
+  int getKeyLocation();
+
+
+  /**
+    * <code>true</code> if the Meta (or Command, on Mac) key was active when the key event was generated. <strong>Read only.</strong>
+    */
+  boolean isMetaKey();
+
+
+  /**
+    * <code>true</code> if the Shift key was active when the key event was generated. <strong>Read only.</strong>
+    */
+  boolean isShiftKey();
+
+
+  /**
+    * <p>Initializes the attributes of a keyboard event object.</p>
+
+<div id="section_11"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>typeArg</code></dt> <dd>The type of keyboard event; this will be one of <code>keydown</code>, <code>keypress</code>, or <code>keyup</code>.</dd> <dt><code>canBubbleArg</code></dt> <dd>Whether or not the event can bubble.</dd> <dt><code>cancelableArg</code></dt> <dd>Whether or not the event can be canceled.</dd> <dt><code>viewArg</code></dt> <dd>?</dd> <dt><code>charArg</code></dt> <dd>The value of the char attribute.</dd> <dt><code>keyArg</code></dt> <dd>The value of the key attribute.</dd> <dt><code>locationArg</code></dt> <dd>The value of the location attribute.</dd> <dt><code>modifiersListArg</code></dt> <dd>A whitespace-delineated list of modifier keys that should be considered to be active on the event's key. For example, specifying "Control Shift" indicates that the user was holding down the Control and Shift keys when pressing the key described by the event.</dd> <dt><code>repeatArg</code></dt> <dd>The value of the repeat attribute.</dd> <dt><code>localeArg</code></dt> <dd>The value of the locale attribute.</dd>
+</dl>
+</div>
+    */
+  void initKeyboardEvent(String type, boolean canBubble, boolean cancelable, Window view, String keyIdentifier, int keyLocation, boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey, boolean altGraphKey);
+}
diff --git a/elemental/src/elemental/events/MediaStreamEvent.java b/elemental/src/elemental/events/MediaStreamEvent.java
new file mode 100644
index 0000000..94d0225
--- /dev/null
+++ b/elemental/src/elemental/events/MediaStreamEvent.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.dom.MediaStream;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaStreamEvent extends Event {
+
+  MediaStream getStream();
+}
diff --git a/elemental/src/elemental/events/MessageChannel.java b/elemental/src/elemental/events/MessageChannel.java
new file mode 100644
index 0000000..69c4e4c
--- /dev/null
+++ b/elemental/src/elemental/events/MessageChannel.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MessageChannel {
+
+  MessagePort getPort1();
+
+  MessagePort getPort2();
+}
diff --git a/elemental/src/elemental/events/MessageEvent.java b/elemental/src/elemental/events/MessageEvent.java
new file mode 100644
index 0000000..7896325
--- /dev/null
+++ b/elemental/src/elemental/events/MessageEvent.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.html.Window;
+import elemental.util.Indexable;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong>
+<div>This page is not complete.</div>
+</div>
+
+<p></p>
+<p>A <code>MessageEvent</code> is sent to clients using WebSockets when data is received from the server. This is delivered to the listener indicated by the <code>WebSocket</code> object's <code>onmessage</code> attribute.</p>
+  */
+public interface MessageEvent extends Event {
+
+
+  /**
+    * The data from the server.
+    */
+  Object getData();
+
+  String getLastEventId();
+
+  String getOrigin();
+
+  Indexable getPorts();
+
+  Window getSource();
+
+  void initMessageEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, Indexable messagePorts);
+
+  void webkitInitMessageEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, Indexable transferables);
+}
diff --git a/elemental/src/elemental/events/MessagePort.java b/elemental/src/elemental/events/MessagePort.java
new file mode 100644
index 0000000..af23364
--- /dev/null
+++ b/elemental/src/elemental/events/MessagePort.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.util.Indexable;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div>
+
+<a rel="custom" href="http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/threads/nsIDOMWorkers.idl"><code>dom/interfaces/threads/nsIDOMWorkers.idl</code></a><span><a rel="internal" href="https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces" title="en/Interfaces/About_Scriptable_Interfaces">Scriptable</a></span></div><span>This interface represents a worker thread's message port, which is used to allow the worker to post messages back to its creator.</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 1.9.1</div><div title="Introduced in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)
+"></div><div title="Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)
+"></div></div>
+<div>Inherits from: <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsISupports">nsISupports</a></code>
+<span>Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)
+</span></div>
+  */
+public interface MessagePort extends EventTarget {
+
+  EventListener getOnmessage();
+
+  void setOnmessage(EventListener arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  void close();
+
+  boolean dispatchEvent(Event evt);
+
+
+  /**
+    * <p>Posts a message into the event queue.</p>
+
+<div id="section_4"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>aMessage</code></dt> <dd>The message to post.</dd>
+</dl>
+</div>
+    */
+  void postMessage(String message);
+
+
+  /**
+    * <p>Posts a message into the event queue.</p>
+
+<div id="section_4"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>aMessage</code></dt> <dd>The message to post.</dd>
+</dl>
+</div>
+    */
+  void postMessage(String message, Indexable messagePorts);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  void start();
+
+  void webkitPostMessage(String message);
+
+  void webkitPostMessage(String message, Indexable transfer);
+}
diff --git a/elemental/src/elemental/events/MouseEvent.java b/elemental/src/elemental/events/MouseEvent.java
new file mode 100644
index 0000000..80fcb8e
--- /dev/null
+++ b/elemental/src/elemental/events/MouseEvent.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.dom.Node;
+import elemental.dom.Clipboard;
+import elemental.html.Window;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+
+import java.util.Date;
+
+/**
+  * The DOM&nbsp;<code>MouseEvent</code> represents events that occur due to the user interacting with a pointing device (such as a mouse). It's represented by the <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsINSDOMMouseEvent&amp;ident=nsINSDOMMouseEvent" class="new">nsINSDOMMouseEvent</a></code>
+&nbsp;interface, which extends the <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIDOMMouseEvent&amp;ident=nsIDOMMouseEvent" class="new">nsIDOMMouseEvent</a></code>
+ interface.
+  */
+public interface MouseEvent extends UIEvent {
+  /**
+   * Contains the set of standard values returned by {@link #button}.
+   */
+  public interface Button {
+    public static final short PRIMARY = 0;
+    public static final short AUXILIARY = 1;
+    public static final short SECONDARY = 2;
+  }
+
+
+  /**
+    * <code>true</code> if the alt key was down when the mouse event was fired. <strong>Read only.</strong>
+    */
+  boolean isAltKey();
+
+
+  /**
+    * The button number that was pressed when the mouse event was fired:&nbsp;Left button=0, middle button=1 (if present), right button=2. For mice configured for left handed use in which the button actions are reversed the values are instead read from right to left. <strong>Read only.</strong>
+    */
+  int getButton();
+
+
+  /**
+    * The X coordinate of the mouse pointer in local (DOM content)&nbsp;coordinates. <strong>Read only.</strong>
+    */
+  int getClientX();
+
+
+  /**
+    * The Y coordinate of the mouse pointer in local (DOM content)&nbsp;coordinates. <strong>Read only.</strong>
+    */
+  int getClientY();
+
+
+  /**
+    * <code>true</code> if the control key was down when the mouse event was fired. <strong>Read only.</strong>
+    */
+  boolean isCtrlKey();
+
+  Clipboard getDataTransfer();
+
+  Node getFromElement();
+
+
+  /**
+    * <code>true</code> if the meta key was down when the mouse event was fired. <strong>Read only.</strong>
+    */
+  boolean isMetaKey();
+
+  int getOffsetX();
+
+  int getOffsetY();
+
+
+  /**
+    * The target to which the event applies. <strong>Read only.</strong>
+    */
+  EventTarget getRelatedTarget();
+
+
+  /**
+    * The X coordinate of the mouse pointer in global (screen)&nbsp;coordinates. <strong>Read only.</strong>
+    */
+  int getScreenX();
+
+
+  /**
+    * The Y coordinate of the mouse pointer in global (screen)&nbsp;coordinates. <strong>Read only.</strong>
+    */
+  int getScreenY();
+
+
+  /**
+    * <code>true</code> if the shift key was down when the mouse event was fired. <strong>Read only.</strong>
+    */
+  boolean isShiftKey();
+
+  Node getToElement();
+
+  int getWebkitMovementX();
+
+  int getWebkitMovementY();
+
+  int getX();
+
+  int getY();
+
+  void initMouseEvent(String type, boolean canBubble, boolean cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey, int button, EventTarget relatedTarget);
+}
diff --git a/elemental/src/elemental/events/MutationEvent.java b/elemental/src/elemental/events/MutationEvent.java
new file mode 100644
index 0000000..e98537a
--- /dev/null
+++ b/elemental/src/elemental/events/MutationEvent.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MutationEvent extends Event {
+
+    static final int ADDITION = 2;
+
+    static final int MODIFICATION = 1;
+
+    static final int REMOVAL = 3;
+
+  int getAttrChange();
+
+  String getAttrName();
+
+  String getNewValue();
+
+  String getPrevValue();
+
+  Node getRelatedNode();
+
+  void initMutationEvent(String type, boolean canBubble, boolean cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange);
+}
diff --git a/elemental/src/elemental/events/OverflowEvent.java b/elemental/src/elemental/events/OverflowEvent.java
new file mode 100644
index 0000000..d2fd5c4
--- /dev/null
+++ b/elemental/src/elemental/events/OverflowEvent.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface OverflowEvent extends Event {
+
+    static final int BOTH = 2;
+
+    static final int HORIZONTAL = 0;
+
+    static final int VERTICAL = 1;
+
+  boolean isHorizontalOverflow();
+
+  int getOrient();
+
+  boolean isVerticalOverflow();
+}
diff --git a/elemental/src/elemental/events/PageTransitionEvent.java b/elemental/src/elemental/events/PageTransitionEvent.java
new file mode 100644
index 0000000..5f49b22
--- /dev/null
+++ b/elemental/src/elemental/events/PageTransitionEvent.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface PageTransitionEvent extends Event {
+
+  boolean isPersisted();
+}
diff --git a/elemental/src/elemental/events/PopStateEvent.java b/elemental/src/elemental/events/PopStateEvent.java
new file mode 100644
index 0000000..8e429b8
--- /dev/null
+++ b/elemental/src/elemental/events/PopStateEvent.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface PopStateEvent extends Event {
+
+  Object getState();
+}
diff --git a/elemental/src/elemental/events/ProgressEvent.java b/elemental/src/elemental/events/ProgressEvent.java
new file mode 100644
index 0000000..ebc52f6
--- /dev/null
+++ b/elemental/src/elemental/events/ProgressEvent.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><div>
+
+<a rel="custom" href="http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/events/nsIDOMProgressEvent.idl"><code>dom/interfaces/events/nsIDOMProgressEvent.idl</code></a><span><a rel="internal" href="https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces" title="en/Interfaces/About_Scriptable_Interfaces">Scriptable</a></span></div><span>This interface represents the events sent with progress information while uploading data using the <code>XMLHttpRequest</code> object.</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 1.9.1</div><div title="Introduced in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)
+"></div><div title="Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)
+"></div></div>
+<div>Inherits from: <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMEvent">nsIDOMEvent</a></code>
+<span>Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)
+</span></div></div>
+<p></p>
+<p>The <code>nsIDOMProgressEvent</code> is used in the media elements (<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/audio">&lt;audio&gt;</a></code>
+) to inform interested code of the progress of the media download. This implementation is a placeholder until the specification is complete, and is compatible with the WebKit ProgressEvent.</p>
+  */
+public interface ProgressEvent extends Event {
+
+
+  /**
+    * Specifies whether or not the total size of the transfer is known. <strong>Read only.</strong>
+    */
+  boolean isLengthComputable();
+
+
+  /**
+    * The number of bytes transferred since the beginning of the operation. This doesn't include headers and other overhead, but only the content itself. <strong>Read only.</strong>
+    */
+  double getLoaded();
+
+
+  /**
+    * The total number of bytes of content that will be transferred during the operation. If the total size is unknown, this value is zero. <strong>Read only.</strong>
+    */
+  double getTotal();
+}
diff --git a/elemental/src/elemental/events/SpeechRecognitionEvent.java b/elemental/src/elemental/events/SpeechRecognitionEvent.java
new file mode 100644
index 0000000..040001e
--- /dev/null
+++ b/elemental/src/elemental/events/SpeechRecognitionEvent.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.dom.SpeechRecognitionResultList;
+import elemental.dom.SpeechRecognitionError;
+import elemental.dom.SpeechRecognitionResult;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SpeechRecognitionEvent extends Event {
+
+  SpeechRecognitionError getError();
+
+  SpeechRecognitionResult getResult();
+
+  SpeechRecognitionResultList getResultHistory();
+
+  short getResultIndex();
+}
diff --git a/elemental/src/elemental/events/TextEvent.java b/elemental/src/elemental/events/TextEvent.java
new file mode 100644
index 0000000..6bb365c
--- /dev/null
+++ b/elemental/src/elemental/events/TextEvent.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.html.Window;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface TextEvent extends UIEvent {
+
+  String getData();
+
+  void initTextEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Window viewArg, String dataArg);
+}
diff --git a/elemental/src/elemental/events/Touch.java b/elemental/src/elemental/events/Touch.java
new file mode 100644
index 0000000..e81407a
--- /dev/null
+++ b/elemental/src/elemental/events/Touch.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * A <code>Touch</code> object represents a single point of contact between the user and a touch-sensitive interface device (which may be, for example, a touchscreen or a trackpad).
+  */
+public interface Touch {
+
+
+  /**
+    * The X coordinate of the touch point relative to the viewport, not including any scroll offset. <strong>Read only.</strong>
+    */
+  int getClientX();
+
+
+  /**
+    * The Y coordinate of the touch point relative to the viewport, not including any scroll offset. <strong>Read only.</strong>
+    */
+  int getClientY();
+
+
+  /**
+    * A unique identifier for this <code>Touch</code> object. A given touch (say, by a finger) will have the same identifier for the duration of its movement around the surface. This lets you ensure that you're tracking the same touch all the time. <strong>Read only.</strong>
+    */
+  int getIdentifier();
+
+
+  /**
+    * The X coordinate of the touch point relative to the viewport, including any scroll offset. <strong>Read only.</strong>
+    */
+  int getPageX();
+
+
+  /**
+    * The Y coordinate of the touch point relative to the viewport, including any scroll offset. <strong>Read only.</strong>
+    */
+  int getPageY();
+
+
+  /**
+    * The X coordinate of the touch point relative to the screen, not including any scroll offset. <strong>Read only.</strong>
+    */
+  int getScreenX();
+
+
+  /**
+    * The Y coordinate of the touch point relative to the screen, not including any scroll offset. <strong>Read only.</strong>
+    */
+  int getScreenY();
+
+  EventTarget getTarget();
+
+  float getWebkitForce();
+
+  int getWebkitRadiusX();
+
+  int getWebkitRadiusY();
+
+  float getWebkitRotationAngle();
+}
diff --git a/elemental/src/elemental/events/TouchEvent.java b/elemental/src/elemental/events/TouchEvent.java
new file mode 100644
index 0000000..df60175
--- /dev/null
+++ b/elemental/src/elemental/events/TouchEvent.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.html.Window;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>A <code>TouchEvent</code> represents an event sent when the state of contacts with a touch-sensitive surface changes. This surface can be a touch screen or trackpad, for example. The event can describe one or more points of contact with the screen and includes support for detecting movement, addition and removal of contact points, and so forth.</p>
+<p>Touches are represented by the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Touch">Touch</a></code>
+&nbsp;object; each touch is described by a position, size and shape, amount of pressure, and target element. Lists of touches are represented by <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TouchList">TouchList</a></code>
+ objects.</p>
+  */
+public interface TouchEvent extends UIEvent {
+
+
+  /**
+    * A Boolean value indicating whether or not the alt key was down when the touch event was fired. <strong>Read only.</strong>
+    */
+  boolean isAltKey();
+
+
+  /**
+    * A <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TouchList">TouchList</a></code>
+ of all the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Touch">Touch</a></code>
+ objects representing individual points of contact whose states changed between the previous touch event and this one. <strong>Read only.</strong>
+    */
+  TouchList getChangedTouches();
+
+
+  /**
+    * A Boolean value indicating whether or not the control key was down when the touch event was fired. <strong>Read only.</strong>
+    */
+  boolean isCtrlKey();
+
+
+  /**
+    * A Boolean value indicating whether or not the meta key was down when the touch event was fired. <strong>Read only.</strong>
+    */
+  boolean isMetaKey();
+
+
+  /**
+    * A Boolean value indicating whether or not the shift key was down when the touch event was fired. <strong>Read only.</strong>
+    */
+  boolean isShiftKey();
+
+
+  /**
+    * A <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TouchList">TouchList</a></code>
+ of all the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Touch">Touch</a></code>
+&nbsp;objects that are both currently in contact with the touch surface <strong>and</strong> were also started on the same element that is the target of the event. <strong>Read only.</strong>
+    */
+  TouchList getTargetTouches();
+
+
+  /**
+    * A <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TouchList">TouchList</a></code>
+ of all the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Touch">Touch</a></code>
+&nbsp;objects representing all current points of contact with the surface, regardless of target or changed status. <strong>Read only.</strong>
+    */
+  TouchList getTouches();
+
+  void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey);
+}
diff --git a/elemental/src/elemental/events/TouchList.java b/elemental/src/elemental/events/TouchList.java
new file mode 100644
index 0000000..d64b94f
--- /dev/null
+++ b/elemental/src/elemental/events/TouchList.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * A <code>TouchList</code> represents a list of all of the points of contact with a touch surface; for example, if the user has three fingers on the screen (or trackpad), the corresponding <code>TouchList</code> would have one <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Touch">Touch</a></code>
+ object for each finger, for a total of three entries.
+  */
+public interface TouchList extends Indexable {
+
+
+  /**
+    * The number of <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Touch">Touch</a></code>
+&nbsp;objects in the <code>TouchList</code>. <strong>Read only.</strong>
+    */
+  int getLength();
+
+
+  /**
+    * Returns the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Touch">Touch</a></code>
+ object at the specified index in the list. You can also simply reference the <code>TouchList</code> using array syntax (<code>touchList[x]</code>).
+    */
+  Touch item(int index);
+}
diff --git a/elemental/src/elemental/events/TransitionEvent.java b/elemental/src/elemental/events/TransitionEvent.java
new file mode 100644
index 0000000..8f74466
--- /dev/null
+++ b/elemental/src/elemental/events/TransitionEvent.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface TransitionEvent extends Event {
+
+  double getElapsedTime();
+
+  String getPropertyName();
+}
diff --git a/elemental/src/elemental/events/UIEvent.java b/elemental/src/elemental/events/UIEvent.java
new file mode 100644
index 0000000..22bbd07
--- /dev/null
+++ b/elemental/src/elemental/events/UIEvent.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.html.Window;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><div>
+
+<a rel="custom" href="http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/events/nsIDOMUIEvent.idl"><code>dom/interfaces/events/nsIDOMUIEvent.idl</code></a><span><a rel="internal" href="https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces" title="en/Interfaces/About_Scriptable_Interfaces">Scriptable</a></span></div><span>A basic event interface for all user interface events</span><div><div>1.0</div><div>11.0</div><div title="Introduced in Gecko 1.0 
+"></div><div title="Last changed in Gecko 9.0 
+"></div></div>
+<div>Inherits from: <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMEvent">nsIDOMEvent</a></code>
+<span>Last changed in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+</span></div></div>
+<p></p>
+<p>The DOM <code>UIEvent</code> represents simple user interface events.</p>
+  */
+public interface UIEvent extends Event {
+
+  int getCharCode();
+
+
+  /**
+    * Detail about the event, depending on the type of event. <strong>Read only.</strong>
+    */
+  int getDetail();
+
+  int getKeyCode();
+
+  int getLayerX();
+
+  int getLayerY();
+
+  int getPageX();
+
+  int getPageY();
+
+
+  /**
+    * A view which generated the event. <strong>Read only.</strong>
+    */
+  Window getView();
+
+  int getWhich();
+
+
+  /**
+    * <p>Initializes the UIEvent object.</p>
+
+<div id="section_5"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>typeArg</code></dt> <dd>The type of UI event.</dd> <dt><code>canBubbleArg</code></dt> <dd>Whether or not the event can bubble.</dd> <dt><code>cancelableArg</code></dt> <dd>Whether or not the event can be canceled.</dd> <dt><code>viewArg</code></dt> <dd>Specifies the <code>view</code> attribute value. This may be <code>null</code>.</dd> <dt><code>detailArg</code></dt> <dd>Specifies the detail attribute value.</dd>
+</dl>
+</div>
+    */
+  void initUIEvent(String type, boolean canBubble, boolean cancelable, Window view, int detail);
+}
diff --git a/elemental/src/elemental/events/WebKitAnimationEvent.java b/elemental/src/elemental/events/WebKitAnimationEvent.java
new file mode 100644
index 0000000..a826c14
--- /dev/null
+++ b/elemental/src/elemental/events/WebKitAnimationEvent.java
@@ -0,0 +1,22 @@
+
+package elemental.events;
+
+import elemental.events.*;
+
+/**
+  * <code>AnimationEvent</code> objects provide information about events that occur related to <a rel="internal" href="https://developer.mozilla.org/en/CSS/CSS_animations" title="en/CSS/CSS_animations">CSS animations</a>.
+  */
+public interface WebKitAnimationEvent extends Event {
+
+
+  /**
+    * The name of the animation on which the animation event occurred.
+    */
+  String getAnimationName();
+
+
+  /**
+    * The amount of time, in seconds, the animation had been running at the time the event occurred.
+    */
+  double getElapsedTime();
+}
diff --git a/elemental/src/elemental/events/WebKitTransitionEvent.java b/elemental/src/elemental/events/WebKitTransitionEvent.java
new file mode 100644
index 0000000..b997966
--- /dev/null
+++ b/elemental/src/elemental/events/WebKitTransitionEvent.java
@@ -0,0 +1,14 @@
+
+package elemental.events;
+
+import elemental.events.*;
+
+/**
+  * 
+  */
+public interface WebKitTransitionEvent extends Event {
+
+  double getElapsedTime();
+
+  String getPropertyName();
+}
diff --git a/elemental/src/elemental/events/WheelEvent.java b/elemental/src/elemental/events/WheelEvent.java
new file mode 100644
index 0000000..473c9a1
--- /dev/null
+++ b/elemental/src/elemental/events/WheelEvent.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+import elemental.html.Window;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WheelEvent extends UIEvent {
+
+  boolean isAltKey();
+
+  int getClientX();
+
+  int getClientY();
+
+  boolean isCtrlKey();
+
+  boolean isMetaKey();
+
+  int getOffsetX();
+
+  int getOffsetY();
+
+  int getScreenX();
+
+  int getScreenY();
+
+  boolean isShiftKey();
+
+  boolean isWebkitDirectionInvertedFromDevice();
+
+  int getWheelDelta();
+
+  int getWheelDeltaX();
+
+  int getWheelDeltaY();
+
+  int getX();
+
+  int getY();
+
+  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey);
+}
diff --git a/elemental/src/elemental/events/XMLHttpRequestProgressEvent.java b/elemental/src/elemental/events/XMLHttpRequestProgressEvent.java
new file mode 100644
index 0000000..7ea964c
--- /dev/null
+++ b/elemental/src/elemental/events/XMLHttpRequestProgressEvent.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface XMLHttpRequestProgressEvent extends ProgressEvent {
+
+  double getPosition();
+
+  double getTotalSize();
+}
diff --git a/elemental/src/elemental/html/AbstractWorker.java b/elemental/src/elemental/html/AbstractWorker.java
new file mode 100644
index 0000000..250a551
--- /dev/null
+++ b/elemental/src/elemental/html/AbstractWorker.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AbstractWorker extends EventTarget {
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/AnchorElement.java b/elemental/src/elemental/html/AnchorElement.java
new file mode 100644
index 0000000..4a90129
--- /dev/null
+++ b/elemental/src/elemental/html/AnchorElement.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM anchor elements expose the <a target="_blank" href="http://www.w3.org/TR/html5/text-level-semantics.html#htmlanchorelement" rel="external nofollow" class=" external" title="http://www.w3.org/TR/html5/text-level-semantics.html#htmlanchorelement">HTMLAnchorElement</a> (or <span><a href="https://developer.mozilla.org/en/HTML" rel="custom nofollow">HTML 4</a></span> <a target="_blank" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-48250443" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-48250443" rel="external nofollow" class=" external"><code>HTMLAnchorElement</code></a>) interface, which provides special properties and methods (beyond the regular <a href="https://developer.mozilla.org/en/DOM/element" rel="internal">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of hyperlink elements.
+  */
+public interface AnchorElement extends Element {
+
+
+  /**
+    * The character encoding of the linked resource. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>
+    */
+  String getCharset();
+
+  void setCharset(String arg);
+
+
+  /**
+    * Comma-separated list of coordinates. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>
+    */
+  String getCoords();
+
+  void setCoords(String arg);
+
+  String getDownload();
+
+  void setDownload(String arg);
+
+
+  /**
+    * The fragment identifier (including the leading hash mark (#)), if any, in the referenced URL.
+    */
+  String getHash();
+
+  void setHash(String arg);
+
+
+  /**
+    * The hostname and port (if it's not the default port) in the referenced URL.
+    */
+  String getHost();
+
+  void setHost(String arg);
+
+
+  /**
+    * The hostname in the referenced URL.
+    */
+  String getHostname();
+
+  void setHostname(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/a#attr-href">href</a></code>
+ HTML attribute, containing a valid URL of a linked resource.
+    */
+  String getHref();
+
+  void setHref(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/a#attr-hreflang">hreflang</a></code>
+ HTML&nbsp;attribute, indicating the language of the linked resource.
+    */
+  String getHreflang();
+
+  void setHreflang(String arg);
+
+
+  /**
+    * Anchor name. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>
+    */
+  String getName();
+
+  void setName(String arg);
+
+  String getOrigin();
+
+
+  /**
+    * The path name component, if any, of the referenced URL.
+    */
+  String getPathname();
+
+  void setPathname(String arg);
+
+  String getPing();
+
+  void setPing(String arg);
+
+
+  /**
+    * The port component, if any, of the referenced URL.
+    */
+  String getPort();
+
+  void setPort(String arg);
+
+
+  /**
+    * The protocol component (including trailing colon (:)), of the referenced URL.
+    */
+  String getProtocol();
+
+  void setProtocol(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/a#attr-rel">rel</a></code>
+ HTML attribute, specifying the relationship of the target object to the link object.
+    */
+  String getRel();
+
+  void setRel(String arg);
+
+
+  /**
+    * Reverse link type. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>
+    */
+  String getRev();
+
+  void setRev(String arg);
+
+
+  /**
+    * The search element (including leading question mark (?)), if any, of the referenced URL
+    */
+  String getSearch();
+
+  void setSearch(String arg);
+
+
+  /**
+    * The shape of the active area. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>
+    */
+  String getShape();
+
+  void setShape(String arg);
+
+
+  /**
+    * Reflectst the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/a#attr-target">target</a></code>
+ HTML attribute, indicating where to display the linked resource.
+    */
+  String getTarget();
+
+  void setTarget(String arg);
+
+
+  /**
+    * Same as the <strong><a title="https://developer.mozilla.org/En/DOM/Node.textContent" rel="internal" href="https://developer.mozilla.org/En/DOM/Node.textContent">textContent</a></strong> property.
+    */
+  String getText();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/a#attr-type">type</a></code>
+ HTML attribute, indicating the MIME type of the linked resource.
+    */
+  String getType();
+
+  void setType(String arg);
+}
diff --git a/elemental/src/elemental/html/Animation.java b/elemental/src/elemental/html/Animation.java
new file mode 100644
index 0000000..ca0c45c
--- /dev/null
+++ b/elemental/src/elemental/html/Animation.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface Animation {
+
+    static final int DIRECTION_ALTERNATE = 1;
+
+    static final int DIRECTION_NORMAL = 0;
+
+    static final int FILL_BACKWARDS = 1;
+
+    static final int FILL_BOTH = 3;
+
+    static final int FILL_FORWARDS = 2;
+
+    static final int FILL_NONE = 0;
+
+  double getDelay();
+
+  int getDirection();
+
+  double getDuration();
+
+  double getElapsedTime();
+
+  void setElapsedTime(double arg);
+
+  boolean isEnded();
+
+  int getFillMode();
+
+  int getIterationCount();
+
+  String getName();
+
+  boolean isPaused();
+
+  void pause();
+
+  void play();
+}
diff --git a/elemental/src/elemental/html/AnimationList.java b/elemental/src/elemental/html/AnimationList.java
new file mode 100644
index 0000000..b747376
--- /dev/null
+++ b/elemental/src/elemental/html/AnimationList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AnimationList {
+
+  int getLength();
+
+  Animation item(int index);
+}
diff --git a/elemental/src/elemental/html/AppletElement.java b/elemental/src/elemental/html/AppletElement.java
new file mode 100644
index 0000000..c315012
--- /dev/null
+++ b/elemental/src/elemental/html/AppletElement.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Obsolete
+  */
+public interface AppletElement extends Element {
+
+
+  /**
+    * This attribute is used to position the applet on the page relative to content that might flow around it. The HTML 4.01 specification defines values of bottom, left, middle, right, and top, whereas Microsoft and Netscape also might support <strong>absbottom</strong>, <strong>absmiddle</strong>, <strong>baseline</strong>, <strong>center</strong>, and <strong>texttop</strong>.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * This attribute causes a descriptive text alternate to be displayed on browsers that do not support Java. Page designers should also remember that content enclosed within the <code>&lt;applet&gt;</code> element may also be rendered as alternative text.
+    */
+  String getAlt();
+
+  void setAlt(String arg);
+
+
+  /**
+    * This attribute refers to an archived or compressed version of the applet and its associated class files, which might help reduce download time.
+    */
+  String getArchive();
+
+  void setArchive(String arg);
+
+
+  /**
+    * This attribute specifies the URL of the applet's class file to be loaded and executed. Applet filenames are identified by a .class filename extension. The URL specified by code might be relative to the <code>codebase</code> attribute.
+    */
+  String getCode();
+
+  void setCode(String arg);
+
+  String getCodeBase();
+
+  void setCodeBase(String arg);
+
+
+  /**
+    * This attribute specifies the height, in pixels, that the applet needs.
+    */
+  String getHeight();
+
+  void setHeight(String arg);
+
+
+  /**
+    * This attribute specifies additional horizontal space, in pixels, to be reserved on either side of the applet.
+    */
+  String getHspace();
+
+  void setHspace(String arg);
+
+
+  /**
+    * This attribute assigns a name to the applet so that it can be identified by other resources; particularly scripts.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * This attribute specifies the URL of a serialized representation of an applet.
+    */
+  String getObject();
+
+  void setObject(String arg);
+
+
+  /**
+    * This attribute specifies additional vertical space, in pixels, to be reserved above and below the applet.
+    */
+  String getVspace();
+
+  void setVspace(String arg);
+
+
+  /**
+    * This attribute specifies in pixels the width that the applet needs.
+    */
+  String getWidth();
+
+  void setWidth(String arg);
+}
diff --git a/elemental/src/elemental/html/ApplicationCache.java b/elemental/src/elemental/html/ApplicationCache.java
new file mode 100644
index 0000000..32435c9
--- /dev/null
+++ b/elemental/src/elemental/html/ApplicationCache.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ApplicationCache extends EventTarget {
+
+    static final int CHECKING = 2;
+
+    static final int DOWNLOADING = 3;
+
+    static final int IDLE = 1;
+
+    static final int OBSOLETE = 5;
+
+    static final int UNCACHED = 0;
+
+    static final int UPDATEREADY = 4;
+
+  EventListener getOncached();
+
+  void setOncached(EventListener arg);
+
+  EventListener getOnchecking();
+
+  void setOnchecking(EventListener arg);
+
+  EventListener getOndownloading();
+
+  void setOndownloading(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnnoupdate();
+
+  void setOnnoupdate(EventListener arg);
+
+  EventListener getOnobsolete();
+
+  void setOnobsolete(EventListener arg);
+
+  EventListener getOnprogress();
+
+  void setOnprogress(EventListener arg);
+
+  EventListener getOnupdateready();
+
+  void setOnupdateready(EventListener arg);
+
+  int getStatus();
+
+  void abort();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  void swapCache();
+
+  void update();
+}
diff --git a/elemental/src/elemental/html/AreaElement.java b/elemental/src/elemental/html/AreaElement.java
new file mode 100644
index 0000000..c328697
--- /dev/null
+++ b/elemental/src/elemental/html/AreaElement.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM area objects expose the <a class=" external" title="http://www.w3.org/TR/html5/the-map-element.html#htmlareaelement" rel="external" href="http://www.w3.org/TR/html5/the-map-element.html#htmlareaelement" target="_blank">HTMLAreaElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26019118" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26019118" target="_blank"><code>HTMLAreaElement</code></a>) interface, which provides special properties and methods (beyond the regular <a href="https://developer.mozilla.org/en/DOM/element" rel="internal">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of area elements.
+  */
+public interface AreaElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/area#attr-alt">alt</a></code>
+ HTML attribute, containing alternative text for the element.
+    */
+  String getAlt();
+
+  void setAlt(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/area#attr-coords">coords</a></code>
+ HTML attribute, containing coordinates to define the hot-spot region.
+    */
+  String getCoords();
+
+  void setCoords(String arg);
+
+
+  /**
+    * The fragment identifier (including the leading hash mark (#)), if any, in the referenced URL.
+    */
+  String getHash();
+
+
+  /**
+    * The hostname and port (if it's not the default port) in the referenced URL.
+    */
+  String getHost();
+
+
+  /**
+    * The hostname in the referenced URL.
+    */
+  String getHostname();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/area#attr-href">href</a></code>
+ HTML attribute, containing a valid URL&nbsp;of a linked resource.
+    */
+  String getHref();
+
+  void setHref(String arg);
+
+
+  /**
+    * Indicates that this area is inactive. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>
+    */
+  boolean isNoHref();
+
+  void setNoHref(boolean arg);
+
+
+  /**
+    * The path name component, if any, of the referenced URL.
+    */
+  String getPathname();
+
+  String getPing();
+
+  void setPing(String arg);
+
+
+  /**
+    * The port component, if any, of the referenced URL.
+    */
+  String getPort();
+
+
+  /**
+    * The protocol component (including trailing colon (:)), of the referenced URL.
+    */
+  String getProtocol();
+
+
+  /**
+    * The search element (including leading question mark (?)), if any, of the referenced URL
+    */
+  String getSearch();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/area#attr-shape">shape</a></code>
+ HTML&nbsp;attribute, indicating the shape of the hot-spot, limited to known values.
+    */
+  String getShape();
+
+  void setShape(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/area#attr-target">target</a></code>
+ HTML&nbsp;attribute, indicating the browsing context in which to open the linked resource.
+    */
+  String getTarget();
+
+  void setTarget(String arg);
+}
diff --git a/elemental/src/elemental/html/ArrayBuffer.java b/elemental/src/elemental/html/ArrayBuffer.java
new file mode 100644
index 0000000..b5dab92
--- /dev/null
+++ b/elemental/src/elemental/html/ArrayBuffer.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>ArrayBuffer</code> is a data type that is used to represent a generic, fixed-length binary data buffer. You can't directly manipulate the contents of an <code>ArrayBuffer</code>; instead, you create an <a title="en/JavaScript typed arrays/ArrayBufferView" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView"><code>ArrayBufferView</code></a> object which represents the buffer in a specific format, and use that to read and write the contents of the buffer.
+  */
+public interface ArrayBuffer {
+
+
+  /**
+    * The size, in bytes, of the array. This is established when the array is constructed and cannot be changed. <strong>Read only.</strong>
+    */
+  int getByteLength();
+
+  ArrayBuffer slice(int begin);
+
+  ArrayBuffer slice(int begin, int end);
+}
diff --git a/elemental/src/elemental/html/ArrayBufferView.java b/elemental/src/elemental/html/ArrayBufferView.java
new file mode 100644
index 0000000..03ba25a
--- /dev/null
+++ b/elemental/src/elemental/html/ArrayBufferView.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>ArrayBufferView</code> type describes a particular view on the contents of an <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a>'s data.</p>
+<p>Of note is that you may create multiple views into the same buffer, each looking at the buffer's contents starting at a particular offset. This makes it possible to set up views of different data types to read the contents of a buffer based on the types of data at specific offsets into the buffer.</p>
+<div class="note"><strong>Note:</strong> Typically, you'll instantiate one of the <a title="en/JavaScript typed arrays/ArrayBufferView#Typed array subclasses" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView#Typed_array_subclasses">subclasses</a> of this object instead of this base class. Those provide access to the data formatted using specific data types.</div>
+  */
+public interface ArrayBufferView {
+
+
+  /**
+    * The buffer this view references. <strong>Read only.</strong>
+    */
+  ArrayBuffer getBuffer();
+
+
+  /**
+    * The length, in bytes, of the view. <strong>Read only.</strong>
+    */
+  int getByteLength();
+
+
+  /**
+    * The offset, in bytes, to the first byte of the view within the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a>.
+    */
+  int getByteOffset();
+}
diff --git a/elemental/src/elemental/html/AudioBuffer.java b/elemental/src/elemental/html/AudioBuffer.java
new file mode 100644
index 0000000..fa86c70
--- /dev/null
+++ b/elemental/src/elemental/html/AudioBuffer.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioBuffer {
+
+  float getDuration();
+
+  float getGain();
+
+  void setGain(float arg);
+
+  int getLength();
+
+  int getNumberOfChannels();
+
+  float getSampleRate();
+
+  Float32Array getChannelData(int channelIndex);
+}
diff --git a/elemental/src/elemental/html/AudioBufferCallback.java b/elemental/src/elemental/html/AudioBufferCallback.java
new file mode 100644
index 0000000..199a496
--- /dev/null
+++ b/elemental/src/elemental/html/AudioBufferCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface AudioBufferCallback {
+  boolean onAudioBufferCallback(AudioBuffer audioBuffer);
+}
diff --git a/elemental/src/elemental/html/AudioBufferSourceNode.java b/elemental/src/elemental/html/AudioBufferSourceNode.java
new file mode 100644
index 0000000..9c1eb2c
--- /dev/null
+++ b/elemental/src/elemental/html/AudioBufferSourceNode.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioBufferSourceNode extends AudioSourceNode {
+
+    static final int FINISHED_STATE = 3;
+
+    static final int PLAYING_STATE = 2;
+
+    static final int SCHEDULED_STATE = 1;
+
+    static final int UNSCHEDULED_STATE = 0;
+
+  AudioBuffer getBuffer();
+
+  void setBuffer(AudioBuffer arg);
+
+  AudioGain getGain();
+
+  boolean isLoop();
+
+  void setLoop(boolean arg);
+
+  boolean isLooping();
+
+  void setLooping(boolean arg);
+
+  AudioParam getPlaybackRate();
+
+  int getPlaybackState();
+
+  void noteGrainOn(double when, double grainOffset, double grainDuration);
+
+  void noteOff(double when);
+
+  void noteOn(double when);
+}
diff --git a/elemental/src/elemental/html/AudioChannelMerger.java b/elemental/src/elemental/html/AudioChannelMerger.java
new file mode 100644
index 0000000..8456734
--- /dev/null
+++ b/elemental/src/elemental/html/AudioChannelMerger.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioChannelMerger extends AudioNode {
+}
diff --git a/elemental/src/elemental/html/AudioChannelSplitter.java b/elemental/src/elemental/html/AudioChannelSplitter.java
new file mode 100644
index 0000000..445e06e
--- /dev/null
+++ b/elemental/src/elemental/html/AudioChannelSplitter.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioChannelSplitter extends AudioNode {
+}
diff --git a/elemental/src/elemental/html/AudioContext.java b/elemental/src/elemental/html/AudioContext.java
new file mode 100644
index 0000000..bb10214
--- /dev/null
+++ b/elemental/src/elemental/html/AudioContext.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioContext extends EventTarget {
+
+  int getActiveSourceCount();
+
+  float getCurrentTime();
+
+  AudioDestinationNode getDestination();
+
+  AudioListener getListener();
+
+  EventListener getOncomplete();
+
+  void setOncomplete(EventListener arg);
+
+  float getSampleRate();
+
+  RealtimeAnalyserNode createAnalyser();
+
+  BiquadFilterNode createBiquadFilter();
+
+  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, float sampleRate);
+
+  AudioBuffer createBuffer(ArrayBuffer buffer, boolean mixToMono);
+
+  AudioBufferSourceNode createBufferSource();
+
+  AudioChannelMerger createChannelMerger();
+
+  AudioChannelMerger createChannelMerger(int numberOfInputs);
+
+  AudioChannelSplitter createChannelSplitter();
+
+  AudioChannelSplitter createChannelSplitter(int numberOfOutputs);
+
+  ConvolverNode createConvolver();
+
+  DelayNode createDelayNode();
+
+  DelayNode createDelayNode(double maxDelayTime);
+
+  DynamicsCompressorNode createDynamicsCompressor();
+
+  AudioGainNode createGainNode();
+
+  JavaScriptAudioNode createJavaScriptNode(int bufferSize);
+
+  JavaScriptAudioNode createJavaScriptNode(int bufferSize, int numberOfInputChannels);
+
+  JavaScriptAudioNode createJavaScriptNode(int bufferSize, int numberOfInputChannels, int numberOfOutputChannels);
+
+  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement);
+
+  Oscillator createOscillator();
+
+  AudioPannerNode createPanner();
+
+  WaveShaperNode createWaveShaper();
+
+  WaveTable createWaveTable(Float32Array real, Float32Array imag);
+
+  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback);
+
+  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, AudioBufferCallback errorCallback);
+
+  void startRendering();
+}
diff --git a/elemental/src/elemental/html/AudioDestinationNode.java b/elemental/src/elemental/html/AudioDestinationNode.java
new file mode 100644
index 0000000..dbe2493
--- /dev/null
+++ b/elemental/src/elemental/html/AudioDestinationNode.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioDestinationNode extends AudioNode {
+
+  int getNumberOfChannels();
+}
diff --git a/elemental/src/elemental/html/AudioElement.java b/elemental/src/elemental/html/AudioElement.java
new file mode 100644
index 0000000..599d86a
--- /dev/null
+++ b/elemental/src/elemental/html/AudioElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>HTMLAudioElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/audio">&lt;audio&gt;</a></code>
+&nbsp;elements, as well as methods to manipulate them. It's derived from the <a title="en/DOM/HTMLMediaElement" rel="internal" href="https://developer.mozilla.org/en/DOM/HTMLMediaElement" class=" new"><code>HTMLMediaElement</code></a> interface; it's implemented by <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMHTMLMediaElement">nsIDOMHTMLMediaElement</a></code>
+.</p>
+<p>For details on how to use the audio streaming features exposed by this interface, please see <a title="en/Introducing the Audio API Extension" rel="internal" href="https://developer.mozilla.org/en/Introducing_the_Audio_API_Extension">Introducing the Audio API Extension</a>.</p>
+  */
+public interface AudioElement extends MediaElement {
+}
diff --git a/elemental/src/elemental/html/AudioGain.java b/elemental/src/elemental/html/AudioGain.java
new file mode 100644
index 0000000..d772957
--- /dev/null
+++ b/elemental/src/elemental/html/AudioGain.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioGain extends AudioParam {
+}
diff --git a/elemental/src/elemental/html/AudioGainNode.java b/elemental/src/elemental/html/AudioGainNode.java
new file mode 100644
index 0000000..1192424
--- /dev/null
+++ b/elemental/src/elemental/html/AudioGainNode.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioGainNode extends AudioNode {
+
+  AudioGain getGain();
+}
diff --git a/elemental/src/elemental/html/AudioListener.java b/elemental/src/elemental/html/AudioListener.java
new file mode 100644
index 0000000..e295cbf
--- /dev/null
+++ b/elemental/src/elemental/html/AudioListener.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioListener {
+
+  float getDopplerFactor();
+
+  void setDopplerFactor(float arg);
+
+  float getSpeedOfSound();
+
+  void setSpeedOfSound(float arg);
+
+  void setOrientation(float x, float y, float z, float xUp, float yUp, float zUp);
+
+  void setPosition(float x, float y, float z);
+
+  void setVelocity(float x, float y, float z);
+}
diff --git a/elemental/src/elemental/html/AudioNode.java b/elemental/src/elemental/html/AudioNode.java
new file mode 100644
index 0000000..ccdba76
--- /dev/null
+++ b/elemental/src/elemental/html/AudioNode.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioNode {
+
+  AudioContext getContext();
+
+  int getNumberOfInputs();
+
+  int getNumberOfOutputs();
+
+  void connect(AudioNode destination, int output, int input);
+
+  void connect(AudioParam destination, int output);
+
+  void disconnect(int output);
+}
diff --git a/elemental/src/elemental/html/AudioPannerNode.java b/elemental/src/elemental/html/AudioPannerNode.java
new file mode 100644
index 0000000..5d9aa14
--- /dev/null
+++ b/elemental/src/elemental/html/AudioPannerNode.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioPannerNode extends AudioNode {
+
+    static final int EQUALPOWER = 0;
+
+    static final int EXPONENTIAL_DISTANCE = 2;
+
+    static final int HRTF = 1;
+
+    static final int INVERSE_DISTANCE = 1;
+
+    static final int LINEAR_DISTANCE = 0;
+
+    static final int SOUNDFIELD = 2;
+
+  AudioGain getConeGain();
+
+  float getConeInnerAngle();
+
+  void setConeInnerAngle(float arg);
+
+  float getConeOuterAngle();
+
+  void setConeOuterAngle(float arg);
+
+  float getConeOuterGain();
+
+  void setConeOuterGain(float arg);
+
+  AudioGain getDistanceGain();
+
+  int getDistanceModel();
+
+  void setDistanceModel(int arg);
+
+  float getMaxDistance();
+
+  void setMaxDistance(float arg);
+
+  int getPanningModel();
+
+  void setPanningModel(int arg);
+
+  float getRefDistance();
+
+  void setRefDistance(float arg);
+
+  float getRolloffFactor();
+
+  void setRolloffFactor(float arg);
+
+  void setOrientation(float x, float y, float z);
+
+  void setPosition(float x, float y, float z);
+
+  void setVelocity(float x, float y, float z);
+}
diff --git a/elemental/src/elemental/html/AudioParam.java b/elemental/src/elemental/html/AudioParam.java
new file mode 100644
index 0000000..8a5da74
--- /dev/null
+++ b/elemental/src/elemental/html/AudioParam.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioParam {
+
+  float getDefaultValue();
+
+  float getMaxValue();
+
+  float getMinValue();
+
+  String getName();
+
+  int getUnits();
+
+  float getValue();
+
+  void setValue(float arg);
+
+  void cancelScheduledValues(float startTime);
+
+  void exponentialRampToValueAtTime(float value, float time);
+
+  void linearRampToValueAtTime(float value, float time);
+
+  void setTargetValueAtTime(float targetValue, float time, float timeConstant);
+
+  void setValueAtTime(float value, float time);
+
+  void setValueCurveAtTime(Float32Array values, float time, float duration);
+}
diff --git a/elemental/src/elemental/html/AudioProcessingEvent.java b/elemental/src/elemental/html/AudioProcessingEvent.java
new file mode 100644
index 0000000..d5164e4
--- /dev/null
+++ b/elemental/src/elemental/html/AudioProcessingEvent.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioProcessingEvent extends Event {
+
+  AudioBuffer getInputBuffer();
+
+  AudioBuffer getOutputBuffer();
+}
diff --git a/elemental/src/elemental/html/AudioSourceNode.java b/elemental/src/elemental/html/AudioSourceNode.java
new file mode 100644
index 0000000..c11e8cf
--- /dev/null
+++ b/elemental/src/elemental/html/AudioSourceNode.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface AudioSourceNode extends AudioNode {
+}
diff --git a/elemental/src/elemental/html/BRElement.java b/elemental/src/elemental/html/BRElement.java
new file mode 100644
index 0000000..9f495fe
--- /dev/null
+++ b/elemental/src/elemental/html/BRElement.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM break elements expose the <a class="external" href="http://www.w3.org/TR/html5/text-level-semantics.html#the-br-element" rel="external nofollow" target="_blank" title="http://www.w3.org/TR/html5/text-level-semantics.html#the-br-element">HTMLBRElement</a> (or <span><a href="https://developer.mozilla.org/en/HTML" rel="custom nofollow">HTML 4</a></span> <a class="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-56836063" rel="external nofollow" target="_blank" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-56836063"><code>HTMLBRElement</code></a>) interface which inherits from HTMLElement, but defines no additional members in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>. The introduced additional property is also deprecated in 
+<span>HTML 4.01</span>.
+  */
+public interface BRElement extends Element {
+
+
+  /**
+    * Indicates flow of text around floating objects.
+    */
+  String getClear();
+
+  void setClear(String arg);
+}
diff --git a/elemental/src/elemental/html/BarProp.java b/elemental/src/elemental/html/BarProp.java
new file mode 100644
index 0000000..04d0dd6
--- /dev/null
+++ b/elemental/src/elemental/html/BarProp.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface BarProp {
+
+  boolean isVisible();
+}
diff --git a/elemental/src/elemental/html/BaseElement.java b/elemental/src/elemental/html/BaseElement.java
new file mode 100644
index 0000000..d2c9083
--- /dev/null
+++ b/elemental/src/elemental/html/BaseElement.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>base</code> object exposes the <a class=" external" title="http://www.w3.org/TR/html5/semantics.html#htmlbaseelement" rel="external" href="http://www.w3.org/TR/html5/semantics.html#htmlbaseelement" target="_blank">HTMLBaseElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class="external" target="_blank" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-73629039" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-73629039">HTMLBaseElement</a>) interface which contains the base URI&nbsp;for a document.&nbsp; This object inherits all of the properties and methods as described in the <a class="internal" title="en/DOM/element" rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> section.
+  */
+public interface BaseElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/base#attr-href">href</a></code>
+ HTML attribute, containing a base URL for relative URLs in the document.
+    */
+  String getHref();
+
+  void setHref(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/base#attr-target">target</a></code>
+ HTML attribute, containing a default target browsing context or frame for elements that do not have a target reference specified.
+    */
+  String getTarget();
+
+  void setTarget(String arg);
+}
diff --git a/elemental/src/elemental/html/BaseFontElement.java b/elemental/src/elemental/html/BaseFontElement.java
new file mode 100644
index 0000000..05ce96d
--- /dev/null
+++ b/elemental/src/elemental/html/BaseFontElement.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Obsolete
+  */
+public interface BaseFontElement extends Element {
+
+
+  /**
+    * This attribute sets the text color using either a named color or a color specified in the hexadecimal #RRGGBB format.
+    */
+  String getColor();
+
+  void setColor(String arg);
+
+
+  /**
+    * This attribute contains a list of one or more font names. The document text in the default style is rendered in the first font face that the client's browser supports. If no font listed is installed on the local system, the browser typically defaults to the proportional or fixed-width font for that system.
+    */
+  String getFace();
+
+  void setFace(String arg);
+
+
+  /**
+    * This attribute specifies the font size as either a numeric or relative value. Numeric values range from 1 to 7 with 1 being the smallest and 3 the default.
+    */
+  int getSize();
+
+  void setSize(int arg);
+}
diff --git a/elemental/src/elemental/html/BatteryManager.java b/elemental/src/elemental/html/BatteryManager.java
new file mode 100644
index 0000000..342e9df
--- /dev/null
+++ b/elemental/src/elemental/html/BatteryManager.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface BatteryManager extends EventTarget {
+
+  boolean isCharging();
+
+  double getChargingTime();
+
+  double getDischargingTime();
+
+  double getLevel();
+
+  EventListener getOnchargingchange();
+
+  void setOnchargingchange(EventListener arg);
+
+  EventListener getOnchargingtimechange();
+
+  void setOnchargingtimechange(EventListener arg);
+
+  EventListener getOndischargingtimechange();
+
+  void setOndischargingtimechange(EventListener arg);
+
+  EventListener getOnlevelchange();
+
+  void setOnlevelchange(EventListener arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/BiquadFilterNode.java b/elemental/src/elemental/html/BiquadFilterNode.java
new file mode 100644
index 0000000..614c594
--- /dev/null
+++ b/elemental/src/elemental/html/BiquadFilterNode.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface BiquadFilterNode extends AudioNode {
+
+    static final int ALLPASS = 7;
+
+    static final int BANDPASS = 2;
+
+    static final int HIGHPASS = 1;
+
+    static final int HIGHSHELF = 4;
+
+    static final int LOWPASS = 0;
+
+    static final int LOWSHELF = 3;
+
+    static final int NOTCH = 6;
+
+    static final int PEAKING = 5;
+
+  AudioParam getQ();
+
+  AudioParam getFrequency();
+
+  AudioParam getGain();
+
+  int getType();
+
+  void setType(int arg);
+
+  void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
+}
diff --git a/elemental/src/elemental/html/Blob.java b/elemental/src/elemental/html/Blob.java
new file mode 100644
index 0000000..5751c0e
--- /dev/null
+++ b/elemental/src/elemental/html/Blob.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><p><strong>This is an experimental feature</strong><br>Because this feature is still in development in some browsers, check the <a href="#AutoCompatibilityTable">compatibility table</a> for the proper prefixes to use in various browsers.</p></div>
+<p></p>
+<p>A <code>Blob</code> object represents a file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ interface is based on <code>Blob</code>, inheriting blob functionality and expanding it to support files on the user's system.</p>
+<p>An easy way to construct a <code>Blob</code> is by using the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/BlobBuilder">BlobBuilder</a></code>
+ interface, which lets you iteratively append data to a blob, then retrieve the completed blob when you're ready to use it for something. Another way is to use the <code>slice()</code> method to create a blob that contains a subset of another blob's data.</p>
+<div class="note"><strong>Note:</strong> The <code>slice()</code> method has vendor prefixes: <code>blob.mozSlice()</code> for Firefox and <code>blob.webkitSlice()</code> for Chrome. An old version of the <code>slice()</code> method, without vendor prefixes, had different semantics, as described below.</div>
+  */
+public interface Blob {
+
+
+  /**
+    * The size, in bytes, of the data contained in the <code>Blob</code> object. <strong>Read only.</strong>
+    */
+  double getSize();
+
+
+  /**
+    * An ASCII-encoded string, in all lower case, indicating the MIME&nbsp;type of the data contained in the <code>Blob</code>. If the type is unknown, this string is empty. <strong>Read only.</strong>
+    */
+  String getType();
+
+  Blob webkitSlice();
+
+  Blob webkitSlice(double start);
+
+  Blob webkitSlice(double start, double end);
+
+  Blob webkitSlice(double start, double end, String contentType);
+}
diff --git a/elemental/src/elemental/html/BlobBuilder.java b/elemental/src/elemental/html/BlobBuilder.java
new file mode 100644
index 0000000..1d84014
--- /dev/null
+++ b/elemental/src/elemental/html/BlobBuilder.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface BlobBuilder {
+
+  void append(Blob blob);
+
+  void append(ArrayBuffer arrayBuffer);
+
+  void append(String value);
+
+  void append(String value, String endings);
+
+  Blob getBlob();
+
+  Blob getBlob(String contentType);
+}
diff --git a/elemental/src/elemental/html/BodyElement.java b/elemental/src/elemental/html/BodyElement.java
new file mode 100644
index 0000000..cc862be
--- /dev/null
+++ b/elemental/src/elemental/html/BodyElement.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.events.EventListener;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM body elements expose the <a href="http://www.w3.org/TR/html5/sections.html#the-body-element" target="_blank" rel="external nofollow" class=" external" title="http://www.w3.org/TR/html5/sections.html#the-body-element">HTMLBodyElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-48250443" target="_blank" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-48250443" rel="external nofollow" class=" external"><code>HTMLBodyElement</code></a>) interface, which provides special properties (beyond the regular <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element">element</a></code>
+ object interface they also have available to them by inheritance) for manipulating body elements.
+  */
+public interface BodyElement extends Element {
+
+
+  /**
+    * Color of active hyperlinks.
+    */
+  String getALink();
+
+  void setALink(String arg);
+
+
+  /**
+    * <p>URI for a background image resource.</p> <div class="note"><strong>Note:</strong> Starting in Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, this value is no longer resolved as a URI; instead, it's treated as a simple string.</div>
+    */
+  String getBackground();
+
+  void setBackground(String arg);
+
+
+  /**
+    * Background color for the document.
+    */
+  String getBgColor();
+
+  void setBgColor(String arg);
+
+
+  /**
+    * Color of unvisited links.
+    */
+  String getLink();
+
+  void setLink(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body#attr-onbeforeunload">onbeforeunload</a></code>
+ HTML&nbsp;attribute value for a function to call when the document is about to be unloaded.
+    */
+  EventListener getOnbeforeunload();
+
+  void setOnbeforeunload(EventListener arg);
+
+
+  /**
+    * <p>Exposes the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/window.onblur">window.onblur</a></code>
+ event handler to call when the window loses focus.</p> <div class="note"><strong>Note:</strong> This handler is triggered when the event reaches the window, not the body element. Use <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element.addEventListener">addEventListener()</a></code>
+ to attach an event listener to the body element.</div>
+    */
+  EventListener getOnblur();
+
+  void setOnblur(EventListener arg);
+
+
+  /**
+    * <p>Exposes the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/window.onerror">window.onerror</a></code>
+ event handler to call when the document fails to load properly.</p> <div class="note"><strong>Note:</strong> This handler is triggered when the event reaches the window, not the body element. Use <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element.addEventListener">addEventListener()</a></code>
+ to attach an event listener to the body element.</div>
+    */
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+
+  /**
+    * <p>Exposes the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/window.onfocus">window.onfocus</a></code>
+ event handler to call when the window gains focus.</p> <div class="note"><strong>Note:</strong> This handler is triggered when the event reaches the window, not the body element. Use <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element.addEventListener">addEventListener()</a></code>
+ to attach an event listener to the body element.</div>
+    */
+  EventListener getOnfocus();
+
+  void setOnfocus(EventListener arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body#attr-onhashchange">onhashchange</a></code>
+ HTML&nbsp;attribute value for a function to call when the fragment identifier in the address of the document changes.
+    */
+  EventListener getOnhashchange();
+
+  void setOnhashchange(EventListener arg);
+
+
+  /**
+    * <p>Exposes the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/window.onload">window.onload</a></code>
+ event handler to call when the window gains focus.</p> <div class="note"><strong>Note:</strong> This handler is triggered when the event reaches the window, not the body element. Use <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element.addEventListener">addEventListener()</a></code>
+ to attach an event listener to the body element.</div>
+    */
+  EventListener getOnload();
+
+  void setOnload(EventListener arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body#attr-onmessage">onmessage</a></code>
+ HTML&nbsp;attribute value for a function to call when the document receives a message.
+    */
+  EventListener getOnmessage();
+
+  void setOnmessage(EventListener arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body#attr-onoffline">onoffline</a></code>
+ HTML&nbsp;attribute value for a function to call when network communication fails.
+    */
+  EventListener getOnoffline();
+
+  void setOnoffline(EventListener arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body#attr-ononline">ononline</a></code>
+ HTML&nbsp;attribute value for a function to call when network communication is restored.
+    */
+  EventListener getOnonline();
+
+  void setOnonline(EventListener arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body#attr-onpopstate">onpopstate</a></code>
+ HTML&nbsp;attribute value for a function to call when the user has navigated session history.
+    */
+  EventListener getOnpopstate();
+
+  void setOnpopstate(EventListener arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body#attr-onresize">onresize</a></code>
+ HTML&nbsp;attribute value for a function to call when the document has been resized.
+    */
+  EventListener getOnresize();
+
+  void setOnresize(EventListener arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body#attr-onpopstate">onpopstate</a></code>
+ HTML&nbsp;attribute value for a function to call when the storage area has changed.
+    */
+  EventListener getOnstorage();
+
+  void setOnstorage(EventListener arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/body#attr-onunload">onunload</a></code>
+ HTML&nbsp;attribute value for a function to call when when the document is going away.
+    */
+  EventListener getOnunload();
+
+  void setOnunload(EventListener arg);
+
+
+  /**
+    * Foreground color of text.
+    */
+  String getText();
+
+  void setText(String arg);
+
+
+  /**
+    * Color of visited links.
+    */
+  String getVLink();
+
+  void setVLink(String arg);
+}
diff --git a/elemental/src/elemental/html/ButtonElement.java b/elemental/src/elemental/html/ButtonElement.java
new file mode 100644
index 0000000..e2fb8b2
--- /dev/null
+++ b/elemental/src/elemental/html/ButtonElement.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM&nbsp;<code>Button </code>objects expose the <a class=" external" title="http://www.w3.org/TR/html5/the-button-element.html#the-button-element" rel="external" href="http://www.w3.org/TR/html5/the-button-element.html#the-button-element" target="_blank">HTMLButtonElement</a> 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>&nbsp;(or <a class=" external" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-34812697" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-34812697" target="_blank">HTMLButtonElement</a> 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span>) interface, which provides properties and methods (beyond the <a href="https://developer.mozilla.org/en/DOM/element" rel="internal">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of button elements.
+  */
+public interface ButtonElement extends Element {
+
+
+  /**
+    * The control should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form-associated element in a document can have this attribute specified.
+    */
+  boolean isAutofocus();
+
+  void setAutofocus(boolean arg);
+
+
+  /**
+    * The control is disabled, meaning that it does not accept any clicks.
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * <p>The form that this button is associated with. If the button is a descendant of a form element, then this attribute is the ID of that form element.</p> <p>If the button is not a descendant of a form element, then:</p> <ul> <li>
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> The attribute can be the ID of any form element in the same document.</li> <li>
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> The attribute is null.</li> </ul>
+    */
+  FormElement getForm();
+
+
+  /**
+    * The URI&nbsp;of a program that processes information submitted by the button. If specified, this attribute overrides the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-action">action</a></code>
+ attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element that owns this element.
+    */
+  String getFormAction();
+
+  void setFormAction(String arg);
+
+  String getFormEnctype();
+
+  void setFormEnctype(String arg);
+
+
+  /**
+    * The HTTP&nbsp;method that the browser uses to submit the form. If specified, this attribute overrides the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-method">method</a></code>
+ attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element that owns this element.
+    */
+  String getFormMethod();
+
+  void setFormMethod(String arg);
+
+
+  /**
+    * Indicates that the form is not to be validated when it is submitted. If specified, this attribute overrides the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-enctype">enctype</a></code>
+ attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element that owns this element.
+    */
+  boolean isFormNoValidate();
+
+  void setFormNoValidate(boolean arg);
+
+
+  /**
+    * A name or keyword indicating where to display the response that is received after submitting the form. If specified, this attribute overrides the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-target">target</a></code>
+ attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element that owns this element.
+    */
+  String getFormTarget();
+
+  void setFormTarget(String arg);
+
+
+  /**
+    * A list of <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/label">&lt;label&gt;</a></code>
+ elements that are labels for this button.
+    */
+  NodeList getLabels();
+
+
+  /**
+    * The name of the object when submitted with a form. 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> If specified, it must not be the empty string.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * <p>Indicates the behavior of the button. This is an enumerated attribute with the following possible values:</p> <ul> <li><code>submit</code>:&nbsp;The button submits the form. This is the default value if the attribute is not specified, 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> or if it is dynamically changed to an empty or invalid value.</li> <li><code>reset</code>:&nbsp;The button resets the form.</li> <li><code>button</code>:&nbsp;The button does nothing.</li> </ul>
+    */
+  String getType();
+
+
+  /**
+    * A localized message that describes the validation constraints that the control does not satisfy (if any). This attribute is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.
+    */
+  String getValidationMessage();
+
+
+  /**
+    * The validity states that this button is in.
+    */
+  ValidityState getValidity();
+
+
+  /**
+    * The current form control value of the button.&nbsp;
+    */
+  String getValue();
+
+  void setValue(String arg);
+
+
+  /**
+    * Indicates whether the button is a candidate for constraint validation. It is false if any conditions bar it from constraint validation.
+    */
+  boolean isWillValidate();
+
+
+  /**
+    * Not supported for button elements.
+    */
+  boolean checkValidity();
+
+
+  /**
+    * Not supported for button elements.
+    */
+  void setCustomValidity(String error);
+}
diff --git a/elemental/src/elemental/html/CanvasElement.java b/elemental/src/elemental/html/CanvasElement.java
new file mode 100644
index 0000000..3d22146
--- /dev/null
+++ b/elemental/src/elemental/html/CanvasElement.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM&nbsp;canvas elements expose the <code><a class="external" href="http://www.w3.org/TR/html5/the-canvas-element.html#htmlcanvaselement" rel="external nofollow" target="_blank" title="http://www.w3.org/TR/html5/the-canvas-element.html#htmlcanvaselement">HTMLCanvasElement</a></code> interface, which provides properties and methods for manipulating the layout and presentation of canvas elements. The <code>HTMLCanvasElement</code> interface inherits the properties and methods of the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element">element</a></code>
+ object interface.
+  */
+public interface CanvasElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas#attr-height">height</a></code>
+ HTML attribute, specifying the height of the coordinate space in CSS pixels.
+    */
+  int getHeight();
+
+  void setHeight(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas#attr-width">width</a></code>
+ HTML attribute, specifying the width of the coordinate space in CSS pixels.
+    */
+  int getWidth();
+
+  void setWidth(int arg);
+
+
+  /**
+    * Returns a drawing context on the canvas, or null if the context ID is not supported. A drawing context lets you draw on the canvas. The currently accepted values are "2d" and "experimental-webgl". The "experimental-webgl" context is only available on browsers that implement <a title="En/WebGL" rel="internal" href="https://developer.mozilla.org/en/WebGL">WebGL</a>. Calling getContext with "2d" returns a <code><a href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D" rel="internal">CanvasRenderingContext2D</a></code> Object, whereas calling it with "experimental-webgl" returns a <code>WebGLRenderingContext</code> Object.
+    */
+  CanvasRenderingContext getContext(String contextId);
+
+
+  /**
+    * <p>Returns a <code>data:</code> URL containing a representation of the image in the format specified by <code>type</code> (defaults to PNG).</p> <ul> <li>If the height or width of the canvas is 0, <code>"data:,</code>" representing the empty string, is returned.</li> <li>If the type requested is not <code>image/png</code>, and the returned value starts with <code>data:image/png</code>, then the requested type is not supported.</li> <li>Chrome supports the&nbsp;<code>image/webp&nbsp;</code>type.</li> <li>If the requested type is <code>image/jpeg&nbsp;</code>or&nbsp;<code>image/webp</code>, then the second argument, if it is between 0.0 and 1.0, is treated as indicating image quality; if the second argument is anything else, the default value for image quality is used. Other arguments are ignored.</li> </ul>
+    */
+  String toDataURL(String type);
+}
diff --git a/elemental/src/elemental/html/CanvasGradient.java b/elemental/src/elemental/html/CanvasGradient.java
new file mode 100644
index 0000000..9fd22d2
--- /dev/null
+++ b/elemental/src/elemental/html/CanvasGradient.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * This is an opaque object representing a gradient and returned by <a title="en/DOM/CanvasRenderingContext2D" rel="internal" href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D">CanvasRenderingContext2D</a>'s <a title="en/DOM/CanvasRenderingContext2D.createLinearGradient" rel="internal" href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D">createLinearGradient</a> or <a title="en/DOM/CanvasRenderingContext2D.createRadialGradient" rel="internal" href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D">createRadialGradient</a> methods.
+  */
+public interface CanvasGradient {
+
+  void addColorStop(float offset, String color);
+}
diff --git a/elemental/src/elemental/html/CanvasPattern.java b/elemental/src/elemental/html/CanvasPattern.java
new file mode 100644
index 0000000..081e37f
--- /dev/null
+++ b/elemental/src/elemental/html/CanvasPattern.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * This is an opaque object created by <a title="en/DOM/CanvasRenderingContext2D" rel="internal" href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D">CanvasRenderingContext2D</a>'s <a title="en/DOM/CanvasRenderingContext2D.createPattern" rel="internal" href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D.createPattern" class="new ">createPattern</a> method (whether based on a image, canvas, or video).
+  */
+public interface CanvasPattern {
+}
diff --git a/elemental/src/elemental/html/CanvasRenderingContext.java b/elemental/src/elemental/html/CanvasRenderingContext.java
new file mode 100644
index 0000000..171421e
--- /dev/null
+++ b/elemental/src/elemental/html/CanvasRenderingContext.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface CanvasRenderingContext {
+
+  CanvasElement getCanvas();
+}
diff --git a/elemental/src/elemental/html/CanvasRenderingContext2D.java b/elemental/src/elemental/html/CanvasRenderingContext2D.java
new file mode 100644
index 0000000..21ac250
--- /dev/null
+++ b/elemental/src/elemental/html/CanvasRenderingContext2D.java
@@ -0,0 +1,727 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.util.Indexable;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The bulk of the operations available at present with <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+ are available through this interface, returned by a call to <code>getContext()</code> on the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+ element, with "2d" as its argument.
+  */
+public interface CanvasRenderingContext2D extends CanvasRenderingContext {
+
+
+  /**
+    * Color or style to use inside shapes. Default <code>#000</code> (black).
+    */
+  Object getFillStyle();
+
+  void setFillStyle(Object arg);
+
+
+  /**
+    * Default value <code>10px sans-serif</code>.
+    */
+  String getFont();
+
+  void setFont(String arg);
+
+
+  /**
+    * Alpha value that is applied to shapes and images before they are composited onto the canvas. Default <code>1.0</code> (opaque).
+    */
+  float getGlobalAlpha();
+
+  void setGlobalAlpha(float arg);
+
+
+  /**
+    * With <code>globalAplpha</code> applied this sets how shapes and images are drawn onto the existing bitmap. Possible values: <ul> <li><code>source-atop</code></li> <li><code>source-in</code></li> <li><code>source-out</code></li> <li><code>source-over</code> (default)</li> <li><code>destination-atop</code></li> <li><code>destination-in</code></li> <li><code>destination-out</code></li> <li><code>destination-over</code></li> <li><code>lighter</code></li> <li><code>xor</code></li> </ul>
+    */
+  String getGlobalCompositeOperation();
+
+  void setGlobalCompositeOperation(String arg);
+
+
+  /**
+    * Type of endings on the end of lines. Possible values: <code>butt</code> (default), <code>round</code>, <code>square</code>
+    */
+  String getLineCap();
+
+  void setLineCap(String arg);
+
+
+  /**
+    * Defines the type of corners where two lines meet. Possible values: <code>round</code>, <code>bevel</code>, <code>miter</code> (default)
+    */
+  String getLineJoin();
+
+  void setLineJoin(String arg);
+
+
+  /**
+    * Width of lines. Default <code>1.0</code>
+    */
+  float getLineWidth();
+
+  void setLineWidth(float arg);
+
+
+  /**
+    * Default <code>10</code>.
+    */
+  float getMiterLimit();
+
+  void setMiterLimit(float arg);
+
+
+  /**
+    * Specifies the blurring effect. Default <code>0</code>
+    */
+  float getShadowBlur();
+
+  void setShadowBlur(float arg);
+
+
+  /**
+    * Color of the shadow. Default fully-transparent black.
+    */
+  String getShadowColor();
+
+  void setShadowColor(String arg);
+
+
+  /**
+    * Horizontal distance the shadow will be offset. Default 0.
+    */
+  float getShadowOffsetX();
+
+  void setShadowOffsetX(float arg);
+
+
+  /**
+    * Vertical distance the shadow will be offset. Default 0.
+    */
+  float getShadowOffsetY();
+
+  void setShadowOffsetY(float arg);
+
+
+  /**
+    * Color or style to use for the lines around shapes. Default <code>#000</code> (black).
+    */
+  Object getStrokeStyle();
+
+  void setStrokeStyle(Object arg);
+
+
+  /**
+    * Possible values: <code>start</code> (default), <code>end</code>, <code>left</code>, <code>right</code> or <code>center</code>.
+    */
+  String getTextAlign();
+
+  void setTextAlign(String arg);
+
+  String getTextBaseline();
+
+  void setTextBaseline(String arg);
+
+  float getWebkitBackingStorePixelRatio();
+
+
+  /**
+    * Image smoothing mode; if disabled, images will not be smoothed if scaled. 
+<span title="(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)
+">Requires Gecko 1.9.2</span>
+    */
+  boolean isWebkitImageSmoothingEnabled();
+
+  void setWebkitImageSmoothingEnabled(boolean arg);
+
+
+  /**
+    * An array which specifies the lengths of alternating dashes and gaps.
+    */
+  Indexable getWebkitLineDash();
+
+  void setWebkitLineDash(Indexable arg);
+
+
+  /**
+    * Specifies where to start a dasharray on a line.
+    */
+  float getWebkitLineDashOffset();
+
+  void setWebkitLineDashOffset(float arg);
+
+
+  /**
+    * <p>Adds an arc to the path which it center is at <em>(x, y)</em> position with radius<em> r</em> starting at <em>startAngle</em> and ending at <em>endAngle</em> going in the given direction by <em>anticlockwise</em> (defaulting to clockwise).</p>
+
+<div id="section_11"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x</code></dt> <dd>The x axis of the coordinate for the arc's center</dd> <dt><code>y</code></dt> <dd>The y axis of the coordinate for the arc's center.</dd> <dt><code>radius</code></dt> <dd>The arc's radius</dd> <dt><code>startAngle</code></dt> <dd>The starting point, measured from the x axis , from which it will be drawed expressed as radians.</dd> <dt><code>endAngle</code></dt> <dd>The end arc's angle to which it will be drawed expressed as radians.</dd> <dt><code>anticlockwise</code> 
+<span title="(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+">Optional from Gecko 2.0</span>
+</dt> <dd>When <code>true</code> draws the arc anticlockwise, otherwise in a clockwise direction.</dd>
+</dl>
+</div>
+    */
+  void arc(float x, float y, float radius, float startAngle, float endAngle, boolean anticlockwise);
+
+
+  /**
+    * <p>Adds an arc with the given control points and radius, connected to the previous point by a straight line.</p>
+
+<div id="section_13"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x1</code></dt> <dd></dd> <dt><code>y1</code></dt> <dd></dd> <dt><code>x2</code></dt> <dd></dd> <dt><code>y2</code></dt> <dd></dd> <dt><code>radius</code></dt> <dd>The arc's radius.</dd>
+</dl>
+</div>
+    */
+  void arcTo(float x1, float y1, float x2, float y2, float radius);
+
+  void beginPath();
+
+  void bezierCurveTo(float cp1x, float cp1y, float cp2x, float cp2y, float x, float y);
+
+
+  /**
+    * <p>Clears the rectangle defined by it starting point at <em>(x, y)</em> and has a <em>w</em> width and a <em>h</em> height.</p>
+
+<div id="section_19"><span id="Parameters_5"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x</code></dt> <dd>The x axis of the coordinate for the rectangle starting point.</dd> <dt><code>y</code></dt> <dd>The y axis of the coordinate for the rectangle starting point.</dd> <dt><code>width</code></dt> <dd>The rectangle's width.</dd> <dt><code>height</code></dt> <dd>The rectangle's height.</dd>
+</dl>
+</div>
+    */
+  void clearRect(float x, float y, float width, float height);
+
+  void clearShadow();
+
+  void clip();
+
+  void closePath();
+
+  ImageData createImageData(ImageData imagedata);
+
+  ImageData createImageData(float sw, float sh);
+
+  CanvasGradient createLinearGradient(float x0, float y0, float x1, float y1);
+
+
+  /**
+    * <div id="section_31"><span id="Parameters_10"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>A DOM <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element">element</a></code>
+ to use as the source image for the pattern. This can be any element, although typically you'll use an <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Image" class="new">Image</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+.</dd> <dt><code>repetition</code></dt> <dd>?</dd>
+</dl>
+</div><div id="section_32"><span id="Return_value_3"></span><h6 class="editable">Return value</h6>
+<p>A new DOM canvas pattern object for use in pattern-based operations.</p>
+</div><div id="section_33"><span id="Exceptions_thrown"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>NS_ERROR_DOM_INVALID_STATE_ERR</code> 
+<span title="(Firefox 10.0 / Thunderbird 10.0)
+">Requires Gecko 10.0</span>
+</dt> <dd>The specified <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+ element for the <code>image</code> parameter is zero-sized (that is, one or both of its dimensions are 0 pixels).</dd>
+</dl>
+</div>
+    */
+  CanvasPattern createPattern(CanvasElement canvas, String repetitionType);
+
+
+  /**
+    * <div id="section_31"><span id="Parameters_10"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>A DOM <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element">element</a></code>
+ to use as the source image for the pattern. This can be any element, although typically you'll use an <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Image" class="new">Image</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+.</dd> <dt><code>repetition</code></dt> <dd>?</dd>
+</dl>
+</div><div id="section_32"><span id="Return_value_3"></span><h6 class="editable">Return value</h6>
+<p>A new DOM canvas pattern object for use in pattern-based operations.</p>
+</div><div id="section_33"><span id="Exceptions_thrown"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>NS_ERROR_DOM_INVALID_STATE_ERR</code> 
+<span title="(Firefox 10.0 / Thunderbird 10.0)
+">Requires Gecko 10.0</span>
+</dt> <dd>The specified <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+ element for the <code>image</code> parameter is zero-sized (that is, one or both of its dimensions are 0 pixels).</dd>
+</dl>
+</div>
+    */
+  CanvasPattern createPattern(ImageElement image, String repetitionType);
+
+  CanvasGradient createRadialGradient(float x0, float y0, float r0, float x1, float y1, float r1);
+
+
+  /**
+    * <p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>
+
+<div id="section_41"><span id="Parameters_13"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img">&lt;img&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>
+</dl>
+<p>The diagram below illustrates the meanings of the various parameters.</p>
+<p><img alt="drawImage.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png"></p>
+</div><div id="section_42"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>
+</dl>
+</div><div id="section_43"><span id="Compatibility_notes"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+ now correctly supports CORS for drawing images across domains without <a title="en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F" rel="internal" href="https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F">tainting the canvas</a>.</li>
+</ul>
+</div>
+    */
+  void drawImage(ImageElement image, float x, float y);
+
+
+  /**
+    * <p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>
+
+<div id="section_41"><span id="Parameters_13"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img">&lt;img&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>
+</dl>
+<p>The diagram below illustrates the meanings of the various parameters.</p>
+<p><img alt="drawImage.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png"></p>
+</div><div id="section_42"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>
+</dl>
+</div><div id="section_43"><span id="Compatibility_notes"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+ now correctly supports CORS for drawing images across domains without <a title="en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F" rel="internal" href="https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F">tainting the canvas</a>.</li>
+</ul>
+</div>
+    */
+  void drawImage(ImageElement image, float x, float y, float width, float height);
+
+
+  /**
+    * <p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>
+
+<div id="section_41"><span id="Parameters_13"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img">&lt;img&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>
+</dl>
+<p>The diagram below illustrates the meanings of the various parameters.</p>
+<p><img alt="drawImage.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png"></p>
+</div><div id="section_42"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>
+</dl>
+</div><div id="section_43"><span id="Compatibility_notes"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+ now correctly supports CORS for drawing images across domains without <a title="en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F" rel="internal" href="https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F">tainting the canvas</a>.</li>
+</ul>
+</div>
+    */
+  void drawImage(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh);
+
+
+  /**
+    * <p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>
+
+<div id="section_41"><span id="Parameters_13"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img">&lt;img&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>
+</dl>
+<p>The diagram below illustrates the meanings of the various parameters.</p>
+<p><img alt="drawImage.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png"></p>
+</div><div id="section_42"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>
+</dl>
+</div><div id="section_43"><span id="Compatibility_notes"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+ now correctly supports CORS for drawing images across domains without <a title="en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F" rel="internal" href="https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F">tainting the canvas</a>.</li>
+</ul>
+</div>
+    */
+  void drawImage(CanvasElement canvas, float x, float y);
+
+
+  /**
+    * <p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>
+
+<div id="section_41"><span id="Parameters_13"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img">&lt;img&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>
+</dl>
+<p>The diagram below illustrates the meanings of the various parameters.</p>
+<p><img alt="drawImage.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png"></p>
+</div><div id="section_42"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>
+</dl>
+</div><div id="section_43"><span id="Compatibility_notes"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+ now correctly supports CORS for drawing images across domains without <a title="en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F" rel="internal" href="https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F">tainting the canvas</a>.</li>
+</ul>
+</div>
+    */
+  void drawImage(CanvasElement canvas, float x, float y, float width, float height);
+
+
+  /**
+    * <p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>
+
+<div id="section_41"><span id="Parameters_13"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img">&lt;img&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>
+</dl>
+<p>The diagram below illustrates the meanings of the various parameters.</p>
+<p><img alt="drawImage.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png"></p>
+</div><div id="section_42"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>
+</dl>
+</div><div id="section_43"><span id="Compatibility_notes"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+ now correctly supports CORS for drawing images across domains without <a title="en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F" rel="internal" href="https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F">tainting the canvas</a>.</li>
+</ul>
+</div>
+    */
+  void drawImage(CanvasElement canvas, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh);
+
+
+  /**
+    * <p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>
+
+<div id="section_41"><span id="Parameters_13"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img">&lt;img&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>
+</dl>
+<p>The diagram below illustrates the meanings of the various parameters.</p>
+<p><img alt="drawImage.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png"></p>
+</div><div id="section_42"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>
+</dl>
+</div><div id="section_43"><span id="Compatibility_notes"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+ now correctly supports CORS for drawing images across domains without <a title="en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F" rel="internal" href="https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F">tainting the canvas</a>.</li>
+</ul>
+</div>
+    */
+  void drawImage(VideoElement video, float x, float y);
+
+
+  /**
+    * <p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>
+
+<div id="section_41"><span id="Parameters_13"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img">&lt;img&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>
+</dl>
+<p>The diagram below illustrates the meanings of the various parameters.</p>
+<p><img alt="drawImage.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png"></p>
+</div><div id="section_42"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>
+</dl>
+</div><div id="section_43"><span id="Compatibility_notes"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+ now correctly supports CORS for drawing images across domains without <a title="en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F" rel="internal" href="https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F">tainting the canvas</a>.</li>
+</ul>
+</div>
+    */
+  void drawImage(VideoElement video, float x, float y, float width, float height);
+
+
+  /**
+    * <p>Draws the specified image. This method is available in multiple formats, providing a great deal of flexibility in its use.</p>
+
+<div id="section_41"><span id="Parameters_13"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>image</code></dt> <dd>An element to draw into the context; the specification permits any image element (that is, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img">&lt;img&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+). Some browsers, including Firefox, let you use any arbitrary element.</dd> <dt><code>dx</code></dt> <dd>The X coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dy</code></dt> <dd>The Y coordinate in the destination canvas at which to place the top-left corner of the source <code>image</code>.</dd> <dt><code>dw</code></dt> <dd>The width to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in width when drawn.</dd> <dt><code>dh</code></dt> <dd>The height to draw the <code>image</code> in the destination canvas. This allows scaling of the drawn image. If not specified, the image is not scaled in height when drawn.</dd> <dt><code>sx</code></dt> <dd>The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sy</code></dt> <dd>The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.</dd> <dt><code>sw</code></dt> <dd>The width of the sub-rectangle of the source image to draw into the destination context. If not specified, the entire rectangle from the coordinates specified by <code>sx</code> and <code>sy</code> to the bottom-right corner of the image is used. If you specify a negative value, the image is flipped horizontally when drawn.</dd> <dt><code>sh</code></dt> <dd>The height of the sub-rectangle of the source image to draw into the destination context. If you specify a negative value, the image is flipped vertically when drawn.</dd>
+</dl>
+<p>The diagram below illustrates the meanings of the various parameters.</p>
+<p><img alt="drawImage.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/5494/=drawImage.png"></p>
+</div><div id="section_42"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>If the canvas or source rectangle width or height is zero.</dd> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The image has no image data.</dd> <dt><code>TYPE_MISMATCH_ERR</code></dt> <dd>The specified source element isn't supported. This is not thrown by Firefox, since any element may be used as a source image.</dd>
+</dl>
+</div><div id="section_43"><span id="Compatibility_notes"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, Firefox threw an exception if any of the coordinate values was non-finite or zero. As per the specification, this no longer happens.</li> <li>Support for flipping the image by using negative values for <code>sw</code> and <code>sh</code> was added in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+.</li> <li>Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+ now correctly supports CORS for drawing images across domains without <a title="en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F" rel="internal" href="https://developer.mozilla.org/en/CORS_Enabled_Image#What_is_a_.22tainted.22_canvas.3F">tainting the canvas</a>.</li>
+</ul>
+</div>
+    */
+  void drawImage(VideoElement video, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh);
+
+  void drawImageFromRect(ImageElement image);
+
+  void drawImageFromRect(ImageElement image, float sx);
+
+  void drawImageFromRect(ImageElement image, float sx, float sy);
+
+  void drawImageFromRect(ImageElement image, float sx, float sy, float sw);
+
+  void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh);
+
+  void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx);
+
+  void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy);
+
+  void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy, float dw);
+
+  void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh);
+
+  void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, String compositeOperation);
+
+
+  /**
+    * Fills the subpaths with the current fill style.
+    */
+  void fill();
+
+
+  /**
+    * <p>Draws a filled rectangle at <em>(x, y) </em>position whose size is determined by <em>width</em> and <em>height</em>.</p>
+
+<div id="section_49"><span id="Parameters_16"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x</code></dt> <dd>The x axis of the coordinate for the rectangle starting point.</dd> <dt><code>y</code></dt> <dd>The y axis of the coordinate for the rectangle starting point.</dd> <dt><code>width</code></dt> <dd>The rectangle's width.</dd> <dt><code>height</code></dt> <dd>The rectangle's height.</dd>
+</dl>
+</div>
+    */
+  void fillRect(float x, float y, float width, float height);
+
+  void fillText(String text, float x, float y);
+
+  void fillText(String text, float x, float y, float maxWidth);
+
+
+  /**
+    * <p>Returns an <code><a class="external" rel="external" href="http://dev.w3.org/html5/2dcontext/Overview.html#imagedata" title="http://dev.w3.org/html5/2dcontext/Overview.html#imagedata" target="_blank">ImageData</a></code> object representing the underlying pixel data for the area of the canvas denoted by the rectangle which starts at <em>(sx, sy)</em> and has a <em>sw</em> width and <em>sh</em> height.</p>
+
+<div id="section_53"><span id="Parameters_18"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>sx</code></dt> <dd>The x axis of the coordinate for the rectangle startpoint from which the ImageData will be extracted.</dd> <dt><code>sy</code></dt> <dd>The x axis of the coordinate for the rectangle endpoint from which the ImageData will be extracted.</dd> <dt><code>sw</code></dt> <dd>The width of the rectangle from which the ImageData will be extracted.</dd> <dt><code>sh</code></dt> <dd>The height of the rectangle from which the ImageData will be extracted.</dd>
+</dl>
+</div><div id="section_54"><span id="Return_value_6"></span><h6 class="editable">Return value</h6>
+<p>Returns an <code><a class="external" rel="external" href="http://www.w3.org/TR/2011/WD-2dcontext-20110405/#imagedata" title="http://www.w3.org/TR/2011/WD-2dcontext-20110405/#imagedata" target="_blank">ImageData</a></code> object containing the image data for the given rectangle of the canvas.</p>
+</div>
+    */
+  ImageData getImageData(float sx, float sy, float sw, float sh);
+
+
+  /**
+    * <p>Reports whether or not the specified point is contained in the current path.</p>
+
+<div id="section_56"><span id="Parameters_19"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x</code></dt> <dd>The X coordinate of the point to check.</dd> <dt><code>y</code></dt> <dd>The Y coordinate of the point to check.</dd>
+</dl>
+</div><div id="section_57"><span id="Return_value_7"></span><h6 class="editable">Return value</h6>
+<p><code>true</code> if the specified point is contained in the current path; otherwise <code>false</code>.</p>
+</div><div id="section_58"><span id="Compatibility_notes_2"></span><h6 class="editable">Compatibility notes</h6>
+<ul> <li>Prior to Gecko 7.0 (Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+, this method incorrectly failed to multiply the specified point's coordinates by the current transformation matrix before comparing it to the path. Now this method works correctly even if the context is rotated, scaled, or otherwise transformed.</li>
+</ul>
+</div>
+    */
+  boolean isPointInPath(float x, float y);
+
+
+  /**
+    * <p>Connects the last point in the subpath to the <code>x, y</code> coordinates with a straight line.</p>
+
+<div id="section_60"><span id="Parameters_20"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x</code></dt> <dd>The x axis of the coordinate for the end of the line.</dd> <dt><code>y</code></dt> <dd>The y axis of the coordinate for the end of the line.</dd>
+</dl>
+</div>
+    */
+  void lineTo(float x, float y);
+
+  TextMetrics measureText(String text);
+
+
+  /**
+    * <p>Moves the starting point of a new subpath to the <strong>(x, y)</strong> coordinates.</p>
+
+<div id="section_65"><span id="Parameters_22"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x</code></dt> <dd>The x axis of the point.</dd> <dt><code>y</code></dt> <dd>The y axis of the point.</dd>
+</dl>
+</div>
+    */
+  void moveTo(float x, float y);
+
+
+  /**
+    * <h6 class="editable">Compatibility notes</h6>
+<ul> <li>Starting in Gecko 10.0 (Firefox 10.0 / Thunderbird 10.0)
+, non-finite values to any of these parameters causes the call to putImageData() to be silently ignored, rather than throwing an exception.</li>
+</ul>
+    */
+  void putImageData(ImageData imagedata, float dx, float dy);
+
+
+  /**
+    * <h6 class="editable">Compatibility notes</h6>
+<ul> <li>Starting in Gecko 10.0 (Firefox 10.0 / Thunderbird 10.0)
+, non-finite values to any of these parameters causes the call to putImageData() to be silently ignored, rather than throwing an exception.</li>
+</ul>
+    */
+  void putImageData(ImageData imagedata, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight);
+
+  void quadraticCurveTo(float cpx, float cpy, float x, float y);
+
+  void rect(float x, float y, float width, float height);
+
+
+  /**
+    * Restores the drawing style state to the last element on the 'state stack' saved by save()
+    */
+  void restore();
+
+  void rotate(float angle);
+
+
+  /**
+    * Saves the current drawing style state using a stack so you can revert any change you make to it using restore().
+    */
+  void save();
+
+  void scale(float sx, float sy);
+
+  void setAlpha(float alpha);
+
+  void setCompositeOperation(String compositeOperation);
+
+  void setFillColor(String color);
+
+  void setFillColor(String color, float alpha);
+
+  void setFillColor(float grayLevel);
+
+  void setFillColor(float grayLevel, float alpha);
+
+  void setFillColor(float r, float g, float b, float a);
+
+  void setFillColor(float c, float m, float y, float k, float a);
+
+  void setShadow(float width, float height, float blur);
+
+  void setShadow(float width, float height, float blur, String color);
+
+  void setShadow(float width, float height, float blur, String color, float alpha);
+
+  void setShadow(float width, float height, float blur, float grayLevel);
+
+  void setShadow(float width, float height, float blur, float grayLevel, float alpha);
+
+  void setShadow(float width, float height, float blur, float r, float g, float b, float a);
+
+  void setShadow(float width, float height, float blur, float c, float m, float y, float k, float a);
+
+  void setStrokeColor(String color);
+
+  void setStrokeColor(String color, float alpha);
+
+  void setStrokeColor(float grayLevel);
+
+  void setStrokeColor(float grayLevel, float alpha);
+
+  void setStrokeColor(float r, float g, float b, float a);
+
+  void setStrokeColor(float c, float m, float y, float k, float a);
+
+  void setTransform(float m11, float m12, float m21, float m22, float dx, float dy);
+
+
+  /**
+    * Strokes the subpaths with the current stroke style.
+    */
+  void stroke();
+
+
+  /**
+    * <p>Paints a rectangle which it starting point is at <em>(x, y)</em> and has a<em> w</em> width and a <em>h</em> height onto the canvas, using the current stroke style.</p>
+
+<div id="section_88"><span id="Parameters_33"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x</code></dt> <dd>The x axis for the starting point of the rectangle.</dd> <dt><code>y</code></dt> <dd>The y axis for the starting point of the rectangle.</dd> <dt><code>w</code></dt> <dd>The rectangle's width.</dd> <dt><code>h</code></dt> <dd>The rectangle's height.</dd>
+</dl>
+</div>
+    */
+  void strokeRect(float x, float y, float width, float height);
+
+
+  /**
+    * <p>Paints a rectangle which it starting point is at <em>(x, y)</em> and has a<em> w</em> width and a <em>h</em> height onto the canvas, using the current stroke style.</p>
+
+<div id="section_88"><span id="Parameters_33"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x</code></dt> <dd>The x axis for the starting point of the rectangle.</dd> <dt><code>y</code></dt> <dd>The y axis for the starting point of the rectangle.</dd> <dt><code>w</code></dt> <dd>The rectangle's width.</dd> <dt><code>h</code></dt> <dd>The rectangle's height.</dd>
+</dl>
+</div>
+    */
+  void strokeRect(float x, float y, float width, float height, float lineWidth);
+
+  void strokeText(String text, float x, float y);
+
+  void strokeText(String text, float x, float y, float maxWidth);
+
+  void transform(float m11, float m12, float m21, float m22, float dx, float dy);
+
+
+  /**
+    * <p>Moves the origin point of the context to (x, y).</p>
+
+<div id="section_94"><span id="Parameters_36"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>x</code></dt> <dd>The x axis for the point to be considered as the origin.</dd> <dt><code>y</code></dt> <dd>The x axis for the point to be considered as the origin.</dd>
+</dl>
+</div>
+    */
+  void translate(float tx, float ty);
+
+  ImageData webkitGetImageDataHD(float sx, float sy, float sw, float sh);
+
+  void webkitPutImageDataHD(ImageData imagedata, float dx, float dy);
+
+  void webkitPutImageDataHD(ImageData imagedata, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight);
+}
diff --git a/elemental/src/elemental/html/ClientRect.java b/elemental/src/elemental/html/ClientRect.java
new file mode 100644
index 0000000..7804270
--- /dev/null
+++ b/elemental/src/elemental/html/ClientRect.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div>
+
+<a rel="custom" href="http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/base/nsIDOMClientRect.idl"><code>dom/interfaces/base/nsIDOMClientRect.idl</code></a><span><a rel="internal" href="https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces" title="en/Interfaces/About_Scriptable_Interfaces">Scriptable</a></span></div><span>Represents a rectangular box. The type of box is specified by the method that returns such an object. It is returned by functions like <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element.getBoundingClientRect">element.getBoundingClientRect</a></code>
+.</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 1.9</div><div title="Introduced in Gecko 1.9 (Firefox 3)
+"></div><div title="Last changed in Gecko 1.9.1 (Firefox 3)
+"></div></div>
+<div>Inherits from: <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsISupports">nsISupports</a></code>
+<span>Last changed in Gecko 1.9.1 (Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)
+</span></div>
+  */
+public interface ClientRect {
+
+
+  /**
+    * Y-coordinate, relative to the viewport origin, of the bottom of the rectangle box. <strong>Read only.</strong>
+    */
+  float getBottom();
+
+
+  /**
+    * Height of the rectangle box (This is identical to <code>bottom</code> minus <code>top</code>). <strong>Read only.</strong>
+    */
+  float getHeight();
+
+
+  /**
+    * X-coordinate, relative to the viewport origin, of the left of the rectangle box. <strong>Read only.</strong>
+    */
+  float getLeft();
+
+
+  /**
+    * X-coordinate, relative to the viewport origin, of the right of the rectangle box. <strong>Read only.</strong>
+    */
+  float getRight();
+
+
+  /**
+    * Y-coordinate, relative to the viewport origin, of the top of the rectangle box. <strong>Read only.</strong>
+    */
+  float getTop();
+
+
+  /**
+    * Width of the rectangle box (This is identical to <code>right</code> minus <code>left</code>). <strong>Read only.</strong> 
+<span title="(Firefox 3.5 / Thunderbird 3.0 / SeaMonkey 2.0)
+">Requires Gecko 1.9.1</span>
+    */
+  float getWidth();
+}
diff --git a/elemental/src/elemental/html/ClientRectList.java b/elemental/src/elemental/html/ClientRectList.java
new file mode 100644
index 0000000..fcc6aaf
--- /dev/null
+++ b/elemental/src/elemental/html/ClientRectList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ClientRectList {
+
+  int getLength();
+
+  ClientRect item(int index);
+}
diff --git a/elemental/src/elemental/html/Console.java b/elemental/src/elemental/html/Console.java
new file mode 100644
index 0000000..36eaea9
--- /dev/null
+++ b/elemental/src/elemental/html/Console.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>Beginning with Firefox 4, the old <a title="en/Error Console" rel="internal" href="https://developer.mozilla.org/en/Error_Console">Error Console</a> has been deprecated in favor of the new, improved Web&nbsp;Console. The Web Console is something of a heads-up display for the web, letting you view error messages and other logged information. In addition, there are methods you can call to output information to the console, making it a useful debugging aid, and you can evaluate JavaScript on the fly.</p>
+<p><a title="webconsole.png" rel="internal" href="https://developer.mozilla.org/@api/deki/files/4748/=webconsole.png"><img alt="webconsole.png" class="internal default" src="https://developer.mozilla.org/@api/deki/files/4748/=webconsole.png"></a></p>
+<p>The Web Console won't replace more advanced debugging tools like <a class="external" title="http://getfirebug.com/" rel="external" href="http://getfirebug.com/" target="_blank">Firebug</a>; what it does give you, however, is a way to let remote users of your site or web application gather and report console logs and other information to you. It also provides a lightweight way to debug content if you don't happen to have Firebug installed when something goes wrong.</p>
+<div class="note"><strong>Note:</strong> The Error Console is still available; you can re-enable it by changing the <code>devtools.errorconsole.enabled</code> preference to <code>true</code> and restarting the browser.</div>
+  */
+public interface Console {
+
+  MemoryInfo getMemory();
+
+  Indexable getProfiles();
+
+  void assertCondition(boolean condition, Object arg);
+
+  void count();
+
+  void debug(Object arg);
+
+  void dir();
+
+  void dirxml();
+
+  void error(Object arg);
+
+  void group(Object arg);
+
+  void groupCollapsed(Object arg);
+
+  void groupEnd();
+
+  void info(Object arg);
+
+  void log(Object arg);
+
+  void markTimeline();
+
+  void profile(String title);
+
+  void profileEnd(String title);
+
+  void time(String title);
+
+  void timeEnd(String title, Object arg);
+
+  void timeStamp(Object arg);
+
+  void trace(Object arg);
+
+  void warn(Object arg);
+}
diff --git a/elemental/src/elemental/html/ContentElement.java b/elemental/src/elemental/html/ContentElement.java
new file mode 100644
index 0000000..94852b1
--- /dev/null
+++ b/elemental/src/elemental/html/ContentElement.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ContentElement extends Element {
+
+  String getSelect();
+
+  void setSelect(String arg);
+}
diff --git a/elemental/src/elemental/html/ConvolverNode.java b/elemental/src/elemental/html/ConvolverNode.java
new file mode 100644
index 0000000..e11ea5a
--- /dev/null
+++ b/elemental/src/elemental/html/ConvolverNode.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ConvolverNode extends AudioNode {
+
+  AudioBuffer getBuffer();
+
+  void setBuffer(AudioBuffer arg);
+
+  boolean isNormalize();
+
+  void setNormalize(boolean arg);
+}
diff --git a/elemental/src/elemental/html/Crypto.java b/elemental/src/elemental/html/Crypto.java
new file mode 100644
index 0000000..06f9bf3
--- /dev/null
+++ b/elemental/src/elemental/html/Crypto.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Non-standard
+  */
+public interface Crypto {
+
+  void getRandomValues(ArrayBufferView array);
+}
diff --git a/elemental/src/elemental/html/DListElement.java b/elemental/src/elemental/html/DListElement.java
new file mode 100644
index 0000000..27abeb7
--- /dev/null
+++ b/elemental/src/elemental/html/DListElement.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM&nbsp;definition list elements expose the <a title="http://www.w3.org/TR/html5/grouping-content.html#htmldlistelement" class=" external" rel="external nofollow" href="http://www.w3.org/TR/html5/grouping-content.html#htmldlistelement" target="_blank">HTMLDListElement</a> (or <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" rel="external nofollow" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-52368974" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-52368974" target="_blank"><code>HTMLDListElement</code></a>) interface, which provides special properties (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating definition list elements. In 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>, this interface inherits from HTMLElement, but defines no additional members.
+  */
+public interface DListElement extends Element {
+
+
+  /**
+    * Indicates that spacing between list items should be reduced.
+    */
+  boolean isCompact();
+
+  void setCompact(boolean arg);
+}
diff --git a/elemental/src/elemental/html/DOMFileSystem.java b/elemental/src/elemental/html/DOMFileSystem.java
new file mode 100644
index 0000000..05f772d
--- /dev/null
+++ b/elemental/src/elemental/html/DOMFileSystem.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMFileSystem {
+
+  String getName();
+
+  DirectoryEntry getRoot();
+}
diff --git a/elemental/src/elemental/html/DOMFileSystemSync.java b/elemental/src/elemental/html/DOMFileSystemSync.java
new file mode 100644
index 0000000..3621d92
--- /dev/null
+++ b/elemental/src/elemental/html/DOMFileSystemSync.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMFileSystemSync {
+
+  String getName();
+
+  DirectoryEntrySync getRoot();
+}
diff --git a/elemental/src/elemental/html/DOMMimeType.java b/elemental/src/elemental/html/DOMMimeType.java
new file mode 100644
index 0000000..36af19e
--- /dev/null
+++ b/elemental/src/elemental/html/DOMMimeType.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMMimeType {
+
+  String getDescription();
+
+  DOMPlugin getEnabledPlugin();
+
+  String getSuffixes();
+
+  String getType();
+}
diff --git a/elemental/src/elemental/html/DOMMimeTypeArray.java b/elemental/src/elemental/html/DOMMimeTypeArray.java
new file mode 100644
index 0000000..41863fe
--- /dev/null
+++ b/elemental/src/elemental/html/DOMMimeTypeArray.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMMimeTypeArray {
+
+  int getLength();
+
+  DOMMimeType item(int index);
+
+  DOMMimeType namedItem(String name);
+}
diff --git a/elemental/src/elemental/html/DOMPlugin.java b/elemental/src/elemental/html/DOMPlugin.java
new file mode 100644
index 0000000..de6e993
--- /dev/null
+++ b/elemental/src/elemental/html/DOMPlugin.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>Plugin</code> interface provides information about a browser plugin.
+  */
+public interface DOMPlugin {
+
+
+  /**
+    * A human readable description of the plugin. <strong>Read only.</strong>
+    */
+  String getDescription();
+
+
+  /**
+    * The filename of the plugin file. <strong>Read only.</strong>
+    */
+  String getFilename();
+
+  int getLength();
+
+
+  /**
+    * The name of the plugin. <strong>Read only.</strong>
+    */
+  String getName();
+
+
+  /**
+    * Returns the MIME&nbsp;type of a supported content type, given the index number into a list of supported types.
+    */
+  DOMMimeType item(int index);
+
+
+  /**
+    * Returns the MIME&nbsp;type of a supported item.
+    */
+  DOMMimeType namedItem(String name);
+}
diff --git a/elemental/src/elemental/html/DOMPluginArray.java b/elemental/src/elemental/html/DOMPluginArray.java
new file mode 100644
index 0000000..6b4c558
--- /dev/null
+++ b/elemental/src/elemental/html/DOMPluginArray.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMPluginArray {
+
+  int getLength();
+
+  DOMPlugin item(int index);
+
+  DOMPlugin namedItem(String name);
+
+  void refresh(boolean reload);
+}
diff --git a/elemental/src/elemental/html/DOMURL.java b/elemental/src/elemental/html/DOMURL.java
new file mode 100644
index 0000000..a9e0858
--- /dev/null
+++ b/elemental/src/elemental/html/DOMURL.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.MediaStream;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DOMURL {
+}
diff --git a/elemental/src/elemental/html/DataView.java b/elemental/src/elemental/html/DataView.java
new file mode 100644
index 0000000..46322b9
--- /dev/null
+++ b/elemental/src/elemental/html/DataView.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong>
+<div>This page is not complete.</div>
+</div>
+
+<p></p>
+<div class="note"><strong>Note:</strong> <code>DataView</code> is not yet implemented in Gecko. It is implemented in Chrome 9.</div>
+<p>An <code>ArrayBuffer</code> is a useful object for representing an arbitrary chunk of data. In many cases, such data will be read from disk or from the network, and will not follow the alignment restrictions that are imposed on the <a title="en/JavaScript_typed_arrays/ArrayBufferView" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBufferView">Typed Array Views</a> described earlier. In addition, the data will often be heterogeneous in nature and have a defined byte order.</p>
+<p>The <code>DataView</code> view provides a low-level interface for reading such data from and writing it to an <code><a title="en/JavaScript_typed_arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer">ArrayBuffer</a></code>.</p>
+  */
+public interface DataView extends ArrayBufferView {
+
+  float getFloat32(int byteOffset);
+
+  float getFloat32(int byteOffset, boolean littleEndian);
+
+  double getFloat64(int byteOffset);
+
+  double getFloat64(int byteOffset, boolean littleEndian);
+
+  short getInt16(int byteOffset);
+
+  short getInt16(int byteOffset, boolean littleEndian);
+
+  int getInt32(int byteOffset);
+
+  int getInt32(int byteOffset, boolean littleEndian);
+
+
+  /**
+    * <p>Gets a signed 8-bit integer at the specified byte offset from the start of the view.</p>
+
+<div id="section_11"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>offset</code></dt> <dd>The offset, in byte, from the start of the view where to read the data.</dd>
+</dl>
+</div><div id="section_12"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>The <code>byteOffset</code> is set such as it would read beyond the end of the view</dd>
+</dl>
+</div>
+    */
+  Object getInt8();
+
+  int getUint16(int byteOffset);
+
+  int getUint16(int byteOffset, boolean littleEndian);
+
+  int getUint32(int byteOffset);
+
+  int getUint32(int byteOffset, boolean littleEndian);
+
+
+  /**
+    * <p>Gets an unsigned 8-bit integer at the specified byte offset from the start of the view.</p>
+
+<div id="section_14"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>offset</code></dt> <dd>The offset, in byte, from the start of the view where to read the data.</dd>
+</dl>
+<dl> <dt><code>INDEX_SIZE_ERR</code></dt> <dd>The <code>byteOffset</code> is set such as it would read beyond the end of the view</dd>
+</dl>
+</div>
+    */
+  Object getUint8();
+
+  void setFloat32(int byteOffset, float value);
+
+  void setFloat32(int byteOffset, float value, boolean littleEndian);
+
+  void setFloat64(int byteOffset, double value);
+
+  void setFloat64(int byteOffset, double value, boolean littleEndian);
+
+  void setInt16(int byteOffset, short value);
+
+  void setInt16(int byteOffset, short value, boolean littleEndian);
+
+  void setInt32(int byteOffset, int value);
+
+  void setInt32(int byteOffset, int value, boolean littleEndian);
+
+  void setInt8();
+
+  void setUint16(int byteOffset, int value);
+
+  void setUint16(int byteOffset, int value, boolean littleEndian);
+
+  void setUint32(int byteOffset, int value);
+
+  void setUint32(int byteOffset, int value, boolean littleEndian);
+
+  void setUint8();
+}
diff --git a/elemental/src/elemental/html/Database.java b/elemental/src/elemental/html/Database.java
new file mode 100644
index 0000000..70077d7
--- /dev/null
+++ b/elemental/src/elemental/html/Database.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><p>This content covers features introduced in <a rel="custom" href="https://developer.mozilla.org/en/Firefox_3_for_developers">Firefox 3</a>.</p></div>
+<p></p>
+<p>This document provides a high-level overview of the overall database design of the <a title="en/Places" rel="internal" href="https://developer.mozilla.org/en/Places">Places</a> system. Places is designed to be a complete replacement for the Firefox bookmarks and history systems using <a title="en/Storage" rel="internal" href="https://developer.mozilla.org/en/Storage">Storage.</a></p>
+<p>View the <a class=" external" rel="external" href="http://people.mozilla.org/~dietrich/places-erd.png" title="http://people.mozilla.org/~dietrich/places-erd.png" target="_blank">schema diagram</a>.</p>
+  */
+public interface Database {
+
+  String getVersion();
+
+  void changeVersion(String oldVersion, String newVersion);
+
+  void changeVersion(String oldVersion, String newVersion, SQLTransactionCallback callback);
+
+  void changeVersion(String oldVersion, String newVersion, SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback);
+
+  void changeVersion(String oldVersion, String newVersion, SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback);
+
+  void readTransaction(SQLTransactionCallback callback);
+
+  void readTransaction(SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback);
+
+  void readTransaction(SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback);
+
+  void transaction(SQLTransactionCallback callback);
+
+  void transaction(SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback);
+
+  void transaction(SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback);
+}
diff --git a/elemental/src/elemental/html/DatabaseCallback.java b/elemental/src/elemental/html/DatabaseCallback.java
new file mode 100644
index 0000000..71debcb
--- /dev/null
+++ b/elemental/src/elemental/html/DatabaseCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface DatabaseCallback {
+  boolean onDatabaseCallback(Object database);
+}
diff --git a/elemental/src/elemental/html/DatabaseSync.java b/elemental/src/elemental/html/DatabaseSync.java
new file mode 100644
index 0000000..29c38ff
--- /dev/null
+++ b/elemental/src/elemental/html/DatabaseSync.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong>
+<div>This page is not complete.</div>
+</div>
+
+<p></p>
+<p>The <code>DatabaseSync</code> interface in the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB API</a> represents a synchronous <a title="en/IndexedDB#gloss database connection" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_database_connection">connection to a database</a>.</p>
+  */
+public interface DatabaseSync {
+
+  String getLastErrorMessage();
+
+
+  /**
+    * The version of the connected database. Has the null value when the database is first created.
+    */
+  String getVersion();
+
+  void changeVersion(String oldVersion, String newVersion);
+
+  void changeVersion(String oldVersion, String newVersion, SQLTransactionSyncCallback callback);
+
+  void readTransaction(SQLTransactionSyncCallback callback);
+
+
+  /**
+    * <p>Creates and returns a transaction, acquiring locks on the given database objects, within the specified timeout duration, if possible.</p>
+<pre>IDBTransactionSync transaction (
+  in optional DOMStringList storeNames,
+  in optional unsigned int timeout
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_20"><span id="Parameters_5"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>storeNames</dt> <dd>The names of object stores and indexes in the scope of the new transaction.</dd> <dt>timeout</dt> <dd>The interval that this operation is allowed to take to acquire locks on all the objects stores and indexes identified in <code>storeNames</code>.</dd>
+</dl>
+</div><div id="section_21"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/TransactionSync" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionSync">IDBTransactionSync</a></code></dt> <dd>An object to access the newly created transaction.</dd>
+</dl>
+</div><div id="section_22"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an IDBDatabaseException with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#TIMEOUT ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TIMEOUT_ERR">TIMEOUT_ERR</a></code></dt> <dd>If reserving all the database objects identified in <code>storeNames</code> takes longer than the <code>timeout</code> interval.</dd>
+</dl></div>
+    */
+  void transaction(SQLTransactionSyncCallback callback);
+}
diff --git a/elemental/src/elemental/html/DedicatedWorkerGlobalScope.java b/elemental/src/elemental/html/DedicatedWorkerGlobalScope.java
new file mode 100644
index 0000000..c326d7c
--- /dev/null
+++ b/elemental/src/elemental/html/DedicatedWorkerGlobalScope.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.util.Indexable;
+import elemental.events.EventListener;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DedicatedWorkerGlobalScope extends WorkerGlobalScope {
+
+  EventListener getOnmessage();
+
+  void setOnmessage(EventListener arg);
+
+  void postMessage(Object message);
+
+  void postMessage(Object message, Indexable messagePorts);
+
+  void webkitPostMessage(Object message);
+
+  void webkitPostMessage(Object message, Indexable transferList);
+}
diff --git a/elemental/src/elemental/html/DelayNode.java b/elemental/src/elemental/html/DelayNode.java
new file mode 100644
index 0000000..072e00f
--- /dev/null
+++ b/elemental/src/elemental/html/DelayNode.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DelayNode extends AudioNode {
+
+  AudioParam getDelayTime();
+}
diff --git a/elemental/src/elemental/html/DeprecatedPeerConnection.java b/elemental/src/elemental/html/DeprecatedPeerConnection.java
new file mode 100644
index 0000000..e0fac8c
--- /dev/null
+++ b/elemental/src/elemental/html/DeprecatedPeerConnection.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.MediaStream;
+import elemental.events.EventListener;
+import elemental.dom.MediaStreamList;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DeprecatedPeerConnection extends EventTarget {
+
+    static final int ACTIVE = 2;
+
+    static final int CLOSED = 3;
+
+    static final int NEGOTIATING = 1;
+
+    static final int NEW = 0;
+
+  MediaStreamList getLocalStreams();
+
+  EventListener getOnaddstream();
+
+  void setOnaddstream(EventListener arg);
+
+  EventListener getOnconnecting();
+
+  void setOnconnecting(EventListener arg);
+
+  EventListener getOnmessage();
+
+  void setOnmessage(EventListener arg);
+
+  EventListener getOnopen();
+
+  void setOnopen(EventListener arg);
+
+  EventListener getOnremovestream();
+
+  void setOnremovestream(EventListener arg);
+
+  EventListener getOnstatechange();
+
+  void setOnstatechange(EventListener arg);
+
+  int getReadyState();
+
+  MediaStreamList getRemoteStreams();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  void addStream(MediaStream stream);
+
+  void close();
+
+  boolean dispatchEvent(Event event);
+
+  void processSignalingMessage(String message);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  void removeStream(MediaStream stream);
+
+  void send(String text);
+}
diff --git a/elemental/src/elemental/html/DetailsElement.java b/elemental/src/elemental/html/DetailsElement.java
new file mode 100644
index 0000000..59c0edf
--- /dev/null
+++ b/elemental/src/elemental/html/DetailsElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The HTML <em>details</em> element (<code>&lt;details&gt;</code>) is used as a disclosure widget from which the user the retrieve additional information.
+  */
+public interface DetailsElement extends Element {
+
+
+  /**
+    * This Boolean attribute indicates whether the details will be shown to the user on page load. If omitted the details will be hidden.
+    */
+  boolean isOpen();
+
+  void setOpen(boolean arg);
+}
diff --git a/elemental/src/elemental/html/DirectoryElement.java b/elemental/src/elemental/html/DirectoryElement.java
new file mode 100644
index 0000000..8b685a6
--- /dev/null
+++ b/elemental/src/elemental/html/DirectoryElement.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Obsolete
+  */
+public interface DirectoryElement extends Element {
+
+
+  /**
+    * This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn't work in all browsers. <div class="note"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it has been deprecated: the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/dir">&lt;dir&gt;</a></code>
+ element should be styled using <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a>. To give a similar effect than the <span>compact</span> attribute, the <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a> property <a title="en/CSS/line-height" rel="internal" href="https://developer.mozilla.org/en/CSS/line-height">line-height</a> can be used with a value of <span>80%</span>.</div>
+    */
+  boolean isCompact();
+
+  void setCompact(boolean arg);
+}
diff --git a/elemental/src/elemental/html/DirectoryEntry.java b/elemental/src/elemental/html/DirectoryEntry.java
new file mode 100644
index 0000000..f41bb78
--- /dev/null
+++ b/elemental/src/elemental/html/DirectoryEntry.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong> <div>This page is not complete.</div>
+</div>
+<p>The <code>DirectoryEntry</code> interface of the <a title="en/DOM/File_API/File_System_API" rel="internal" href="https://developer.mozilla.org/en/DOM/File_API/File_System_API">FileSystem API</a> represents a directory in a file system.</p>
+  */
+public interface DirectoryEntry extends Entry {
+
+
+  /**
+    * <p>Creates a new DirectoryReader to read entries from this Directory.</p>
+<pre>void getMetada ();</pre> <div id="section_7"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>DirectoryReader</code></dt>
+</dl> </div>
+    */
+  DirectoryReader createReader();
+
+
+  /**
+    * <p>Creates or looks up a directory.</p>
+<pre>void vopyTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_12"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getDirectory must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getDirectory must create it as a zero-length file and return a corresponding getDirectory. </li> <li>If create is not true and the path doesn't exist, getDirectory must fail. </li> <li>If create is not true and the path exists, but is a directory, getDirectory must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a getDirectory corresponding to path.</li>
+</ul> <dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+ </div><div id="section_13"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void getDirectory(String path);
+
+
+  /**
+    * <p>Creates or looks up a directory.</p>
+<pre>void vopyTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_12"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getDirectory must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getDirectory must create it as a zero-length file and return a corresponding getDirectory. </li> <li>If create is not true and the path doesn't exist, getDirectory must fail. </li> <li>If create is not true and the path exists, but is a directory, getDirectory must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a getDirectory corresponding to path.</li>
+</ul> <dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+ </div><div id="section_13"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void getDirectory(String path, Object flags);
+
+
+  /**
+    * <p>Creates or looks up a directory.</p>
+<pre>void vopyTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_12"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getDirectory must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getDirectory must create it as a zero-length file and return a corresponding getDirectory. </li> <li>If create is not true and the path doesn't exist, getDirectory must fail. </li> <li>If create is not true and the path exists, but is a directory, getDirectory must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a getDirectory corresponding to path.</li>
+</ul> <dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+ </div><div id="section_13"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void getDirectory(String path, Object flags, EntryCallback successCallback);
+
+
+  /**
+    * <p>Creates or looks up a directory.</p>
+<pre>void vopyTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_12"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getDirectory must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getDirectory must create it as a zero-length file and return a corresponding getDirectory. </li> <li>If create is not true and the path doesn't exist, getDirectory must fail. </li> <li>If create is not true and the path exists, but is a directory, getDirectory must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a getDirectory corresponding to path.</li>
+</ul> <dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+ </div><div id="section_13"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void getDirectory(String path, Object flags, EntryCallback successCallback, ErrorCallback errorCallback);
+
+
+  /**
+    * <p>Creates or looks up a file.</p>
+<pre>void moveTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_9"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getFile must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getFile must create it as a zero-length file and return a corresponding FileEntry. </li> <li>If create is not true and the path doesn't exist, getFile must fail. </li> <li>If create is not true and the path exists, but is a directory, getFile must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a FileEntry corresponding to path.</li>
+</ul>
+<dl> <dt>successCallback</dt> <dd>A callback that is called to return the file selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id="section_10"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void getFile(String path);
+
+
+  /**
+    * <p>Creates or looks up a file.</p>
+<pre>void moveTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_9"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getFile must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getFile must create it as a zero-length file and return a corresponding FileEntry. </li> <li>If create is not true and the path doesn't exist, getFile must fail. </li> <li>If create is not true and the path exists, but is a directory, getFile must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a FileEntry corresponding to path.</li>
+</ul>
+<dl> <dt>successCallback</dt> <dd>A callback that is called to return the file selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id="section_10"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void getFile(String path, Object flags);
+
+
+  /**
+    * <p>Creates or looks up a file.</p>
+<pre>void moveTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_9"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getFile must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getFile must create it as a zero-length file and return a corresponding FileEntry. </li> <li>If create is not true and the path doesn't exist, getFile must fail. </li> <li>If create is not true and the path exists, but is a directory, getFile must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a FileEntry corresponding to path.</li>
+</ul>
+<dl> <dt>successCallback</dt> <dd>A callback that is called to return the file selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id="section_10"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void getFile(String path, Object flags, EntryCallback successCallback);
+
+
+  /**
+    * <p>Creates or looks up a file.</p>
+<pre>void moveTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_9"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getFile must fail.</li> <li> If create is true, the path doesn't exist, and no other error occurs, getFile must create it as a zero-length file and return a corresponding FileEntry. </li> <li>If create is not true and the path doesn't exist, getFile must fail. </li> <li>If create is not true and the path exists, but is a directory, getFile must fail. </li> <li>Otherwise, if no other error occurs, getFile must return a FileEntry corresponding to path.</li>
+</ul>
+<dl> <dt>successCallback</dt> <dd>A callback that is called to return the file selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id="section_10"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void getFile(String path, Object flags, EntryCallback successCallback, ErrorCallback errorCallback);
+
+
+  /**
+    * <p>Deletes a directory and all of its contents, if any. If you are deleting a directory that contains a file that cannot be removed, some of the contents of the directory might be deleted. You cannot delete the root directory of a file system.</p>
+<pre>DOMString toURL (
+  <em>(in </em>VoidCallback successCallback, optional ErrorCallback errorCallback<em>);</em>
+);</pre>
+<div id="section_15"><span id="Parameter_3"></span><h5 class="editable">Parameter</h5>
+<dl>
+<dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl> </div><div id="section_16"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void removeRecursively(VoidCallback successCallback);
+
+
+  /**
+    * <p>Deletes a directory and all of its contents, if any. If you are deleting a directory that contains a file that cannot be removed, some of the contents of the directory might be deleted. You cannot delete the root directory of a file system.</p>
+<pre>DOMString toURL (
+  <em>(in </em>VoidCallback successCallback, optional ErrorCallback errorCallback<em>);</em>
+);</pre>
+<div id="section_15"><span id="Parameter_3"></span><h5 class="editable">Parameter</h5>
+<dl>
+<dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl> </div><div id="section_16"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void removeRecursively(VoidCallback successCallback, ErrorCallback errorCallback);
+}
diff --git a/elemental/src/elemental/html/DirectoryEntrySync.java b/elemental/src/elemental/html/DirectoryEntrySync.java
new file mode 100644
index 0000000..b9a8bf7
--- /dev/null
+++ b/elemental/src/elemental/html/DirectoryEntrySync.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong> <div>This page is not complete.</div>
+</div>
+<p>The <code>DirectoryEntry</code> interface of the <a title="en/DOM/File_API/File_System_API" rel="internal" href="https://developer.mozilla.org/en/DOM/File_API/File_System_API">FileSystem API</a> represents a directory in a file system.</p>
+  */
+public interface DirectoryEntrySync extends EntrySync {
+
+
+  /**
+    * <p>Creates a new DirectoryReader to read entries from this Directory.</p>
+<pre>void getMetada ();</pre>
+<div id="section_6"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>DirectoryReader</code></dt>
+</dl>
+</div>
+    */
+  DirectoryReaderSync createReader();
+
+
+  /**
+    * <p>Creates or looks up a directory.</p>
+<pre>void vopyTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_11"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getDirectory must fail.</li> <li>If create is true, the path doesn't exist, and no other error occurs, getDirectory must create it as a zero-length file and return a corresponding getDirectory.</li> <li>If create is not true and the path doesn't exist, getDirectory must fail.</li> <li>If create is not true and the path exists, but is a directory, getDirectory must fail.</li> <li>Otherwise, if no other error occurs, getFile must return a getDirectory corresponding to path.</li>
+</ul>
+<dt>successCallback</dt>
+<dd>A callback that is called to return the DirectoryEntry selected or created.</dd>
+<dt>errorCallback</dt>
+<dd>A callback that is called when errors happen.</dd>
+</div><div id="section_12"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  DirectoryEntrySync getDirectory(String path, Object flags);
+
+
+  /**
+    * <p>Creates or looks up a file.</p>
+<pre>void moveTo (
+  <em>(in DOMString path, optional Flags options, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_8"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>path</dt> <dd>Either an absolute path or a relative path from this DirectoryEntry to the file to be looked up or created. It is an error to attempt to create a file whose immediate parent does not yet exist.</dd> <dt>options</dt>
+</dl>
+<ul> <li>If create and exclusive are both true, and the path already exists, getFile must fail.</li> <li>If create is true, the path doesn't exist, and no other error occurs, getFile must create it as a zero-length file and return a corresponding FileEntry.</li> <li>If create is not true and the path doesn't exist, getFile must fail.</li> <li>If create is not true and the path exists, but is a directory, getFile must fail.</li> <li>Otherwise, if no other error occurs, getFile must return a FileEntry corresponding to path.</li>
+</ul>
+<dl> <dt>successCallback</dt> <dd>A callback that is called to return the file selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_9"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  FileEntrySync getFile(String path, Object flags);
+
+
+  /**
+    * <p>Deletes a directory and all of its contents, if any. If you are deleting a directory that contains a file that cannot be removed, some of the contents of the directory might be deleted. You cannot delete the root directory of a file system.</p>
+<pre>DOMString toURL (
+  <em>(in </em>VoidCallback successCallback, optional ErrorCallback errorCallback<em>);</em>
+);</pre>
+<div id="section_14"><span id="Parameter_3"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called to return the DirectoryEntry selected or created.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_15"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void removeRecursively();
+}
diff --git a/elemental/src/elemental/html/DirectoryReader.java b/elemental/src/elemental/html/DirectoryReader.java
new file mode 100644
index 0000000..177214f
--- /dev/null
+++ b/elemental/src/elemental/html/DirectoryReader.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>`DRAFT</strong> <div>This page is not complete.</div>
+</div>
+<p>The <code>DirectoryReader</code> interface of the <a title="en/DOM/File_API/File_System_API" rel="internal" href="https://developer.mozilla.org/en/DOM/File_API/File_System_API">FileSystem API</a> lets a user list files and directories in a directory.</p>
+  */
+public interface DirectoryReader {
+
+  void readEntries(EntriesCallback successCallback);
+
+  void readEntries(EntriesCallback successCallback, ErrorCallback errorCallback);
+}
diff --git a/elemental/src/elemental/html/DirectoryReaderSync.java b/elemental/src/elemental/html/DirectoryReaderSync.java
new file mode 100644
index 0000000..a624e4a
--- /dev/null
+++ b/elemental/src/elemental/html/DirectoryReaderSync.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>`DRAFT</strong> <div>This page is not complete.</div>
+</div>
+<p>The <code>DirectoryReaderSync</code> interface of the <a title="en/DOM/File_API/File_System_API" rel="internal" href="https://developer.mozilla.org/en/DOM/File_API/File_System_API">FileSystem API</a> lets a user list files and directories in a directory.</p>
+  */
+public interface DirectoryReaderSync {
+
+  EntryArraySync readEntries();
+}
diff --git a/elemental/src/elemental/html/DivElement.java b/elemental/src/elemental/html/DivElement.java
new file mode 100644
index 0000000..33beae6
--- /dev/null
+++ b/elemental/src/elemental/html/DivElement.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM&nbsp;div (document division) objects expose the <a title="http://www.w3.org/TR/html5/grouping-content.html#htmldivelement" class=" external" rel="external nofollow" href="http://www.w3.org/TR/html5/grouping-content.html#htmldivelement" target="_blank">HTMLDivElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" rel="external nofollow" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-22445964" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-22445964" target="_blank"><code>HTMLDivElement</code></a>) interface, which provides special properties (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating div elements. In 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>, this interface inherits from HTMLElement, but defines no additional members.
+  */
+public interface DivElement extends Element {
+
+
+  /**
+    * Enumerated attribute indicating alignment of the element's contents with respect to the surrounding context.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+}
diff --git a/elemental/src/elemental/html/DynamicsCompressorNode.java b/elemental/src/elemental/html/DynamicsCompressorNode.java
new file mode 100644
index 0000000..c22d5e6
--- /dev/null
+++ b/elemental/src/elemental/html/DynamicsCompressorNode.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface DynamicsCompressorNode extends AudioNode {
+
+  AudioParam getAttack();
+
+  AudioParam getKnee();
+
+  AudioParam getRatio();
+
+  AudioParam getReduction();
+
+  AudioParam getRelease();
+
+  AudioParam getThreshold();
+}
diff --git a/elemental/src/elemental/html/EXTTextureFilterAnisotropic.java b/elemental/src/elemental/html/EXTTextureFilterAnisotropic.java
new file mode 100644
index 0000000..628abd8
--- /dev/null
+++ b/elemental/src/elemental/html/EXTTextureFilterAnisotropic.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface EXTTextureFilterAnisotropic {
+
+    static final int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
+
+    static final int TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;
+}
diff --git a/elemental/src/elemental/html/EmbedElement.java b/elemental/src/elemental/html/EmbedElement.java
new file mode 100644
index 0000000..61efa18
--- /dev/null
+++ b/elemental/src/elemental/html/EmbedElement.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.svg.SVGDocument;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <strong>Note:</strong>&nbsp;This topic describes the HTMLEmbedElement interface as defined in the HTML5 standard. It does not address earlier, non-standardized version of the interface.
+  */
+public interface EmbedElement extends Element {
+
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/embed#attr-height">height</a></code>
+ HTML&nbsp;attribute, containing the displayed height of the resource.
+    */
+  String getHeight();
+
+  void setHeight(String arg);
+
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/embed#attr-src">src</a></code>
+ HTML&nbsp;attribute, containing the address of the resource.
+    */
+  String getSrc();
+
+  void setSrc(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/embed#attr-type">type</a></code>
+ HTML&nbsp;attribute, containing the type of the resource.
+    */
+  String getType();
+
+  void setType(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/embed#attr-width">width</a></code>
+ HTML&nbsp;attribute, containing the displayed width of the resource.
+    */
+  String getWidth();
+
+  void setWidth(String arg);
+
+  SVGDocument getSVGDocument();
+}
diff --git a/elemental/src/elemental/html/EntriesCallback.java b/elemental/src/elemental/html/EntriesCallback.java
new file mode 100644
index 0000000..c4ab044
--- /dev/null
+++ b/elemental/src/elemental/html/EntriesCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface EntriesCallback {
+  boolean onEntriesCallback(EntryArray entries);
+}
diff --git a/elemental/src/elemental/html/Entry.java b/elemental/src/elemental/html/Entry.java
new file mode 100644
index 0000000..a368f60
--- /dev/null
+++ b/elemental/src/elemental/html/Entry.java
@@ -0,0 +1,327 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong> <div>This page is not complete.</div>
+</div>
+<p>The <code>Entry</code> interface of the <a title="en/DOM/File_API/File_System_API" rel="internal" href="https://developer.mozilla.org/en/DOM/File_API/File_System_API">FileSystem API</a> represents entries in a file system. The entries can be a file&nbsp;or a <a href="https://developer.mozilla.org/en/DOM/File_API/File_system_API/DirectoryEntry" rel="internal" title="en/DOM/File_API/File_system_API/DirectoryEntry">DirectoryEntry</a>.</p>
+  */
+public interface Entry {
+
+
+  /**
+    * The file system on which the entry resides.
+    */
+  DOMFileSystem getFilesystem();
+
+  String getFullPath();
+
+
+  /**
+    * The entry is a directory.
+    */
+  boolean isDirectory();
+
+
+  /**
+    * The entry is a file.
+    */
+  boolean isFile();
+
+
+  /**
+    * The name of the entry, excluding the path leading to it.
+    */
+  String getName();
+
+
+  /**
+    * <p>Copy an entry to a different location on the file system. You cannot copy an entry inside itself if it is a directory nor can you copy it into its parent if a name different from its current one isn't provided. Directory copies are always recursive—that is, they copy all contents of the directory.</p>
+<pre>void vopyTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_12"><span id="Parameter_3"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_13"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void copyTo(DirectoryEntry parent);
+
+
+  /**
+    * <p>Copy an entry to a different location on the file system. You cannot copy an entry inside itself if it is a directory nor can you copy it into its parent if a name different from its current one isn't provided. Directory copies are always recursive—that is, they copy all contents of the directory.</p>
+<pre>void vopyTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_12"><span id="Parameter_3"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_13"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void copyTo(DirectoryEntry parent, String name);
+
+
+  /**
+    * <p>Copy an entry to a different location on the file system. You cannot copy an entry inside itself if it is a directory nor can you copy it into its parent if a name different from its current one isn't provided. Directory copies are always recursive—that is, they copy all contents of the directory.</p>
+<pre>void vopyTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_12"><span id="Parameter_3"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_13"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void copyTo(DirectoryEntry parent, String name, EntryCallback successCallback);
+
+
+  /**
+    * <p>Copy an entry to a different location on the file system. You cannot copy an entry inside itself if it is a directory nor can you copy it into its parent if a name different from its current one isn't provided. Directory copies are always recursive—that is, they copy all contents of the directory.</p>
+<pre>void vopyTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_12"><span id="Parameter_3"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_13"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void copyTo(DirectoryEntry parent, String name, EntryCallback successCallback, ErrorCallback errorCallback);
+
+
+  /**
+    * <p>Look up metadata about this entry.</p>
+<pre>void getMetada (
+  in MetadataCallback ErrorCallback
+);</pre>
+<div id="section_6"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the time of the last modification.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_7"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void getMetadata(MetadataCallback successCallback);
+
+
+  /**
+    * <p>Look up metadata about this entry.</p>
+<pre>void getMetada (
+  in MetadataCallback ErrorCallback
+);</pre>
+<div id="section_6"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the time of the last modification.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_7"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void getMetadata(MetadataCallback successCallback, ErrorCallback errorCallback);
+
+
+  /**
+    * <p>Look up the parent <code>DirectoryEntry</code> containing this entry. If this entry is the root of its filesystem, its parent is itself.</p>
+<pre>void getParent (
+  <em>(in EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_21"><span id="Parameter_6"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCellback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_22"><span id="Returns_6"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void getParent();
+
+
+  /**
+    * <p>Look up the parent <code>DirectoryEntry</code> containing this entry. If this entry is the root of its filesystem, its parent is itself.</p>
+<pre>void getParent (
+  <em>(in EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_21"><span id="Parameter_6"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCellback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_22"><span id="Returns_6"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void getParent(EntryCallback successCallback);
+
+
+  /**
+    * <p>Look up the parent <code>DirectoryEntry</code> containing this entry. If this entry is the root of its filesystem, its parent is itself.</p>
+<pre>void getParent (
+  <em>(in EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_21"><span id="Parameter_6"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCellback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_22"><span id="Returns_6"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void getParent(EntryCallback successCallback, ErrorCallback errorCallback);
+
+
+  /**
+    * <p>Move an entry to a different location on the file system. You cannot do the following:</p>
+<ul> <li>move a directory inside itself or to any child at any depth;</li> <li>move an entry into its parent if a name different from its current one isn't provided;</li> <li>move a file to a path occupied by a directory;</li> <li>move a directory to a path occupied by a file;</li> <li>move any element to a path occupied by a directory which is not empty.</li>
+</ul>
+<p>Moving a file over an existing file&nbsp;replaces that existing file. A move of a directory on top of an existing empty directory&nbsp;replaces that directory.</p>
+<pre>void moveTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_9"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_10"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void moveTo(DirectoryEntry parent);
+
+
+  /**
+    * <p>Move an entry to a different location on the file system. You cannot do the following:</p>
+<ul> <li>move a directory inside itself or to any child at any depth;</li> <li>move an entry into its parent if a name different from its current one isn't provided;</li> <li>move a file to a path occupied by a directory;</li> <li>move a directory to a path occupied by a file;</li> <li>move any element to a path occupied by a directory which is not empty.</li>
+</ul>
+<p>Moving a file over an existing file&nbsp;replaces that existing file. A move of a directory on top of an existing empty directory&nbsp;replaces that directory.</p>
+<pre>void moveTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_9"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_10"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void moveTo(DirectoryEntry parent, String name);
+
+
+  /**
+    * <p>Move an entry to a different location on the file system. You cannot do the following:</p>
+<ul> <li>move a directory inside itself or to any child at any depth;</li> <li>move an entry into its parent if a name different from its current one isn't provided;</li> <li>move a file to a path occupied by a directory;</li> <li>move a directory to a path occupied by a file;</li> <li>move any element to a path occupied by a directory which is not empty.</li>
+</ul>
+<p>Moving a file over an existing file&nbsp;replaces that existing file. A move of a directory on top of an existing empty directory&nbsp;replaces that directory.</p>
+<pre>void moveTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_9"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_10"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void moveTo(DirectoryEntry parent, String name, EntryCallback successCallback);
+
+
+  /**
+    * <p>Move an entry to a different location on the file system. You cannot do the following:</p>
+<ul> <li>move a directory inside itself or to any child at any depth;</li> <li>move an entry into its parent if a name different from its current one isn't provided;</li> <li>move a file to a path occupied by a directory;</li> <li>move a directory to a path occupied by a file;</li> <li>move any element to a path occupied by a directory which is not empty.</li>
+</ul>
+<p>Moving a file over an existing file&nbsp;replaces that existing file. A move of a directory on top of an existing empty directory&nbsp;replaces that directory.</p>
+<pre>void moveTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_9"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_10"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void moveTo(DirectoryEntry parent, String name, EntryCallback successCallback, ErrorCallback errorCallback);
+
+
+  /**
+    * <p>Deletes a file or directory. You cannot delete an empty directory or the root directory of a filesystem.</p>
+<pre>void remove (
+  <em>(in VoidCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_18"><span id="Parameter_5"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_19"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void remove(VoidCallback successCallback);
+
+
+  /**
+    * <p>Deletes a file or directory. You cannot delete an empty directory or the root directory of a filesystem.</p>
+<pre>void remove (
+  <em>(in VoidCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_18"><span id="Parameter_5"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_19"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void remove(VoidCallback successCallback, ErrorCallback errorCallback);
+
+
+  /**
+    * <p>Returns a URL that can be used to identify this entry. It has no specific expiration. Bcause it describes a location on disk, it is valid for as long as that location exists. Users can supply&nbsp;<code>mimeType</code>&nbsp;to simulate the optional mime-type header associated with HTTP downloads.</p>
+<pre>DOMString toURL (
+  <em>(in </em>optional DOMString mimeType<em>);</em>
+);</pre>
+<div id="section_15"><span id="Parameter_4"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>mimeType</dt> <dd>For a FileEntry, the mime type to be used to interpret the file, when loaded through this URL.</dd>
+</dl>
+</div><div id="section_16"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>DOMString</code></dt>
+</dl>
+</div>
+    */
+  String toURL();
+}
diff --git a/elemental/src/elemental/html/EntryArray.java b/elemental/src/elemental/html/EntryArray.java
new file mode 100644
index 0000000..18db383
--- /dev/null
+++ b/elemental/src/elemental/html/EntryArray.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface EntryArray {
+
+  int getLength();
+
+  Entry item(int index);
+}
diff --git a/elemental/src/elemental/html/EntryArraySync.java b/elemental/src/elemental/html/EntryArraySync.java
new file mode 100644
index 0000000..83dd62b
--- /dev/null
+++ b/elemental/src/elemental/html/EntryArraySync.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface EntryArraySync {
+
+  int getLength();
+
+  EntrySync item(int index);
+}
diff --git a/elemental/src/elemental/html/EntryCallback.java b/elemental/src/elemental/html/EntryCallback.java
new file mode 100644
index 0000000..4f8e6dd
--- /dev/null
+++ b/elemental/src/elemental/html/EntryCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface EntryCallback {
+  boolean onEntryCallback(Entry entry);
+}
diff --git a/elemental/src/elemental/html/EntrySync.java b/elemental/src/elemental/html/EntrySync.java
new file mode 100644
index 0000000..632c8b0
--- /dev/null
+++ b/elemental/src/elemental/html/EntrySync.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong> <div>This page is not complete.</div>
+</div>
+<p>The <code>EntrySync</code> interface of the <a title="en/DOM/File_API/File_System_API" rel="internal" href="https://developer.mozilla.org/en/DOM/File_API/File_System_API">FileSystem API</a> represents entries in a file system. The entries can be a file&nbsp;or a <a href="https://developer.mozilla.org/en/DOM/File_API/File_system_API/DirectoryEntry" rel="internal" title="en/DOM/File_API/File_system_API/DirectoryEntry">DirectoryEntry</a>.</p>
+  */
+public interface EntrySync {
+
+  DOMFileSystemSync getFilesystem();
+
+  String getFullPath();
+
+  boolean isDirectory();
+
+  boolean isFile();
+
+  String getName();
+
+
+  /**
+    * <p>Copy an entry to a different location on the file system. You cannot copy an entry inside itself if it is a directory nor can you copy it into its parent if a name different from its current one isn't provided. Directory copies are always recursive—that is, they copy all contents of the directory.</p>
+<pre>void vopyTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_10"><span id="Parameter_3"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_11"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  EntrySync copyTo(DirectoryEntrySync parent, String name);
+
+
+  /**
+    * <p>Look up metadata about this entry.</p>
+<pre>void getMetada (
+  in MetadataCallback ErrorCallback
+);</pre>
+<div id="section_4"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the time of the last modification.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_5"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  Metadata getMetadata();
+
+
+  /**
+    * <p>Look up the parent <code>DirectoryEntry</code> containing this entry. If this entry is the root of its filesystem, its parent is itself.</p>
+<pre>void getParent (
+  <em>(in EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_19"><span id="Parameter_6"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCellback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_20"><span id="Returns_6"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  EntrySync getParent();
+
+
+  /**
+    * <p>Move an entry to a different location on the file system. You cannot do the following:</p>
+<ul> <li>move a directory inside itself or to any child at any depth;</li> <li>move an entry into its parent if a name different from its current one isn't provided;</li> <li>move a file to a path occupied by a directory;</li> <li>move a directory to a path occupied by a file;</li> <li>move any element to a path occupied by a directory which is not empty.</li>
+</ul>
+<p>Moving a file over an existing file&nbsp;replaces that existing file. A move of a directory on top of an existing empty directory&nbsp;replaces that directory.</p>
+<pre>void moveTo (
+  <em>(in DirectoryEntry parent, optional DOMString newName, optional EntryCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_7"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>parent</dt> <dd>The directory to which to move the entry.</dd> <dt>newName</dt> <dd>The new name of the entry. Defaults to the entry's current name if unspecified.</dd> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_8"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  EntrySync moveTo(DirectoryEntrySync parent, String name);
+
+
+  /**
+    * <p>Deletes a file or directory. You cannot delete an empty directory or the root directory of a filesystem.</p>
+<pre>void remove (
+  <em>(in VoidCallback successCallback, optional ErrorCallback errorCallback);</em>
+);</pre>
+<div id="section_16"><span id="Parameter_5"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the entry for the new object.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_17"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void remove();
+
+
+  /**
+    * <p>Returns a URL that can be used to identify this entry. It has no specific expiration. Bcause it describes a location on disk, it is valid for as long as that location exists. Users can supply&nbsp;<code>mimeType</code>&nbsp;to simulate the optional mime-type header associated with HTTP downloads.</p>
+<pre>DOMString toURL (
+  <em>(in </em>optional DOMString mimeType<em>);</em>
+);</pre>
+<div id="section_13"><span id="Parameter_4"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>mimeType</dt> <dd>For a FileEntry, the mime type to be used to interpret the file, when loaded through this URL.</dd>
+</dl>
+</div><div id="section_14"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>DOMString</code></dt>
+</dl>
+</div>
+    */
+  String toURL();
+}
diff --git a/elemental/src/elemental/html/ErrorCallback.java b/elemental/src/elemental/html/ErrorCallback.java
new file mode 100644
index 0000000..14caf5d
--- /dev/null
+++ b/elemental/src/elemental/html/ErrorCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface ErrorCallback {
+  boolean onErrorCallback(FileError error);
+}
diff --git a/elemental/src/elemental/html/EventSource.java b/elemental/src/elemental/html/EventSource.java
new file mode 100644
index 0000000..c73463d
--- /dev/null
+++ b/elemental/src/elemental/html/EventSource.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>EventSource</code> interface is used to manage server-sent events. You can set the onmessage attribute to a JavaScript function to receive non-typed messages (that is, messages with no <code>event</code> field). You can also call <code>addEventListener()</code> to listen for events just like any other event source.</p>
+<p>See <a title="en/Server-sent events/Using server-sent events" rel="internal" href="https://developer.mozilla.org/en/Server-sent_events/Using_server-sent_events">Using server-sent events</a> for further details.</p>
+  */
+public interface EventSource extends EventTarget {
+
+  /**
+    * The connection is not being established, has been closed or there was a fatal error.
+    */
+
+    static final int CLOSED = 2;
+
+  /**
+    * The connection is being established.
+    */
+
+    static final int CONNECTING = 0;
+
+  /**
+    * The connection is open and dispatching events.
+    */
+
+    static final int OPEN = 1;
+
+  String getURL();
+
+
+  /**
+    * A JavaScript function to call when an error occurs.
+    */
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+
+  /**
+    * A JavaScript function to call when an a message without an <code>event</code> field arrives.
+    */
+  EventListener getOnmessage();
+
+  void setOnmessage(EventListener arg);
+
+
+  /**
+    * A JavaScript function to call when the connection has opened.
+    */
+  EventListener getOnopen();
+
+  void setOnopen(EventListener arg);
+
+
+  /**
+    * The state of the connection, must be one of <code>CONNECTING</code>, <code>OPEN</code>, or <code>CLOSED</code>. <strong>Read only.</strong>
+    */
+  int getReadyState();
+
+
+  /**
+    * Read only.
+    */
+  String getUrl();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+
+  /**
+    * Closes the connection, if any, and sets the <code>readyState</code> attribute to <code>CLOSED</code>. If the connection is already closed, the method does nothing.
+    */
+  void close();
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/FieldSetElement.java b/elemental/src/elemental/html/FieldSetElement.java
new file mode 100644
index 0000000..103e57a
--- /dev/null
+++ b/elemental/src/elemental/html/FieldSetElement.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM&nbsp;<code>fieldset</code> elements expose the <a class=" external" title="http://dev.w3.org/html5/spec/forms.html#htmlfieldsetelement" rel="external" href="http://dev.w3.org/html5/spec/forms.html#htmlfieldsetelement" target="_blank">HTMLFieldSetElement</a>&nbsp; (
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-7365882" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-7365882" target="_blank">HTMLFieldSetElement</a>) interface, which provides special properties and methods (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of field-set elements.
+  */
+public interface FieldSetElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/fieldset#attr-disabled">disabled</a></code>
+ HTML&nbsp;attribute, indicating whether the user can interact with the control.
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * The elements belonging to this field set.
+    */
+  HTMLCollection getElements();
+
+
+  /**
+    * The containing form element, if this element is in a form. Otherwise, the element the <a title="en/HTML/Element/fieldset#attr-name" rel="internal" href="https://developer.mozilla.org/en/HTML/Element/fieldset#attr-name">name content attribute</a> points to 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>. (<code>null</code> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span>.)
+    */
+  FormElement getForm();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/fieldset#attr-name">name</a></code>
+ HTML&nbsp;attribute, containing the name of the field set, used for submitting the form.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Must be the string <code>fieldset</code>.
+    */
+  String getType();
+
+
+  /**
+    * A localized message that describes the validation constraints that the element does not satisfy (if any). This is the empty string if the element&nbsp; is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.
+    */
+  String getValidationMessage();
+
+
+  /**
+    * The validity states that this element is in.
+    */
+  ValidityState getValidity();
+
+
+  /**
+    * Always false because <code>fieldset</code> objects are never candidates for constraint validation.
+    */
+  boolean isWillValidate();
+
+
+  /**
+    * Always returns true because <code>fieldset</code> objects are never candidates for constraint validation.
+    */
+  boolean checkValidity();
+
+
+  /**
+    * Sets a custom validity message for the field set. If this message is not the empty string, then the field set is suffering from a custom validity error, and does not validate.
+    */
+  void setCustomValidity(String error);
+}
diff --git a/elemental/src/elemental/html/File.java b/elemental/src/elemental/html/File.java
new file mode 100644
index 0000000..1bab68c
--- /dev/null
+++ b/elemental/src/elemental/html/File.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>File</code> object provides information about -- and access to the contents of -- files. These are generally retrieved from a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/FileList">FileList</a></code>
+ object returned as a result of a user selecting files using the <code>input</code> element, or from a drag and drop operation's <a title="En/DragDrop/DataTransfer" rel="internal" href="https://developer.mozilla.org/En/DragDrop/DataTransfer"><code>DataTransfer</code></a> object.</p>
+<div class="geckoVersionNote">
+<p>
+</p><div class="geckoVersionHeading">Gecko 2.0 note<div>(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+</div></div>
+<p></p>
+<p>Starting in Gecko 2.0&nbsp;(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+, the File object inherits from the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+&nbsp;interface, which provides methods and properties providing further information about the file.</p>
+</div>
+<p>The file reference can be saved when the form is submitted while the user is offline, so that the data can be retrieved and uploaded when the Internet connection is restored.</p>
+<div class="note"><strong>Note:</strong> The <code>File</code> object as implemented by Gecko offers several non-standard methods for reading the contents of the file. These should <em>not</em> be used, as they will prevent your web application from being used in other browsers, as well as in future versions of Gecko, which will likely remove these methods.</div>
+  */
+public interface File extends Blob {
+
+  Date getLastModifiedDate();
+
+
+  /**
+    * The name of the file referenced by the <code>File</code> object. <strong>Read only.</strong> 
+<span title="(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)
+">Requires Gecko 1.9.2</span>
+    */
+  String getName();
+
+  String getWebkitRelativePath();
+}
diff --git a/elemental/src/elemental/html/FileCallback.java b/elemental/src/elemental/html/FileCallback.java
new file mode 100644
index 0000000..f7f5982
--- /dev/null
+++ b/elemental/src/elemental/html/FileCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface FileCallback {
+  boolean onFileCallback(File file);
+}
diff --git a/elemental/src/elemental/html/FileEntry.java b/elemental/src/elemental/html/FileEntry.java
new file mode 100644
index 0000000..03b6852
--- /dev/null
+++ b/elemental/src/elemental/html/FileEntry.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong> <div>This page is not complete.</div>
+</div>
+<p>The <code>FileEntry</code> interface of the <a title="en/DOM/File_API/File_System_API" rel="internal" href="https://developer.mozilla.org/en/DOM/File_API/File_System_API">FileSystem API</a> represents a file in a file system.</p>
+  */
+public interface FileEntry extends Entry {
+
+
+  /**
+    * <p>Creates a new <code>FileWriter</code> associated with the file that the <code>FileEntry</code> represents.</p>
+<pre>void createWriter (
+ in FileWriterCallback successCallback, optional ErrorCallback errorCallback
+);</pre> <div id="section_4"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id="section_5"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void createWriter(FileWriterCallback successCallback);
+
+
+  /**
+    * <p>Creates a new <code>FileWriter</code> associated with the file that the <code>FileEntry</code> represents.</p>
+<pre>void createWriter (
+ in FileWriterCallback successCallback, optional ErrorCallback errorCallback
+);</pre> <div id="section_4"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id="section_5"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl> </div>
+    */
+  void createWriter(FileWriterCallback successCallback, ErrorCallback errorCallback);
+
+
+  /**
+    * <p>Returns a File that represents the current state of the file that this <code>FileEntry</code> represents.</p>
+<pre>void file (
+  <em>FileCallback successCallback, optional ErrorCallback errorCallback</em>
+);</pre>
+<div id="section_7"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id="section_8"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void file(FileCallback successCallback);
+
+
+  /**
+    * <p>Returns a File that represents the current state of the file that this <code>FileEntry</code> represents.</p>
+<pre>void file (
+  <em>FileCallback successCallback, optional ErrorCallback errorCallback</em>
+);</pre>
+<div id="section_7"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd> </dl> </div><div id="section_8"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  void file(FileCallback successCallback, ErrorCallback errorCallback);
+}
diff --git a/elemental/src/elemental/html/FileEntrySync.java b/elemental/src/elemental/html/FileEntrySync.java
new file mode 100644
index 0000000..1f12dee
--- /dev/null
+++ b/elemental/src/elemental/html/FileEntrySync.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong> <div>This page is not complete.</div>
+</div>
+<p>The <code>FileEntrySync</code>&nbsp;interface of the <a title="en/DOM/File_API/File_System_API" rel="internal" href="https://developer.mozilla.org/en/DOM/File_API/File_System_API">FileSystem API</a> represents a file in a file system.</p>
+  */
+public interface FileEntrySync extends EntrySync {
+
+
+  /**
+    * <p>Creates a new <code>FileWriter</code> associated with the file that the <code>FileEntry</code> represents.</p>
+<pre>void createWriter (
+ in FileWriterCallback successCallback, optional ErrorCallback errorCallback
+);</pre>
+<div id="section_4"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_5"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  FileWriterSync createWriter();
+
+
+  /**
+    * <p>Returns a File that represents the current state of the file that this <code>FileEntry</code> represents.</p>
+<pre>void file (
+  <em>FileCallback successCallback, optional ErrorCallback errorCallback</em>
+);</pre>
+<div id="section_7"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>successCallback</dt> <dd>A callback that is called with the new <code>FileWriter</code>.</dd> <dt>errorCallback</dt> <dd>A callback that is called when errors happen.</dd>
+</dl>
+</div><div id="section_8"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div>
+    */
+  File file();
+}
diff --git a/elemental/src/elemental/html/FileError.java b/elemental/src/elemental/html/FileError.java
new file mode 100644
index 0000000..d0091e0
--- /dev/null
+++ b/elemental/src/elemental/html/FileError.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Represents an error that occurs while using the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/FileReader">FileReader</a></code>
+ interface.
+  */
+public interface FileError {
+
+  /**
+    * The file operation was aborted, probably due to a call to the <code>FileReader</code> <code>abort()</code>&nbsp;method.
+    */
+
+    static final int ABORT_ERR = 3;
+
+  /**
+    * The file data cannot be accurately represented in a data URL.
+    */
+
+    static final int ENCODING_ERR = 5;
+
+    static final int INVALID_MODIFICATION_ERR = 9;
+
+    static final int INVALID_STATE_ERR = 7;
+
+  /**
+    * File not found.
+    */
+
+    static final int NOT_FOUND_ERR = 1;
+
+  /**
+    * File could not be read.
+    */
+
+    static final int NOT_READABLE_ERR = 4;
+
+    static final int NO_MODIFICATION_ALLOWED_ERR = 6;
+
+    static final int PATH_EXISTS_ERR = 12;
+
+    static final int QUOTA_EXCEEDED_ERR = 10;
+
+  /**
+    * The file could not be accessed for security reasons.
+    */
+
+    static final int SECURITY_ERR = 2;
+
+    static final int SYNTAX_ERR = 8;
+
+    static final int TYPE_MISMATCH_ERR = 11;
+
+
+  /**
+    * The <a title="en/nsIDOMFileError#Error codes" rel="internal" href="https://developer.mozilla.org/en/nsIDOMFileError#Error_codes">error code</a>.
+    */
+  int getCode();
+}
diff --git a/elemental/src/elemental/html/FileException.java b/elemental/src/elemental/html/FileException.java
new file mode 100644
index 0000000..fa60314
--- /dev/null
+++ b/elemental/src/elemental/html/FileException.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <strong>DRAFT</strong> <div>This page is not complete.</div>
+  */
+public interface FileException {
+
+    static final int ABORT_ERR = 3;
+
+    static final int ENCODING_ERR = 5;
+
+    static final int INVALID_MODIFICATION_ERR = 9;
+
+    static final int INVALID_STATE_ERR = 7;
+
+    static final int NOT_FOUND_ERR = 1;
+
+    static final int NOT_READABLE_ERR = 4;
+
+    static final int NO_MODIFICATION_ALLOWED_ERR = 6;
+
+    static final int PATH_EXISTS_ERR = 12;
+
+    static final int QUOTA_EXCEEDED_ERR = 10;
+
+    static final int SECURITY_ERR = 2;
+
+    static final int SYNTAX_ERR = 8;
+
+    static final int TYPE_MISMATCH_ERR = 11;
+
+  int getCode();
+
+  String getMessage();
+
+  String getName();
+}
diff --git a/elemental/src/elemental/html/FileList.java b/elemental/src/elemental/html/FileList.java
new file mode 100644
index 0000000..f2d481c
--- /dev/null
+++ b/elemental/src/elemental/html/FileList.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>An object of this type is returned by the <code>files</code> property of the HTML&nbsp;input element; this lets you access the list of files selected with the <code>&lt;input type="file"&gt;</code> element. It's also used for a list of files dropped into web content when using the drag and drop API; see the <a title="En/DragDrop/DataTransfer" rel="internal" href="https://developer.mozilla.org/En/DragDrop/DataTransfer"><code>DataTransfer</code></a> object for details on this usage.</p>
+<p>
+
+</p><div><p>Gecko 1.9.2 note</p><p>Prior to Gecko 1.9.2, the input element only supported a single file being selected at a time, meaning that the FileList would contain only one file. Starting with Gecko 1.9.2, if the input element's multiple attribute is true, the FileList may contain multiple files.</p></div>
+  */
+public interface FileList extends Indexable {
+
+
+  /**
+    * A read-only value indicating the number of files in the list.
+    */
+  int getLength();
+
+
+  /**
+    * <p>Returns a <a title="en/DOM/File" rel="internal" href="https://developer.mozilla.org/en/DOM/File"><code>File</code></a> object representing the file at the specified index in the file list.</p>
+
+<div id="section_6"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>index</code></dt> <dd>The zero-based index of the file to retrieve from the list.</dd>
+</dl>
+</div><div id="section_7"><span id="Return_value"></span><h6 class="editable">Return value</h6>
+<p>The <a title="en/DOM/File" rel="internal" href="https://developer.mozilla.org/en/DOM/File"><code>File</code></a> representing the requested file.</p>
+</div>
+    */
+  File item(int index);
+}
diff --git a/elemental/src/elemental/html/FileReader.java b/elemental/src/elemental/html/FileReader.java
new file mode 100644
index 0000000..50f8d76
--- /dev/null
+++ b/elemental/src/elemental/html/FileReader.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>FileReader</code> object lets web applications asynchronously read the contents of files (or raw data buffers) stored on the user's computer, using <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+ objects to specify the file or data to read. File objects may be obtained in one of two ways: from a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/FileList">FileList</a></code>
+ object returned as a result of a user selecting files using the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input">&lt;input&gt;</a></code>
+ element, or from a drag and drop operation's <a title="En/DragDrop/DataTransfer" rel="internal" href="https://developer.mozilla.org/En/DragDrop/DataTransfer"><code>DataTransfer</code></a> object.</p>
+<p>To create a <code>FileReader</code>, simply do the following:</p>
+<pre>var reader = new FileReader();
+</pre>
+<p>See <a title="en/Using files from web applications" rel="internal" href="https://developer.mozilla.org/en/Using_files_from_web_applications">Using files from web applications</a> for details and examples.</p>
+  */
+public interface FileReader extends EventTarget {
+
+  /**
+    * The entire read request has been completed.
+    */
+
+    static final int DONE = 2;
+
+  /**
+    * No data has been loaded yet.
+    */
+
+    static final int EMPTY = 0;
+
+  /**
+    * Data is currently being loaded.
+    */
+
+    static final int LOADING = 1;
+
+
+  /**
+    * The error that occurred while reading the file. <strong>Read only.</strong>
+    */
+  FileError getError();
+
+
+  /**
+    * Called when the read operation is aborted.
+    */
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+
+  /**
+    * Called when an error occurs.
+    */
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+
+  /**
+    * Called when the read operation is successfully completed.
+    */
+  EventListener getOnload();
+
+  void setOnload(EventListener arg);
+
+
+  /**
+    * Called when the read is completed, whether successful or not. This is called after either <code>onload</code> or <code>onerror</code>.
+    */
+  EventListener getOnloadend();
+
+  void setOnloadend(EventListener arg);
+
+
+  /**
+    * Called when reading the data is about to begin.
+    */
+  EventListener getOnloadstart();
+
+  void setOnloadstart(EventListener arg);
+
+
+  /**
+    * Called periodically while the data is being read.
+    */
+  EventListener getOnprogress();
+
+  void setOnprogress(EventListener arg);
+
+
+  /**
+    * Indicates the state of the <code>FileReader</code>. This will be one of the <a rel="custom" href="https://developer.mozilla.org/en/DOM/FileReader#State_constants">State constants</a>. <strong>Read only.</strong>
+    */
+  int getReadyState();
+
+
+  /**
+    * The file's contents. This property is only valid after the read operation is complete, and the format of the data depends on which of the methods was used to initiate the read operation. <strong>Read only.</strong>
+    */
+  Object getResult();
+
+
+  /**
+    * <p>Aborts the read operation. Upon return, the <code>readyState</code> will be <code>DONE</code>.</p>
+
+<div id="section_7"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<p>None.</p>
+</div><div id="section_8"><span id="Exceptions_thrown"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>DOM_FILE_ABORT_ERR</code></dt> <dd><code>abort()</code> was called while no read operation was in progress (that is, the state wasn't <code>LOADING</code>). <div class="note"><strong>Note:</strong>&nbsp;This exception was not thrown by Gecko until Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)
+.</div>
+</dd>
+</dl>
+<p>
+</p><div>
+<span id="readAsArrayBuffer()"></span></div></div>
+    */
+  void abort();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+
+  /**
+    * <div id="section_8"><p>Starts reading the contents of the specified <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+. When the read operation is finished, the <code>readyState</code> will become <code>DONE</code>, and the <code>onloadend</code> callback, if any, will be called. At that time, the <code>result</code> attribute contains an <code><a title="/en/JavaScript_typed_arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer">ArrayBuffer</a></code> representing the file's data.</p>
+
+</div><div id="section_9"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ to read into the <code><a title="/en/JavaScript_typed_arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer">ArrayBuffer</a></code>.</dd>
+</dl>
+</div>
+    */
+  void readAsArrayBuffer(Blob blob);
+
+
+  /**
+    * <p>Starts reading the contents of the specified <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+, which may be a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+. When the read operation is finished, the <code>readyState</code> will become <code>DONE</code>, and the <code>onloadend</code> callback, if any, will be called. At that time, the <code>result</code> attribute contains the raw binary data from the file.</p>
+
+<div id="section_11"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ from which to read.</dd>
+</dl>
+</div>
+    */
+  void readAsBinaryString(Blob blob);
+
+
+  /**
+    * <p>Starts reading the contents of the specified <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+. When the read operation is finished, the <code>readyState</code> will become <code>DONE</code>, and the <code>onloadend</code> callback, if any, will be called. At that time, the <code>result</code> attribute contains a <code>data:</code> URL representing the file's data.</p>
+
+<p>This method is useful, for example, to get a preview of an image before uploading it:</p>
+
+          <pre name="code" class="xml">&lt;!doctype html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /&gt;
+&lt;title&gt;Image preview example&lt;/title&gt;
+&lt;script type="text/javascript"&gt;
+oFReader = new FileReader(), rFilter = /^(image\/bmp|image\/cis-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x-cmu-raster|image\/x-cmx|image\/x-icon|image\/x-portable-anymap|image\/x-portable-bitmap|image\/x-portable-graymap|image\/x-portable-pixmap|image\/x-rgb|image\/x-xbitmap|image\/x-xpixmap|image\/x-xwindowdump)$/i;
+
+oFReader.onload = function (oFREvent) {
+  document.getElementById("uploadPreview").src = oFREvent.target.result;
+};
+
+function loadImageFile() {
+  if (document.getElementById("uploadImage").files.length === 0) { return; }
+  var oFile = document.getElementById("uploadImage").files[0];
+  if (!rFilter.test(oFile.type)) { alert("You must select a valid image file!"); return; }
+  oFReader.readAsDataURL(oFile);
+}
+&lt;/script&gt;
+&lt;/head&gt;
+
+&lt;body onload="loadImageFile();"&gt;
+&lt;form name="uploadForm"&gt;
+&lt;table&gt;
+&lt;tbody&gt;
+&lt;tr&gt;
+&lt;td&gt;&lt;img id="uploadPreview" style="width: 100px; height: 100px;" src="data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Csvg%20width%3D%22153%22%20height%3D%22153%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%0A%20%3Cg%3E%0A%20%20%3Ctitle%3ENo%20image%3C/title%3E%0A%20%20%3Crect%20id%3D%22externRect%22%20height%3D%22150%22%20width%3D%22150%22%20y%3D%221.5%22%20x%3D%221.500024%22%20stroke-width%3D%223%22%20stroke%3D%22%23666666%22%20fill%3D%22%23e1e1e1%22/%3E%0A%20%20%3Ctext%20transform%3D%22matrix%286.66667%2C%200%2C%200%2C%206.66667%2C%20-960.5%2C%20-1099.33%29%22%20xml%3Aspace%3D%22preserve%22%20text-anchor%3D%22middle%22%20font-family%3D%22Fantasy%22%20font-size%3D%2214%22%20id%3D%22questionMark%22%20y%3D%22181.249569%22%20x%3D%22155.549819%22%20stroke-width%3D%220%22%20stroke%3D%22%23666666%22%20fill%3D%22%23000000%22%3E%3F%3C/text%3E%0A%20%3C/g%3E%0A%3C/svg%3E" alt="Image preview" /&gt;&lt;/td&gt;
+&lt;td&gt;&lt;input id="uploadImage" type="file" name="myPhoto" onchange="loadImageFile();" /&gt;&lt;/td&gt;
+&lt;/tr&gt;
+&lt;/tbody&gt;
+&lt;/table&gt;
+&lt;p&gt;&lt;input type="submit" value="Send" /&gt;&lt;/p&gt;
+&lt;/form&gt;
+&lt;/body&gt;
+&lt;/html&gt;</pre>
+        
+<div id="section_13"><span id="Parameters_4"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>file</code></dt> <dd>The DOM <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ from which to read.</dd>
+</dl>
+</div>
+    */
+  void readAsDataURL(Blob blob);
+
+
+  /**
+    * <p>Starts reading the specified blob's contents. When the read operation is finished, the <code>readyState</code> will become <code>DONE</code>, and the <code>onloadend</code> callback, if any, will be called. At that time, the <code>result</code> attribute contains the contents of the file as a text string.</p>
+
+<div id="section_15"><span id="Parameters_5"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ from which to read.</dd> <dt><code>encoding</code> 
+<span title="">Optional</span>
+</dt> <dd>A string indicating the encoding to use for the returned data. By default, UTF-8 is assumed if this parameter is not specified.</dd>
+</dl>
+</div>
+    */
+  void readAsText(Blob blob);
+
+
+  /**
+    * <p>Starts reading the specified blob's contents. When the read operation is finished, the <code>readyState</code> will become <code>DONE</code>, and the <code>onloadend</code> callback, if any, will be called. At that time, the <code>result</code> attribute contains the contents of the file as a text string.</p>
+
+<div id="section_15"><span id="Parameters_5"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ from which to read.</dd> <dt><code>encoding</code> 
+<span title="">Optional</span>
+</dt> <dd>A string indicating the encoding to use for the returned data. By default, UTF-8 is assumed if this parameter is not specified.</dd>
+</dl>
+</div>
+    */
+  void readAsText(Blob blob, String encoding);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/FileReaderSync.java b/elemental/src/elemental/html/FileReaderSync.java
new file mode 100644
index 0000000..1e0f560
--- /dev/null
+++ b/elemental/src/elemental/html/FileReaderSync.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>FileReaderSync</code> interface allows to read <code>File</code> or <code>Blob</code> objects in a synchronous way.</p>
+<p>This interface is <a title="https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers" rel="internal" href="https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers">only available</a> in <a title="Worker" rel="internal" href="https://developer.mozilla.org/En/DOM/Worker">workers</a> as it enables synchronous I/O that could potentially block.</p>
+  */
+public interface FileReaderSync {
+
+
+  /**
+    * <p>This method reads the contents of the specified <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code>. When the read operation is finished, it returns an <code><a href="../JavaScript_typed_arrays/ArrayBuffer" rel="internal" title="/en/JavaScript_typed_arrays/ArrayBuffer">ArrayBuffer</a></code> representing the file's data. If an error happened during the read, the adequate exception is sent.</p>
+
+<div id="section_5"><span id="Parameters"></span><h4 class="editable">Parameters</h4>
+<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> to read into the <code><a href="../JavaScript_typed_arrays/ArrayBuffer" rel="internal" title="/en/JavaScript_typed_arrays/ArrayBuffer">ArrayBuffer</a></code>.</dd>
+</dl>
+</div><div id="section_6"><span id="Return_value"></span><h4 class="editable">Return value</h4>
+<p>An <code><a href="../JavaScript_typed_arrays/ArrayBuffer" rel="internal" title="/en/JavaScript_typed_arrays/ArrayBuffer">ArrayBuffer</a></code> representing the file's data.</p>
+</div><div id="section_7"><span id="Exceptions"></span><h4 class="editable">Exceptions</h4>
+<p>The following exceptions can be raised by this method:</p>
+<dl> <dt><code>NotFoundError</code></dt> <dd>is raised when the resource represented by the DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> cannot be found, e. g. because it has been erased.</dd> <dt><code>SecurityError</code></dt> <dd>is raised when one of the following problematic situation is detected: <ul> <li>the resource has been modified by a third party;</li> <li>two many read are performed simultaneously;</li> <li>the file pointed by the resource is unsafe for a use from the Web (like it is a system file).</li> </ul> </dd> <dt><code>NotReadableError</code></dt> <dd>is raised when the resource cannot be read due to a permission problem, like a concurrent lock.</dd> <dt><code>EncodingError</code></dt> <dd>is raised when the resource is a data URL and exceed the limit length defined by each browser.</dd>
+</dl>
+</div>
+    */
+  ArrayBuffer readAsArrayBuffer(Blob blob);
+
+
+  /**
+    * <p>This method reads the contents of the specified <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code>, which may be a <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code>. When the read operation is finished, it returns a <a title="DOMString" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMString"><code>DOMString</code></a> containing the raw binary data from the file. If an error happened during the read, the adequate exception is sent.</p>
+<div class="note"><strong>Note</strong> <strong>: </strong>This method is deprecated and <code>readAsArrayBuffer()</code> should be used instead.</div>
+
+<div id="section_9"><span id="Parameters_2"></span><h4 class="editable">Parameters</h4>
+<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> to read into the <a title="DOMString" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMString"><code>DOMString</code></a>.</dd>
+</dl>
+</div><div id="section_10"><span id="Return_value_2"></span><h4 class="editable">Return value</h4>
+<p><code>A </code><a title="DOMString" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMString"><code>DOMString</code></a> containing the raw binary data from the resource</p>
+</div><div id="section_11"><span id="Exceptions_2"></span><h4 class="editable">Exceptions</h4>
+<p>The following exceptions can be raised by this method:</p>
+<dl> <dt><code>NotFoundError</code></dt> <dd>is raised when the resource represented by the DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> cannot be found, e. g. because it has been erased.</dd> <dt><code>SecurityError</code></dt> <dd>is raised when one of the following problematic situation is detected: <ul> <li>the resource has been modified by a third party;</li> <li>two many read are performed simultaneously;</li> <li>the file pointed by the resource is unsafe for a use from the Web (like it is a system file).</li> </ul> </dd> <dt><code>NotReadableError</code></dt> <dd>is raised when the resource cannot be read due to a permission problem, like a concurrent lock.</dd> <dt><code>EncodingError</code></dt> <dd>is raised when the resource is a data URL and exceed the limit length defined by each browser.</dd>
+</dl>
+</div>
+    */
+  String readAsBinaryString(Blob blob);
+
+
+  /**
+    * <p>This method reads the contents of the specified <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code>. When the read operation is finished, it returns a data URL representing the file's data. If an error happened during the read, the adequate exception is sent.</p>
+
+<div id="section_5"> <div id="section_17"><span id="Parameters_4"></span><h4 class="editable"><span>Parameters</span></h4> <dl> <dt><code>blob</code></dt> <dd>The DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> to read.</dd> </dl>
+</div></div>
+<div id="section_6"> <div id="section_18"><span id="Return_value_4"></span><h4 class="editable"><span>Return value</span></h4> <p>An <a title="DOMString" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMString"><code>DOMString</code></a> representing the file's data as a data URL.</p>
+</div></div>
+<div id="section_19"><span id="Exceptions_4"></span><h4 class="editable"><span>Exceptions</span></h4>
+<p>The following exceptions can be raised by this method:</p>
+<dl> <dt><code>NotFoundError</code></dt> <dd>is raised when the resource represented by the DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> cannot be found, e. g. because it has been erased.</dd> <dt><code>SecurityError</code></dt> <dd>is raised when one of the following problematic situation is detected: <ul> <li>the resource has been modified by a third party;</li> <li>too many read are performed simultaneously;</li> <li>the file pointed by the resource is unsafe for a use from the Web (like it is a system file).</li> </ul> </dd> <dt><code>NotReadableError</code></dt> <dd>is raised when the resource cannot be read due to a permission problem, like a concurrent lock.</dd> <dt><code>EncodingError</code></dt> <dd>is raised when the resource is a data URL and exceed the limit length defined by each browser.</dd>
+</dl>
+<dl> <dt></dt>
+</dl></div>
+    */
+  String readAsDataURL(Blob blob);
+
+
+  /**
+    * <p>This methods reads the specified blob's contents. When the read operation is finished, it returns a <a title="DOMString" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMString"><code>DOMString</code></a> containing the file represented as a text string. The optional <strong><code>encoding</code></strong> parameter indicates the encoding to be used. If not present, the method will apply a detection algorithm for it. If an error happened during the read, the adequate exception is sent.</p>
+
+<div id="section_13"><span id="Parameters_3"></span><h4 class="editable">Parameters</h4>
+<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> to read into the <a title="DOMString" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMString"><code>DOMString</code></a>.</dd> <dt><code>encoding</code></dt> <dd>Optional. A string representing the encoding to be used, like <strong>iso-8859-1</strong> or <strong>UTF-8</strong>.</dd>
+</dl>
+</div><div id="section_14"><span id="Return_value_3"></span><h4 class="editable">Return value</h4>
+<p>A <a href="https://developer.mozilla.org/en/DOM/DOMString" rel="internal" title="DOMString"><code>DOMString</code></a> containing the raw binary data from the resource</p>
+</div><div id="section_15"><span id="Exceptions_3"></span><h4 class="editable">Exceptions</h4>
+<p>The following exceptions can be raised by this method:</p>
+<dl> <dt><code>NotFoundError</code></dt> <dd>is raised when the resource represented by the DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> cannot be found, e. g. because it has been erased.</dd> <dt><code>SecurityError</code></dt> <dd>is raised when one of the following problematic situation is detected: <ul> <li>the resource has been modified by a third party;</li> <li>two many read are performed simultaneously;</li> <li>the file pointed by the resource is unsafe for a use from the Web (like it is a system file).</li> </ul> </dd> <dt><code>NotReadableError</code></dt> <dd>is raised when the resource cannot be read due to a permission problem, like a concurrent lock.</dd>
+</dl>
+</div>
+    */
+  String readAsText(Blob blob);
+
+
+  /**
+    * <p>This methods reads the specified blob's contents. When the read operation is finished, it returns a <a title="DOMString" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMString"><code>DOMString</code></a> containing the file represented as a text string. The optional <strong><code>encoding</code></strong> parameter indicates the encoding to be used. If not present, the method will apply a detection algorithm for it. If an error happened during the read, the adequate exception is sent.</p>
+
+<div id="section_13"><span id="Parameters_3"></span><h4 class="editable">Parameters</h4>
+<dl> <dt><code>blob</code></dt> <dd>The DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> to read into the <a title="DOMString" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMString"><code>DOMString</code></a>.</dd> <dt><code>encoding</code></dt> <dd>Optional. A string representing the encoding to be used, like <strong>iso-8859-1</strong> or <strong>UTF-8</strong>.</dd>
+</dl>
+</div><div id="section_14"><span id="Return_value_3"></span><h4 class="editable">Return value</h4>
+<p>A <a href="https://developer.mozilla.org/en/DOM/DOMString" rel="internal" title="DOMString"><code>DOMString</code></a> containing the raw binary data from the resource</p>
+</div><div id="section_15"><span id="Exceptions_3"></span><h4 class="editable">Exceptions</h4>
+<p>The following exceptions can be raised by this method:</p>
+<dl> <dt><code>NotFoundError</code></dt> <dd>is raised when the resource represented by the DOM <code><a href="https://developer.mozilla.org/en/DOM/Blob" rel="custom">Blob</a></code> or <code><a href="https://developer.mozilla.org/en/DOM/File" rel="custom">File</a></code> cannot be found, e. g. because it has been erased.</dd> <dt><code>SecurityError</code></dt> <dd>is raised when one of the following problematic situation is detected: <ul> <li>the resource has been modified by a third party;</li> <li>two many read are performed simultaneously;</li> <li>the file pointed by the resource is unsafe for a use from the Web (like it is a system file).</li> </ul> </dd> <dt><code>NotReadableError</code></dt> <dd>is raised when the resource cannot be read due to a permission problem, like a concurrent lock.</dd>
+</dl>
+</div>
+    */
+  String readAsText(Blob blob, String encoding);
+}
diff --git a/elemental/src/elemental/html/FileSystemCallback.java b/elemental/src/elemental/html/FileSystemCallback.java
new file mode 100644
index 0000000..f53999f
--- /dev/null
+++ b/elemental/src/elemental/html/FileSystemCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface FileSystemCallback {
+  boolean onFileSystemCallback(DOMFileSystem fileSystem);
+}
diff --git a/elemental/src/elemental/html/FileWriter.java b/elemental/src/elemental/html/FileWriter.java
new file mode 100644
index 0000000..e31ed2a
--- /dev/null
+++ b/elemental/src/elemental/html/FileWriter.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface FileWriter extends EventTarget {
+
+    static final int DONE = 2;
+
+    static final int INIT = 0;
+
+    static final int WRITING = 1;
+
+  FileError getError();
+
+  double getLength();
+
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnprogress();
+
+  void setOnprogress(EventListener arg);
+
+  EventListener getOnwrite();
+
+  void setOnwrite(EventListener arg);
+
+  EventListener getOnwriteend();
+
+  void setOnwriteend(EventListener arg);
+
+  EventListener getOnwritestart();
+
+  void setOnwritestart(EventListener arg);
+
+  double getPosition();
+
+  int getReadyState();
+
+  void abort();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  void seek(double position);
+
+  void truncate(double size);
+
+  void write(Blob data);
+}
diff --git a/elemental/src/elemental/html/FileWriterCallback.java b/elemental/src/elemental/html/FileWriterCallback.java
new file mode 100644
index 0000000..2c54a61
--- /dev/null
+++ b/elemental/src/elemental/html/FileWriterCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface FileWriterCallback {
+  boolean onFileWriterCallback(FileWriter fileWriter);
+}
diff --git a/elemental/src/elemental/html/FileWriterSync.java b/elemental/src/elemental/html/FileWriterSync.java
new file mode 100644
index 0000000..4bacfde
--- /dev/null
+++ b/elemental/src/elemental/html/FileWriterSync.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface FileWriterSync {
+
+  double getLength();
+
+  double getPosition();
+
+  void seek(double position);
+
+  void truncate(double size);
+
+  void write(Blob data);
+}
diff --git a/elemental/src/elemental/html/Float32Array.java b/elemental/src/elemental/html/Float32Array.java
new file mode 100644
index 0000000..00e4122
--- /dev/null
+++ b/elemental/src/elemental/html/Float32Array.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>Float32Array</code> type represents an array of 32-bit floating point numbers (corresponding to the C <code>float</code> data type).</p>
+<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>
+  */
+public interface Float32Array extends ArrayBufferView, IndexableNumber {
+
+  /**
+    * The size, in bytes, of each array element.
+    */
+
+    static final int BYTES_PER_ELEMENT = 4;
+
+
+  /**
+    * The number of entries in the array. <strong>Read only.</strong>
+    */
+  int getLength();
+
+  void setElements(Object array);
+
+  void setElements(Object array, int offset);
+
+
+  /**
+    * <p>Returns a new <code>Float32Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Float32Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Float32Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Float32Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Float32Array subarray(int start);
+
+
+  /**
+    * <p>Returns a new <code>Float32Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Float32Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Float32Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Float32Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Float32Array subarray(int start, int end);
+}
diff --git a/elemental/src/elemental/html/Float64Array.java b/elemental/src/elemental/html/Float64Array.java
new file mode 100644
index 0000000..7bbb366
--- /dev/null
+++ b/elemental/src/elemental/html/Float64Array.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>Float64Array</code> type represents an array of 64-bit floating point numbers (corresponding to the C <code>double</code> data type).</p>
+<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>
+  */
+public interface Float64Array extends ArrayBufferView, IndexableNumber {
+
+  /**
+    * The size, in bytes, of each array element.
+    */
+
+    static final int BYTES_PER_ELEMENT = 8;
+
+
+  /**
+    * The number of entries in the array. <strong>Read only.</strong>
+    */
+  int getLength();
+
+  void setElements(Object array);
+
+  void setElements(Object array, int offset);
+
+
+  /**
+    * <p>Returns a new <code>Float64Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Float64Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Float64Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Float64Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Float64Array subarray(int start);
+
+
+  /**
+    * <p>Returns a new <code>Float64Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Float64Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Float64Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Float64Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Float64Array subarray(int start, int end);
+}
diff --git a/elemental/src/elemental/html/FontElement.java b/elemental/src/elemental/html/FontElement.java
new file mode 100644
index 0000000..05ec786
--- /dev/null
+++ b/elemental/src/elemental/html/FontElement.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Obsolete
+  */
+public interface FontElement extends Element {
+
+
+  /**
+    * This attribute sets the text color using either a named color or a color specified in the hexadecimal #RRGGBB format.
+    */
+  String getColor();
+
+  void setColor(String arg);
+
+
+  /**
+    * This attribute contains a comma-sperated list of one or more font names. The document text in the default style is rendered in the first font face that the client's browser supports. If no font listed is installed on the local system, the browser typically defaults to the proportional or fixed-width font for that system.
+    */
+  String getFace();
+
+  void setFace(String arg);
+
+
+  /**
+    * This attribute specifies the font size as either a numeric or relative value. Numeric values range from <span>1</span> to <span>7</span> with <span>1</span> being the smallest and <span>3</span> the default. It can be defined using a relative value, like <span>+2</span> or <span>-3</span>, which set it relative to the value of the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/basefont#attr-size">size</a></code>
+ attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/basefont">&lt;basefont&gt;</a></code>
+ element, or relative to <span>3</span>, the default value, if none does exist.
+    */
+  String getSize();
+
+  void setSize(String arg);
+}
diff --git a/elemental/src/elemental/html/FormData.java b/elemental/src/elemental/html/FormData.java
new file mode 100644
index 0000000..eaa6e9c
--- /dev/null
+++ b/elemental/src/elemental/html/FormData.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface FormData {
+
+  void append(String name, String value, String filename);
+}
diff --git a/elemental/src/elemental/html/FormElement.java b/elemental/src/elemental/html/FormElement.java
new file mode 100644
index 0000000..38eb229
--- /dev/null
+++ b/elemental/src/elemental/html/FormElement.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><code>FORM</code> elements share all of the properties and methods of other HTML elements described in the <a title="en/DOM/element" rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> section.</p>
+<p>This interface provides methods to create and modify <code>FORM</code> elements using the DOM.</p>
+  */
+public interface FormElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-accept-charset">accept-charset</a></code>
+&nbsp;HTML&nbsp;attribute, containing a list of character encodings that the server accepts.
+    */
+  String getAcceptCharset();
+
+  void setAcceptCharset(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-action">action</a></code>
+&nbsp;HTML&nbsp;attribute, containing the URI&nbsp;of a program that processes the information submitted by the form.
+    */
+  String getAction();
+
+  void setAction(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-autocomplete">autocomplete</a></code>
+ HTML&nbsp;attribute, containing a string that indicates whether the controls in this form can have their values automatically populated by the browser.
+    */
+  String getAutocomplete();
+
+  void setAutocomplete(String arg);
+
+
+  /**
+    * All the form controls belonging to this form element.
+    */
+  HTMLCollection getElements();
+
+
+  /**
+    * Synonym for <strong>enctype</strong>.
+    */
+  String getEncoding();
+
+  void setEncoding(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-enctype">enctype</a></code>
+&nbsp;HTML&nbsp;attribute, indicating the type of content that is used to transmit the form to the server. Only specified values can be set.
+    */
+  String getEnctype();
+
+  void setEnctype(String arg);
+
+
+  /**
+    * The number of controls in the form.
+    */
+  int getLength();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-method">method</a></code>
+&nbsp;HTML&nbsp;attribute, indicating the HTTP&nbsp;method used to submit the form. Only specified values can be set.
+    */
+  String getMethod();
+
+  void setMethod(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-name">name</a></code>
+&nbsp;HTML&nbsp;attribute, containing the name of the form.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-novalidate">novalidate</a></code>
+ HTML attribute, indicating that the form should not be validated.
+    */
+  boolean isNoValidate();
+
+  void setNoValidate(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-target">target</a></code>
+ HTML attribute, indicating where to display the results received from submitting the form.
+    */
+  String getTarget();
+
+  void setTarget(String arg);
+
+  boolean checkValidity();
+
+
+  /**
+    * Resets the forms to its initial state.
+    */
+  void reset();
+
+
+  /**
+    * Submits the form to the server.
+    */
+  void submit();
+}
diff --git a/elemental/src/elemental/html/FrameElement.java b/elemental/src/elemental/html/FrameElement.java
new file mode 100644
index 0000000..d9ef5ba
--- /dev/null
+++ b/elemental/src/elemental/html/FrameElement.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.svg.SVGDocument;
+import elemental.dom.Document;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><code>&lt;frame&gt;</code> is an HTML element which defines a particular area in which another HTML document can be displayed. A frame should be used within a <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/frameset">&lt;frameset&gt;</a></code>
+.</p>
+<p>Using the <code>&lt;frame&gt;</code> element is not encouraged because of certain disadvantages such as performance problems and lack of accessibility for users with screen readers. Instead of the <code>&lt;frame&gt;</code> element, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/iframe">&lt;iframe&gt;</a></code>
+&nbsp;may be preferred.</p>
+  */
+public interface FrameElement extends Element {
+
+  Document getContentDocument();
+
+  Window getContentWindow();
+
+  String getFrameBorder();
+
+  void setFrameBorder(String arg);
+
+  int getHeight();
+
+  String getLocation();
+
+  void setLocation(String arg);
+
+  String getLongDesc();
+
+  void setLongDesc(String arg);
+
+  String getMarginHeight();
+
+  void setMarginHeight(String arg);
+
+  String getMarginWidth();
+
+  void setMarginWidth(String arg);
+
+
+  /**
+    * This attribute is used to labeling frames. Without labeling all links will open in the frame that they are in.
+    */
+  String getName();
+
+  void setName(String arg);
+
+  boolean isNoResize();
+
+  void setNoResize(boolean arg);
+
+
+  /**
+    * This attribute defines existence of scrollbar. If this attribute is not used, browser put a scrollbar when necessary. There are two choices; "yes" for showing a scrollbar even when it is not necessary and "no" for do not showing a scrollbar even when it is necessary.
+    */
+  String getScrolling();
+
+  void setScrolling(String arg);
+
+
+  /**
+    * This attribute is specify document which will be displayed by frame.
+    */
+  String getSrc();
+
+  void setSrc(String arg);
+
+  int getWidth();
+
+  SVGDocument getSVGDocument();
+}
diff --git a/elemental/src/elemental/html/FrameSetElement.java b/elemental/src/elemental/html/FrameSetElement.java
new file mode 100644
index 0000000..2b3fbea
--- /dev/null
+++ b/elemental/src/elemental/html/FrameSetElement.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.events.EventListener;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <code>&lt;frameset&gt;</code> is an HTML element which is used to contain <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/frame">&lt;frame&gt;</a></code>
+ elements.
+  */
+public interface FrameSetElement extends Element {
+
+  String getCols();
+
+  void setCols(String arg);
+
+  EventListener getOnbeforeunload();
+
+  void setOnbeforeunload(EventListener arg);
+
+  EventListener getOnblur();
+
+  void setOnblur(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnfocus();
+
+  void setOnfocus(EventListener arg);
+
+  EventListener getOnhashchange();
+
+  void setOnhashchange(EventListener arg);
+
+  EventListener getOnload();
+
+  void setOnload(EventListener arg);
+
+  EventListener getOnmessage();
+
+  void setOnmessage(EventListener arg);
+
+  EventListener getOnoffline();
+
+  void setOnoffline(EventListener arg);
+
+  EventListener getOnonline();
+
+  void setOnonline(EventListener arg);
+
+  EventListener getOnpopstate();
+
+  void setOnpopstate(EventListener arg);
+
+  EventListener getOnresize();
+
+  void setOnresize(EventListener arg);
+
+  EventListener getOnstorage();
+
+  void setOnstorage(EventListener arg);
+
+  EventListener getOnunload();
+
+  void setOnunload(EventListener arg);
+
+  String getRows();
+
+  void setRows(String arg);
+}
diff --git a/elemental/src/elemental/html/HRElement.java b/elemental/src/elemental/html/HRElement.java
new file mode 100644
index 0000000..9ad5115
--- /dev/null
+++ b/elemental/src/elemental/html/HRElement.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM <code>hr</code> elements expose the <a target="_blank" rel="external nofollow" class=" external" title="http://www.w3.org/TR/html5/grouping-content.html#htmlhrelement" href="http://www.w3.org/TR/html5/grouping-content.html#htmlhrelement">HTMLHRElement</a> (or <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a target="_blank" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-68228811" rel="external nofollow" class=" external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-68228811"><code>HTMLHRElement</code></a>) interface, which provides special properties (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating <code>hr</code> elements. In <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML/HTML5">HTML 5</a></span>, this interface inherits from HTMLElement, but defines no additional members.
+  */
+public interface HRElement extends Element {
+
+
+  /**
+    * Enumerated attribute indicating alignment of the rule with respect to the surrounding context.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+  boolean isNoShade();
+
+  void setNoShade(boolean arg);
+
+
+  /**
+    * The height of the rule.
+    */
+  String getSize();
+
+  void setSize(String arg);
+
+
+  /**
+    * The width of the rule on the page.
+    */
+  String getWidth();
+
+  void setWidth(String arg);
+}
diff --git a/elemental/src/elemental/html/HTMLAllCollection.java b/elemental/src/elemental/html/HTMLAllCollection.java
new file mode 100644
index 0000000..c57e347
--- /dev/null
+++ b/elemental/src/elemental/html/HTMLAllCollection.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Node;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface HTMLAllCollection {
+
+  int getLength();
+
+  Node item(int index);
+
+  Node namedItem(String name);
+
+  NodeList tags(String name);
+}
diff --git a/elemental/src/elemental/html/HTMLCollection.java b/elemental/src/elemental/html/HTMLCollection.java
new file mode 100644
index 0000000..f390f29
--- /dev/null
+++ b/elemental/src/elemental/html/HTMLCollection.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><code>HTMLCollection</code> is an interface representing a generic collection of elements (in document order) and offers methods and properties for traversing the list.</p>
+<div class="note"><strong>Note:</strong> This interface is called <code>HTMLCollection</code> for historical reasons (before DOM4, collections implementing this interface could only have HTML elements as their items).</div>
+<p><code>HTMLCollection</code>s in the HTML DOM are live; they are automatically updated when the underlying document is changed.</p>
+  */
+public interface HTMLCollection extends Indexable {
+
+
+  /**
+    * The number of items in the collection. <strong>Read only</strong>.
+    */
+  int getLength();
+
+
+  /**
+    * Returns the specific node at the given zero-based <code>index</code> into the list. Returns <code>null</code> if the <code>index</code> is out of range.
+    */
+  Node item(int index);
+
+
+  /**
+    * Returns the specific node whose ID or, as a fallback, name matches the string specified by <code>name</code>. Matching by name is only done as a last resort, only in HTML, and only if the referenced element supports the <code>name</code> attribute. Returns <code>null</code> if no node exists by the given name.
+    */
+  Node namedItem(String name);
+}
diff --git a/elemental/src/elemental/html/HTMLOptionsCollection.java b/elemental/src/elemental/html/HTMLOptionsCollection.java
new file mode 100644
index 0000000..1715716
--- /dev/null
+++ b/elemental/src/elemental/html/HTMLOptionsCollection.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * HTMLOptionsCollection is an interface representing a collection of HTML option elements (in document order)&nbsp;and offers methods and properties for traversing the list as well as optionally altering its items. This type is returned solely by the "options" property of <a title="En/DOM/select" rel="internal" href="https://developer.mozilla.org/en/DOM/HTMLSelectElement">select</a>.
+  */
+public interface HTMLOptionsCollection extends HTMLCollection {
+
+
+  /**
+    * As optionally allowed by the spec, Mozilla allows this property to be set, either removing options at the end when using a shorter length, or adding blank options at the end when setting a longer length. Other implementations could potentially throw a <a title="En/DOM/DOMException" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMException">DOMException</a>.
+    */
+  int getLength();
+
+  void setLength(int arg);
+
+  int getSelectedIndex();
+
+  void setSelectedIndex(int arg);
+
+  void remove(int index);
+}
diff --git a/elemental/src/elemental/html/HeadElement.java b/elemental/src/elemental/html/HeadElement.java
new file mode 100644
index 0000000..b1d4ad9
--- /dev/null
+++ b/elemental/src/elemental/html/HeadElement.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The DOM <code>head</code> element exposes the <a title="http://www.w3.org/TR/html5/semantics.html#htmlheadelement" class=" external" rel="external" href="http://www.w3.org/TR/html5/semantics.html#htmlheadelement" target="_blank">HTMLHeadElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span>&nbsp; <a class=" external" target="_blank" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-77253168" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-77253168">HTMLHeadElement</a>) interface, which contains the descriptive information, or metadata, for a document. This object inherits all of the properties and methods described in the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element">element</a></code>
+ section. In 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>, this interface inherits from HTMLElement, but defines no additional members.
+  */
+public interface HeadElement extends Element {
+
+
+  /**
+    * The URIs of one or more metadata profiles (white space separated). 
+
+<span class="deprecatedInlineTemplate" title="(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+">Deprecated since Gecko 2.0</span>
+
+ 
+
+<span title="(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+">Obsolete since Gecko 7.0</span>
+    */
+  String getProfile();
+
+  void setProfile(String arg);
+}
diff --git a/elemental/src/elemental/html/HeadingElement.java b/elemental/src/elemental/html/HeadingElement.java
new file mode 100644
index 0000000..e511fde
--- /dev/null
+++ b/elemental/src/elemental/html/HeadingElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM heading elements expose the <a title="http://www.w3.org/TR/html5/sections.html#htmlheadingelement" class=" external" rel="external nofollow" href="http://www.w3.org/TR/html5/sections.html#htmlheadingelement" target="_blank">HTMLHeadingElement</a> (or <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" rel="external nofollow" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-43345119" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-43345119" target="_blank"><code>HTMLHeadingElement</code></a>) interface. In <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML/HTML5">HTML 5</a></span>, this interface inherits from HTMLElement, but defines no additional members, though in <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> it introduces the deprecated <code>align</code> property.
+  */
+public interface HeadingElement extends Element {
+
+
+  /**
+    * Enumerated attribute indicating alignment of the heading with respect to the surrounding context.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+}
diff --git a/elemental/src/elemental/html/History.java b/elemental/src/elemental/html/History.java
new file mode 100644
index 0000000..5199080
--- /dev/null
+++ b/elemental/src/elemental/html/History.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Returns a reference to the <code>History</code> object, which provides an interface for manipulating the browser <em>session history</em> (pages visited in the tab or frame that the current page is loaded in).
+  */
+public interface History {
+
+
+  /**
+    * Read-only. Returns the number of elements in the session history, including the currently loaded page. For example, for a page loaded in a new tab this property returns <code>1</code>.
+    */
+  int getLength();
+
+
+  /**
+    * Returns the state at the top of the history stack. This is a way to look at the state without having to wait for a <code>popstate</code> event. <strong>Read only.</strong>
+    */
+  Object getState();
+
+
+  /**
+    * <p>Goes to the previous page in session history, the same action as when the user clicks the browser's Back button. Equivalent to <code>history.go(-1)</code>.</p> <div class="note"><strong>Note:</strong> Calling this method to go back beyond the first page in the session history has no effect and doesn't raise an exception.</div>
+    */
+  void back();
+
+
+  /**
+    * <p>Goes to the next page in session history, the same action as when the user clicks the browser's Forward button; this is equivalent to <code>history.go(1)</code>.</p> <div class="note"><strong>Note:</strong> Calling this method to go back beyond the last page in the session history has no effect and doesn't raise an exception.</div>
+    */
+  void forward();
+
+
+  /**
+    * Loads a page from the session history, identified by its relative location to the current page, for example <code>-1</code> for the previous page or <code>1</code> for the next page. When <code><em>integerDelta</em></code> is out of bounds (e.g. -1 when there are no previously visited pages in the session history), the method doesn't do anything and doesn't raise an exception. Calling <code>go()</code> without parameters or with a non-integer argument has no effect (unlike Internet Explorer, <a class="external" title="http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx" rel="external" href="http://msdn.microsoft.com/en-us/library/ms536443(VS.85).aspx" target="_blank">which supports string URLs as the argument</a>).
+    */
+  void go(int distance);
+
+
+  /**
+    * <p>Pushes the given data onto the session history stack with the specified title and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title="en/DOM/Manipulating the browser history" rel="internal" href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history">manipulating the browser history</a>.</p> <div class="note"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)
+, the object is serialized using <a title="en/DOM/The structured clone algorithm" rel="internal" href="https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>
+    */
+  void pushState(Object data, String title);
+
+
+  /**
+    * <p>Pushes the given data onto the session history stack with the specified title and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title="en/DOM/Manipulating the browser history" rel="internal" href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history">manipulating the browser history</a>.</p> <div class="note"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)
+, the object is serialized using <a title="en/DOM/The structured clone algorithm" rel="internal" href="https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>
+    */
+  void pushState(Object data, String title, String url);
+
+
+  /**
+    * <p>Updates the most recent entry on the history stack to have the specified data, title, and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title="en/DOM/Manipulating the browser history" rel="internal" href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history">manipulating the browser history</a>.</p> <div class="note"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)
+, the object is serialized using <a title="en/DOM/The structured clone algorithm" rel="internal" href="https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>
+    */
+  void replaceState(Object data, String title);
+
+
+  /**
+    * <p>Updates the most recent entry on the history stack to have the specified data, title, and, if provided, URL. The data is treated as opaque by the DOM; you may specify any JavaScript object that can be serialized.&nbsp; Note that Firefox currently ignores the title parameter; for more information, see <a title="en/DOM/Manipulating the browser history" rel="internal" href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history">manipulating the browser history</a>.</p> <div class="note"><strong>Note:</strong> In Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ through Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+, the passed object is serialized using JSON. Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)
+, the object is serialized using <a title="en/DOM/The structured clone algorithm" rel="internal" href="https://developer.mozilla.org/en/DOM/The_structured_clone_algorithm">the structured clone algorithm</a>. This allows a wider variety of objects to be safely passed.</div>
+    */
+  void replaceState(Object data, String title, String url);
+}
diff --git a/elemental/src/elemental/html/HtmlElement.java b/elemental/src/elemental/html/HtmlElement.java
new file mode 100644
index 0000000..d760d95
--- /dev/null
+++ b/elemental/src/elemental/html/HtmlElement.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>html</code> object exposes the <a class=" external" title="http://www.w3.org/TR/html5/semantics.html#htmlhtmlelement" rel="external" href="http://www.w3.org/TR/html5/semantics.html#htmlhtmlelement" target="_blank">HTMLHtmlElement</a> (
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a target="_blank" class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-33759296" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-33759296">HTMLHtmlElement</a>) interface and serves as the root node for a given HTML&nbsp;document.&nbsp; This object inherits the properties and methods described in the <a title="en/DOM/element" class="internal" rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> section.&nbsp; In 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>, this interface inherits from HTMLElement, but provides no other members.</p>
+<p>You can retrieve the <code>html</code> object for a document by obtaining the value of the <a class="internal" title="en/DOM/document.documentElement" rel="internal" href="https://developer.mozilla.org/en/DOM/document.documentElement"><code>document.documentElement</code></a> property.</p>
+  */
+public interface HtmlElement extends Element {
+
+  String getManifest();
+
+  void setManifest(String arg);
+
+
+  /**
+    * Version of the HTML&nbsp;Document Type Definition that governs this document.
+    */
+  String getVersion();
+
+  void setVersion(String arg);
+}
diff --git a/elemental/src/elemental/html/IDBAny.java b/elemental/src/elemental/html/IDBAny.java
new file mode 100644
index 0000000..a5aea27
--- /dev/null
+++ b/elemental/src/elemental/html/IDBAny.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface IDBAny {
+}
diff --git a/elemental/src/elemental/html/IDBCursor.java b/elemental/src/elemental/html/IDBCursor.java
new file mode 100644
index 0000000..53caa01
--- /dev/null
+++ b/elemental/src/elemental/html/IDBCursor.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>IDBCursor</code> interface of the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB API</a> represents a <a title="en/IndexedDB#gloss_cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss_cursor">cursor</a> for traversing or iterating over multiple records in a database.
+  */
+public interface IDBCursor {
+
+  /**
+    * The cursor shows all records, including duplicates. It starts at the lower bound of the key range and moves upwards (monotonically increasing in the order of keys).
+    */
+
+    static final int NEXT = 0;
+
+  /**
+    * The cursor shows all records, excluding duplicates. If multiple records exist with the same key, only the first one iterated is retrieved. It starts at the lower bound of the key range and moves upwards.
+    */
+
+    static final int NEXT_NO_DUPLICATE = 1;
+
+  /**
+    * The cursor shows all records, including duplicates. It starts at the upper bound of the key range and moves downwards (monotonically decreasing in the order of keys).
+    */
+
+    static final int PREV = 2;
+
+  /**
+    * The cursor shows all records, excluding duplicates. If multiple records exist with the same key, only the first one iterated is retrieved. It starts at the upper bound of the key range and moves downwards.
+    */
+
+    static final int PREV_NO_DUPLICATE = 3;
+
+
+  /**
+    * On getting, returns the <a title="en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss_direction">direction</a> of traversal of the cursor. See Constants for possible values.
+    */
+  String getDirection();
+
+
+  /**
+    * Returns the key for the record at the cursor's position. If the cursor is outside its range, this is <code>undefined</code>.
+    */
+  Object getKey();
+
+
+  /**
+    * Returns the cursor's current effective key. If the cursor is currently being iterated or has iterated outside its range, this is <code>undefined</code>.
+    */
+  Object getPrimaryKey();
+
+
+  /**
+    * On getting, returns the <code>IDBObjectStore</code> or <code>IDBIndex</code> that the cursor is iterating. This function never returns null or throws an exception, even if the cursor is currently being iterated, has iterated past its end, or its transaction is not active.
+    */
+  Object getSource();
+
+
+  /**
+    * <p>Sets the number times a cursor should move its position forward.</p>
+<pre>IDBRequest advance (
+  in long <em>count</em>
+) raises (IDBDatabaseException);</pre>
+<div id="section_13"><span id="Parameter_2"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>count</dt> <dd>The number of advances forward the cursor should make.</dd>
+</dl>
+</div><div id="section_14"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code>void</code></dt>
+</dl>
+</div><div id="section_15"><span id="Exceptions_2"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#NON_TRANSIET_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NON_TRANSIET_ERR"><code>NON_TRANSIENT_ERR</code></a></td> <td> <p>The value passed into the <code>count</code> parameter was zero or a negative number.</p> </td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The cursor was created using <a title="en/IndexedDB/IDBIndex#openKeyCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR">TRANSACTION_INACTIVE_ERR</a></code></td> <td>The transaction that this cursor belongs to is inactive.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  void advance(int count);
+
+  void continueFunction();
+
+  void continueFunction(Object key);
+
+
+  /**
+    * <p>Returns an <code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code> object, and, in a separate thread, deletes the record at the cursor's position, without changing the cursor's position. Once the record is deleted, the cursor's <code>value</code> is set to <code>null</code>.</p>
+<pre>IDBRequest delete (
+) raises (IDBDatabaseException);</pre>
+<div id="section_21"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired. The <code>result</code> attribute is set to <code>undefined</code>.</dd>
+</dl>
+</div><div id="section_22"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The cursor was created using <a title="en/IndexedDB/IDBIndex#openKeyCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#READ ONLY ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR">READ_ONLY_ERR</a></code></td> <td>The cursor is in a transaction whose mode is <code><a title="en/IndexedDB/IDBTransaction#READ ONLY" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY">READ_ONLY</a></code>.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR">TRANSACTION_INACTIVE_ERR</a></code></td> <td>The transaction that this cursor belongs to is inactive.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest _delete();
+
+
+  /**
+    * <p>Returns an IDBRequest object, and, in a separate thread, updates the value at the current position of the cursor in the object store. If the cursor points to a record that has just been deleted, a new record is created.</p>
+<pre>IDBRequest update (
+  in any <em>value</em>
+) raises (IDBDatabaseException, DOMException);
+</pre>
+<div id="section_9"><span id="Parameter"></span><h5 class="editable">Parameter</h5>
+<dl> <dt>value</dt> <dd>The value to be stored.</dd>
+</dl>
+</div><div id="section_10"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_11"><span id="Exceptions"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td> <p>The underlying object store uses <a title="en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss in-line keys" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss_in-line_keys">in-line keys</a>, and the key for the cursor's position does not match the <code>value</code> property at the object store's&nbsp;<a class="external" title="object store key path" rel="external" href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#dfn-object-store-key-path" target="_blank">key path</a>.</p> </td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The cursor was created using <a title="en/IndexedDB/IDBIndex#openKeyCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBIndex#openKeyCursor">openKeyCursor()</a>, or if it is currently being iterated (you cannot call this method again until the new cursor data has been loaded), or if it has iterated past the end of its range.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#READ ONLY ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR">READ_ONLY_ERR</a></code></td> <td>The cursor is in a transaction whose mode is <code><a title="en/IndexedDB/IDBTransaction#READ ONLY" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY">READ_ONLY</a></code>.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR">TRANSACTION_INACTIVE_ERR</a></code></td> <td>The transaction that this cursor belongs to is inactive.</td> </tr> </tbody>
+</table>
+<p>It can also raise a <a title="En/DOM/DOMException" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMException">DOMException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code>DATA_CLONE_ERR</code></td> <td>If the value could not be cloned.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest update(Object value);
+}
diff --git a/elemental/src/elemental/html/IDBCursorWithValue.java b/elemental/src/elemental/html/IDBCursorWithValue.java
new file mode 100644
index 0000000..ffac89e
--- /dev/null
+++ b/elemental/src/elemental/html/IDBCursorWithValue.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface IDBCursorWithValue extends IDBCursor {
+
+  Object getValue();
+}
diff --git a/elemental/src/elemental/html/IDBDatabase.java b/elemental/src/elemental/html/IDBDatabase.java
new file mode 100644
index 0000000..2417362
--- /dev/null
+++ b/elemental/src/elemental/html/IDBDatabase.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.util.Mappable;
+import elemental.util.Indexable;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>IDBDatabase</code> interface of the IndexedDB&nbsp;API provides asynchronous access to a <a title="en/IndexedDB#database connection" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#database_connection">connection to a database</a>. Use it to create, manipulate, and delete objects in that database. The interface also provides the only way to get a <a title="en/IndexedDB#gloss transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_transaction">transaction</a>&nbsp;and manage versions on that database.</p>
+<p>Inherits from: <a title="en/DOM/EventTarget" rel="internal" href="https://developer.mozilla.org/en/DOM/EventTarget">EventTarget</a></p>
+  */
+public interface IDBDatabase extends EventTarget {
+
+
+  /**
+    * Name of the connected database.
+    */
+  String getName();
+
+
+  /**
+    * A list of the names of the <a title="en/IndexedDB#gloss object store" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_object_store">object stores</a> currently in the connected database.
+    */
+  Indexable getObjectStoreNames();
+
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnversionchange();
+
+  void setOnversionchange(EventListener arg);
+
+
+  /**
+    * The version of the connected database. When a database is first created, this attribute is the empty string.
+    */
+  String getVersion();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+
+  /**
+    * <p>Returns immediately and closes the connection in a separate thread. The connection is not actually closed until all transactions created using this connection are complete. No new transactions can be created for this connection once this method is called. Methods that create transactions throw an exception if a closing operation is pending.</p>
+<pre>void close();
+</pre>
+    */
+  void close();
+
+
+  /**
+    * <p>Creates and returns a new object store or index. The method takes the name of the store as well as a parameter object. The parameter object lets you define important optional properties. You can use the property to uniquely identify individual objects in the store. As the property is an identifier, it should be unique to every object, and every object should have that property.</p>
+<p>But before you can create any object store or index,&nbsp;you must first call the <code><a href="#setVersion()">setVersion()</a></code><a href="#setVersion()"> method</a>.</p>
+
+<div id="section_11"><span id="Parameters"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>name</dt> <dd>The name of the new object store.</dd> <dt>optionalParameters</dt> <dd> <div class="warning"><strong>Warning:</strong> The latest draft of the specification changed this to <code>IDBDatabaseOptionalParameters</code>, which is not yet recognized by any browser</div> <p><em>Optional</em>. Options object whose attributes are optional parameters to the method. It includes the following properties:</p> <table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code>keyPath</code></td> <td>The <a title="en/IndexedDB#gloss key path" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_path">key path</a> to be used by the new object store. If empty or not specified, the object store is created without a key path and uses <a title="en/IndexedDB#gloss out-of-line key" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_out-of-line_key">out-of-line keys</a>.</td> </tr> <tr> <td><code>autoIncrement</code></td> <td>If true, the object store has a <a title="en/IndexedDB#gloss key generator" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_generator">key generator</a>. Defaults to <code>false</code>.</td> </tr> </tbody> </table> <p>Unknown parameters are ignored.</p> </dd>
+</dl>
+</div><div id="section_12"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBObjectStore" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBObjectStore">IDBObjectStore</a></code></dt> <dd>The newly created object store.</dd>
+</dl>
+</div><div id="section_13"><span id="Exceptions"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The method was not called from a <code><a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE">VERSION_CHANGE</a></code> transaction callback. You must call <code>setVersion()</code> first.</td> </tr> <tr> <td><code><a title="en/IndexedDB/DatabaseException#CONSTRAINT ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR">CONSTRAINT_ERR</a></code></td> <td>An object store with the given name (based on case-sensitive comparison) already exists in the connected database.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR">NON_TRANSIENT_ERR</a></code></td> <td><code>optionalParameters</code> has attributes other than <code>keyPath</code> and <code>autoIncrement</code>.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBObjectStore createObjectStore(String name);
+
+
+  /**
+    * <p>Creates and returns a new object store or index. The method takes the name of the store as well as a parameter object. The parameter object lets you define important optional properties. You can use the property to uniquely identify individual objects in the store. As the property is an identifier, it should be unique to every object, and every object should have that property.</p>
+<p>But before you can create any object store or index,&nbsp;you must first call the <code><a href="#setVersion()">setVersion()</a></code><a href="#setVersion()"> method</a>.</p>
+
+<div id="section_11"><span id="Parameters"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>name</dt> <dd>The name of the new object store.</dd> <dt>optionalParameters</dt> <dd> <div class="warning"><strong>Warning:</strong> The latest draft of the specification changed this to <code>IDBDatabaseOptionalParameters</code>, which is not yet recognized by any browser</div> <p><em>Optional</em>. Options object whose attributes are optional parameters to the method. It includes the following properties:</p> <table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code>keyPath</code></td> <td>The <a title="en/IndexedDB#gloss key path" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_path">key path</a> to be used by the new object store. If empty or not specified, the object store is created without a key path and uses <a title="en/IndexedDB#gloss out-of-line key" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_out-of-line_key">out-of-line keys</a>.</td> </tr> <tr> <td><code>autoIncrement</code></td> <td>If true, the object store has a <a title="en/IndexedDB#gloss key generator" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_generator">key generator</a>. Defaults to <code>false</code>.</td> </tr> </tbody> </table> <p>Unknown parameters are ignored.</p> </dd>
+</dl>
+</div><div id="section_12"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBObjectStore" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBObjectStore">IDBObjectStore</a></code></dt> <dd>The newly created object store.</dd>
+</dl>
+</div><div id="section_13"><span id="Exceptions"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The method was not called from a <code><a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE">VERSION_CHANGE</a></code> transaction callback. You must call <code>setVersion()</code> first.</td> </tr> <tr> <td><code><a title="en/IndexedDB/DatabaseException#CONSTRAINT ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR">CONSTRAINT_ERR</a></code></td> <td>An object store with the given name (based on case-sensitive comparison) already exists in the connected database.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR">NON_TRANSIENT_ERR</a></code></td> <td><code>optionalParameters</code> has attributes other than <code>keyPath</code> and <code>autoIncrement</code>.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBObjectStore createObjectStore(String name, Mappable options);
+
+
+  /**
+    * <p>Destroys the object store with the given name in the connected database, along with any indexes that reference it.&nbsp;</p>
+<p>As with <code>createObjectStore()</code>, this method can be called <em>only</em> within a <code><a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE">VERSION_CHANGE</a></code> transaction. So you must call the <code>setVersion()</code> method first before you can remove any object store or index.</p>
+
+<div id="section_15"><span id="Parameters_2"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>name</dt> <dd>The name of the data store to delete.</dd>
+</dl>
+</div><div id="section_16"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<p><code>void</code></p>
+</div><div id="section_17"><span id="Exceptions_2"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The method was not called from a <code><a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE">VERSION_CHANGE</a></code> transaction callback. You must call <code>setVersion()</code> first.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></td> <td>You are trying to delete an object store that does not exist. Names are case sensitive.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  void deleteObjectStore(String name);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction">IDBTransaction</a> object, and starts a transaction in a separate thread. &nbsp;The method returns a transaction object (<a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction"><code>IDBTransaction</code></a>) containing the <a title="en/IndexedDB/IDBTransaction#objectStore()" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#objectStore()">objectStore()</a> method, which you can use to access your object store.&nbsp;</p>
+
+<div id="section_22"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>storeNames</dt> <dd>The names of object stores and indexes that are in the scope of the new transaction. Specify only the object stores that you need to access.</dd> <dt>mode</dt> <dd><em>Optional</em>. The types of access that can be performed in the transaction. Transactions are opened in one of three modes: <code>READ_ONLY</code>, <code>READ_WRITE</code>, and <code>VERSION_CHANGE</code>. If you don't provide the parameter, the default access mode is <code>READ_ONLY</code>. To avoid slowing things down, don't open a <code>READ_WRITE</code> transaction, unless you actually need to write into the database.</dd>
+</dl>
+</div><div id="section_23"><span id="Sample_code"></span><h5 class="editable">Sample code</h5>
+<p>To start a transaction with the following scope, you can use the code snippets in the table. As noted earlier:</p>
+<ul> <li>Add prefixes to the methods in WebKit browsers, (that is, instead of <code>IDBTransaction.READ_ONLY</code>, use <code>webkitIDBTransaction.READ_ONLY</code>).</li> <li>The default mode is <code>READ_ONLY</code>, so you don't really have to specify it. Of course, if you need to write into the object store, you can open the transaction in the <code>READ_WRITE</code> mode.</li>
+</ul>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="185">Scope</th> <th scope="col" width="1018">Code</th> </tr> <tr> <td>Single object store</td> <td> <p><code>var transaction = db.transaction(['my-store-name'], IDBTransaction.READ_ONLY); </code></p> <p>Alternatively:</p> <p><code>var transaction = db.transaction('my-store-name', IDBTransaction.READ_ONLY);</code></p> </td> </tr> <tr> <td>Multiple object stores</td> <td><code>var transaction = db.transaction(['my-store-name', 'my-store-name2'], IDBTransaction.READ_ONLY);</code></td> </tr> <tr> <td>All object stores</td> <td> <p><code>var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);</code></p> <p>You cannot pass an empty array into the storeNames parameter, such as in the following: <code>var transaction = db.transaction([], IDBTransaction.READ_ONLY);.</code></p> <div class="warning"><strong>Warning:</strong>&nbsp; Accessing all obejct stores under the <code>READ_WRITE</code> mode means that you can run only that transaction. You cannot have writing transactions with overlapping scopes.</div> </td> </tr> </thead> <tbody> </tbody>
+</table>
+</div><div id="section_24"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeRequest">IDBTransaction</a></code></dt> <dd>The transaction object.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The error is thrown for one of two reasons: <ul> <li>The <code>close()</code> method has been called on this IDBDatabase instance.</li> <li>The object store has been deleted or removed.</li> </ul> </td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></td> <td>One of the object stores doesn't exist in the connected database.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBTransaction transaction(Indexable storeNames);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction">IDBTransaction</a> object, and starts a transaction in a separate thread. &nbsp;The method returns a transaction object (<a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction"><code>IDBTransaction</code></a>) containing the <a title="en/IndexedDB/IDBTransaction#objectStore()" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#objectStore()">objectStore()</a> method, which you can use to access your object store.&nbsp;</p>
+
+<div id="section_22"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>storeNames</dt> <dd>The names of object stores and indexes that are in the scope of the new transaction. Specify only the object stores that you need to access.</dd> <dt>mode</dt> <dd><em>Optional</em>. The types of access that can be performed in the transaction. Transactions are opened in one of three modes: <code>READ_ONLY</code>, <code>READ_WRITE</code>, and <code>VERSION_CHANGE</code>. If you don't provide the parameter, the default access mode is <code>READ_ONLY</code>. To avoid slowing things down, don't open a <code>READ_WRITE</code> transaction, unless you actually need to write into the database.</dd>
+</dl>
+</div><div id="section_23"><span id="Sample_code"></span><h5 class="editable">Sample code</h5>
+<p>To start a transaction with the following scope, you can use the code snippets in the table. As noted earlier:</p>
+<ul> <li>Add prefixes to the methods in WebKit browsers, (that is, instead of <code>IDBTransaction.READ_ONLY</code>, use <code>webkitIDBTransaction.READ_ONLY</code>).</li> <li>The default mode is <code>READ_ONLY</code>, so you don't really have to specify it. Of course, if you need to write into the object store, you can open the transaction in the <code>READ_WRITE</code> mode.</li>
+</ul>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="185">Scope</th> <th scope="col" width="1018">Code</th> </tr> <tr> <td>Single object store</td> <td> <p><code>var transaction = db.transaction(['my-store-name'], IDBTransaction.READ_ONLY); </code></p> <p>Alternatively:</p> <p><code>var transaction = db.transaction('my-store-name', IDBTransaction.READ_ONLY);</code></p> </td> </tr> <tr> <td>Multiple object stores</td> <td><code>var transaction = db.transaction(['my-store-name', 'my-store-name2'], IDBTransaction.READ_ONLY);</code></td> </tr> <tr> <td>All object stores</td> <td> <p><code>var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);</code></p> <p>You cannot pass an empty array into the storeNames parameter, such as in the following: <code>var transaction = db.transaction([], IDBTransaction.READ_ONLY);.</code></p> <div class="warning"><strong>Warning:</strong>&nbsp; Accessing all obejct stores under the <code>READ_WRITE</code> mode means that you can run only that transaction. You cannot have writing transactions with overlapping scopes.</div> </td> </tr> </thead> <tbody> </tbody>
+</table>
+</div><div id="section_24"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeRequest">IDBTransaction</a></code></dt> <dd>The transaction object.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The error is thrown for one of two reasons: <ul> <li>The <code>close()</code> method has been called on this IDBDatabase instance.</li> <li>The object store has been deleted or removed.</li> </ul> </td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></td> <td>One of the object stores doesn't exist in the connected database.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBTransaction transaction(Indexable storeNames, String mode);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction">IDBTransaction</a> object, and starts a transaction in a separate thread. &nbsp;The method returns a transaction object (<a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction"><code>IDBTransaction</code></a>) containing the <a title="en/IndexedDB/IDBTransaction#objectStore()" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#objectStore()">objectStore()</a> method, which you can use to access your object store.&nbsp;</p>
+
+<div id="section_22"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>storeNames</dt> <dd>The names of object stores and indexes that are in the scope of the new transaction. Specify only the object stores that you need to access.</dd> <dt>mode</dt> <dd><em>Optional</em>. The types of access that can be performed in the transaction. Transactions are opened in one of three modes: <code>READ_ONLY</code>, <code>READ_WRITE</code>, and <code>VERSION_CHANGE</code>. If you don't provide the parameter, the default access mode is <code>READ_ONLY</code>. To avoid slowing things down, don't open a <code>READ_WRITE</code> transaction, unless you actually need to write into the database.</dd>
+</dl>
+</div><div id="section_23"><span id="Sample_code"></span><h5 class="editable">Sample code</h5>
+<p>To start a transaction with the following scope, you can use the code snippets in the table. As noted earlier:</p>
+<ul> <li>Add prefixes to the methods in WebKit browsers, (that is, instead of <code>IDBTransaction.READ_ONLY</code>, use <code>webkitIDBTransaction.READ_ONLY</code>).</li> <li>The default mode is <code>READ_ONLY</code>, so you don't really have to specify it. Of course, if you need to write into the object store, you can open the transaction in the <code>READ_WRITE</code> mode.</li>
+</ul>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="185">Scope</th> <th scope="col" width="1018">Code</th> </tr> <tr> <td>Single object store</td> <td> <p><code>var transaction = db.transaction(['my-store-name'], IDBTransaction.READ_ONLY); </code></p> <p>Alternatively:</p> <p><code>var transaction = db.transaction('my-store-name', IDBTransaction.READ_ONLY);</code></p> </td> </tr> <tr> <td>Multiple object stores</td> <td><code>var transaction = db.transaction(['my-store-name', 'my-store-name2'], IDBTransaction.READ_ONLY);</code></td> </tr> <tr> <td>All object stores</td> <td> <p><code>var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);</code></p> <p>You cannot pass an empty array into the storeNames parameter, such as in the following: <code>var transaction = db.transaction([], IDBTransaction.READ_ONLY);.</code></p> <div class="warning"><strong>Warning:</strong>&nbsp; Accessing all obejct stores under the <code>READ_WRITE</code> mode means that you can run only that transaction. You cannot have writing transactions with overlapping scopes.</div> </td> </tr> </thead> <tbody> </tbody>
+</table>
+</div><div id="section_24"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeRequest">IDBTransaction</a></code></dt> <dd>The transaction object.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The error is thrown for one of two reasons: <ul> <li>The <code>close()</code> method has been called on this IDBDatabase instance.</li> <li>The object store has been deleted or removed.</li> </ul> </td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></td> <td>One of the object stores doesn't exist in the connected database.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBTransaction transaction(String storeName);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction">IDBTransaction</a> object, and starts a transaction in a separate thread. &nbsp;The method returns a transaction object (<a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction"><code>IDBTransaction</code></a>) containing the <a title="en/IndexedDB/IDBTransaction#objectStore()" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#objectStore()">objectStore()</a> method, which you can use to access your object store.&nbsp;</p>
+
+<div id="section_22"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>storeNames</dt> <dd>The names of object stores and indexes that are in the scope of the new transaction. Specify only the object stores that you need to access.</dd> <dt>mode</dt> <dd><em>Optional</em>. The types of access that can be performed in the transaction. Transactions are opened in one of three modes: <code>READ_ONLY</code>, <code>READ_WRITE</code>, and <code>VERSION_CHANGE</code>. If you don't provide the parameter, the default access mode is <code>READ_ONLY</code>. To avoid slowing things down, don't open a <code>READ_WRITE</code> transaction, unless you actually need to write into the database.</dd>
+</dl>
+</div><div id="section_23"><span id="Sample_code"></span><h5 class="editable">Sample code</h5>
+<p>To start a transaction with the following scope, you can use the code snippets in the table. As noted earlier:</p>
+<ul> <li>Add prefixes to the methods in WebKit browsers, (that is, instead of <code>IDBTransaction.READ_ONLY</code>, use <code>webkitIDBTransaction.READ_ONLY</code>).</li> <li>The default mode is <code>READ_ONLY</code>, so you don't really have to specify it. Of course, if you need to write into the object store, you can open the transaction in the <code>READ_WRITE</code> mode.</li>
+</ul>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="185">Scope</th> <th scope="col" width="1018">Code</th> </tr> <tr> <td>Single object store</td> <td> <p><code>var transaction = db.transaction(['my-store-name'], IDBTransaction.READ_ONLY); </code></p> <p>Alternatively:</p> <p><code>var transaction = db.transaction('my-store-name', IDBTransaction.READ_ONLY);</code></p> </td> </tr> <tr> <td>Multiple object stores</td> <td><code>var transaction = db.transaction(['my-store-name', 'my-store-name2'], IDBTransaction.READ_ONLY);</code></td> </tr> <tr> <td>All object stores</td> <td> <p><code>var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);</code></p> <p>You cannot pass an empty array into the storeNames parameter, such as in the following: <code>var transaction = db.transaction([], IDBTransaction.READ_ONLY);.</code></p> <div class="warning"><strong>Warning:</strong>&nbsp; Accessing all obejct stores under the <code>READ_WRITE</code> mode means that you can run only that transaction. You cannot have writing transactions with overlapping scopes.</div> </td> </tr> </thead> <tbody> </tbody>
+</table>
+</div><div id="section_24"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeRequest">IDBTransaction</a></code></dt> <dd>The transaction object.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The error is thrown for one of two reasons: <ul> <li>The <code>close()</code> method has been called on this IDBDatabase instance.</li> <li>The object store has been deleted or removed.</li> </ul> </td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></td> <td>One of the object stores doesn't exist in the connected database.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBTransaction transaction(String storeName, String mode);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction">IDBTransaction</a> object, and starts a transaction in a separate thread. &nbsp;The method returns a transaction object (<a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction"><code>IDBTransaction</code></a>) containing the <a title="en/IndexedDB/IDBTransaction#objectStore()" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#objectStore()">objectStore()</a> method, which you can use to access your object store.&nbsp;</p>
+
+<div id="section_22"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>storeNames</dt> <dd>The names of object stores and indexes that are in the scope of the new transaction. Specify only the object stores that you need to access.</dd> <dt>mode</dt> <dd><em>Optional</em>. The types of access that can be performed in the transaction. Transactions are opened in one of three modes: <code>READ_ONLY</code>, <code>READ_WRITE</code>, and <code>VERSION_CHANGE</code>. If you don't provide the parameter, the default access mode is <code>READ_ONLY</code>. To avoid slowing things down, don't open a <code>READ_WRITE</code> transaction, unless you actually need to write into the database.</dd>
+</dl>
+</div><div id="section_23"><span id="Sample_code"></span><h5 class="editable">Sample code</h5>
+<p>To start a transaction with the following scope, you can use the code snippets in the table. As noted earlier:</p>
+<ul> <li>Add prefixes to the methods in WebKit browsers, (that is, instead of <code>IDBTransaction.READ_ONLY</code>, use <code>webkitIDBTransaction.READ_ONLY</code>).</li> <li>The default mode is <code>READ_ONLY</code>, so you don't really have to specify it. Of course, if you need to write into the object store, you can open the transaction in the <code>READ_WRITE</code> mode.</li>
+</ul>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="185">Scope</th> <th scope="col" width="1018">Code</th> </tr> <tr> <td>Single object store</td> <td> <p><code>var transaction = db.transaction(['my-store-name'], IDBTransaction.READ_ONLY); </code></p> <p>Alternatively:</p> <p><code>var transaction = db.transaction('my-store-name', IDBTransaction.READ_ONLY);</code></p> </td> </tr> <tr> <td>Multiple object stores</td> <td><code>var transaction = db.transaction(['my-store-name', 'my-store-name2'], IDBTransaction.READ_ONLY);</code></td> </tr> <tr> <td>All object stores</td> <td> <p><code>var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);</code></p> <p>You cannot pass an empty array into the storeNames parameter, such as in the following: <code>var transaction = db.transaction([], IDBTransaction.READ_ONLY);.</code></p> <div class="warning"><strong>Warning:</strong>&nbsp; Accessing all obejct stores under the <code>READ_WRITE</code> mode means that you can run only that transaction. You cannot have writing transactions with overlapping scopes.</div> </td> </tr> </thead> <tbody> </tbody>
+</table>
+</div><div id="section_24"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeRequest">IDBTransaction</a></code></dt> <dd>The transaction object.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The error is thrown for one of two reasons: <ul> <li>The <code>close()</code> method has been called on this IDBDatabase instance.</li> <li>The object store has been deleted or removed.</li> </ul> </td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></td> <td>One of the object stores doesn't exist in the connected database.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBTransaction transaction(Indexable storeNames, int mode);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction">IDBTransaction</a> object, and starts a transaction in a separate thread. &nbsp;The method returns a transaction object (<a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction"><code>IDBTransaction</code></a>) containing the <a title="en/IndexedDB/IDBTransaction#objectStore()" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#objectStore()">objectStore()</a> method, which you can use to access your object store.&nbsp;</p>
+
+<div id="section_22"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>storeNames</dt> <dd>The names of object stores and indexes that are in the scope of the new transaction. Specify only the object stores that you need to access.</dd> <dt>mode</dt> <dd><em>Optional</em>. The types of access that can be performed in the transaction. Transactions are opened in one of three modes: <code>READ_ONLY</code>, <code>READ_WRITE</code>, and <code>VERSION_CHANGE</code>. If you don't provide the parameter, the default access mode is <code>READ_ONLY</code>. To avoid slowing things down, don't open a <code>READ_WRITE</code> transaction, unless you actually need to write into the database.</dd>
+</dl>
+</div><div id="section_23"><span id="Sample_code"></span><h5 class="editable">Sample code</h5>
+<p>To start a transaction with the following scope, you can use the code snippets in the table. As noted earlier:</p>
+<ul> <li>Add prefixes to the methods in WebKit browsers, (that is, instead of <code>IDBTransaction.READ_ONLY</code>, use <code>webkitIDBTransaction.READ_ONLY</code>).</li> <li>The default mode is <code>READ_ONLY</code>, so you don't really have to specify it. Of course, if you need to write into the object store, you can open the transaction in the <code>READ_WRITE</code> mode.</li>
+</ul>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="185">Scope</th> <th scope="col" width="1018">Code</th> </tr> <tr> <td>Single object store</td> <td> <p><code>var transaction = db.transaction(['my-store-name'], IDBTransaction.READ_ONLY); </code></p> <p>Alternatively:</p> <p><code>var transaction = db.transaction('my-store-name', IDBTransaction.READ_ONLY);</code></p> </td> </tr> <tr> <td>Multiple object stores</td> <td><code>var transaction = db.transaction(['my-store-name', 'my-store-name2'], IDBTransaction.READ_ONLY);</code></td> </tr> <tr> <td>All object stores</td> <td> <p><code>var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);</code></p> <p>You cannot pass an empty array into the storeNames parameter, such as in the following: <code>var transaction = db.transaction([], IDBTransaction.READ_ONLY);.</code></p> <div class="warning"><strong>Warning:</strong>&nbsp; Accessing all obejct stores under the <code>READ_WRITE</code> mode means that you can run only that transaction. You cannot have writing transactions with overlapping scopes.</div> </td> </tr> </thead> <tbody> </tbody>
+</table>
+</div><div id="section_24"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBTransaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeRequest">IDBTransaction</a></code></dt> <dd>The transaction object.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Exception</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The error is thrown for one of two reasons: <ul> <li>The <code>close()</code> method has been called on this IDBDatabase instance.</li> <li>The object store has been deleted or removed.</li> </ul> </td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></td> <td>One of the object stores doesn't exist in the connected database.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBTransaction transaction(String storeName, int mode);
+}
diff --git a/elemental/src/elemental/html/IDBDatabaseException.java b/elemental/src/elemental/html/IDBDatabaseException.java
new file mode 100644
index 0000000..4d68f4c
--- /dev/null
+++ b/elemental/src/elemental/html/IDBDatabaseException.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * In the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB API</a>, an <code>IDBDatabaseException</code> object represents exception conditions that can be encountered while performing database operations.
+  */
+public interface IDBDatabaseException {
+
+  /**
+    * A request was aborted, for example, through a call to<a title="en/IndexedDB/IDBTransaction#abort" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#abort"> <code>IDBTransaction.abort</code></a>.
+    */
+
+    static final int ABORT_ERR = 20;
+
+  /**
+    * A mutation operation in the transaction failed because a constraint was not satisfied. For example, an object, such as an object store or index, already exists and a request attempted to create a new one.
+    */
+
+    static final int CONSTRAINT_ERR = 4;
+
+  /**
+    * Data provided to an operation does not meet requirements.
+    */
+
+    static final int DATA_ERR = 5;
+
+  /**
+    * An operation was not allowed on an object. Unless the cause of the error is corrected, retrying the same operation would result in failure.
+    */
+
+    static final int NON_TRANSIENT_ERR = 2;
+
+  /**
+    * <p>An operation was called on an object where it is not allowed or at a time when it is not allowed. It also occurs if a request is made on a source object that has been deleted or removed.</p> <p>More specific variants of this error includes: <code> TRANSACTION_INACTIVE_ERR</code> and <code>READ_ONLY_ERR</code>.</p>
+    */
+
+    static final int NOT_ALLOWED_ERR = 6;
+
+  /**
+    * The operation failed, because the requested database object could not be found; for example, an object store did not exist but was being opened.
+    */
+
+    static final int NOT_FOUND_ERR = 8;
+
+    static final int NO_ERR = 0;
+
+  /**
+    * Either there's not enough remaining storage space or the storage quota was reached and the user declined to give more space to the database.
+    */
+
+    static final int QUOTA_ERR = 22;
+
+  /**
+    * A mutation operation was attempted in a <code>READ_ONLY</code>&nbsp;transaction.
+    */
+
+    static final int READ_ONLY_ERR = 9;
+
+  /**
+    * A lock for the transaction could not be obtained in a reasonable time.
+    */
+
+    static final int TIMEOUT_ERR = 23;
+
+  /**
+    * A request was made against a transaction that is either not currently active or is already finished.
+    */
+
+    static final int TRANSACTION_INACTIVE_ERR = 7;
+
+  /**
+    * The operation failed for reasons unrelated to the database itself, and it is not covered by any other error code; for example, a failure due to disk IO errors.
+    */
+
+    static final int UNKNOWN_ERR = 1;
+
+  /**
+    * A request to open a database with a version lower than the one it already has. This can only happen with <a title="en/IndexedDB/IDBOpenDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBOpenDBRequest"><code>IDBOpenDBRequest</code></a>.
+    */
+
+    static final int VER_ERR = 12;
+
+
+  /**
+    * The most appropriate error code for the condition.
+    */
+  int getCode();
+
+
+  /**
+    * Error message describing the exception raised.
+    */
+  String getMessage();
+
+  String getName();
+}
diff --git a/elemental/src/elemental/html/IDBFactory.java b/elemental/src/elemental/html/IDBFactory.java
new file mode 100644
index 0000000..cad8417
--- /dev/null
+++ b/elemental/src/elemental/html/IDBFactory.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>IDBFactory</code> interface of the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB&nbsp;API</a> lets applications asynchronously access the indexed databases. The object that implements the interface is&nbsp; <code>window.indexedDB</code>. You open—that is, create and access—and delete a database with the object and not directly with <code>IDBFactory</code>.</p>
+<p>This interface still has vendor prefixes, that is to say, you have to make calls with <code>mozIndexedDB.open()</code> for Firefox and <code>webkitIndexedDB.open()</code> for Chrome.</p>
+  */
+public interface IDBFactory {
+
+
+  /**
+    * <p>Compares two values as keys to determine equality and ordering for IndexedDB operations, such as storing and iterating. Do not use this method for comparing arbitrary JavaScript values, because many JavaScript values are either not valid IndexedDB keys (booleans and objects, for example) or are treated as equivalent IndexedDB keys (for example, since IndexedDB ignores arrays with non-numeric properties and treats them as empty arrays, so any non-numeric array are treated as equivalent).</p>
+<p>This throws an exception if either of the values is not a valid key. &nbsp;</p>
+
+<div id="section_11"><span id="Parameters_3"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>first</dt> <dd>The first key to compare.</dd> <dt>second</dt> <dd>The second key to compare.</dd>
+</dl>
+</div><div id="section_12"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt>Integer</dt> <dd> <table class="standard-table" width="434"> <thead> <tr> <th scope="col" width="216">Returned value</th> <th scope="col" width="206">Description</th> </tr> </thead> <tbody> <tr> <td>-1</td> <td>1st key &lt; 2nd</td> </tr> <tr> <td>0</td> <td>1st key = 2nd</td> </tr> <tr> <td>1</td> <td>1st key &gt; 2nd</td> </tr> </tbody> </table> </dd>
+</dl>
+</div><div id="section_13"><span id="Exceptions"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<br>
+<br>
+<br><table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NON_TRANSIENT_ERR">NON_TRANSIENT_ERR</a></code></td> <td>One of the supplied keys was not a valid key.</td> </tr> </thead> <tbody> </tbody>
+</table>
+</div>
+    */
+  short cmp(Object first, Object second);
+
+
+  /**
+    * <p>Request deleting a database. The method returns&nbsp;&nbsp;an IDBRequest object&nbsp;immediately, and performs the deletion operation&nbsp;asynchronously.</p>
+<p>The deletion operation (performed in a different thread) consists of the following steps:</p>
+<ol> <li>If there is no database with the given name, exit successfully.</li> <li>Fire an <a title="en/IndexedDB/IDBVersionChangeEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeEvent">IDBVersionChangeEvent</a> at all connection objects connected to the named database, with <code><a title="en/IndexedDB/IDBVersionChangeEvent#attr version" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeEvent#attr_version">version</a></code> set to <code>null</code>.</li> <li>If any connection objects connected to the database are still open, fire a <code>blocked</code> event at the request object returned by the <code>deleteDatabase</code> method, using <a title="en/IndexedDB/IDBVersionChangeEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeEvent">IDBVersionChangeEvent</a> with <code><a title="en/IndexedDB/IDBVersionChangeEvent#attr version" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBVersionChangeEvent#attr_version">version</a></code> set to <code>null</code>.</li> <li>Wait until all open connections to the database are closed.</li> <li>Delete the database.</li>
+</ol>
+<p>If the database is successfully deleted, then an <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">IDBSuccessEvent</a> is fired on the request object returned from this method, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to <code>null</code>.</p>
+<p>If an error occurs while the database is being deleted, then an error event is fired on the request object that is returned from this method, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> and <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code> set to appropriate values.</p>
+<p><strong>Tip:</strong> If the browser you are using hasn't implemented this yet, you can delete the object stores one by one, thus effectively removing the database.</p>
+
+<div id="section_8"><span id="Parameters_2"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>name</dt> <dd>The name of the database.</dd>
+</dl>
+</div><div id="section_9"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this request are fired. In the latest draft of the specification, which has not yet been implemented by browsers, the returned object is <code>IDBOpenRequest</code>.</dd>
+</dl>
+</div>
+    */
+  IDBVersionChangeRequest deleteDatabase(String name);
+
+  IDBRequest getDatabaseNames();
+
+
+  /**
+    * <div class="warning"><strong>Warning:</strong> The description documents the old specification. Some browsers still implement this method. The specifications have changed, but the changes have not yet been implemented by all browser. See the compatibility table for more information.</div>
+<p>Request opening a <a title="en/IndexedDB#gloss database connection" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_database_connection">connection to a database</a>. The method returns &nbsp;an IDBRequest object&nbsp;immediately, and performs the opening operation asynchronously.&nbsp;</p>
+<p>The opening operation—which is performed in a separate thread—consists of the following steps:</p>
+<ol> <li>If a database named <code>myAwesomeDatabase</code> already exists: <ul> <li>Wait until any existing <code><a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE">VERSION_CHANGE</a></code> transactions have finished.</li> <li>If the database has a deletion pending, wait until it has been deleted.</li> </ul> </li> <li>If no database with that name exists, create a database with the provided name, with the empty string as its version, and no object stores.</li> <li>Create a connection to the database.</li>
+</ol>
+<p>If the operation is successful, an <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">IDBSuccessEvent</a> is fired on the request object that is returned from this method, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> attribute set to the new <a title="en/IndexedDB/IDBDatabase" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabase">IDBDatabase</a> object for the connection.</p>
+<p>If an error occurs while the database connection is being opened, then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object returned from this method, with its <a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code"><code>code</code></a> and&nbsp; <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code> set to appropriate values.</p>
+
+<div id="section_5"><span id="Parameters"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>name</dt> <dd>The name of the database.</dd> <dt>version</dt> <dd>The version of the database.</dd>
+</dl>
+</div><div id="section_6"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this request are fired. In the latest draft of the specification, which has not yet been implemented by browsers, the returned object is <code>IDBOpenRequest</code>.</dd>
+</dl>
+</div>
+    */
+  IDBRequest open(String name);
+}
diff --git a/elemental/src/elemental/html/IDBIndex.java b/elemental/src/elemental/html/IDBIndex.java
new file mode 100644
index 0000000..74eaf09
--- /dev/null
+++ b/elemental/src/elemental/html/IDBIndex.java
@@ -0,0 +1,558 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>IDBIndex</code> interface of the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB API</a> provides asynchronous access to an <a title="en/IndexedDB#gloss index" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_index">index</a> in a database. An index is a kind of object store for looking up records in another object store, called the <em>referenced object store</em>. You use this interface to retrieve data.</p>
+<p>Inherits from: <a title="en/DOM/EventTarget" rel="internal" href="https://developer.mozilla.org/en/DOM/EventTarget">EventTarget</a></p>
+  */
+public interface IDBIndex {
+
+  Object getKeyPath();
+
+  boolean isMultiEntry();
+
+  String getName();
+
+  IDBObjectStore getObjectStore();
+
+  boolean isUnique();
+
+
+  /**
+    * <p>Returns an <a title="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and in a separate thread, returns the number of records within a key range. For example, if you want to see how many records are between keys 1000 and 2000 in an object store, you can write the following: <code> var req = store.count(<a title="en/IndexedDB/IDBKeyRange" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBKeyRange">IDBKeyRange</a>.bound(1000, 2000));</code></p>
+<pre>IDBRequest count (
+  in optional any key
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_15"><span id="Parameters_3"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key or key range that identifies the record to be counted.</dd>
+</dl></div><div id="section_16"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_17"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise a <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest count();
+
+
+  /**
+    * <p>Returns an <a title="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and in a separate thread, returns the number of records within a key range. For example, if you want to see how many records are between keys 1000 and 2000 in an object store, you can write the following: <code> var req = store.count(<a title="en/IndexedDB/IDBKeyRange" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBKeyRange">IDBKeyRange</a>.bound(1000, 2000));</code></p>
+<pre>IDBRequest count (
+  in optional any key
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_15"><span id="Parameters_3"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key or key range that identifies the record to be counted.</dd>
+</dl></div><div id="section_16"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_17"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise a <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest count(IDBKeyRange range);
+
+
+  /**
+    * <p>Returns an <a title="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and in a separate thread, returns the number of records within a key range. For example, if you want to see how many records are between keys 1000 and 2000 in an object store, you can write the following: <code> var req = store.count(<a title="en/IndexedDB/IDBKeyRange" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBKeyRange">IDBKeyRange</a>.bound(1000, 2000));</code></p>
+<pre>IDBRequest count (
+  in optional any key
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_15"><span id="Parameters_3"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key or key range that identifies the record to be counted.</dd>
+</dl></div><div id="section_16"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_17"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise a <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest count(Object key);
+
+
+  /**
+    * <p>Returns an <a title="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, finds either:</p>
+<ul> <li>The value in the referenced object store that corresponds to the given key.</li> <li>The first corresponding value, if <code>key</code> is a key range.</li>
+</ul>
+<p>If a value is successfully found, then a structured clone of it is created and set as the <code><a title="en/IndexedDB/IDBRequest#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest#attr_result">result</a></code> of the request object.</p>
+<p></p><div class="note"><strong>Note:</strong>&nbsp;This method produces the same result for: a) a record that doesn't exist in the database and b) a record that has an undefined value. To tell these situations apart, call the openCursor() method with the same key. That method provides a cursor if the record exists, and not if it does not.</div>
+<p></p>
+<pre>IDBRequest get (
+  in any key
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_7"><span id="Parameters"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key or key range that identifies the record to be retrieved.</dd>
+</dl>
+</div><div id="section_8"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_9"><span id="Exceptions"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest get(IDBKeyRange key);
+
+  IDBRequest getObject(Object key);
+
+
+  /**
+    * <p>Returns an <a title="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, finds either:</p>
+<ul> <li>The value in the index that corresponds to the given key</li> <li>The first corresponding value, if <code>key</code> is a key range.</li>
+</ul>
+<p>If a value is successfully found, then a structured clone of it is created and set as the <code><a title="en/IndexedDB/IDBRequest#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest#attr_result">result</a></code> of the request object.</p>
+<p></p><div class="note"><strong>Note:</strong>&nbsp;This method produces the same result for: a) a record that doesn't exist in the database and b) a record that has an undefined value. To tell these situations apart, call the openCursor() method with the same key. That method provides a cursor if the record exists, and not if it does not.</div>
+<p></p>
+<pre>IDBRequest getKey (
+  in any key
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_11"><span id="Parameters_2"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key or key range that identifies the record to be retrieved.</dd>
+</dl>
+</div><div id="section_12"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_13"><span id="Exceptions_2"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise a <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest getKey(IDBKeyRange key);
+
+
+  /**
+    * <p>Returns an <a title="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, finds either:</p>
+<ul> <li>The value in the index that corresponds to the given key</li> <li>The first corresponding value, if <code>key</code> is a key range.</li>
+</ul>
+<p>If a value is successfully found, then a structured clone of it is created and set as the <code><a title="en/IndexedDB/IDBRequest#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest#attr_result">result</a></code> of the request object.</p>
+<p></p><div class="note"><strong>Note:</strong>&nbsp;This method produces the same result for: a) a record that doesn't exist in the database and b) a record that has an undefined value. To tell these situations apart, call the openCursor() method with the same key. That method provides a cursor if the record exists, and not if it does not.</div>
+<p></p>
+<pre>IDBRequest getKey (
+  in any key
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_11"><span id="Parameters_2"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key or key range that identifies the record to be retrieved.</dd>
+</dl>
+</div><div id="section_12"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_13"><span id="Exceptions_2"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise a <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest getKey(Object key);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the specified key range. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to a structured clone of the referenced value.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_19"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required <a title="en/indexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_20"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_21"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openCursor();
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the specified key range. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to a structured clone of the referenced value.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_19"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required <a title="en/indexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_20"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_21"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openCursor(IDBKeyRange range);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the specified key range. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to a structured clone of the referenced value.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_19"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required <a title="en/indexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_20"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_21"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openCursor(IDBKeyRange range, String direction);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the specified key range. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to a structured clone of the referenced value.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_19"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required <a title="en/indexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_20"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_21"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openCursor(Object key);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the specified key range. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to a structured clone of the referenced value.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_19"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required <a title="en/indexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_20"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_21"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openCursor(Object key, String direction);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the specified key range. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to a structured clone of the referenced value.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_19"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required <a title="en/indexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_20"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_21"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openCursor(IDBKeyRange range, int direction);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the specified key range. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to a structured clone of the referenced value.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_19"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required <a title="en/indexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_20"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_21"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openCursor(Object key, int direction);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a cursor over the specified key range, as arranged by this index. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to the value of the found record.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openKeyCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_23"><span id="Parameters_5"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required direction. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_24"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_5"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openKeyCursor();
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a cursor over the specified key range, as arranged by this index. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to the value of the found record.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openKeyCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_23"><span id="Parameters_5"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required direction. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_24"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_5"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openKeyCursor(IDBKeyRange range);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a cursor over the specified key range, as arranged by this index. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to the value of the found record.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openKeyCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_23"><span id="Parameters_5"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required direction. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_24"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_5"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openKeyCursor(IDBKeyRange range, String direction);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a cursor over the specified key range, as arranged by this index. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to the value of the found record.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openKeyCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_23"><span id="Parameters_5"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required direction. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_24"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_5"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openKeyCursor(Object key);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a cursor over the specified key range, as arranged by this index. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to the value of the found record.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openKeyCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_23"><span id="Parameters_5"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required direction. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_24"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_5"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openKeyCursor(Object key, String direction);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a cursor over the specified key range, as arranged by this index. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to the value of the found record.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openKeyCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_23"><span id="Parameters_5"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required direction. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_24"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_5"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openKeyCursor(IDBKeyRange range, int direction);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a cursor over the specified key range, as arranged by this index. The method sets the position of the cursor to the appropriate record, based on the specified direction.</p>
+<ul> <li>If the key range is not specified or is null, then the range includes all the records.</li> <li>If at least one record matches the key range, then a <a title="en/IndexedDB/IDBSuccessEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent">success event</a> is fired on the result object, with its <a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a> set to the new <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object; the <code><a title="en/IndexedDB/IDBCursor#attr value" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#attr_value">value</a></code> of the cursor object is set to the value of the found record.</li> <li>If no records match the key range, then then an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a> is fired on the request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR" rel="internal">NOT_FOUND_ERR</a></code> and a suitable <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>.</li>
+</ul>
+<pre>IDBRequest openKeyCursor (
+  in optional any? range, 
+  in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_23"><span id="Parameters_5"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd><em>Optional.</em> The key range to use as the cursor's range.</dd> <dt>direction</dt> <dd><em>Optional.</em> The cursor's required direction. See <a title="en/IndexedDB/IDBCursor#Constants" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor#Constants">IDBCursor Constants</a> for possible values.</dd>
+</dl>
+</div><div id="section_24"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a href="https://developer.mozilla.org/en/IndexedDB/IDBRequest" rel="internal">IDBRequest</a></code></dt>
+</dl>
+<dl> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_5"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></td> <td>The index's transaction is not active.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></td> <td>The <code>key</code> parameter was not a valid value.</td> </tr> <tr> <td><code><a title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></td> <td>The request was made on a source object that has been deleted or removed.</td> </tr> </tbody>
+</table>
+</div>
+    */
+  IDBRequest openKeyCursor(Object key, int direction);
+}
diff --git a/elemental/src/elemental/html/IDBKey.java b/elemental/src/elemental/html/IDBKey.java
new file mode 100644
index 0000000..30262a4
--- /dev/null
+++ b/elemental/src/elemental/html/IDBKey.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface IDBKey {
+}
diff --git a/elemental/src/elemental/html/IDBKeyRange.java b/elemental/src/elemental/html/IDBKeyRange.java
new file mode 100644
index 0000000..c8b00fa
--- /dev/null
+++ b/elemental/src/elemental/html/IDBKeyRange.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>IDBKeyRange</code> interface of the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB API</a> represents a continuous interval over some data type that is used for keys. Records can be retrieved from object stores and indexes using keys or a range of keys. You can limit the range using lower and upper bounds. For example, you can iterate over all values of a key between x and y.
+  */
+public interface IDBKeyRange {
+
+  Object getLower();
+
+  boolean isLowerOpen();
+
+  Object getUpper();
+
+
+  /**
+    * Returns false if the upper-bound value is included in the key range.
+    */
+  boolean isUpperOpen();
+}
diff --git a/elemental/src/elemental/html/IDBObjectStore.java b/elemental/src/elemental/html/IDBObjectStore.java
new file mode 100644
index 0000000..62c303b
--- /dev/null
+++ b/elemental/src/elemental/html/IDBObjectStore.java
@@ -0,0 +1,463 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.util.Mappable;
+import elemental.util.Indexable;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>IDBObjectStore</code> interface of the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB API</a> represents an <a title="en/IndexedDB#gloss object store" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_object_store">object store</a> in a database.&nbsp;Records within an object store are sorted according to their keys. This sorting enable fast insertion, look-up, and &nbsp;ordered retrieval.&nbsp;
+  */
+public interface IDBObjectStore {
+
+  boolean isAutoIncrement();
+
+
+  /**
+    * A list of the names of <a title="en/IndexedDB#gloss index" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_index">indexes</a> on objects in this object store.
+    */
+  Indexable getIndexNames();
+
+
+  /**
+    * The <a title="en/IndexedDB#gloss key path" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_path">key path</a> of this object store. If this attribute is null, the application must provide a key for each modification operation.
+    */
+  Object getKeyPath();
+
+
+  /**
+    * The name of this object store.
+    */
+  String getName();
+
+  IDBTransaction getTransaction();
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a class="external" title="http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone" rel="external" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone" target="_blank">structured clone</a> of the <code>value</code>, and stores the cloned value in the object store. If the record is successfully stored, then a success event is fired on the returned request object, using the <a title="en/IndexedDB/IDBTransactionEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent">IDBTransactionEvent</a> interface, with the <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the key for the stored record, and <code><a title="en/IndexedDB/IDBTransactionEvent#attr transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction">transaction</a></code> set to the transaction in which this object store is opened. If a record already exists in the object store with the <code>key</code> parameter as its key, then an error event is fired on the returned request object, with <a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a> set to <code><a title="en/IndexedDB/DatabaseException#CONSTRAINT ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR">CONSTRAINT_ERR</a></code>.</p>
+
+<div id="section_5"><span id="Parameters"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>value</dt> <dd>The value to be stored.</dd> <dt>key</dt> <dd>The key to use to identify the record. If unspecified, it results to null.</dd>
+</dl>
+</div><div id="section_6"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_7"><span id="Exceptions"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></dt> <dd>If the object store uses in-line keys or has a key generator, and a key parameter was provided.<br> If the object store uses out-of-line keys and has no key generator, and no key parameter was provided.<br> If the object store uses in-line keys but no key generator, and the object store's key path does not yield a valid key.<br> If the key parameter was provided but does not contain a valid key.<br> If there are indexed on this object store, and using their key path on the value parameter yields a value that is not a valid key.</dd> <dt><code><a title="en/IndexedDB/IDBDatabaseException#READ ONLY ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR">READ_ONLY_ERR</a></code></dt> <dd>If the mode of the associated transaction is <code><a title="en/IndexedDB/IDBTransaction#READ ONLY" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY">READ_ONLY</a></code>.</dd> <dt><code><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR">TRANSACTION_INACTIVE_ERR</a></code></dt> <dd>If the associated transaction is not active.</dd>
+</dl>
+<p>This method can raise a <a title="en/DOM/DOMException" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMException">DOMException</a> with the following code:</p>
+<dl> <dt><code>DATA_CLONE_ERR</code></dt> <dd>If the data being stored could not be cloned by the internal structured cloning algorithm.</dd>
+</dl>
+<dl>
+</dl>
+</div>
+    */
+  IDBRequest add(Object value);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a class="external" title="http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone" rel="external" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone" target="_blank">structured clone</a> of the <code>value</code>, and stores the cloned value in the object store. If the record is successfully stored, then a success event is fired on the returned request object, using the <a title="en/IndexedDB/IDBTransactionEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent">IDBTransactionEvent</a> interface, with the <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the key for the stored record, and <code><a title="en/IndexedDB/IDBTransactionEvent#attr transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction">transaction</a></code> set to the transaction in which this object store is opened. If a record already exists in the object store with the <code>key</code> parameter as its key, then an error event is fired on the returned request object, with <a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a> set to <code><a title="en/IndexedDB/DatabaseException#CONSTRAINT ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR">CONSTRAINT_ERR</a></code>.</p>
+
+<div id="section_5"><span id="Parameters"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>value</dt> <dd>The value to be stored.</dd> <dt>key</dt> <dd>The key to use to identify the record. If unspecified, it results to null.</dd>
+</dl>
+</div><div id="section_6"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_7"><span id="Exceptions"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#DATA ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#DATA_ERR">DATA_ERR</a></code></dt> <dd>If the object store uses in-line keys or has a key generator, and a key parameter was provided.<br> If the object store uses out-of-line keys and has no key generator, and no key parameter was provided.<br> If the object store uses in-line keys but no key generator, and the object store's key path does not yield a valid key.<br> If the key parameter was provided but does not contain a valid key.<br> If there are indexed on this object store, and using their key path on the value parameter yields a value that is not a valid key.</dd> <dt><code><a title="en/IndexedDB/IDBDatabaseException#READ ONLY ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR">READ_ONLY_ERR</a></code></dt> <dd>If the mode of the associated transaction is <code><a title="en/IndexedDB/IDBTransaction#READ ONLY" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY">READ_ONLY</a></code>.</dd> <dt><code><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR">TRANSACTION_INACTIVE_ERR</a></code></dt> <dd>If the associated transaction is not active.</dd>
+</dl>
+<p>This method can raise a <a title="en/DOM/DOMException" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMException">DOMException</a> with the following code:</p>
+<dl> <dt><code>DATA_CLONE_ERR</code></dt> <dd>If the data being stored could not be cloned by the internal structured cloning algorithm.</dd>
+</dl>
+<dl>
+</dl>
+</div>
+    */
+  IDBRequest add(Object value, Object key);
+
+
+  /**
+    * <p>If the mode of the transaction that this object store belongs to is <code><a title="en/IndexedDB/IDBTransaction#READ ONLY" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#READ_ONLY">READ_ONLY</a></code>, this method raises an&nbsp;<a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with its code set to <code><a title="en/IndexedDB/IDBDatabaseException#READ ONLY ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR">READ_ONLY_ERR</a></code>. Otherwise, this method creates and immediately returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and clears this object store in a separate thread. Clearing an object store consists of removing all records from the object store and removing all records in indexes that reference the object store.</p>
+
+<div id="section_9"><span id="Returns_2"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_10"><span id="Exceptions_2"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <dt><a title="en/IndexedDB/IDBDatabaseException#READ ONLY ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#READ_ONLY_ERR"><code>READ_ONLY_ERR</code></a></dt> <dd>If the mode of the transaction that this object store belongs to is READ_ONLY.</dd> <dt><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR"><code>TRANSACTION_INACTIVE_ERR</code></a></dt> <dd>If the transaction that this object store belongs to is not active.</dd>
+</dl></div>
+    */
+  IDBRequest clear();
+
+
+  /**
+    * <p>Immediately returns an <a title="IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object and asynchronously count the amount of objects in the object store that match the parameter, a key or a key range. If the parameter is not valid returns an exception.</p>
+
+<div id="section_12"><span id="Parameters_2"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key or key range that identifies the records to be counted.</dd>
+</dl>
+</div><div id="section_13"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_14"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <dt><code><a href="IDBDatabaseException#DATA_ERR" rel="internal" title="en/IndexedDB/DatabaseException#DATA ERR">DATA_ERR</a></code></dt> <dd>If the object store uses in-line keys or has a key generator, and a key parameter was provided.<br> If the object store uses out-of-line keys and has no key generator, and no key parameter was provided.<br> If the object store uses in-line keys but no key generator, and the object store's key path does not yield a valid key.<br> If the key parameter was provided but does not contain a valid key.<br> If there are indexed on this object store, and using their key path on the value parameter yields a value that is not a valid key.</dd> <dt><code><a href="IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>The request was made on a source object that has been deleted or removed.</dd>
+</dl></div>
+    */
+  IDBRequest count();
+
+
+  /**
+    * <p>Immediately returns an <a title="IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object and asynchronously count the amount of objects in the object store that match the parameter, a key or a key range. If the parameter is not valid returns an exception.</p>
+
+<div id="section_12"><span id="Parameters_2"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key or key range that identifies the records to be counted.</dd>
+</dl>
+</div><div id="section_13"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_14"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <dt><code><a href="IDBDatabaseException#DATA_ERR" rel="internal" title="en/IndexedDB/DatabaseException#DATA ERR">DATA_ERR</a></code></dt> <dd>If the object store uses in-line keys or has a key generator, and a key parameter was provided.<br> If the object store uses out-of-line keys and has no key generator, and no key parameter was provided.<br> If the object store uses in-line keys but no key generator, and the object store's key path does not yield a valid key.<br> If the key parameter was provided but does not contain a valid key.<br> If there are indexed on this object store, and using their key path on the value parameter yields a value that is not a valid key.</dd> <dt><code><a href="IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>The request was made on a source object that has been deleted or removed.</dd>
+</dl></div>
+    */
+  IDBRequest count(IDBKeyRange range);
+
+
+  /**
+    * <p>Immediately returns an <a title="IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object and asynchronously count the amount of objects in the object store that match the parameter, a key or a key range. If the parameter is not valid returns an exception.</p>
+
+<div id="section_12"><span id="Parameters_2"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key or key range that identifies the records to be counted.</dd>
+</dl>
+</div><div id="section_13"><span id="Returns_3"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_14"><span id="Exceptions_3"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <dt><code><a href="IDBDatabaseException#DATA_ERR" rel="internal" title="en/IndexedDB/DatabaseException#DATA ERR">DATA_ERR</a></code></dt> <dd>If the object store uses in-line keys or has a key generator, and a key parameter was provided.<br> If the object store uses out-of-line keys and has no key generator, and no key parameter was provided.<br> If the object store uses in-line keys but no key generator, and the object store's key path does not yield a valid key.<br> If the key parameter was provided but does not contain a valid key.<br> If there are indexed on this object store, and using their key path on the value parameter yields a value that is not a valid key.</dd> <dt><code><a href="IDBDatabaseException#NOT_ALLOWED_ERR" rel="internal" title="en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>The request was made on a source object that has been deleted or removed.</dd>
+</dl></div>
+    */
+  IDBRequest count(Object key);
+
+
+  /**
+    * <p>Creates and returns a new index in the connected database. Note that this method must be called only from a <a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE"><code>VERSION_CHANGE</code></a> transaction callback.</p>
+<pre>IDBIndex createIndex (
+&nbsp; in DOMString name, 
+&nbsp; in DOMString keyPath, 
+&nbsp; in Object optionalParameters
+) raises (IDBDatabaseException);
+
+</pre>
+<div id="section_16"><span id="Parameters_3"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>name</dt> <dd>The name of the index to create.</dd> <dt>keyPath</dt> <dd>The key path for the index to use.</dd> <dt>optionalParameters</dt> <dd> <div class="warning"><strong>Warning:</strong> The latest draft of the specification changed this to <code>IDBIndexParameters</code>, which is not yet recognized by any browser</div> <p>Options object whose attributes are optional parameters to the method. It includes the following properties:</p> <table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code>unique</code></td> <td>If true, the index will not allow duplicate values for a single key.</td> </tr> <tr> <td><code>multientry</code></td> <td>If true, the index will add an entry in the index for each array element when the <em>keypath</em> resolves to an Array. If false, it will add one single entry containing the Array.</td> </tr> </tbody> </table> <p>Unknown parameters are ignored.</p> </dd> <dd></dd>
+</dl>
+</div><div id="section_17"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBIndex" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBIndex">IDBIndex</a></dt> <dd>The newly created index.</dd>
+</dl>
+</div><div id="section_18"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#CONSTRAINT ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR">CONSTRAINT_ERR</a></code></dt> <dd>If an index with the same name (based on case-sensitive comparison) already exists in the connected database.</dd> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If this method was not called from a <a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE"><code>VERSION_CHANGE</code></a> transaction callback.</dd>
+</dl></div>
+    */
+  IDBIndex createIndex(String name, String keyPath);
+
+
+  /**
+    * <p>Creates and returns a new index in the connected database. Note that this method must be called only from a <a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE"><code>VERSION_CHANGE</code></a> transaction callback.</p>
+<pre>IDBIndex createIndex (
+&nbsp; in DOMString name, 
+&nbsp; in DOMString keyPath, 
+&nbsp; in Object optionalParameters
+) raises (IDBDatabaseException);
+
+</pre>
+<div id="section_16"><span id="Parameters_3"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>name</dt> <dd>The name of the index to create.</dd> <dt>keyPath</dt> <dd>The key path for the index to use.</dd> <dt>optionalParameters</dt> <dd> <div class="warning"><strong>Warning:</strong> The latest draft of the specification changed this to <code>IDBIndexParameters</code>, which is not yet recognized by any browser</div> <p>Options object whose attributes are optional parameters to the method. It includes the following properties:</p> <table class="standard-table"> <thead> <tr> <th scope="col" width="131">Attribute</th> <th scope="col" width="698">Description</th> </tr> </thead> <tbody> <tr> <td><code>unique</code></td> <td>If true, the index will not allow duplicate values for a single key.</td> </tr> <tr> <td><code>multientry</code></td> <td>If true, the index will add an entry in the index for each array element when the <em>keypath</em> resolves to an Array. If false, it will add one single entry containing the Array.</td> </tr> </tbody> </table> <p>Unknown parameters are ignored.</p> </dd> <dd></dd>
+</dl>
+</div><div id="section_17"><span id="Returns_4"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBIndex" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBIndex">IDBIndex</a></dt> <dd>The newly created index.</dd>
+</dl>
+</div><div id="section_18"><span id="Exceptions_4"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#CONSTRAINT ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#CONSTRAINT_ERR">CONSTRAINT_ERR</a></code></dt> <dd>If an index with the same name (based on case-sensitive comparison) already exists in the connected database.</dd> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If this method was not called from a <a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE"><code>VERSION_CHANGE</code></a> transaction callback.</dd>
+</dl></div>
+    */
+  IDBIndex createIndex(String name, String keyPath, Mappable options);
+
+
+  /**
+    * <p>Immediately returns an <code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code> object, and removes the record specified by the given key from this object store, and any indexes that reference it, in a separate thread. If no record exists in this object store corresponding to the key, an error event is fired on the returned request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code> and an appropriate <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>. If the record is successfully removed, then a success event is fired on the returned request object, using the <code><a title="en/IndexedDB/IDBTransactionEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent">IDBTransactionEvent</a></code> interface, with the <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to <code>undefined</code>, and <a title="en/IndexedDB/IDBTransactionEvent#attr transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction">transaction</a> set to the transaction in which this object store is opened.</p>
+<pre>IDBRequest delete (
+  in any key
+) raises (IDBDatabaseException); 
+</pre>
+<div id="section_20"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key to use to identify the record.</dd>
+</dl>
+</div><div id="section_21"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_22"><span id="Exceptions_5"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p></div>
+    */
+  IDBRequest _delete(IDBKeyRange keyRange);
+
+
+  /**
+    * <p>Immediately returns an <code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code> object, and removes the record specified by the given key from this object store, and any indexes that reference it, in a separate thread. If no record exists in this object store corresponding to the key, an error event is fired on the returned request object, with its <code><a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a></code> set to <code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code> and an appropriate <code><a title="en/IndexedDB/IDBErrorEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_message">message</a></code>. If the record is successfully removed, then a success event is fired on the returned request object, using the <code><a title="en/IndexedDB/IDBTransactionEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent">IDBTransactionEvent</a></code> interface, with the <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to <code>undefined</code>, and <a title="en/IndexedDB/IDBTransactionEvent#attr transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction">transaction</a> set to the transaction in which this object store is opened.</p>
+<pre>IDBRequest delete (
+  in any key
+) raises (IDBDatabaseException); 
+</pre>
+<div id="section_20"><span id="Parameters_4"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>key</dt> <dd>The key to use to identify the record.</dd>
+</dl>
+</div><div id="section_21"><span id="Returns_5"></span><h5 class="editable">Returns</h5>
+<dl> <dt><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_22"><span id="Exceptions_5"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p></div>
+    */
+  IDBRequest _delete(Object key);
+
+
+  /**
+    * <p>Destroys the index with the specified name in the connected database. Note that this method must be called only from a <code><a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE">VERSION_CHANGE</a></code> transaction callback.</p>
+<pre>void removeIndex(
+  in DOMString indexName
+) raises (IDBDatabaseException); 
+</pre>
+<div id="section_24"><span id="Parameters_5"></span><h5 class="editable">Parameters</h5>
+<p>&nbsp;</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If the object store is not in the <a title="en/IndexedDB#gloss scope" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_scope">scope</a> of any existing <a title="en/IndexedDB#gloss transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_transaction">transaction</a>, or if the associated transaction's mode is <a title="en/IndexedDB/IDBTransaction#const read only" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_read_only"><code>READ_ONLY</code></a>&nbsp;or <a title="en/IndexedDB/IDBTransaction#const snapshot read" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_snapshot_read"><code>SNAPSHOT_READ</code></a>.</dd> <dt><code><a title="en/IndexedDB/IDBDatabaseException#TRANSACTION INACTIVE ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#TRANSACTION_INACTIVE_ERR">TRANSACTION_INACTIVE_ERR</a></code></dt> <dd>If the associated transaction is not active.</dd> <dt>indexName</dt> <dd>The name of the existing index to remove.</dd>
+</dl>
+</div><div id="section_25"><span id="Exceptions_6"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If this method was not called from a <a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE">VERSION_CHANGE</a> transaction callback.</dd> <dt><code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></dt> <dd>If no index exists with the specified name (based on case-sensitive comparison) in the connected database.</dd>
+</dl>
+</div>
+    */
+  void deleteIndex(String name);
+
+  IDBRequest getObject(IDBKeyRange key);
+
+  IDBRequest getObject(Object key);
+
+
+  /**
+    * <p>Opens the named index in this object store.</p>
+
+<div id="section_31"><span id="Parameters_7"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>name</dt> <dd>The name of the index to open.</dd>
+</dl>
+</div><div id="section_32"><span id="Returns_7"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBIndex" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBIndex">IDBIndex</a></code></dt> <dd>An object for accessing the index.</dd>
+</dl>
+</div><div id="section_33"><span id="Exceptions_8"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/IDBDatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></dt> <dd>If no index exists with the specified name (based on case-sensitive comparison) in the connected database.</dd>
+</dl>
+</div>
+    */
+  IDBIndex index(String name);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the records in this object store, in a separate thread. If there is even a single record that matches the <a title="en/IndexedDB#gloss key range" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_range">key range</a>, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object for the new cursor. If no records match the key range, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to null.</p>
+<pre>IDBRequest openCursor (
+&nbsp; in optional IDBKeyRange range, 
+&nbsp; in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_35"><span id="Parameters_8"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd>The key range to use as the cursor's range. If this parameter is unspecified or null, then the range includes all the records in the object store.</dd> <dt>direction</dt> <dd>The cursor's <a title="en/IndexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>.</dd>
+</dl>
+</div><div id="section_36"><span id="Returns_8"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_37"><span id="Exceptions_9"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an IDBDatabaseException with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If this object store is not in the scope of any existing transaction on the connected database.</dd>
+</dl>
+</div>
+    */
+  IDBRequest openCursor(IDBKeyRange range);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the records in this object store, in a separate thread. If there is even a single record that matches the <a title="en/IndexedDB#gloss key range" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_range">key range</a>, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object for the new cursor. If no records match the key range, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to null.</p>
+<pre>IDBRequest openCursor (
+&nbsp; in optional IDBKeyRange range, 
+&nbsp; in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_35"><span id="Parameters_8"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd>The key range to use as the cursor's range. If this parameter is unspecified or null, then the range includes all the records in the object store.</dd> <dt>direction</dt> <dd>The cursor's <a title="en/IndexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>.</dd>
+</dl>
+</div><div id="section_36"><span id="Returns_8"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_37"><span id="Exceptions_9"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an IDBDatabaseException with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If this object store is not in the scope of any existing transaction on the connected database.</dd>
+</dl>
+</div>
+    */
+  IDBRequest openCursor(IDBKeyRange range, String direction);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the records in this object store, in a separate thread. If there is even a single record that matches the <a title="en/IndexedDB#gloss key range" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_range">key range</a>, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object for the new cursor. If no records match the key range, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to null.</p>
+<pre>IDBRequest openCursor (
+&nbsp; in optional IDBKeyRange range, 
+&nbsp; in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_35"><span id="Parameters_8"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd>The key range to use as the cursor's range. If this parameter is unspecified or null, then the range includes all the records in the object store.</dd> <dt>direction</dt> <dd>The cursor's <a title="en/IndexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>.</dd>
+</dl>
+</div><div id="section_36"><span id="Returns_8"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_37"><span id="Exceptions_9"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an IDBDatabaseException with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If this object store is not in the scope of any existing transaction on the connected database.</dd>
+</dl>
+</div>
+    */
+  IDBRequest openCursor(Object key);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the records in this object store, in a separate thread. If there is even a single record that matches the <a title="en/IndexedDB#gloss key range" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_range">key range</a>, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object for the new cursor. If no records match the key range, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to null.</p>
+<pre>IDBRequest openCursor (
+&nbsp; in optional IDBKeyRange range, 
+&nbsp; in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_35"><span id="Parameters_8"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd>The key range to use as the cursor's range. If this parameter is unspecified or null, then the range includes all the records in the object store.</dd> <dt>direction</dt> <dd>The cursor's <a title="en/IndexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>.</dd>
+</dl>
+</div><div id="section_36"><span id="Returns_8"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_37"><span id="Exceptions_9"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an IDBDatabaseException with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If this object store is not in the scope of any existing transaction on the connected database.</dd>
+</dl>
+</div>
+    */
+  IDBRequest openCursor(Object key, String direction);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the records in this object store, in a separate thread. If there is even a single record that matches the <a title="en/IndexedDB#gloss key range" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_range">key range</a>, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object for the new cursor. If no records match the key range, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to null.</p>
+<pre>IDBRequest openCursor (
+&nbsp; in optional IDBKeyRange range, 
+&nbsp; in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_35"><span id="Parameters_8"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd>The key range to use as the cursor's range. If this parameter is unspecified or null, then the range includes all the records in the object store.</dd> <dt>direction</dt> <dd>The cursor's <a title="en/IndexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>.</dd>
+</dl>
+</div><div id="section_36"><span id="Returns_8"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_37"><span id="Exceptions_9"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an IDBDatabaseException with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If this object store is not in the scope of any existing transaction on the connected database.</dd>
+</dl>
+</div>
+    */
+  IDBRequest openCursor(IDBKeyRange range, int direction);
+
+
+  /**
+    * <p>Immediately returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and creates a <a title="en/IndexedDB#gloss cursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_cursor">cursor</a> over the records in this object store, in a separate thread. If there is even a single record that matches the <a title="en/IndexedDB#gloss key range" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_range">key range</a>, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the <a title="en/IndexedDB/IDBCursor" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBCursor">IDBCursor</a> object for the new cursor. If no records match the key range, then a success event is fired on the returned object, with its <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to null.</p>
+<pre>IDBRequest openCursor (
+&nbsp; in optional IDBKeyRange range, 
+&nbsp; in optional unsigned short direction
+) raises (IDBDatabaseException);
+</pre>
+<div id="section_35"><span id="Parameters_8"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>range</dt> <dd>The key range to use as the cursor's range. If this parameter is unspecified or null, then the range includes all the records in the object store.</dd> <dt>direction</dt> <dd>The cursor's <a title="en/IndexedDB#gloss direction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_direction">direction</a>.</dd>
+</dl>
+</div><div id="section_36"><span id="Returns_8"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_37"><span id="Exceptions_9"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an IDBDatabaseException with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If this object store is not in the scope of any existing transaction on the connected database.</dd>
+</dl>
+</div>
+    */
+  IDBRequest openCursor(Object key, int direction);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a class="external" title="http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone" rel="external" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone" target="_blank">structured clone</a> of the <code>value</code>, and stores the cloned value in the object store. If the record is successfully stored, then a success event is fired on the returned request object, using the <a title="en/IndexedDB/IDBTransactionEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent">IDBTransactionEvent</a> interface, with the <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the key for the stored record, and <code><a title="en/IndexedDB/IDBTransactionEvent#attr transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction">transaction</a></code> set to the transaction in which this object store is opened.</p>
+
+<div id="section_39"><span id="Parameters_9"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>value</dt> <dd>The value to be stored.</dd> <dt>key</dt> <dd>The key to use to identify the record. If unspecified, it results to null.</dd>
+</dl>
+</div><div id="section_40"><span id="Returns_9"></span><h5 class="editable">Returns</h5>
+<dl> <dt>IDBRequest</dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_41"><span id="Exceptions_10"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <li> <ul> <li>If this object store uses <a title="en/IndexedDB#gloss out-of-line key" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_out-of-line_key">out-of-line keys</a> and does not use a <a title="en/IndexedDB#gloss key generator" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_generator">key generator</a>, but the <code>key</code> parameter was not passed</li> <li>If the object store uses <a title="en/IndexedDB#gloss in-line key" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_in-line_key">in-line keys</a>, but the <code>value</code> object does not have a property identified by the object store's key path.</li> </ul> </li> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If the object store is not in the <a title="en/IndexedDB#gloss scope" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_scope">scope</a> of any existing <a title="en/IndexedDB#gloss transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_transaction">transaction</a>, or if the associated transaction's mode is <a title="en/IndexedDB/IDBTransaction#const read only" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_read_only"><code>READ_ONLY</code></a>&nbsp;or <a title="en/IndexedDB/IDBTransaction#const snapshot read" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_snapshot_read"><code>SNAPSHOT_READ</code></a>.</dd> <dt><code><a title="en/IndexedDB/IDBDatabaseException#SERIAL ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#SERIAL_ERR">SERIAL_ERR</a></code></dt> <dd>If the data being stored could not be serialized by the internal structured cloning algorithm.</dd>
+</dl>
+<p>This method can raise a <a title="en/DOM/DOMException" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMException">DOMException</a> with the following code:</p>
+<dl> <dt><code>DATA_CLONE_ERR</code></dt> <dd>If the data being stored could not be cloned by the internal structured cloning algorithm.</dd>
+</dl>
+</div>
+    */
+  IDBRequest put(Object value);
+
+
+  /**
+    * <p>Returns an <a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a> object, and, in a separate thread, creates a <a class="external" title="http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone" rel="external" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#structured-clone" target="_blank">structured clone</a> of the <code>value</code>, and stores the cloned value in the object store. If the record is successfully stored, then a success event is fired on the returned request object, using the <a title="en/IndexedDB/IDBTransactionEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent">IDBTransactionEvent</a> interface, with the <code><a title="en/IndexedDB/IDBSuccessEvent#attr result" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBSuccessEvent#attr_result">result</a></code> set to the key for the stored record, and <code><a title="en/IndexedDB/IDBTransactionEvent#attr transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransactionEvent#attr_transaction">transaction</a></code> set to the transaction in which this object store is opened.</p>
+
+<div id="section_39"><span id="Parameters_9"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>value</dt> <dd>The value to be stored.</dd> <dt>key</dt> <dd>The key to use to identify the record. If unspecified, it results to null.</dd>
+</dl>
+</div><div id="section_40"><span id="Returns_9"></span><h5 class="editable">Returns</h5>
+<dl> <dt>IDBRequest</dt> <dd>A request object on which subsequent events related to this operation are fired.</dd>
+</dl>
+</div><div id="section_41"><span id="Exceptions_10"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following codes:</p>
+<dl> <li> <ul> <li>If this object store uses <a title="en/IndexedDB#gloss out-of-line key" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_out-of-line_key">out-of-line keys</a> and does not use a <a title="en/IndexedDB#gloss key generator" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_key_generator">key generator</a>, but the <code>key</code> parameter was not passed</li> <li>If the object store uses <a title="en/IndexedDB#gloss in-line key" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_in-line_key">in-line keys</a>, but the <code>value</code> object does not have a property identified by the object store's key path.</li> </ul> </li> <dt><code><a title="en/IndexedDB/DatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>If the object store is not in the <a title="en/IndexedDB#gloss scope" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_scope">scope</a> of any existing <a title="en/IndexedDB#gloss transaction" rel="internal" href="https://developer.mozilla.org/en/IndexedDB#gloss_transaction">transaction</a>, or if the associated transaction's mode is <a title="en/IndexedDB/IDBTransaction#const read only" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_read_only"><code>READ_ONLY</code></a>&nbsp;or <a title="en/IndexedDB/IDBTransaction#const snapshot read" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#const_snapshot_read"><code>SNAPSHOT_READ</code></a>.</dd> <dt><code><a title="en/IndexedDB/IDBDatabaseException#SERIAL ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#SERIAL_ERR">SERIAL_ERR</a></code></dt> <dd>If the data being stored could not be serialized by the internal structured cloning algorithm.</dd>
+</dl>
+<p>This method can raise a <a title="en/DOM/DOMException" rel="internal" href="https://developer.mozilla.org/En/DOM/DOMException">DOMException</a> with the following code:</p>
+<dl> <dt><code>DATA_CLONE_ERR</code></dt> <dd>If the data being stored could not be cloned by the internal structured cloning algorithm.</dd>
+</dl>
+</div>
+    */
+  IDBRequest put(Object value, Object key);
+}
diff --git a/elemental/src/elemental/html/IDBRequest.java b/elemental/src/elemental/html/IDBRequest.java
new file mode 100644
index 0000000..940f6aa
--- /dev/null
+++ b/elemental/src/elemental/html/IDBRequest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.DOMError;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>IDBRequest</code> interface of the IndexedDB&nbsp;API provides access to results of asynchronous requests to databases and database objects using event handler attributes. Each reading and writing operation on a database is done using a request.</p>
+<p>The request object does not initially contain any information about the result of the operation, but once information becomes available, an event is fired on the request, and the information becomes available through the properties of the <code>IDBRequest</code> instance.</p>
+<p>Inherits from: <a title="en/DOM/EventTarget" rel="internal" href="https://developer.mozilla.org/en/DOM/EventTarget">EventTarget</a></p>
+  */
+public interface IDBRequest extends EventTarget {
+
+  DOMError getError();
+
+  int getErrorCode();
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnsuccess();
+
+  void setOnsuccess(EventListener arg);
+
+  String getReadyState();
+
+  Object getResult();
+
+  Object getSource();
+
+  IDBTransaction getTransaction();
+
+  String getWebkitErrorMessage();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/IDBTransaction.java b/elemental/src/elemental/html/IDBTransaction.java
new file mode 100644
index 0000000..b67a94b
--- /dev/null
+++ b/elemental/src/elemental/html/IDBTransaction.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.DOMError;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>IDBTransaction</code> interface of the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB&nbsp;API</a> provides a static, asynchronous transaction on a database using event handler attributes. All reading and writing of data are done within transactions. You actually use <code><a title="en/IndexedDB/IDBDatabase" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabase">IDBDatabase</a></code> to start transactions and use <code>IDBTransaction</code> to set the mode of the transaction and access an object store and make your request. You can also use it to abort transactions.</p>
+<p>Inherits from: <a title="en/DOM/EventTarget" rel="internal" href="https://developer.mozilla.org/en/DOM/EventTarget">EventTarget</a></p>
+  */
+public interface IDBTransaction extends EventTarget {
+
+  /**
+    * Allows data to be read but not changed.&nbsp;
+    */
+
+    static final int READ_ONLY = 0;
+
+  /**
+    * Allows reading and writing of data in existing data stores to be changed.
+    */
+
+    static final int READ_WRITE = 1;
+
+  /**
+    * Allows any operation to be performed, including ones that delete and create object stores and indexes. This mode is for updating the version number of transactions that were started using the <a title="en/IndexedDB/IDBDatabase#setVersion" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabase#setVersion"><code>setVersion()</code></a> method of <a title="en/IndexedDB/IDBDatabase" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabase">IDBDatabase</a> objects. Transactions of this mode cannot run concurrently with other transactions.
+    */
+
+    static final int VERSION_CHANGE = 2;
+
+
+  /**
+    * The database connection that this transaction is associated with.
+    */
+  IDBDatabase getDb();
+
+  DOMError getError();
+
+
+  /**
+    * The mode for isolating access to data in the object stores that are in the scope of the transaction. For possible values, see Constants. The default value is <code><a href="#const_read_only" title="#const read only">READ_ONLY</a></code>.
+    */
+  String getMode();
+
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+  EventListener getOncomplete();
+
+  void setOncomplete(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+
+  /**
+    * <p>Returns immediately, and undoes all the changes to objects in the database associated with this transaction. If this transaction has been aborted or completed, then this method throws an <a title="en/IndexedDB/IDBErrorEvent" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent">error event</a>, with its <a title="en/IndexedDB/IDBErrorEvent#attr code" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBErrorEvent#attr_code">code</a> set to <code><a title="en/IndexedDB/IDBDatabaseException#ABORT ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#ABORT_ERR">ABORT_ERR</a></code> and a suitable <a title="en/IndexedDB/IDBEvent#attr message" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBEvent#attr_message">message</a>.</p>
+
+<p>All pending <a title="IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest"><code>IDBRequest</code></a> objects created during this transaction have their <code>errorCode</code> set to <code>ABORT_ERR</code>.</p>
+<div id="section_12"><span id="Exceptions"></span><h5 class="editable">Exceptions</h5>
+<p>This method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a>, with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/IDBDatabaseException#NOT ALLOWED ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_ALLOWED_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>The transaction has already been committed or aborted.</dd>
+</dl>
+</div>
+    */
+  void abort();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+
+  /**
+    * <p>Returns an object store that has already been added to the scope of this transaction. Every call to this method on the same transaction object, with the same name, returns the same <a title="en/IndexedDB/IDBObjectStore" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBObjectStore">IDBObjectStore</a> instance. If this method is called on a different transaction object, a different IDBObjectStore instance is returned.</p>
+
+<div id="section_14"><span id="Parameters"></span><h5 class="editable">Parameters</h5>
+<dl> <dt>name</dt> <dd>The name of the requested object store.</dd>
+</dl>
+</div><div id="section_15"><span id="Returns"></span><h5 class="editable">Returns</h5>
+<dl> <dt><code><a title="IDBObjectStore" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBObjectStore">IDBObjectStore</a></code></dt> <dd>An object for accessing the requested object store.</dd>
+</dl>
+</div><div id="section_16"><span id="Exceptions_2"></span><h5 class="editable">Exceptions</h5>
+<p>The method can raise an <a title="en/IndexedDB/IDBDatabaseException" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException">IDBDatabaseException</a> with the following code:</p>
+<dl> <dt><code><a title="en/IndexedDB/DatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_FOUND_ERR</a></code></dt> <dd>The requested object store is not in this transaction's scope.</dd> <dt><code><a title="en/IndexedDB/DatabaseException#NOT FOUND ERR" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#NOT_FOUND_ERR">NOT_ALLOWED_ERR</a></code></dt> <dd>request is made on a source object that has been deleted or removed..</dd>
+</dl>
+</div>
+    */
+  IDBObjectStore objectStore(String name);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/IDBVersionChangeEvent.java b/elemental/src/elemental/html/IDBVersionChangeEvent.java
new file mode 100644
index 0000000..bf9841b
--- /dev/null
+++ b/elemental/src/elemental/html/IDBVersionChangeEvent.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>IDBVersionChangeEvent</code> interface of the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB&nbsp;API</a> indicates that the version of the database has changed.</p>
+<p>The specification has changed and some not up-to-date browsers only support the deprecated unique attribute, <code>version</code>, from an early draft version.</p>
+  */
+public interface IDBVersionChangeEvent extends Event {
+
+
+  /**
+    * <div class="warning"><strong>Warning:</strong> While this property is still implemented by not up-to-date browsers, the latest specification does replace it by the <code>oldVersion</code> and <code>newVersion</code> attributes. See compatibility table to know what browsers support them.</div> The new version of the database in a <a title="en/IndexedDB/IDBTransaction#VERSION CHANGE" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBTransaction#VERSION_CHANGE">VERSION_CHANGE</a> transaction.
+    */
+  String getVersion();
+}
diff --git a/elemental/src/elemental/html/IDBVersionChangeRequest.java b/elemental/src/elemental/html/IDBVersionChangeRequest.java
new file mode 100644
index 0000000..24f1181
--- /dev/null
+++ b/elemental/src/elemental/html/IDBVersionChangeRequest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div class="warning"><strong>Warning: </strong> The latest specification does not include this interface anymore as the <code>IDBDatabase.setVersion()</code> method has been removed. However, it is still implemented in not up-to-date browsers. See the compatibility table for version details.<br> The new way to do it is to use the <a title="en/IndexedDB/IDBOpenDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBOpenDBRequest"><code>IDBOpenDBRequest</code></a> interface which has now the <code>onblocked</code> handler and the newly needed <code>onupgradeneeded</code> one.</div>
+<p>The <code>IDBVersionChangeRequest</code> interface the <a title="en/IndexedDB" rel="internal" href="https://developer.mozilla.org/en/IndexedDB">IndexedDB API </a>represents a request to change the version of a database. It is used only by the <a title="en/IndexedDB/IDBDatabase#setVersion" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabase#setVersion"><code>setVersion()</code></a> method of <code><a title="en/IndexedDB/IDBDatabase" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBDatabase">IDBDatabase</a></code>.</p>
+<p>Inherits from:&nbsp;<code><a title="en/IndexedDB/IDBRequest" rel="internal" href="https://developer.mozilla.org/en/IndexedDB/IDBRequest">IDBRequest</a></code></p>
+  */
+public interface IDBVersionChangeRequest extends IDBRequest {
+
+
+  /**
+    * The event handler for the blocked event.
+    */
+  EventListener getOnblocked();
+
+  void setOnblocked(EventListener arg);
+}
diff --git a/elemental/src/elemental/html/IFrameElement.java b/elemental/src/elemental/html/IFrameElement.java
new file mode 100644
index 0000000..4ab07d6
--- /dev/null
+++ b/elemental/src/elemental/html/IFrameElement.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.svg.SVGDocument;
+import elemental.dom.Document;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM iframe objects expose the <a class="external" href="http://www.w3.org/TR/html5/the-iframe-element.html#htmliframeelement" rel="external nofollow" target="_blank" title="http://www.w3.org/TR/html5/the-iframe-element.html#htmliframeelement">HTMLIFrameElement</a> (or <span><a href="https://developer.mozilla.org/en/HTML" rel="custom nofollow">HTML 4</a></span> <a class="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-50708718" rel="external nofollow" target="_blank" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-50708718"><code>HTMLIFrameElement</code></a>) interface, which provides special properties and methods (beyond the regular <a href="https://developer.mozilla.org/en/DOM/element" rel="internal">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of inline frame elements.
+  */
+public interface IFrameElement extends Element {
+
+
+  /**
+    * Specifies the alignment of the frame with respect to the surrounding context.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * The active document in the inline frame's nested browsing context.
+    */
+  Document getContentDocument();
+
+
+  /**
+    * The window proxy for the nested browsing context.
+    */
+  Window getContentWindow();
+
+  String getFrameBorder();
+
+  void setFrameBorder(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/iframe#attr-height">height</a></code>
+ HTML&nbsp;attribute, indicating the height of the frame.
+    */
+  String getHeight();
+
+  void setHeight(String arg);
+
+
+  /**
+    * URI of a long description of the frame.
+    */
+  String getLongDesc();
+
+  void setLongDesc(String arg);
+
+
+  /**
+    * Height of the frame margin.
+    */
+  String getMarginHeight();
+
+  void setMarginHeight(String arg);
+
+
+  /**
+    * Width of the frame margin.
+    */
+  String getMarginWidth();
+
+  void setMarginWidth(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/iframe#attr-name">name</a></code>
+ HTML&nbsp;attribute, containing a name by which to refer to the frame.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/iframe#attr-sandbox">sandbox</a></code>
+ HTML&nbsp;attribute, indicating extra restrictions on the behavior of the nested content.
+    */
+  String getSandbox();
+
+  void setSandbox(String arg);
+
+
+  /**
+    * Indicates whether the browser should provide scrollbars for the frame.
+    */
+  String getScrolling();
+
+  void setScrolling(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/iframe#attr-src">src</a></code>
+ HTML&nbsp;attribute, containing the address of the content to be embedded.
+    */
+  String getSrc();
+
+  void setSrc(String arg);
+
+
+  /**
+    * The content to display in the frame.
+    */
+  String getSrcdoc();
+
+  void setSrcdoc(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/iframe#attr-width">width</a></code>
+&nbsp;HTML&nbsp;attribute, indicating the width of the frame.
+    */
+  String getWidth();
+
+  void setWidth(String arg);
+
+  SVGDocument getSVGDocument();
+}
diff --git a/elemental/src/elemental/html/IceCallback.java b/elemental/src/elemental/html/IceCallback.java
new file mode 100644
index 0000000..6698b15
--- /dev/null
+++ b/elemental/src/elemental/html/IceCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface IceCallback {
+  boolean onIceCallback(IceCandidate candidate, boolean moreToFollow, PeerConnection00 source);
+}
diff --git a/elemental/src/elemental/html/IceCandidate.java b/elemental/src/elemental/html/IceCandidate.java
new file mode 100644
index 0000000..3fe415b
--- /dev/null
+++ b/elemental/src/elemental/html/IceCandidate.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface IceCandidate {
+
+  String getLabel();
+
+  String toSdp();
+}
diff --git a/elemental/src/elemental/html/ImageData.java b/elemental/src/elemental/html/ImageData.java
new file mode 100644
index 0000000..840d372
--- /dev/null
+++ b/elemental/src/elemental/html/ImageData.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Used with the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/canvas">&lt;canvas&gt;</a></code>
+ element. Returned by <a title="en/DOM/CanvasRenderingContext2D" rel="internal" href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D">CanvasRenderingContext2D</a>'s <a title="en/DOM/CanvasRenderingContext2D.createImageData" rel="internal" href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D.createImageData" class="new ">createImageData</a> and <a title="en/DOM/CanvasRenderingContext2D.getImageData" rel="internal" href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D.getImageData" class="new ">getImageData</a> (and accepted as first argument in <a title="en/DOM/CanvasRenderingContext2D.putImageData" rel="internal" href="https://developer.mozilla.org/en/DOM/CanvasRenderingContext2D.putImageData" class="new ">putImageData</a>)
+  */
+public interface ImageData {
+
+  Uint8ClampedArray getData();
+
+  int getHeight();
+
+  int getWidth();
+}
diff --git a/elemental/src/elemental/html/ImageElement.java b/elemental/src/elemental/html/ImageElement.java
new file mode 100644
index 0000000..ab7ad5b
--- /dev/null
+++ b/elemental/src/elemental/html/ImageElement.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM image objects expose the <a title="http://www.w3.org/TR/html5/embedded-content-1.html#htmlimageelement" class=" external" rel="external" href="http://www.w3.org/TR/html5/embedded-content-1.html#htmlimageelement" target="_blank">HTMLImageElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-17701901" class=" external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-17701901" target="_blank"><code>HTMLImageElement</code></a>) interface, which provides special properties and methods (beyond the regular <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element">element</a></code>
+ object interface they also have available to them by inheritance) for manipulating the layout and presentation of input elements.
+  */
+public interface ImageElement extends Element {
+
+
+  /**
+    * Indicates the alignment of the image with respect to the surrounding context.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img#attr-alt">alt</a></code>
+ HTML attribute, indicating fallback context for the image.
+    */
+  String getAlt();
+
+  void setAlt(String arg);
+
+
+  /**
+    * Width of the border around the image.
+    */
+  String getBorder();
+
+  void setBorder(String arg);
+
+
+  /**
+    * True if the browser has fetched the image, and it is in a <a title="en/HTML/Element/Img#Image Format" rel="internal" href="https://developer.mozilla.org/En/HTML/Element/Img#Image_Format">supported image type</a> that was decoded without errors.
+    */
+  boolean isComplete();
+
+
+  /**
+    * The CORS setting for this image element. See <a title="en/HTML/CORS settings attributes" rel="internal" href="https://developer.mozilla.org/en/HTML/CORS_settings_attributes">CORS&nbsp;settings attributes</a> for details.
+    */
+  String getCrossOrigin();
+
+  void setCrossOrigin(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img#attr-height">height</a></code>
+ HTML attribute, indicating the rendered height of the image in CSS&nbsp;pixels.
+    */
+  int getHeight();
+
+  void setHeight(int arg);
+
+
+  /**
+    * Space to the left and right of the image.
+    */
+  int getHspace();
+
+  void setHspace(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img#attr-ismap">ismap</a></code>
+ HTML attribute, indicating that the image is part of a server-side image map.
+    */
+  boolean isMap();
+
+  void setIsMap(boolean arg);
+
+
+  /**
+    * URI of a long description of the image.
+    */
+  String getLongDesc();
+
+  void setLongDesc(String arg);
+
+
+  /**
+    * A reference to a low-quality (but faster to load) copy of the image.
+    */
+  String getLowsrc();
+
+  void setLowsrc(String arg);
+
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Intrinsic height of the image in CSS&nbsp;pixels, if it is available; otherwise, 0.
+    */
+  int getNaturalHeight();
+
+
+  /**
+    * Intrinsic width of the image in CSS&nbsp;pixels, if it is available; otherwise, 0.
+    */
+  int getNaturalWidth();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element#attr-src">src</a></code>
+ HTML attribute, containing the URL of the image.
+    */
+  String getSrc();
+
+  void setSrc(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img#attr-usemap">usemap</a></code>
+ HTML attribute, containing a partial URL of a map element.
+    */
+  String getUseMap();
+
+  void setUseMap(String arg);
+
+
+  /**
+    * Space above and below the image.
+    */
+  int getVspace();
+
+  void setVspace(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/img#attr-width">width</a></code>
+ HTML attribute, indicating the rendered width of the image in CSS&nbsp;pixels.
+    */
+  int getWidth();
+
+  void setWidth(int arg);
+
+  int getX();
+
+  int getY();
+}
diff --git a/elemental/src/elemental/html/InputElement.java b/elemental/src/elemental/html/InputElement.java
new file mode 100644
index 0000000..ef2f839
--- /dev/null
+++ b/elemental/src/elemental/html/InputElement.java
@@ -0,0 +1,548 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.events.EventListener;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM <code>Input</code> objects expose the <a title="http://dev.w3.org/html5/spec/the-input-element.html#htmlinputelement" class=" external" rel="external" href="http://dev.w3.org/html5/spec/the-input-element.html#htmlinputelement" target="_blank">HTMLInputElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-6043025" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-6043025" target="_blank"><code>HTMLInputElement</code></a>) interface, which provides special properties and methods (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of input elements.
+  */
+public interface InputElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-accept">accept</a></code>
+ HTML&nbsp;attribute, containing comma-separated list of file types accepted by the server when <strong>type</strong> is <code>file</code>.
+    */
+  String getAccept();
+
+  void setAccept(String arg);
+
+
+  /**
+    * Alignment of the element.
+
+<span title="">Obsolete</span>&nbsp;in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-alt">alt</a></code>
+&nbsp;HTML attribute, containing alternative text to use when <strong>type</strong> is <code>image.</code>
+    */
+  String getAlt();
+
+  void setAlt(String arg);
+
+
+  /**
+    * Reflects the {{htmlattrxref("autocomplete", "input)}} HTML attribute, indicating whether the value of the control can be automatically completed by the browser. Ignored if the value of the <strong>type</strong> attribute is <span>hidden</span>, <span>checkbox</span>, <span>radio</span>, <span>file</span>, or a button type (<span>button</span>, <span>submit</span>, <span>reset</span>, <span>image</span>). Possible values are: <ul> <li><span>off</span>: The user must explicitly enter a value into this field for every use, or the document provides its own auto-completion method; the browser does not automatically complete the entry.</li> <li><span>on</span>: The browser can automatically complete the value based on values that the user has entered during previous uses.</li> </ul>
+    */
+  String getAutocomplete();
+
+  void setAutocomplete(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-autofocus">autofocus</a></code>
+ HTML&nbsp;attribute, which specifies that a form control should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form element in a document can have the <strong>autofocus</strong> attribute. It cannot be applied if the <strong>type</strong> attribute is set to <code>hidden</code> (that is, you cannot automatically set focus to a hidden control).
+    */
+  boolean isAutofocus();
+
+  void setAutofocus(boolean arg);
+
+
+  /**
+    * The current state of the element when <strong>type</strong> is <code>checkbox</code> or <code>radio</code>.
+    */
+  boolean isChecked();
+
+  void setChecked(boolean arg);
+
+
+  /**
+    * The default state of a radio button or checkbox as originally specified in HTML that created this object.
+    */
+  boolean isDefaultChecked();
+
+  void setDefaultChecked(boolean arg);
+
+
+  /**
+    * The default value as originally specified in HTML that created this object.
+    */
+  String getDefaultValue();
+
+  void setDefaultValue(String arg);
+
+  String getDirName();
+
+  void setDirName(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-disabled">disabled</a></code>
+ HTML attribute, indicating that the control is not available for interaction.
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * A list of selected files.
+    */
+  FileList getFiles();
+
+  void setFiles(FileList arg);
+
+
+  /**
+    * <p>The containing form element, if this element is in a form. If this element is not contained in a form element:</p> <ul> <li>
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> this can be the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-id">id</a></code>
+ attribute of any <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element in the same document. Even if the attribute is set on <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input">&lt;input&gt;</a></code>
+, this property will be <code>null</code>, if it isn't the id of a <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element.</li> <li>
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> this must be <code>null</code>.</li> </ul>
+    */
+  FormElement getForm();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-formaction">formaction</a></code>
+ HTML attribute, containing the URI&nbsp;of a program that processes information submitted by the element. If specified, this attribute overrides the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-action">action</a></code>
+ attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element that owns this element.
+    */
+  String getFormAction();
+
+  void setFormAction(String arg);
+
+  String getFormEnctype();
+
+  void setFormEnctype(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-formmethod">formmethod</a></code>
+&nbsp;HTML&nbsp;attribute, containing the HTTP&nbsp;method that the browser uses to submit the form. If specified, this attribute overrides the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-method">method</a></code>
+ attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element that owns this element.
+    */
+  String getFormMethod();
+
+  void setFormMethod(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-formnovalidate">formnovalidate</a></code>
+&nbsp;HTML&nbsp;attribute, indicating that the form is not to be validated when it is submitted. If specified, this attribute overrides the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-novalidate">novalidate</a></code>
+ attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element that owns this element.
+    */
+  boolean isFormNoValidate();
+
+  void setFormNoValidate(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-formtarget">formtarget</a></code>
+ HTML&nbsp;attribute, containing a name or keyword indicating where to display the response that is received after submitting the form. If specified, this attribute overrides the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-target">target</a></code>
+ attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element that owns this element.
+    */
+  String getFormTarget();
+
+  void setFormTarget(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-height">height</a></code>
+ HTML attribute, which defines the height of the image displayed for the button, if the value of <strong>type</strong> is <span>image</span>.
+    */
+  int getHeight();
+
+  void setHeight(int arg);
+
+  boolean isIncremental();
+
+  void setIncremental(boolean arg);
+
+
+  /**
+    * Indicates that a checkbox is neither on nor off.
+    */
+  boolean isIndeterminate();
+
+  void setIndeterminate(boolean arg);
+
+
+  /**
+    * A list of <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/label">&lt;label&gt;</a></code>
+ elements that are labels for this element.
+    */
+  NodeList getLabels();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-max">max</a></code>
+ HTML&nbsp;attribute, containing the maximum (numeric or date-time) value for this item, which must not be less than its minimum (<strong>min</strong> attribute) value.
+    */
+  String getMax();
+
+  void setMax(String arg);
+
+
+  /**
+    * <p>Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-maxlength">maxlength</a></code>
+&nbsp;HTML attribute, containing the maximum length of text (in Unicode code points) that the value can be changed to. The constraint is evaluated only when the value is changed</p> <div class="note"><strong>Note:</strong> If you set <code>maxlength</code> to a negative value programmatically, an exception will be thrown.</div>
+    */
+  int getMaxLength();
+
+  void setMaxLength(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-min">min</a></code>
+ HTML&nbsp;attribute, containing the minimum (numeric or date-time) value for this item, which must not be greater than its maximum (<strong>max</strong> attribute) value.
+    */
+  String getMin();
+
+  void setMin(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-multiple">multiple</a></code>
+ HTML&nbsp;attribute, indicating whether more than one value is possible (e.g., multiple files).
+    */
+  boolean isMultiple();
+
+  void setMultiple(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-name">name</a></code>
+ HTML&nbsp;attribute, containing a name that identifies the element when submitting the form.
+    */
+  String getName();
+
+  void setName(String arg);
+
+  EventListener getOnwebkitspeechchange();
+
+  void setOnwebkitspeechchange(EventListener arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-pattern">pattern</a></code>
+ HTML&nbsp;attribute, containing a regular expression that the control's value is checked against. The pattern must match the entire value, not just some subset. Use the <strong>title</strong> attribute to describe the pattern to help the user. This attribute applies when the value of the <strong>type</strong> attribute is <span>text</span>, <span>search</span>, <span>tel</span>, <span>url</span> or <span>email</span>; otherwise it is ignored.
+    */
+  String getPattern();
+
+  void setPattern(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-placeholder">placeholder</a></code>
+ HTML&nbsp;attribute, containing a hint to the user of what can be entered in the control. The placeholder text must not contain carriage returns or line-feeds. This attribute applies when the value of the <strong>type</strong> attribute is <span>text</span>, <span>search</span>, <span>tel</span>, <span>url</span> or <span>email</span>; otherwise it is ignored.
+    */
+  String getPlaceholder();
+
+  void setPlaceholder(String arg);
+
+
+  /**
+    * <p>Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-readonly">readonly</a></code>
+ HTML&nbsp;attribute, indicating that the user cannot modify the value of the control.</p> <p><span><a href="https://developer.mozilla.org/en/HTML/HTML5" rel="custom nofollow">HTML 5</a></span> This is ignored if the value of the <strong>type</strong> attribute is <span>hidden</span>, <span>range</span>, <span>color</span>, <span>checkbox</span>, <span>radio</span>, <span>file</span>, or a button type.</p>
+    */
+  boolean isReadOnly();
+
+  void setReadOnly(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-required">required</a></code>
+ HTML&nbsp;attribute, indicating that the user must fill in a value before submitting a form.
+    */
+  boolean isRequired();
+
+  void setRequired(boolean arg);
+
+
+  /**
+    * The direction in which selection occurred. This is "forward" if selection was performed in the start-to-end direction of the current locale, or "backward" for the opposite direction. This can also be "none"&nbsp;if the direction is unknown."
+    */
+  String getSelectionDirection();
+
+  void setSelectionDirection(String arg);
+
+
+  /**
+    * The index of the end of selected text.
+    */
+  int getSelectionEnd();
+
+  void setSelectionEnd(int arg);
+
+
+  /**
+    * The index of the beginning of selected text.
+    */
+  int getSelectionStart();
+
+  void setSelectionStart(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-size">size</a></code>
+ HTML&nbsp;attribute, containing size of the control. This value is in pixels unless the value of <strong>type</strong> is <span>text</span> or <span>password</span>, in which case, it is an integer number of characters. 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> Applies only when <strong>type</strong> is set to <span>text</span>, <span>search</span>, <span>tel</span>, <span>url</span>, <span>email</span>, or <span>password</span>; otherwise it is ignored.
+    */
+  int getSize();
+
+  void setSize(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-src">src</a></code>
+ HTML&nbsp;attribute, which specifies a URI for the location of an image to display on the graphical submit button, if the value of <strong>type</strong> is <span>image</span>; otherwise it is ignored.
+    */
+  String getSrc();
+
+  void setSrc(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-step">step</a></code>
+ HTML&nbsp;attribute, which works with<strong> min</strong> and <strong>max</strong> to limit the increments at which a numeric or date-time value can be set. It can be the string <span>any</span> or a positive floating point number. If this is not set to <span>any</span>, the control accepts only values at multiples of the step value greater than the minimum.
+    */
+  String getStep();
+
+  void setStep(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-type">type</a></code>
+ HTML&nbsp;attribute, indicating the type of control to display. See 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-type">type</a></code>
+ attribute of <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input">&lt;input&gt;</a></code>
+ for possible values.
+    */
+  String getType();
+
+  void setType(String arg);
+
+
+  /**
+    * A client-side image map. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>
+    */
+  String getUseMap();
+
+  void setUseMap(String arg);
+
+
+  /**
+    * A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.
+    */
+  String getValidationMessage();
+
+
+  /**
+    * The validity states that this element is in.&nbsp;
+    */
+  ValidityState getValidity();
+
+
+  /**
+    * Current value in the control.
+    */
+  String getValue();
+
+  void setValue(String arg);
+
+
+  /**
+    * The value of the element, interpreted as a date, or <code>null</code> if conversion is not possible.
+    */
+  Date getValueAsDate();
+
+  void setValueAsDate(Date arg);
+
+
+  /**
+    * <p>The value of the element, interpreted as one of the following in order:</p> <ol> <li>a time value</li> <li>a number</li> <li><code>null</code> if conversion is not possible</li> </ol>
+    */
+  double getValueAsNumber();
+
+  void setValueAsNumber(double arg);
+
+  boolean isWebkitGrammar();
+
+  void setWebkitGrammar(boolean arg);
+
+  boolean isWebkitSpeech();
+
+  void setWebkitSpeech(boolean arg);
+
+  boolean isWebkitdirectory();
+
+  void setWebkitdirectory(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-width">width</a></code>
+ HTML&nbsp;attribute, which defines the width of the image displayed for the button, if the value of <strong>type</strong> is <span>image</span>.
+    */
+  int getWidth();
+
+  void setWidth(int arg);
+
+
+  /**
+    * Indicates whether the element is a candidate for constraint validation. It is false if any conditions bar it from constraint validation.
+    */
+  boolean isWillValidate();
+
+
+  /**
+    * Returns false if the element is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an <code>invalid</code> event at the element. It returns true if the element is not a candidate for constraint validation, or if it satisfies its constraints.
+    */
+  boolean checkValidity();
+
+
+  /**
+    * Selects the input text in the element, and focuses it so the user can subsequently replace the whole entry.
+    */
+  void select();
+
+
+  /**
+    * Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.
+    */
+  void setCustomValidity(String error);
+
+
+  /**
+    * Selects a range of text in the element (but does not focus it). The optional <code>selectionDirection</code> parameter may be "forward" or "backward" to establish the direction in which selection was set, or "none"if the direction is unknown or not relevant. The default is "none". Specifying <code>selectionDirection</code> sets the value of the <code>selectionDirection</code> property.
+    */
+  void setSelectionRange(int start, int end);
+
+
+  /**
+    * Selects a range of text in the element (but does not focus it). The optional <code>selectionDirection</code> parameter may be "forward" or "backward" to establish the direction in which selection was set, or "none"if the direction is unknown or not relevant. The default is "none". Specifying <code>selectionDirection</code> sets the value of the <code>selectionDirection</code> property.
+    */
+  void setSelectionRange(int start, int end, String direction);
+
+
+  /**
+    * <p>Decrements the <strong>value</strong> by (<strong>step</strong> * <code>n</code>), where <code>n</code> defaults to 1 if not specified. Throws an INVALID_STATE_ERR exception:</p> <ul> <li>if the method is not applicable to for the current <strong>type</strong> value.</li> <li>if the element has no step value.</li> <li>if the <strong>value</strong> cannot be converted to a number.</li> <li>if the resulting value is above the <strong>max</strong> or below the <strong>min</strong>.&nbsp;</li> </ul>
+    */
+  void stepDown();
+
+
+  /**
+    * <p>Decrements the <strong>value</strong> by (<strong>step</strong> * <code>n</code>), where <code>n</code> defaults to 1 if not specified. Throws an INVALID_STATE_ERR exception:</p> <ul> <li>if the method is not applicable to for the current <strong>type</strong> value.</li> <li>if the element has no step value.</li> <li>if the <strong>value</strong> cannot be converted to a number.</li> <li>if the resulting value is above the <strong>max</strong> or below the <strong>min</strong>.&nbsp;</li> </ul>
+    */
+  void stepDown(int n);
+
+
+  /**
+    * <p>Increments the <strong>value</strong> by (<strong>step</strong> * <code>n</code>), where <code>n</code> defaults to 1 if not specified. Throws an INVALID_STATE_ERR exception:</p> <ul> <li>if the method is not applicable to for the current <strong>type</strong> value.</li> <li>if the element has no step value.</li> <li>if the <strong>value</strong> cannot be converted to a number.</li> <li>if the resulting value is above the <strong>max</strong> or below the <strong>min</strong>.</li> </ul>
+    */
+  void stepUp();
+
+
+  /**
+    * <p>Increments the <strong>value</strong> by (<strong>step</strong> * <code>n</code>), where <code>n</code> defaults to 1 if not specified. Throws an INVALID_STATE_ERR exception:</p> <ul> <li>if the method is not applicable to for the current <strong>type</strong> value.</li> <li>if the element has no step value.</li> <li>if the <strong>value</strong> cannot be converted to a number.</li> <li>if the resulting value is above the <strong>max</strong> or below the <strong>min</strong>.</li> </ul>
+    */
+  void stepUp(int n);
+}
diff --git a/elemental/src/elemental/html/Int16Array.java b/elemental/src/elemental/html/Int16Array.java
new file mode 100644
index 0000000..05588e5
--- /dev/null
+++ b/elemental/src/elemental/html/Int16Array.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>Int16Array</code> type represents an array of twos-complement 16-bit signed integers.</p>
+<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>
+  */
+public interface Int16Array extends ArrayBufferView, IndexableInt {
+
+  /**
+    * The size, in bytes, of each array element.
+    */
+
+    static final int BYTES_PER_ELEMENT = 2;
+
+
+  /**
+    * The number of entries in the array. <strong>Read only.</strong>
+    */
+  int getLength();
+
+  void setElements(Object array);
+
+  void setElements(Object array, int offset);
+
+
+  /**
+    * <p>Returns a new <code>Int16Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Int16Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Int16Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Int16Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Int16Array subarray(int start);
+
+
+  /**
+    * <p>Returns a new <code>Int16Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Int16Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Int16Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Int16Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Int16Array subarray(int start, int end);
+}
diff --git a/elemental/src/elemental/html/Int32Array.java b/elemental/src/elemental/html/Int32Array.java
new file mode 100644
index 0000000..c0db8fd
--- /dev/null
+++ b/elemental/src/elemental/html/Int32Array.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>Int32Array</code> type represents an array of twos-complement 32-bit signed integers.</p>
+<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>
+  */
+public interface Int32Array extends ArrayBufferView, IndexableInt {
+
+  /**
+    * The size, in bytes, of each array element.
+    */
+
+    static final int BYTES_PER_ELEMENT = 4;
+
+
+  /**
+    * The number of entries in the array. <strong>Read only.</strong>
+    */
+  int getLength();
+
+  void setElements(Object array);
+
+  void setElements(Object array, int offset);
+
+
+  /**
+    * <p>Returns a new <code>Int32Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Int32Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Int32Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to one past the last element in the array to be referenced by the new <code>Int32Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Int32Array subarray(int start);
+
+
+  /**
+    * <p>Returns a new <code>Int32Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Int32Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Int32Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to one past the last element in the array to be referenced by the new <code>Int32Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Int32Array subarray(int start, int end);
+}
diff --git a/elemental/src/elemental/html/Int8Array.java b/elemental/src/elemental/html/Int8Array.java
new file mode 100644
index 0000000..504749f
--- /dev/null
+++ b/elemental/src/elemental/html/Int8Array.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>Int8Array</code> type represents an array of twos-complement 8-bit signed integers.</p>
+<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>
+  */
+public interface Int8Array extends ArrayBufferView, IndexableInt {
+
+  /**
+    * The size, in bytes, of each array element.
+    */
+
+    static final int BYTES_PER_ELEMENT = 1;
+
+
+  /**
+    * The number of entries in the array; for these 8-bit values, this is the same as the size of the array in bytes. <strong>Read only.</strong>
+    */
+  int getLength();
+
+  void setElements(Object array);
+
+  void setElements(Object array, int offset);
+
+
+  /**
+    * <p>Returns a new <code>Int8Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Int8Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Int8Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Int8Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Int8Array subarray(int start);
+
+
+  /**
+    * <p>Returns a new <code>Int8Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Int8Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Int8Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Int8Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Int8Array subarray(int start, int end);
+}
diff --git a/elemental/src/elemental/html/JavaScriptAudioNode.java b/elemental/src/elemental/html/JavaScriptAudioNode.java
new file mode 100644
index 0000000..06b6c2a
--- /dev/null
+++ b/elemental/src/elemental/html/JavaScriptAudioNode.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface JavaScriptAudioNode extends AudioNode, EventTarget {
+
+  int getBufferSize();
+
+  EventListener getOnaudioprocess();
+
+  void setOnaudioprocess(EventListener arg);
+}
diff --git a/elemental/src/elemental/html/JavaScriptCallFrame.java b/elemental/src/elemental/html/JavaScriptCallFrame.java
new file mode 100644
index 0000000..18f6dbc
--- /dev/null
+++ b/elemental/src/elemental/html/JavaScriptCallFrame.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.util.Indexable;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface JavaScriptCallFrame {
+
+    static final int CATCH_SCOPE = 4;
+
+    static final int CLOSURE_SCOPE = 3;
+
+    static final int GLOBAL_SCOPE = 0;
+
+    static final int LOCAL_SCOPE = 1;
+
+    static final int WITH_SCOPE = 2;
+
+  JavaScriptCallFrame getCaller();
+
+  int getColumn();
+
+  String getFunctionName();
+
+  int getLine();
+
+  Indexable getScopeChain();
+
+  int getSourceID();
+
+  Object getThisObject();
+
+  String getType();
+
+  void evaluate(String script);
+
+  int scopeType(int scopeIndex);
+}
diff --git a/elemental/src/elemental/html/KeygenElement.java b/elemental/src/elemental/html/KeygenElement.java
new file mode 100644
index 0000000..cbe15b0
--- /dev/null
+++ b/elemental/src/elemental/html/KeygenElement.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <strong>Note:</strong>&nbsp;This page describes the Keygen Element interface as specified, not as currently implemented by Gecko. See <a rel="external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=101019" class="external" title="">
+bug 101019</a>
+ for details and status.
+  */
+public interface KeygenElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/keygen#attr-autofocus">autofocus</a></code>
+&nbsp;HTML attribute, indicating that the form control should have input focus when the page loads.
+    */
+  boolean isAutofocus();
+
+  void setAutofocus(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/keygen#attr-challenge">challenge</a></code>
+ HTML&nbsp;attribute, containing a challenge string that is packaged with the submitted key.
+    */
+  String getChallenge();
+
+  void setChallenge(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/keygen#attr-disabled">disabled</a></code>
+&nbsp;HTML attribute, indicating that the control is not available for interaction.
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * Indicates the control's form owner, reflecting the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/keygen#attr-form">form</a></code>
+&nbsp;HTML&nbsp;attribute if it is defined.
+    */
+  FormElement getForm();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/keygen#attr-keytype">keytype</a></code>
+ HTML&nbsp;attribute, containing the type of key used.
+    */
+  String getKeytype();
+
+  void setKeytype(String arg);
+
+
+  /**
+    * A list of label elements associated with this keygen element.
+    */
+  NodeList getLabels();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/keygen#attr-name">name</a></code>
+ HTML attribute, containing the name for the control that is submitted with form data.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Must be the value <code>keygen</code>.
+    */
+  String getType();
+
+
+  /**
+    * A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.
+    */
+  String getValidationMessage();
+
+
+  /**
+    * The validity states that this element is in.
+    */
+  ValidityState getValidity();
+
+
+  /**
+    * Always false because <code>keygen</code> objects are never candidates for constraint validation.
+    */
+  boolean isWillValidate();
+
+
+  /**
+    * Always returns true because <code>keygen</code> objects are never candidates for constraint validation.
+    */
+  boolean checkValidity();
+
+
+  /**
+    * Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.
+    */
+  void setCustomValidity(String error);
+}
diff --git a/elemental/src/elemental/html/LIElement.java b/elemental/src/elemental/html/LIElement.java
new file mode 100644
index 0000000..8625e67
--- /dev/null
+++ b/elemental/src/elemental/html/LIElement.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <em>HTML List item element</em> (<code>&lt;li&gt;</code>) is used to represent a list item. It should be contained in an ordered list (<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+), an unordered list (<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+) or a menu (<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/menu">&lt;menu&gt;</a></code>
+), where it represents a single entity in that list. In menus and unordered lists, list items are ordinarily displayed using bullet points. In order lists, they are usually displayed with some ascending counter on the left such as a number or letter
+  */
+public interface LIElement extends Element {
+
+
+  /**
+    * This character attributes indicates the numbering type: <ul> <li><code>a</code>: lowercase letters</li> <li><code>A</code>: uppercase letters</li> <li><code>i</code>: lowercase Roman numerals</li> <li><code>I</code>: uppercase Roman numerals</li> <li><code>1</code>: numbers</li> </ul> This type overrides the one used by its parent <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ element, if any.<br> <div class="note"><strong>Usage note:</strong> This attribute has been deprecated: use the CSS <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/list-style-type">list-style-type</a></code>
+ property instead.</div>
+    */
+  String getType();
+
+  void setType(String arg);
+
+
+  /**
+    * This integer attributes indicates the current ordinal value of the item in the list as defined by the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ element. The only allowed value for this attribute is a number, even if the list is displayed with Roman numerals or letters. List items that follow this one continue numbering from the value set. The <strong>value</strong> attribute has no meaning for unordered lists (<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+) or for menus (<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/menu">&lt;menu&gt;</a></code>
+). <div class="note"><strong>Note</strong>: This attribute was deprecated in HTML4, but reintroduced in HTML5.</div> <div class="geckoVersionNote"> <p>
+</p><div class="geckoVersionHeading">Gecko 9.0 note<div>(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+</div></div>
+<p></p> <p>Prior to <span title="(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+">Gecko&nbsp;9.0</span>, negative values were incorrectly converted to 0. Starting in <span title="(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+">Gecko&nbsp;9.0</span> all integer values are correctly parsed.</p> </div>
+    */
+  int getValue();
+
+  void setValue(int arg);
+}
diff --git a/elemental/src/elemental/html/LabelElement.java b/elemental/src/elemental/html/LabelElement.java
new file mode 100644
index 0000000..3c5cea9
--- /dev/null
+++ b/elemental/src/elemental/html/LabelElement.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM Label objects inherit all of the properties and methods of DOM <a title="en/DOM/element" rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a>, and also expose the <a title="http://dev.w3.org/html5/spec/forms.html#htmllabelelement" class=" external" rel="external" href="http://dev.w3.org/html5/spec/forms.html#htmllabelelement" target="_blank">HTMLLabelElement</a>(or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-13691394" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-13691394" target="_blank">HTMLLabelElement</a>) interface.
+  */
+public interface LabelElement extends Element {
+
+
+  /**
+    * The labeled control.
+    */
+  Element getControl();
+
+
+  /**
+    * The form owner of this label.
+    */
+  FormElement getForm();
+
+
+  /**
+    * The ID of the labeled control. Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/label#attr-for">for</a></code>
+ attribute.
+    */
+  String getHtmlFor();
+
+  void setHtmlFor(String arg);
+}
diff --git a/elemental/src/elemental/html/LegendElement.java b/elemental/src/elemental/html/LegendElement.java
new file mode 100644
index 0000000..c6f6daa
--- /dev/null
+++ b/elemental/src/elemental/html/LegendElement.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM&nbsp;Legend objects inherit all of the properties and methods of DOM <a href="https://developer.mozilla.org/en/DOM/HTMLElement" title="en/DOM/HTMLElement" rel="internal">HTMLElement</a>, and also expose the <a title="http://www.w3.org/TR/html5/forms.html#htmllegendelement" class=" external" rel="external nofollow" href="http://www.w3.org/TR/html5/forms.html#htmllegendelement" target="_blank">HTMLLegendElement</a> 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> (or <a class=" external" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-21482039" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-21482039" target="_blank">HTMLLegendElement</a> 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span>) interface.
+  */
+public interface LegendElement extends Element {
+
+
+  /**
+    * Alignment relative to the form set. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>, 
+
+<span class="deprecatedInlineTemplate" title="">Deprecated</span>
+
+ in 
+<span>HTML 4.01</span>
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * The form that this legend belongs to. If the legend has a fieldset element as its parent, then this attribute returns the same value as the <strong>form</strong> attribute on the parent fieldset element. Otherwise, it returns null.
+    */
+  FormElement getForm();
+}
diff --git a/elemental/src/elemental/html/LinkElement.java b/elemental/src/elemental/html/LinkElement.java
new file mode 100644
index 0000000..b1b8366
--- /dev/null
+++ b/elemental/src/elemental/html/LinkElement.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.dom.DOMSettableTokenList;
+import elemental.stylesheets.StyleSheet;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <em>HTML Link Element</em> (&lt;link&gt;) specifies relationships between the current document and other documents. Possible uses for this element include defining a relational framework for navigation and linking the document to a style sheet.
+  */
+public interface LinkElement extends Element {
+
+
+  /**
+    * This attribute defines the character encoding of the linked resource. The value is a space- and/or comma-delimited list of character sets as defined in <a class="external" title="http://tools.ietf.org/html/rfc2045" rel="external" href="http://tools.ietf.org/html/rfc2045" target="_blank">RFC 2045</a>. The default value is ISO-8859-1. <div class="note"><strong>Usage note: </strong>This attribute is obsolete in HTML5 and <span>must</span><strong> not be used by authors</strong>. To achieve its effect, use the <span>Content-Type:</span> HTTP header on the linked resource.</div>
+    */
+  String getCharset();
+
+  void setCharset(String arg);
+
+
+  /**
+    * This attribute is used to disable a link relationship. In conjunction with scripting, this attribute could be used to turn on and off various style sheet relationships. <div class="note"> <p><strong>Note: </strong>While there is no <code>disabled</code> attribute in the HTML standard, there <strong>is</strong> a <code>disabled</code> attribute on the <code>HTMLLinkElement</code> DOM object.</p> <p>The use of&nbsp;<code>disabled</code> as an HTML attribute is non-standard and only used by some Microsoft browsers. <span>Do not use it</span>. To achieve a similar effect, use one of the following techniques:</p> <ul> <li>If the <code>disabled</code> attribute has been added directly to the element on the page, do not include the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/link">&lt;link&gt;</a></code>
+ element instead;</li> <li>Set the <code>disabled</code> <strong>property</strong> of the DOM object via scripting.</li> </ul> </div>
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * This attribute specifies the <a title="https://developer.mozilla.org/en/URIs_and_URLs" rel="internal" href="https://developer.mozilla.org/en/URIs_and_URLs">URL</a> of the linked resource. A URL might be absolute or relative.
+    */
+  String getHref();
+
+  void setHref(String arg);
+
+
+  /**
+    * This attribute indicates the language of the linked resource. It is purely advisory. Allowed values are determined by <a class="external" title="http://www.ietf.org/rfc/bcp/bcp47.txt" rel="external" href="http://www.ietf.org/rfc/bcp/bcp47.txt" target="_blank">BCP47</a> for HTML5 and by <a class="external" title="http://www.ietf.org/rfc/rfc1766.txt" rel="external" href="http://www.ietf.org/rfc/rfc1766.txt" target="_blank">RFC1766</a> for HTML 4. Use this attribute only if the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/a#attr-href">href</a></code>
+ attribute is present.
+    */
+  String getHreflang();
+
+  void setHreflang(String arg);
+
+
+  /**
+    * This attribute specifies the media which the linked resource applies to. Its value must be a <a title="En/CSS/Media queries" rel="internal" href="https://developer.mozilla.org/en/CSS/Media_queries">media query</a>. This attribute is mainly useful when linking to external stylesheets by allowing the user agent to pick the best adapted one for the device it runs on.<br> <div class="note"><strong>Usage note:&nbsp;</strong> <p>&nbsp;</p> <ul> <li>In HTML 4, this can only be a simple white-space-separated list of media description literals, i.e., <a title="https://developer.mozilla.org/en/CSS/@media" rel="internal" href="https://developer.mozilla.org/en/CSS/@media">media types and groups</a>, where defined and allowed as values for this attribute, such as <span>print</span>, <span>screen</span>, <span>aural</span>, <span>braille.</span> HTML5 extended this to any kind of <a title="En/CSS/Media queries" rel="internal" href="https://developer.mozilla.org/en/CSS/Media_queries">media queries</a>, which are a superset of the allowed values of HTML 4.</li> <li>Browsers not supporting the <a title="En/CSS/Media queries" rel="internal" href="https://developer.mozilla.org/en/CSS/Media_queries">CSS3 Media Queries</a> won't necessary recognized the adequate link; do not forget to set fallback links,&nbsp; the restricted set of media queries defined in HTML 4.</li> </ul> </div>
+    */
+  String getMedia();
+
+  void setMedia(String arg);
+
+
+  /**
+    * This attribute names a relationship of the linked document to the current document. The attribute must be a space-separated list of the <a title="en/HTML/Link types" rel="internal" href="https://developer.mozilla.org/en/HTML/Link_types">link types values</a>. The most common use of this attribute is to specify a link to an external style sheet:&nbsp;the <strong>rel</strong> attribute is set to <code>stylesheet</code>, and the <strong>href</strong> attribute is set to the URL of an external style sheet to format the page. WebTV also supports the use of the value <code>next</code> for <strong>rel</strong> to preload the next page in a document series.
+    */
+  String getRel();
+
+  void setRel(String arg);
+
+
+  /**
+    * The value of this attribute shows the relationship of the current document to the linked document, as defined by the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/link#attr-href">href</a></code>
+ attribute. The attribute thus defines the reverse relationship compared to the value of the <strong>rel</strong> attribute. <a title="en/HTML/Link types" rel="internal" href="https://developer.mozilla.org/en/HTML/Link_types">Link types values</a> for the attribute are similar to the possible values for 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/link#attr-rel">rel</a></code>
+.<br> <div class="note"><strong>Usage note: </strong>This attribute is obsolete in HTML5. <strong>Do not use it</strong>. To achieve its effect, use the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/link#attr-rel">rel</a></code>
+ attribute with the opposite <a title="en/HTML/Link types" rel="internal" href="https://developer.mozilla.org/en/HTML/Link_types">link types values</a>, e.g. <span>made</span> should be replaced by <span>author</span>. Also this attribute doesn't mean <em>revision</em> and must not be used with a version number, which is unfortunately the case on numerous sites.</div>
+    */
+  String getRev();
+
+  void setRev(String arg);
+
+  StyleSheet getSheet();
+
+
+  /**
+    * This attribute defines the sizes of the icons for visual media contained in the resource. It must be present only if the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/link#attr-rel">rel</a></code>
+ contains the <span>icon</span> <a title="en/HTML/Link types" rel="internal" href="https://developer.mozilla.org/en/HTML/Link_types">link types value</a>. It may have the following values: <ul> <li><span>any</span>, meaning that the icon can be scaled to any size as it is in a vectorial format, like <span>image/svg</span>.</li> <li>a white-space separated list of sizes, each in the format <span><em>&lt;width in pixels&gt;</em>x<em>&lt;height in pixels&gt;</em></span> or <span><em>&lt;width in pixels&gt;</em>X<em>&lt;height in pixels&gt;</em></span>. Each of these sizes must be contained in the resource.</li> </ul> <div class="note"><strong>Usage note:&nbsp;</strong> <p>&nbsp;</p> <ul> <li>Most icon format are only able to store one single icon; therefore most of the time the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element#attr-sizes">sizes</a></code>
+ contains only one entry. Among the major browsers, only the Apple's ICNS format allows the storage of multiple icons, and this format is only supported in WebKit.</li> <li>Apple's iOS does not support this attribute, hence Apple's iPhone and iPad use special, non-standard <a title="en/HTML/Link types" rel="internal" href="https://developer.mozilla.org/en/HTML/Link_types">link types values</a> to define icon to be used as Web Clip or start-up placeholder: <span>apple-touch-icon</span> and <span>apple-touch-startup-icon</span>.</li> </ul> </div>
+    */
+  DOMSettableTokenList getSizes();
+
+  void setSizes(DOMSettableTokenList arg);
+
+
+  /**
+    * Defines the frame or window name that has the defined linking relationship or that will show the rendering of any linked resource.
+    */
+  String getTarget();
+
+  void setTarget(String arg);
+
+
+  /**
+    * This attribute is used to define the type of the content linked to. The value of the attribute should be a MIME type such as <strong>text/html</strong>, <strong>text/css</strong>, and so on. The common use of this attribute is to define the type of style sheet linked and the most common current value is <strong>text/css</strong>, which indicates a Cascading Style Sheet format.
+    */
+  String getType();
+
+  void setType(String arg);
+}
diff --git a/elemental/src/elemental/html/Location.java b/elemental/src/elemental/html/Location.java
new file mode 100644
index 0000000..5b28571
--- /dev/null
+++ b/elemental/src/elemental/html/Location.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.util.Indexable;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Returns a <a href="#Location_object"> <code>Location</code> object</a>, which contains information about the URL of the document and provides methods for changing that URL. You can also assign to this property to load another URL.
+  */
+public interface Location {
+
+  Indexable getAncestorOrigins();
+
+
+  /**
+    * the part of the URL that follows the # symbol, including the # symbol.<br> You can listen for the <a title="en/DOM/window.onhashchange" rel="internal" href="https://developer.mozilla.org/en/DOM/window.onhashchange">hashchange event</a> to get notified of changes to the hash in supporting browsers.
+    */
+  String getHash();
+
+  void setHash(String arg);
+
+
+  /**
+    * the host name and port number.
+    */
+  String getHost();
+
+  void setHost(String arg);
+
+
+  /**
+    * the host name (without the port number or square brackets).
+    */
+  String getHostname();
+
+  void setHostname(String arg);
+
+
+  /**
+    * the entire URL.
+    */
+  String getHref();
+
+  void setHref(String arg);
+
+  String getOrigin();
+
+
+  /**
+    * the path (relative to the host).
+    */
+  String getPathname();
+
+  void setPathname(String arg);
+
+
+  /**
+    * the port number of the URL.
+    */
+  String getPort();
+
+  void setPort(String arg);
+
+
+  /**
+    * the protocol of the URL.
+    */
+  String getProtocol();
+
+  void setProtocol(String arg);
+
+
+  /**
+    * the part of the URL that follows the&nbsp;? symbol, including the&nbsp;? symbol.
+    */
+  String getSearch();
+
+  void setSearch(String arg);
+
+
+  /**
+    * Load the document at the provided URL.
+    */
+  void assign(String url);
+
+
+  /**
+    * Reload the document from the current URL. <code>forceget</code> is a boolean, which, when it is <code>true</code>, causes the page to always be reloaded from the server. If it is <code>false</code> or not specified, the browser may reload the page from its cache.
+    */
+  void reload();
+
+
+  /**
+    * Replace the current document with the one at the provided URL. The difference from the <code>assign()</code> method is that after using <code>replace()</code> the current page will not be saved in session history, meaning the user won't be able to use the Back button to navigate to it.
+    */
+  void replace(String url);
+}
diff --git a/elemental/src/elemental/html/MapElement.java b/elemental/src/elemental/html/MapElement.java
new file mode 100644
index 0000000..3067518
--- /dev/null
+++ b/elemental/src/elemental/html/MapElement.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The HTML <em>Map</em> element (<code>&lt;map&gt;</code>) is used with <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/area">&lt;area&gt;</a></code>
+ elements to define a image map.
+  */
+public interface MapElement extends Element {
+
+  HTMLCollection getAreas();
+
+  String getName();
+
+  void setName(String arg);
+}
diff --git a/elemental/src/elemental/html/MarqueeElement.java b/elemental/src/elemental/html/MarqueeElement.java
new file mode 100644
index 0000000..7449eae
--- /dev/null
+++ b/elemental/src/elemental/html/MarqueeElement.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Non-standard
+  */
+public interface MarqueeElement extends Element {
+
+
+  /**
+    * Sets how the text is scrolled within the marquee. Possible values are <code>scroll</code>, <code>slide</code> and <code>alternate</code>. If no value is specified, the default value is <code>scroll</code>.
+    */
+  String getBehavior();
+
+  void setBehavior(String arg);
+
+  String getBgColor();
+
+  void setBgColor(String arg);
+
+
+  /**
+    * Sets the direction of the scrolling within the marquee. Possible values are <code>left</code>, <code>right</code>, <code>up</code> and <code>down</code>. If no value is specified, the default value is <code>left</code>.
+    */
+  String getDirection();
+
+  void setDirection(String arg);
+
+
+  /**
+    * Sets the height in pixels or percentage value.
+    */
+  String getHeight();
+
+  void setHeight(String arg);
+
+
+  /**
+    * Sets the horizontal margin
+    */
+  int getHspace();
+
+  void setHspace(int arg);
+
+
+  /**
+    * Sets the number of times the marquee will scroll. If no value is specified, the default value is −1, which means the marquee will scroll continuously.
+    */
+  int getLoop();
+
+  void setLoop(int arg);
+
+  int getScrollAmount();
+
+  void setScrollAmount(int arg);
+
+  int getScrollDelay();
+
+  void setScrollDelay(int arg);
+
+  boolean isTrueSpeed();
+
+  void setTrueSpeed(boolean arg);
+
+
+  /**
+    * Sets the vertical margin in pixels or percentage value.
+    */
+  int getVspace();
+
+  void setVspace(int arg);
+
+
+  /**
+    * Sets the width in pixels or percentage value.
+    */
+  String getWidth();
+
+  void setWidth(String arg);
+
+
+  /**
+    * Starts scrolling of the marquee.
+    */
+  void start();
+
+
+  /**
+    * Stops scrolling of the marquee.
+    */
+  void stop();
+}
diff --git a/elemental/src/elemental/html/MediaController.java b/elemental/src/elemental/html/MediaController.java
new file mode 100644
index 0000000..a447dbd
--- /dev/null
+++ b/elemental/src/elemental/html/MediaController.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaController extends EventTarget {
+
+  TimeRanges getBuffered();
+
+  double getCurrentTime();
+
+  void setCurrentTime(double arg);
+
+  double getDefaultPlaybackRate();
+
+  void setDefaultPlaybackRate(double arg);
+
+  double getDuration();
+
+  boolean isMuted();
+
+  void setMuted(boolean arg);
+
+  boolean isPaused();
+
+  double getPlaybackRate();
+
+  void setPlaybackRate(double arg);
+
+  TimeRanges getPlayed();
+
+  TimeRanges getSeekable();
+
+  double getVolume();
+
+  void setVolume(double arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  void pause();
+
+  void play();
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/MediaElement.java b/elemental/src/elemental/html/MediaElement.java
new file mode 100644
index 0000000..9261b99
--- /dev/null
+++ b/elemental/src/elemental/html/MediaElement.java
@@ -0,0 +1,373 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.events.EventListener;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * HTML media elements (such as <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/audio">&lt;audio&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+) expose the <code>HTMLMediaElement</code> interface which provides special properties and methods (beyond the regular <a href="https://developer.mozilla.org/en/DOM/element" rel="internal">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of media elements.
+  */
+public interface MediaElement extends Element {
+
+    static final int EOS_DECODE_ERR = 2;
+
+    static final int EOS_NETWORK_ERR = 1;
+
+    static final int EOS_NO_ERROR = 0;
+
+  /**
+    * Data is available for the current playback position, but not enough to actually play more than one frame.
+    */
+
+    static final int HAVE_CURRENT_DATA = 2;
+
+  /**
+    * Enough data is available—and the download rate is high enough—that the media can be played through to the end without interruption.
+    */
+
+    static final int HAVE_ENOUGH_DATA = 4;
+
+  /**
+    * Data for the current playback position as well as for at least a little bit of time into the future is available (in other words, at least two frames of video, for example).
+    */
+
+    static final int HAVE_FUTURE_DATA = 3;
+
+  /**
+    * Enough of the media resource has been retrieved that the metadata attributes are initialized.&nbsp; Seeking will no longer raise an exception.
+    */
+
+    static final int HAVE_METADATA = 1;
+
+  /**
+    * No information is available about the media resource.
+    */
+
+    static final int HAVE_NOTHING = 0;
+
+    static final int NETWORK_EMPTY = 0;
+
+    static final int NETWORK_IDLE = 1;
+
+    static final int NETWORK_LOADING = 2;
+
+    static final int NETWORK_NO_SOURCE = 3;
+
+    static final int SOURCE_CLOSED = 0;
+
+    static final int SOURCE_ENDED = 2;
+
+    static final int SOURCE_OPEN = 1;
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video#attr-autoplay">autoplay</a></code>
+ HTML&nbsp;attribute, indicating whether to begin playing as soon as enough media is available.
+    */
+  boolean isAutoplay();
+
+  void setAutoplay(boolean arg);
+
+
+  /**
+    * The ranges of the media source that the browser has buffered, if any.
+    */
+  TimeRanges getBuffered();
+
+  MediaController getController();
+
+  void setController(MediaController arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video#attr-controls">controls</a></code>
+ HTML attribute, indicating whether user interface items for controlling the resource should be displayed.
+    */
+  boolean isControls();
+
+  void setControls(boolean arg);
+
+
+  /**
+    * The absolute URL of the chosen media resource (if, for example, the server selects a media file based on the resolution of the user's display), or an empty string if the <code>networkState</code> is <code>EMPTY</code>.
+    */
+  String getCurrentSrc();
+
+
+  /**
+    * The current playback time, in seconds.&nbsp; Setting this value seeks the media to the new time.
+    */
+  float getCurrentTime();
+
+  void setCurrentTime(float arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video#attr-muted">muted</a></code>
+ HTML attribute, indicating whether the media element's audio output should be muted by default. Changing the value dynamically will not unmute the audio (it only controls the default state).
+    */
+  boolean isDefaultMuted();
+
+  void setDefaultMuted(boolean arg);
+
+
+  /**
+    * The default playback rate for the media.&nbsp; The Ogg backend does not support this.&nbsp; 1.0 is "normal speed," values lower than 1.0 make the media play slower than normal, higher values make it play faster.&nbsp; The value 0.0 is invalid and throws a <code>NOT_SUPPORTED_ERR</code>&nbsp;exception.
+    */
+  float getDefaultPlaybackRate();
+
+  void setDefaultPlaybackRate(float arg);
+
+
+  /**
+    * The length of the media in seconds, or zero if no media data is available.&nbsp; If the media data is available but the length is unknown, this value is <code>NaN</code>.&nbsp; If the media is streamed and has no predefined length, the value is <code>Inf</code>.
+    */
+  float getDuration();
+
+
+  /**
+    * Indicates whether the media element has ended playback.
+    */
+  boolean isEnded();
+
+
+  /**
+    * The media error object for the most recent error, or null if there has not been an error.
+    */
+  MediaError getError();
+
+  double getInitialTime();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video#attr-loop">loop</a></code>
+ HTML&nbsp;attribute, indicating whether the media element should start over when it reaches the end.
+    */
+  boolean isLoop();
+
+  void setLoop(boolean arg);
+
+  String getMediaGroup();
+
+  void setMediaGroup(String arg);
+
+
+  /**
+    * <code>true</code> if the audio is muted, and <code>false</code> otherwise.
+    */
+  boolean isMuted();
+
+  void setMuted(boolean arg);
+
+
+  /**
+    * <p>The current state of fetching the media over the network.</p> <table class="standard-table"> <tbody> <tr> <td class="header">Constant</td> <td class="header">Value</td> <td class="header">Description</td> </tr> <tr> <td><code>EMPTY</code></td> <td>0</td> <td>There is no data yet.&nbsp; The <code>readyState</code> is also <code>HAVE_NOTHING</code>.</td> </tr> <tr> <td><code>LOADING</code></td> <td>1</td> <td>The media is loading.</td> </tr> <tr> <td><code>LOADED_METADATA</code></td> <td>2</td> <td>The media's metadata has been loaded.</td> </tr> <tr> <td><code>LOADED_FIRST_FRAME</code></td> <td>3</td> <td>The media's first frame has been loaded.</td> </tr> <tr> <td><code>LOADED</code></td> <td>4</td> <td>The media has been fully loaded.</td> </tr> </tbody> </table>
+    */
+  int getNetworkState();
+
+  EventListener getOnwebkitkeyadded();
+
+  void setOnwebkitkeyadded(EventListener arg);
+
+  EventListener getOnwebkitkeyerror();
+
+  void setOnwebkitkeyerror(EventListener arg);
+
+  EventListener getOnwebkitkeymessage();
+
+  void setOnwebkitkeymessage(EventListener arg);
+
+  EventListener getOnwebkitneedkey();
+
+  void setOnwebkitneedkey(EventListener arg);
+
+  EventListener getOnwebkitsourceclose();
+
+  void setOnwebkitsourceclose(EventListener arg);
+
+  EventListener getOnwebkitsourceended();
+
+  void setOnwebkitsourceended(EventListener arg);
+
+  EventListener getOnwebkitsourceopen();
+
+  void setOnwebkitsourceopen(EventListener arg);
+
+
+  /**
+    * Indicates whether the media element is paused.
+    */
+  boolean isPaused();
+
+
+  /**
+    * The current rate at which the media is being played back. This is used to implement user controls for fast forward, slow motion, and so forth. The normal playback rate is multiplied by this value to obtain the current rate, so a value of 1.0 indicates normal speed.&nbsp; Not supported by the Ogg backend.
+    */
+  float getPlaybackRate();
+
+  void setPlaybackRate(float arg);
+
+
+  /**
+    * The ranges of the media source that the browser has played, if any.
+    */
+  TimeRanges getPlayed();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video#attr-preload">preload</a></code>
+ HTML attribute, indicating what data should be preloaded at page-load time, if any.
+    */
+  String getPreload();
+
+  void setPreload(String arg);
+
+
+  /**
+    * <p>The readiness state of the media:</p> <table class="standard-table"> <tbody> <tr> <td class="header">Constant</td> <td class="header">Value</td> <td class="header">Description</td> </tr> <tr> <td><code>HAVE_NOTHING</code></td> <td>0</td> <td>No information is available about the media resource.</td> </tr> <tr> <td><code>HAVE_METADATA</code></td> <td>1</td> <td>Enough of the media resource has been retrieved that the metadata attributes are initialized.&nbsp; Seeking will no longer raise an exception.</td> </tr> <tr> <td><code>HAVE_CURRENT_DATA</code></td> <td>2</td> <td>Data is available for the current playback position, but not enough to actually play more than one frame.</td> </tr> <tr> <td><code>HAVE_FUTURE_DATA</code></td> <td>3</td> <td>Data for the current playback position as well as for at least a little bit of time into the future is available (in other words, at least two frames of video, for example).</td> </tr> <tr> <td><code>HAVE_ENOUGH_DATA</code></td> <td>4</td> <td>Enough data is available—and the download rate is high enough—that the media can be played through to the end without interruption.</td> </tr> </tbody> </table>
+    */
+  int getReadyState();
+
+
+  /**
+    * The time ranges that the user is able to seek to, if any.
+    */
+  TimeRanges getSeekable();
+
+
+  /**
+    * Indicates whether the media is in the process of seeking to a new position.
+    */
+  boolean isSeeking();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video#attr-src">src</a></code>
+ HTML attribute, containing the URL of a media resource to use.
+    */
+  String getSrc();
+
+  void setSrc(String arg);
+
+
+  /**
+    * The earliest possible position in the media, in seconds.
+    */
+  float getStartTime();
+
+  TextTrackList getTextTracks();
+
+
+  /**
+    * The audio volume, from 0.0 (silent) to 1.0 (loudest).
+    */
+  float getVolume();
+
+  void setVolume(float arg);
+
+  int getWebkitAudioDecodedByteCount();
+
+  boolean isWebkitClosedCaptionsVisible();
+
+  void setWebkitClosedCaptionsVisible(boolean arg);
+
+  boolean isWebkitHasClosedCaptions();
+
+  String getWebkitMediaSourceURL();
+
+  boolean isWebkitPreservesPitch();
+
+  void setWebkitPreservesPitch(boolean arg);
+
+  int getWebkitSourceState();
+
+  int getWebkitVideoDecodedByteCount();
+
+  TextTrack addTextTrack(String kind);
+
+  TextTrack addTextTrack(String kind, String label);
+
+  TextTrack addTextTrack(String kind, String label, String language);
+
+
+  /**
+    * Determines whether the specified media type can be played back.
+    */
+  String canPlayType(String type, String keySystem);
+
+
+  /**
+    * Begins loading the media content from the server.
+    */
+  void load();
+
+
+  /**
+    * Pauses the media playback.
+    */
+  void pause();
+
+
+  /**
+    * Begins playback of the media. If you have changed the <strong>src</strong> attribute of the media element since the page was loaded, you must call load() before play(), otherwise the original media plays again.
+    */
+  void play();
+
+  void webkitAddKey(String keySystem, Uint8Array key);
+
+  void webkitAddKey(String keySystem, Uint8Array key, Uint8Array initData, String sessionId);
+
+  void webkitCancelKeyRequest(String keySystem, String sessionId);
+
+  void webkitGenerateKeyRequest(String keySystem);
+
+  void webkitGenerateKeyRequest(String keySystem, Uint8Array initData);
+
+  void webkitSourceAbort(String id);
+
+  void webkitSourceAddId(String id, String type);
+
+  void webkitSourceAppend(String id, Uint8Array data);
+
+  TimeRanges webkitSourceBuffered(String id);
+
+  void webkitSourceEndOfStream(int status);
+
+  void webkitSourceRemoveId(String id);
+}
diff --git a/elemental/src/elemental/html/MediaElementAudioSourceNode.java b/elemental/src/elemental/html/MediaElementAudioSourceNode.java
new file mode 100644
index 0000000..6ad23c8
--- /dev/null
+++ b/elemental/src/elemental/html/MediaElementAudioSourceNode.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaElementAudioSourceNode extends AudioSourceNode {
+
+  MediaElement getMediaElement();
+}
diff --git a/elemental/src/elemental/html/MediaError.java b/elemental/src/elemental/html/MediaError.java
new file mode 100644
index 0000000..6ef9f09
--- /dev/null
+++ b/elemental/src/elemental/html/MediaError.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaError {
+
+    static final int MEDIA_ERR_ABORTED = 1;
+
+    static final int MEDIA_ERR_DECODE = 3;
+
+    static final int MEDIA_ERR_ENCRYPTED = 5;
+
+    static final int MEDIA_ERR_NETWORK = 2;
+
+    static final int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
+
+  int getCode();
+}
diff --git a/elemental/src/elemental/html/MediaKeyError.java b/elemental/src/elemental/html/MediaKeyError.java
new file mode 100644
index 0000000..bf82721
--- /dev/null
+++ b/elemental/src/elemental/html/MediaKeyError.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaKeyError {
+
+    static final int MEDIA_KEYERR_CLIENT = 2;
+
+    static final int MEDIA_KEYERR_DOMAIN = 6;
+
+    static final int MEDIA_KEYERR_HARDWARECHANGE = 5;
+
+    static final int MEDIA_KEYERR_OUTPUT = 4;
+
+    static final int MEDIA_KEYERR_SERVICE = 3;
+
+    static final int MEDIA_KEYERR_UNKNOWN = 1;
+
+  int getCode();
+}
diff --git a/elemental/src/elemental/html/MediaKeyEvent.java b/elemental/src/elemental/html/MediaKeyEvent.java
new file mode 100644
index 0000000..0b72164
--- /dev/null
+++ b/elemental/src/elemental/html/MediaKeyEvent.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaKeyEvent extends Event {
+
+  String getDefaultURL();
+
+  MediaKeyError getErrorCode();
+
+  Uint8Array getInitData();
+
+  String getKeySystem();
+
+  Uint8Array getMessage();
+
+  String getSessionId();
+
+  int getSystemCode();
+}
diff --git a/elemental/src/elemental/html/MediaQueryList.java b/elemental/src/elemental/html/MediaQueryList.java
new file mode 100644
index 0000000..eabc763
--- /dev/null
+++ b/elemental/src/elemental/html/MediaQueryList.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong>
+<div>This page is not complete.</div>
+</div>
+
+<p></p>
+<p>A <code>MediaQueryList</code> object maintains a list of <a title="En/CSS/Media queries" rel="internal" href="https://developer.mozilla.org/En/CSS/Media_queries">media queries</a> on a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/document">document</a></code>
+, and handles sending notifications to listeners when the media queries on the document change.</p>
+<p>This makes it possible to observe a document to detect when its media queries change, instead of polling the values periodically, if you need to programmatically detect changes to the values of media queries on a document.</p>
+  */
+public interface MediaQueryList {
+
+
+  /**
+    * <code>true</code> if the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/document">document</a></code>
+ currently matches the media query list; otherwise <code>false</code>. <strong>Read only.</strong>
+    */
+  boolean isMatches();
+
+
+  /**
+    * The serialized media query list.
+    */
+  String getMedia();
+
+
+  /**
+    * <p>Adds a new listener to the media query list. If the specified listener is already in the list, this method has no effect.</p>
+
+<div id="section_5"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>listener</code></dt> <dd>The <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/MediaQueryListListener">MediaQueryListListener</a></code>
+ to invoke when the media query's evaluated result changes.</dd> <div id="section_6"><span id="removeListener()"></span></div></dl></div>
+    */
+  void addListener(MediaQueryListListener listener);
+
+
+  /**
+    * <div id="section_5"><dl><div id="section_6"><p>Removes a listener from the media query list. Does nothing if the specified listener isn't already in the list.</p> 
+</div></dl>
+</div><div id="section_7"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>listener</code></dt> <dd>The <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/MediaQueryListListener">MediaQueryListListener</a></code>
+ to stop calling on changes to the media query's evaluated result.</dd>
+</dl>
+</div>
+    */
+  void removeListener(MediaQueryListListener listener);
+}
diff --git a/elemental/src/elemental/html/MediaQueryListListener.java b/elemental/src/elemental/html/MediaQueryListListener.java
new file mode 100644
index 0000000..5f8773a
--- /dev/null
+++ b/elemental/src/elemental/html/MediaQueryListListener.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><strong>DRAFT</strong>
+<div>This page is not complete.</div>
+</div>
+
+<p></p>
+<p>A <code>MediaQueryList</code> object maintains a list of <a title="En/CSS/Media queries" rel="internal" href="https://developer.mozilla.org/En/CSS/Media_queries">media queries</a> on a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/document">document</a></code>
+, and handles sending notifications to listeners when the media queries on the document change.</p>
+<p>This makes it possible to observe a document to detect when its media queries change, instead of polling the values periodically, if you need to programmatically detect changes to the values of media queries on a document.</p>
+  */
+public interface MediaQueryListListener {
+
+  void queryChanged(MediaQueryList list);
+}
diff --git a/elemental/src/elemental/html/MemoryInfo.java b/elemental/src/elemental/html/MemoryInfo.java
new file mode 100644
index 0000000..15590aa
--- /dev/null
+++ b/elemental/src/elemental/html/MemoryInfo.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MemoryInfo {
+
+  int getJsHeapSizeLimit();
+
+  int getTotalJSHeapSize();
+
+  int getUsedJSHeapSize();
+}
diff --git a/elemental/src/elemental/html/MenuElement.java b/elemental/src/elemental/html/MenuElement.java
new file mode 100644
index 0000000..621688c
--- /dev/null
+++ b/elemental/src/elemental/html/MenuElement.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The HTML <em>menu</em> element (<code>&lt;menu&gt;</code>) represents an unordered list of menu choices, or commands.</p>
+<p>There is no limitation to the depth and nesting of lists defined with the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/menu">&lt;menu&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+ elements.</p>
+<div class="note"><strong>Usage note: </strong> The <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/menu">&lt;menu&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+ both represent an unordered list of items. They differ in the way that the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+ element only contains items to display while the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/menu">&lt;menu&gt;</a></code>
+ element contains interactive items, to act on.</div>
+<div class="note"><strong>Note</strong>: This element was deprecated in HTML4, but reintroduced in HTML5.</div>
+  */
+public interface MenuElement extends Element {
+
+  boolean isCompact();
+
+  void setCompact(boolean arg);
+}
diff --git a/elemental/src/elemental/html/MetaElement.java b/elemental/src/elemental/html/MetaElement.java
new file mode 100644
index 0000000..14f11cc
--- /dev/null
+++ b/elemental/src/elemental/html/MetaElement.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The meta objects expose the <a class=" external" target="_blank" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-37041454" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-37041454">HTMLMetaElement</a> interface which contains descriptive metadata about a document.&nbsp; This object inherits all of the properties and methods described in the <a class="internal" rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> section.
+  */
+public interface MetaElement extends Element {
+
+
+  /**
+    * Gets or sets the value of meta-data property.
+    */
+  String getContent();
+
+  void setContent(String arg);
+
+
+  /**
+    * Gets or sets the name of an HTTP&nbsp;response header to define for a document.
+    */
+  String getHttpEquiv();
+
+  void setHttpEquiv(String arg);
+
+
+  /**
+    * Gets or sets the name of a meta-data property to define for a document.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Gets or sets the name of a scheme used to interpret the value of a meta-data property.
+    */
+  String getScheme();
+
+  void setScheme(String arg);
+}
diff --git a/elemental/src/elemental/html/Metadata.java b/elemental/src/elemental/html/Metadata.java
new file mode 100644
index 0000000..59029ae
--- /dev/null
+++ b/elemental/src/elemental/html/Metadata.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Metadata is structured data about data. Metadata which is included with SVG content should be specified within <code>metadata</code> elements. The contents of the <code>metadata</code> should be elements from other XML namespaces such as RDF, FOAF, etc.
+  */
+public interface Metadata {
+
+  Date getModificationTime();
+
+  double getSize();
+}
diff --git a/elemental/src/elemental/html/MetadataCallback.java b/elemental/src/elemental/html/MetadataCallback.java
new file mode 100644
index 0000000..5ae3f50
--- /dev/null
+++ b/elemental/src/elemental/html/MetadataCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface MetadataCallback {
+  boolean onMetadataCallback(Metadata metadata);
+}
diff --git a/elemental/src/elemental/html/MeterElement.java b/elemental/src/elemental/html/MeterElement.java
new file mode 100644
index 0000000..afa7dc1
--- /dev/null
+++ b/elemental/src/elemental/html/MeterElement.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The HTML <em>meter</em> element (<code>&lt;meter&gt;</code>) represents either a scalar value within a known range or a fractional value.</p>
+<div class="note"><strong>Usage note: </strong>Unless the <strong>value</strong> attribute is between 0 and 1 (inclusive), the <strong>min</strong> attribute and <strong>max</strong> attribute should define the range so that the <strong>value</strong> attribute's value is within it.</div>
+  */
+public interface MeterElement extends Element {
+
+
+  /**
+    * The lower numeric bound of the high end of the measured range. This must be less than the maximum value (<strong>max</strong> attribute), and it also must be greater than the low value and minimum value (<strong>low</strong> attribute and <strong>min</strong> attribute, respectively), if any are specified. If unspecified, or if greater than the maximum value, the <strong>high</strong> value is equal to the maximum value.
+    */
+  double getHigh();
+
+  void setHigh(double arg);
+
+  NodeList getLabels();
+
+
+  /**
+    * The upper numeric bound of the low end of the measured range. This must be greater than the minimum value (<strong>min</strong> attribute), and it also must be less than the high value and maximum value (<strong>high</strong> attribute and <strong>max</strong> attribute, respectively), if any are specified. If unspecified, or if less than the minimum value, the <strong>low</strong> value is equal to the minimum value.
+    */
+  double getLow();
+
+  void setLow(double arg);
+
+
+  /**
+    * The upper numeric bound of the measured range. This must be greater than the minimum value (<strong>min</strong> attribute), if specified. If unspecified, the maximum value is 1.
+    */
+  double getMax();
+
+  void setMax(double arg);
+
+
+  /**
+    * The lower numeric bound of the measured range. This must be less than the maximum value (<strong>max</strong> attribute), if specified. If unspecified, the minimum value is 0.
+    */
+  double getMin();
+
+  void setMin(double arg);
+
+
+  /**
+    * This attribute indicates the optimal numeric value. It must be within the range (as defined by the <strong>min</strong> attribute and <strong>max</strong> attribute). When used with the <strong>low</strong> attribute and <strong>high</strong> attribute, it gives an indication where along the range is considered preferable. For example, if it is between the <strong>min</strong> attribute and the <strong>low</strong> attribute, then the lower range is considered preferred.
+    */
+  double getOptimum();
+
+  void setOptimum(double arg);
+
+
+  /**
+    * The current numeric value. This must be between the minimum and maximum values (<strong>min</strong> attribute and <strong>max</strong> attribute) if they are specified. If unspecified or malformed, the value is 0. If specified, but not within the range given by the <strong>min</strong> attribute and <strong>max</strong> attribute, the value is equal to the nearest end of the range.
+    */
+  double getValue();
+
+  void setValue(double arg);
+}
diff --git a/elemental/src/elemental/html/ModElement.java b/elemental/src/elemental/html/ModElement.java
new file mode 100644
index 0000000..684b83f
--- /dev/null
+++ b/elemental/src/elemental/html/ModElement.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM mod (modification)&nbsp;objects expose the <a title="http://www.w3.org/TR/html5/edits.html#htmlmodelement" class=" external" rel="external nofollow" href="http://www.w3.org/TR/html5/edits.html#htmlmodelement" target="_blank">HTMLModElement</a> (or <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" rel="external nofollow" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-79359609" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-79359609" target="_blank"><code>HTMLModElement</code></a>) interface, which provides special properties (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating modification elements.
+  */
+public interface ModElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/del#attr-cite">cite</a></code>
+ HTML attribute, containing a URI of a resource explaining the change.
+    */
+  String getCite();
+
+  void setCite(String arg);
+
+  String getDateTime();
+
+  void setDateTime(String arg);
+}
diff --git a/elemental/src/elemental/html/Navigator.java b/elemental/src/elemental/html/Navigator.java
new file mode 100644
index 0000000..a6d3a7f
--- /dev/null
+++ b/elemental/src/elemental/html/Navigator.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.util.Mappable;
+import elemental.dom.Geolocation;
+import elemental.dom.PointerLock;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Returns a reference to the navigator object, which can be queried for information about the application running the script.
+  */
+public interface Navigator {
+
+
+  /**
+    * Returns the internal "code" name of the current browser. Do not rely on this property to return the correct value.
+    */
+  String getAppCodeName();
+
+
+  /**
+    * Returns the official name of the browser. Do not rely on this property to return the correct value.
+    */
+  String getAppName();
+
+
+  /**
+    * Returns the version of the browser as a string. Do not rely on this property to return the correct value.
+    */
+  String getAppVersion();
+
+
+  /**
+    * Returns a boolean indicating whether cookies are enabled in the browser or not.
+    */
+  boolean isCookieEnabled();
+
+  Geolocation getGeolocation();
+
+
+  /**
+    * Returns a string representing the language version of the browser.
+    */
+  String getLanguage();
+
+
+  /**
+    * Returns a list of the MIME types supported by the browser.
+    */
+  DOMMimeTypeArray getMimeTypes();
+
+
+  /**
+    * Returns a boolean indicating whether the browser is working online.
+    */
+  boolean isOnLine();
+
+
+  /**
+    * Returns a string representing the platform of the browser.
+    */
+  String getPlatform();
+
+
+  /**
+    * Returns an array of the plugins installed in the browser.
+    */
+  DOMPluginArray getPlugins();
+
+
+  /**
+    * Returns the product name of the current browser. (e.g. "Gecko")
+    */
+  String getProduct();
+
+
+  /**
+    * Returns the build number of the current browser (e.g. "20060909")
+    */
+  String getProductSub();
+
+
+  /**
+    * Returns the user agent string for the current browser.
+    */
+  String getUserAgent();
+
+
+  /**
+    * Returns the vendor name of the current browser (e.g. "Netscape6")
+    */
+  String getVendor();
+
+
+  /**
+    * Returns the vendor version number (e.g. "6.1")
+    */
+  String getVendorSub();
+
+
+  /**
+    * Returns a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/window.navigator.mozBattery">battery</a></code>
+ object you can use to get information about the battery charging status.
+    */
+  BatteryManager getWebkitBattery();
+
+
+  /**
+    * Returns a PointerLock object for the <a title="Mouse Lock API" rel="internal" href="https://developer.mozilla.org/en/API/Mouse_Lock_API">Mouse Lock API</a>.
+    */
+  PointerLock getWebkitPointer();
+
+  void getStorageUpdates();
+
+
+  /**
+    * Indicates whether the host browser is Java-enabled or not.
+    */
+  boolean javaEnabled();
+
+
+  /**
+    * Allows web sites to register themselves as a possible handler for a given protocol.
+    */
+  void registerProtocolHandler(String scheme, String url, String title);
+
+  void webkitGetUserMedia(Mappable options, NavigatorUserMediaSuccessCallback successCallback, NavigatorUserMediaErrorCallback errorCallback);
+
+  void webkitGetUserMedia(Mappable options, NavigatorUserMediaSuccessCallback successCallback);
+}
diff --git a/elemental/src/elemental/html/NavigatorUserMediaError.java b/elemental/src/elemental/html/NavigatorUserMediaError.java
new file mode 100644
index 0000000..de95c03
--- /dev/null
+++ b/elemental/src/elemental/html/NavigatorUserMediaError.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface NavigatorUserMediaError {
+
+    static final int PERMISSION_DENIED = 1;
+
+  int getCode();
+}
diff --git a/elemental/src/elemental/html/NavigatorUserMediaErrorCallback.java b/elemental/src/elemental/html/NavigatorUserMediaErrorCallback.java
new file mode 100644
index 0000000..00ba550
--- /dev/null
+++ b/elemental/src/elemental/html/NavigatorUserMediaErrorCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface NavigatorUserMediaErrorCallback {
+  boolean onNavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
+}
diff --git a/elemental/src/elemental/html/NavigatorUserMediaSuccessCallback.java b/elemental/src/elemental/html/NavigatorUserMediaSuccessCallback.java
new file mode 100644
index 0000000..6a41001
--- /dev/null
+++ b/elemental/src/elemental/html/NavigatorUserMediaSuccessCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface NavigatorUserMediaSuccessCallback {
+  boolean onNavigatorUserMediaSuccessCallback(LocalMediaStream stream);
+}
diff --git a/elemental/src/elemental/html/Notification.java b/elemental/src/elemental/html/Notification.java
new file mode 100644
index 0000000..c6c79b8
--- /dev/null
+++ b/elemental/src/elemental/html/Notification.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div class="geckoMinversionHeaderTemplate"><p>Mobile Only in Gecko 2.0</p><p>Available only in Firefox Mobile as of Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+</p></div>
+
+<div><p>Non-standard</p></div><p></p>
+<p>The notification object, which you create using the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/navigator.mozNotification">navigator.mozNotification</a></code>
+&nbsp;object's <code>createNotification()</code>&nbsp;method, is used to configure and display desktop notifications to the user.</p>
+  */
+public interface Notification extends EventTarget {
+
+  String getDir();
+
+  void setDir(String arg);
+
+
+  /**
+    * &nbsp;A function to call when the notification is clicked.
+    */
+  EventListener getOnclick();
+
+  void setOnclick(EventListener arg);
+
+
+  /**
+    * &nbsp;A function to call when the notification is dismissed.
+    */
+  EventListener getOnclose();
+
+  void setOnclose(EventListener arg);
+
+  EventListener getOndisplay();
+
+  void setOndisplay(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnshow();
+
+  void setOnshow(EventListener arg);
+
+  String getReplaceId();
+
+  void setReplaceId(String arg);
+
+  String getTag();
+
+  void setTag(String arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  void cancel();
+
+  void close();
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+
+  /**
+    * Displays the notification.
+    */
+  void show();
+}
diff --git a/elemental/src/elemental/html/NotificationCenter.java b/elemental/src/elemental/html/NotificationCenter.java
new file mode 100644
index 0000000..02d924a
--- /dev/null
+++ b/elemental/src/elemental/html/NotificationCenter.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface NotificationCenter {
+
+  int checkPermission();
+
+  Notification createHTMLNotification(String url);
+
+  Notification createNotification(String iconUrl, String title, String body);
+
+  void requestPermission(VoidCallback callback);
+}
diff --git a/elemental/src/elemental/html/NotificationPermissionCallback.java b/elemental/src/elemental/html/NotificationPermissionCallback.java
new file mode 100644
index 0000000..00dd0f2
--- /dev/null
+++ b/elemental/src/elemental/html/NotificationPermissionCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface NotificationPermissionCallback {
+  boolean onNotificationPermissionCallback(String permission);
+}
diff --git a/elemental/src/elemental/html/OESStandardDerivatives.java b/elemental/src/elemental/html/OESStandardDerivatives.java
new file mode 100644
index 0000000..2202f6c
--- /dev/null
+++ b/elemental/src/elemental/html/OESStandardDerivatives.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface OESStandardDerivatives {
+
+    static final int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
+}
diff --git a/elemental/src/elemental/html/OESTextureFloat.java b/elemental/src/elemental/html/OESTextureFloat.java
new file mode 100644
index 0000000..e4e439a
--- /dev/null
+++ b/elemental/src/elemental/html/OESTextureFloat.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface OESTextureFloat {
+}
diff --git a/elemental/src/elemental/html/OESVertexArrayObject.java b/elemental/src/elemental/html/OESVertexArrayObject.java
new file mode 100644
index 0000000..16a2fd1
--- /dev/null
+++ b/elemental/src/elemental/html/OESVertexArrayObject.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface OESVertexArrayObject {
+
+    static final int VERTEX_ARRAY_BINDING_OES = 0x85B5;
+
+  void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject);
+
+  WebGLVertexArrayObjectOES createVertexArrayOES();
+
+  void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject);
+
+  boolean isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject);
+}
diff --git a/elemental/src/elemental/html/OListElement.java b/elemental/src/elemental/html/OListElement.java
new file mode 100644
index 0000000..e47463b
--- /dev/null
+++ b/elemental/src/elemental/html/OListElement.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The HTML <em>ordered list</em> element (<code>&lt;ol&gt;</code>) represents an ordered list of items. Typically, ordered-list items are displayed with a preceding numbering, which can be of any form, like numerals, letters or Romans numerals or even simple bullets. This numbered style is not defined in the HTML description of the page, but in its associated CSS, using the <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/list-style-type">list-style-type</a></code>
+ property.</p>
+<p>There is no limitation to the depth and imbrication of lists defined with the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+ elements.</p>
+<div class="note"><strong>Usage note: </strong> The <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+ both represent a list of items. They differ in the way that, with the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ element, the order is meaningful. As a rule of thumb to determine which one to use, try changing the order of the list items; if the meaning is changed, the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ element should be used, else the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+ is adequate.</div>
+  */
+public interface OListElement extends Element {
+
+
+  /**
+    * This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn't work in all browsers. <div class="note"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it has been deprecated: the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ element should be styled using <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a>. To give a similar effect than the <span>compact</span> attribute, the <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a> property <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/line-height">line-height</a></code>
+ can be used with a value of <span>80%</span>.</div>
+    */
+  boolean isCompact();
+
+  void setCompact(boolean arg);
+
+
+  /**
+    * This Boolean attribute specifies that the items of the item are specified in the reverse order, i.e. that the least important one is listed first. Browsers, by default, numbered the items in the reverse order too.
+    */
+  boolean isReversed();
+
+  void setReversed(boolean arg);
+
+
+  /**
+    * This integer attribute specifies the start value for numbering the individual list items. Although the ordering type of list elements might be Roman numerals, such as XXXI, or letters, the value of start is always represented as a number. To start numbering elements from the letter "C", use <code>&lt;ol start="3"&gt;</code>. <div class="note"><strong>Note</strong>: that attribute was deprecated in HTML4, but reintroduced in HTML5.</div>
+    */
+  int getStart();
+
+  void setStart(int arg);
+
+
+  /**
+    * Indicates the numbering type: <ul> <li><span><code>'a'</code></span> indicates lowercase letters,</li> <li><span id="1284454877507S">&nbsp;</span><span><code>'<span id="1284454878023E">&nbsp;</span>A'</code></span> indicates uppercase letters,</li> <li><span><code>'i'</code></span> indicates lowercase Roman numerals,</li> <li><span><code>'I'</code></span> indicates uppercase Roman numerals,</li> <li>and <span><code>'1'</code></span> indicates numbers.</li> </ul> <p>The type set is used for the entire list unless a different 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/li#attr-type">type</a></code>
+ attribute is used within an enclosed <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/li">&lt;li&gt;</a></code>
+ element.</p> <div class="note"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it has been deprecated: use the <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a> <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/list-style-type">list-style-type</a></code>
+ property instead.</div>
+    */
+  String getType();
+
+  void setType(String arg);
+}
diff --git a/elemental/src/elemental/html/ObjectElement.java b/elemental/src/elemental/html/ObjectElement.java
new file mode 100644
index 0000000..65d3678
--- /dev/null
+++ b/elemental/src/elemental/html/ObjectElement.java
@@ -0,0 +1,265 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.svg.SVGDocument;
+import elemental.dom.Document;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM <code>Object</code> objects expose the <a title="http://dev.w3.org/html5/spec/the-iframe-element.html#htmlobjectelement" class=" external" rel="external nofollow" href="http://dev.w3.org/html5/spec/the-iframe-element.html#htmlobjectelement" target="_blank">HTMLObjectElement</a> (or <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" rel="external nofollow" href="http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-9893177" title="http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-9893177" target="_blank">HTMLObjectElement</a>) interface, which provides special properties and methods (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of Object element, representing external resources.
+  */
+public interface ObjectElement extends Element {
+
+
+  /**
+    * Alignment of the object relative to its context. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object#attr-archive">archive</a></code>
+&nbsp;HTML attribute, containing a list of archives for resources for this object. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  String getArchive();
+
+  void setArchive(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object#attr-border">border</a></code>
+&nbsp;HTML attribute, specifying the width of a border around the object. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  String getBorder();
+
+  void setBorder(String arg);
+
+
+  /**
+    * The name of an applet class file, containing either the applet's subclass, or the path to get to the class, including the class file itself. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  String getCode();
+
+  void setCode(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object#attr-codebase">codebase</a></code>
+&nbsp;HTML attribute, specifying the base path to use to resolve relative URIs. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  String getCodeBase();
+
+  void setCodeBase(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object#attr-codetype">codetype</a></code>
+&nbsp;HTML attribute, specifying the content type of the data. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  String getCodeType();
+
+  void setCodeType(String arg);
+
+
+  /**
+    * The active document of the object element's nested browsing context, if any; otherwise null.
+    */
+  Document getContentDocument();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object#attr-data">data</a></code>
+ HTML&nbsp;attribute, specifying the address of a resource's data.
+    */
+  String getData();
+
+  void setData(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object#attr-declare">declare</a></code>
+ HTML&nbsp;attribute, indicating that this is a declaration, not an instantiation, of the object. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  boolean isDeclare();
+
+  void setDeclare(boolean arg);
+
+
+  /**
+    * The object element's form owner, or null if there isn't one.
+    */
+  FormElement getForm();
+
+
+  /**
+    * Reflects the {{htmlattrxref("height", "object)}}&nbsp;HTML attribute, specifying the displayed height of the resource in CSS pixels.
+    */
+  String getHeight();
+
+  void setHeight(String arg);
+
+
+  /**
+    * Horizontal space in pixels around the control. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  int getHspace();
+
+  void setHspace(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object#attr-name">name</a></code>
+&nbsp;HTML attribute, specifying the name of the object (
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span>, or of a browsing context (
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object#attr-standby">standby</a></code>
+ HTML&nbsp;attribute, specifying a message to display while the object loads. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  String getStandby();
+
+  void setStandby(String arg);
+
+
+  /**
+    * Reflects the {{htmlattrxref("type", "object)}}&nbsp;HTML attribute, specifying the MIME type of the resource.
+    */
+  String getType();
+
+  void setType(String arg);
+
+
+  /**
+    * Reflects the {{htmlattrxref("usemap", "object)}}&nbsp;HTML attribute, specifying a {{HTMLElement("map")}} element to use.
+    */
+  String getUseMap();
+
+  void setUseMap(String arg);
+
+
+  /**
+    * A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.
+    */
+  String getValidationMessage();
+
+
+  /**
+    * The validity states that this element is in.
+    */
+  ValidityState getValidity();
+
+
+  /**
+    * Horizontal space in pixels around the control. 
+
+<span title="">Obsolete</span> in 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>.
+    */
+  int getVspace();
+
+  void setVspace(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object#attr-width">width</a></code>
+&nbsp;HTML attribute, specifying the displayed width of the resource in CSS pixels.
+    */
+  String getWidth();
+
+  void setWidth(String arg);
+
+
+  /**
+    * Indicates whether the element is a candidate for constraint validation. Always false for <code>object</code> objects.
+    */
+  boolean isWillValidate();
+
+
+  /**
+    * Always returns true, because <code>object</code> objects are never candidates for constraint validation.
+    */
+  boolean checkValidity();
+
+  SVGDocument getSVGDocument();
+
+
+  /**
+    * Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.
+    */
+  void setCustomValidity(String error);
+}
diff --git a/elemental/src/elemental/html/OfflineAudioCompletionEvent.java b/elemental/src/elemental/html/OfflineAudioCompletionEvent.java
new file mode 100644
index 0000000..5272d6a
--- /dev/null
+++ b/elemental/src/elemental/html/OfflineAudioCompletionEvent.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface OfflineAudioCompletionEvent extends Event {
+
+  AudioBuffer getRenderedBuffer();
+}
diff --git a/elemental/src/elemental/html/OperationNotAllowedException.java b/elemental/src/elemental/html/OperationNotAllowedException.java
new file mode 100644
index 0000000..2db64a5
--- /dev/null
+++ b/elemental/src/elemental/html/OperationNotAllowedException.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface OperationNotAllowedException {
+
+    static final int NOT_ALLOWED_ERR = 1;
+
+  int getCode();
+
+  String getMessage();
+
+  String getName();
+}
diff --git a/elemental/src/elemental/html/OptGroupElement.java b/elemental/src/elemental/html/OptGroupElement.java
new file mode 100644
index 0000000..695f378
--- /dev/null
+++ b/elemental/src/elemental/html/OptGroupElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * In a web form, the HTML <em>optgroup</em> element (&lt;optgroup&gt;) creates a grouping of options within a <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/select">&lt;select&gt;</a></code>
+ element.
+  */
+public interface OptGroupElement extends Element {
+
+
+  /**
+    * If this Boolean attribute is set, none of the items in this option group is selectable. Often browsers grey out such control and it won't received any browsing events, like mouse clicks or focus-related ones.
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * The name of the group of options, which the browser can use when labeling the options in the user interface. This attribute is mandatory if this element is used.
+    */
+  String getLabel();
+
+  void setLabel(String arg);
+}
diff --git a/elemental/src/elemental/html/OptionElement.java b/elemental/src/elemental/html/OptionElement.java
new file mode 100644
index 0000000..914f590
--- /dev/null
+++ b/elemental/src/elemental/html/OptionElement.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>DOM&nbsp;<em>option</em> elements elements share all of the properties and methods of other HTML elements described in the <a title="en/DOM/element" rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> section. They also have the specialized interface <a title="http://dev.w3.org/html5/spec/the-button-element.html#htmloptionelement" class=" external" rel="external" href="http://dev.w3.org/html5/spec/the-button-element.html#htmloptionelement" target="_blank">HTMLOptionElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class="external" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-70901257" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-70901257" target="_blank">HTMLOptionElement</a>).</p>
+<p>No methods are defined on this interface.</p>
+  */
+public interface OptionElement extends Element {
+
+
+  /**
+    * Reflects the value of the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/option#attr-selected">selected</a></code>
+ HTML attribute. which indicates whether the option is selected by default.
+    */
+  boolean isDefaultSelected();
+
+  void setDefaultSelected(boolean arg);
+
+
+  /**
+    * Reflects the value of the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/option#attr-disabled">disabled</a></code>
+ HTML&nbsp;attribute, which indicates that the option is unavailable to be selected. An option can also be disabled if it is a child of an <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/optgroup">&lt;optgroup&gt;</a></code>
+ element that is disabled.
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * If the option is a descendent of a <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/select">&lt;select&gt;</a></code>
+ element, then this property has the same value as the <code>form</code> property of the corresponding {{DomXref("HTMLSelectElement") object; otherwise, it is null.
+    */
+  FormElement getForm();
+
+
+  /**
+    * The position of the option within the list of options it belongs to, in tree-order. If the option is not part of a list of options, the value is 0.
+    */
+  int getIndex();
+
+
+  /**
+    * Reflects the value of the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/option#attr-label">label</a></code>
+ HTML attribute, which provides a label for the option. If this attribute isn't specifically set, reading it returns the element's text content.
+    */
+  String getLabel();
+
+  void setLabel(String arg);
+
+
+  /**
+    * Indicates whether the option is selected.
+    */
+  boolean isSelected();
+
+  void setSelected(boolean arg);
+
+
+  /**
+    * Contains the text content of the element.
+    */
+  String getText();
+
+  void setText(String arg);
+
+
+  /**
+    * Reflects the value of the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/option#attr-value">value</a></code>
+ HTML attribute, if it exists; otherwise reflects value of the <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/textContent" class="new">textContent</a></code>
+&nbsp;IDL&nbsp;attribute.
+    */
+  String getValue();
+
+  void setValue(String arg);
+}
diff --git a/elemental/src/elemental/html/Oscillator.java b/elemental/src/elemental/html/Oscillator.java
new file mode 100644
index 0000000..f7d8030
--- /dev/null
+++ b/elemental/src/elemental/html/Oscillator.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface Oscillator extends AudioSourceNode {
+
+    static final int CUSTOM = 4;
+
+    static final int FINISHED_STATE = 3;
+
+    static final int PLAYING_STATE = 2;
+
+    static final int SAWTOOTH = 2;
+
+    static final int SCHEDULED_STATE = 1;
+
+    static final int SINE = 0;
+
+    static final int SQUARE = 1;
+
+    static final int TRIANGLE = 3;
+
+    static final int UNSCHEDULED_STATE = 0;
+
+  AudioParam getDetune();
+
+  AudioParam getFrequency();
+
+  int getPlaybackState();
+
+  int getType();
+
+  void setType(int arg);
+
+  void noteOff(double when);
+
+  void noteOn(double when);
+
+  void setWaveTable(WaveTable waveTable);
+}
diff --git a/elemental/src/elemental/html/OutputElement.java b/elemental/src/elemental/html/OutputElement.java
new file mode 100644
index 0000000..fc212dc
--- /dev/null
+++ b/elemental/src/elemental/html/OutputElement.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.dom.DOMSettableTokenList;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface OutputElement extends Element {
+
+
+  /**
+    * The default value of the element, initially the empty string.
+    */
+  String getDefaultValue();
+
+  void setDefaultValue(String arg);
+
+
+  /**
+    * Indicates the control's form owner, reflecting the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/output#attr-form">form</a></code>
+&nbsp;HTML&nbsp;attribute if it is defined.
+    */
+  FormElement getForm();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/output#attr-for">for</a></code>
+ HTML attribute, containing a list of IDs of other elements in the same document that contribute to (or otherwise affect) the calculated <strong>value</strong>.
+    */
+  DOMSettableTokenList getHtmlFor();
+
+  void setHtmlFor(DOMSettableTokenList arg);
+
+
+  /**
+    * A list of label elements associated with this output element.
+    */
+  NodeList getLabels();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/output#attr-name">name</a></code>
+ HTML attribute, containing the name for the control that is submitted with form data.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Must be the string <code>output</code>.
+    */
+  String getType();
+
+
+  /**
+    * A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.
+    */
+  String getValidationMessage();
+
+
+  /**
+    * The validity states that this element is in.
+    */
+  ValidityState getValidity();
+
+
+  /**
+    * The value of the contents of the elements. Behaves like the <strong><a title="En/DOM/Node.textContent" rel="internal" href="https://developer.mozilla.org/En/DOM/Node.textContent">textContent</a></strong> property.
+    */
+  String getValue();
+
+  void setValue(String arg);
+
+
+  /**
+    * <p>      in Gecko 2.0. Indicates whether the element is a candidate for constraint validation. It is false if any conditions bar it from constraint validation. (See <a rel="external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=604673" class="external" title="">
+bug 604673</a>
+.)</p> <p>The standard behavior is to always return false because <code>output</code> objects are never candidates for constraint validation.</p>
+    */
+  boolean isWillValidate();
+
+
+  /**
+    * <p>      in Gecko 2.0. Returns false if the element is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an <code>invalid</code> event at the element. It returns true if the element is not a candidate for constraint validation, or if it satisfies its constraints.</p> <p>The standard behavior is to always return true because <code>output</code> objects are never candidates for constraint validation.</p>
+    */
+  boolean checkValidity();
+
+
+  /**
+    * Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.
+    */
+  void setCustomValidity(String error);
+}
diff --git a/elemental/src/elemental/html/PagePopupController.java b/elemental/src/elemental/html/PagePopupController.java
new file mode 100644
index 0000000..2bdee8a
--- /dev/null
+++ b/elemental/src/elemental/html/PagePopupController.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface PagePopupController {
+
+  void setValueAndClosePopup(int numberValue, String stringValue);
+}
diff --git a/elemental/src/elemental/html/ParagraphElement.java b/elemental/src/elemental/html/ParagraphElement.java
new file mode 100644
index 0000000..c5e5f25
--- /dev/null
+++ b/elemental/src/elemental/html/ParagraphElement.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM p (paragraph) objects expose the <a title="http://www.w3.org/TR/html5/grouping-content.html#htmlparagraphelement" class=" external" rel="external nofollow" href="http://www.w3.org/TR/html5/grouping-content.html#htmlparagraphelement" target="_blank">HTMLParagraphElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" rel="external nofollow" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-84675076" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-84675076" target="_blank"><code>HTMLParagraphElement</code></a>) interface, which provides special properties (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating div elements. In 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>, this interface inherits from HTMLElement, but defines no additional members.
+  */
+public interface ParagraphElement extends Element {
+
+
+  /**
+    * Enumerated attribute indicating alignment of the element's contents with respect to the surrounding context.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+}
diff --git a/elemental/src/elemental/html/ParamElement.java b/elemental/src/elemental/html/ParamElement.java
new file mode 100644
index 0000000..22e20ad
--- /dev/null
+++ b/elemental/src/elemental/html/ParamElement.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <strong>Parameter </strong>element which defines parameters for <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object">&lt;object&gt;</a></code>
+.
+  */
+public interface ParamElement extends Element {
+
+
+  /**
+    * Name of the parameter.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Only used if the <code>valuetype</code> is set to "ref". Specifies the type of values found at the URI specified by value.
+    */
+  String getType();
+
+  void setType(String arg);
+
+
+  /**
+    * Value of the parameter.
+    */
+  String getValue();
+
+  void setValue(String arg);
+
+  String getValueType();
+
+  void setValueType(String arg);
+}
diff --git a/elemental/src/elemental/html/PeerConnection00.java b/elemental/src/elemental/html/PeerConnection00.java
new file mode 100644
index 0000000..4ab5cb9
--- /dev/null
+++ b/elemental/src/elemental/html/PeerConnection00.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.MediaStream;
+import elemental.events.EventTarget;
+import elemental.dom.MediaStreamList;
+import elemental.util.Mappable;
+import elemental.events.EventListener;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface PeerConnection00 extends EventTarget {
+
+    static final int ACTIVE = 2;
+
+    static final int CLOSED = 3;
+
+    static final int ICE_CHECKING = 0x300;
+
+    static final int ICE_CLOSED = 0x700;
+
+    static final int ICE_COMPLETED = 0x500;
+
+    static final int ICE_CONNECTED = 0x400;
+
+    static final int ICE_FAILED = 0x600;
+
+    static final int ICE_GATHERING = 0x100;
+
+    static final int ICE_WAITING = 0x200;
+
+    static final int NEW = 0;
+
+    static final int OPENING = 1;
+
+    static final int SDP_ANSWER = 0x300;
+
+    static final int SDP_OFFER = 0x100;
+
+    static final int SDP_PRANSWER = 0x200;
+
+  int getIceState();
+
+  SessionDescription getLocalDescription();
+
+  MediaStreamList getLocalStreams();
+
+  EventListener getOnaddstream();
+
+  void setOnaddstream(EventListener arg);
+
+  EventListener getOnconnecting();
+
+  void setOnconnecting(EventListener arg);
+
+  EventListener getOnopen();
+
+  void setOnopen(EventListener arg);
+
+  EventListener getOnremovestream();
+
+  void setOnremovestream(EventListener arg);
+
+  EventListener getOnstatechange();
+
+  void setOnstatechange(EventListener arg);
+
+  int getReadyState();
+
+  SessionDescription getRemoteDescription();
+
+  MediaStreamList getRemoteStreams();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  void addStream(MediaStream stream);
+
+  void addStream(MediaStream stream, Mappable mediaStreamHints);
+
+  void close();
+
+  SessionDescription createAnswer(String offer);
+
+  SessionDescription createAnswer(String offer, Mappable mediaHints);
+
+  SessionDescription createOffer();
+
+  SessionDescription createOffer(Mappable mediaHints);
+
+  boolean dispatchEvent(Event event);
+
+  void processIceMessage(IceCandidate candidate);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  void removeStream(MediaStream stream);
+
+  void startIce();
+
+  void startIce(Mappable iceOptions);
+}
diff --git a/elemental/src/elemental/html/Performance.java b/elemental/src/elemental/html/Performance.java
new file mode 100644
index 0000000..5a236ec
--- /dev/null
+++ b/elemental/src/elemental/html/Performance.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The articles linked to from here will help you improve performance, whether you're developing core Mozilla code or an add-on.
+  */
+public interface Performance {
+
+  MemoryInfo getMemory();
+
+  PerformanceNavigation getNavigation();
+
+  PerformanceTiming getTiming();
+
+  double webkitNow();
+}
diff --git a/elemental/src/elemental/html/PerformanceNavigation.java b/elemental/src/elemental/html/PerformanceNavigation.java
new file mode 100644
index 0000000..aa95b66
--- /dev/null
+++ b/elemental/src/elemental/html/PerformanceNavigation.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface PerformanceNavigation {
+
+    static final int TYPE_BACK_FORWARD = 2;
+
+    static final int TYPE_NAVIGATE = 0;
+
+    static final int TYPE_RELOAD = 1;
+
+    static final int TYPE_RESERVED = 255;
+
+  int getRedirectCount();
+
+  int getType();
+}
diff --git a/elemental/src/elemental/html/PerformanceTiming.java b/elemental/src/elemental/html/PerformanceTiming.java
new file mode 100644
index 0000000..b578955
--- /dev/null
+++ b/elemental/src/elemental/html/PerformanceTiming.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface PerformanceTiming {
+
+  double getConnectEnd();
+
+  double getConnectStart();
+
+  double getDomComplete();
+
+  double getDomContentLoadedEventEnd();
+
+  double getDomContentLoadedEventStart();
+
+  double getDomInteractive();
+
+  double getDomLoading();
+
+  double getDomainLookupEnd();
+
+  double getDomainLookupStart();
+
+  double getFetchStart();
+
+  double getLoadEventEnd();
+
+  double getLoadEventStart();
+
+  double getNavigationStart();
+
+  double getRedirectEnd();
+
+  double getRedirectStart();
+
+  double getRequestStart();
+
+  double getResponseEnd();
+
+  double getResponseStart();
+
+  double getSecureConnectionStart();
+
+  double getUnloadEventEnd();
+
+  double getUnloadEventStart();
+}
diff --git a/elemental/src/elemental/html/Point.java b/elemental/src/elemental/html/Point.java
new file mode 100644
index 0000000..14fcb14
--- /dev/null
+++ b/elemental/src/elemental/html/Point.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface Point {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/html/PreElement.java b/elemental/src/elemental/html/PreElement.java
new file mode 100644
index 0000000..496447a
--- /dev/null
+++ b/elemental/src/elemental/html/PreElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * This element represents preformatted text. Text within this element is typically displayed in a non-proportional font exactly as it is laid out in the file. Whitespaces inside this element are displayed as typed.
+  */
+public interface PreElement extends Element {
+
+  int getWidth();
+
+  void setWidth(int arg);
+
+  boolean isWrap();
+
+  void setWrap(boolean arg);
+}
diff --git a/elemental/src/elemental/html/ProgressElement.java b/elemental/src/elemental/html/ProgressElement.java
new file mode 100644
index 0000000..2ff8f9b
--- /dev/null
+++ b/elemental/src/elemental/html/ProgressElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The HTML <em>progress</em> (<code>&lt;progress&gt;</code>) element is used to view the completion progress of a task. While the specifics of how it's displayed is left up to the browser developer, it's typically displayed as a progress bar.
+  */
+public interface ProgressElement extends Element {
+
+  NodeList getLabels();
+
+
+  /**
+    * This attribute describes how much work the task indicated by the <code>progress</code> element requires.
+    */
+  double getMax();
+
+  void setMax(double arg);
+
+  double getPosition();
+
+
+  /**
+    * <dl><dd>This attribute specifies how much of the task that has been completed. If there is no <code>value</code> attribute, the progress bar is indeterminate; this indicates that an activity is ongoing with no indication of how long it is expected to take.</dd>
+</dl>
+<p>You can use the <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/orient">orient</a></code>
+ property to specify whether the progress bar should be rendered horizontally (the default) or vertically. The <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/%3Aindeterminate">:indeterminate</a></code>
+ pseudo-class can be used to match against indeterminate progress bars.</p>
+    */
+  double getValue();
+
+  void setValue(double arg);
+}
diff --git a/elemental/src/elemental/html/QuoteElement.java b/elemental/src/elemental/html/QuoteElement.java
new file mode 100644
index 0000000..91268aa
--- /dev/null
+++ b/elemental/src/elemental/html/QuoteElement.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM quote objects expose the <a class=" external" title="http://www.w3.org/TR/html5/grouping-content.html#htmlquoteelement" rel="external" href="http://www.w3.org/TR/html5/grouping-content.html#htmlquoteelement" target="_blank">HTMLQuoteElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-70319763" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-70319763" target="_blank"><code>HTMLQuoteElement</code></a>) interface, which provides special properties&nbsp; (beyond the regular <a href="https://developer.mozilla.org/en/DOM/element" rel="internal">element</a> object interface they also have available to them by inheritance) for manipulating quote elements.
+  */
+public interface QuoteElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/blockquote#attr-cite">cite</a></code>
+ HTML attribute, containing a URL for the source of the quotation.
+    */
+  String getCite();
+
+  void setCite(String arg);
+}
diff --git a/elemental/src/elemental/html/RadioNodeList.java b/elemental/src/elemental/html/RadioNodeList.java
new file mode 100644
index 0000000..ac5b433
--- /dev/null
+++ b/elemental/src/elemental/html/RadioNodeList.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface RadioNodeList extends NodeList {
+
+  String getValue();
+
+  void setValue(String arg);
+}
diff --git a/elemental/src/elemental/html/RealtimeAnalyserNode.java b/elemental/src/elemental/html/RealtimeAnalyserNode.java
new file mode 100644
index 0000000..3514a37
--- /dev/null
+++ b/elemental/src/elemental/html/RealtimeAnalyserNode.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface RealtimeAnalyserNode extends AudioNode {
+
+  int getFftSize();
+
+  void setFftSize(int arg);
+
+  int getFrequencyBinCount();
+
+  float getMaxDecibels();
+
+  void setMaxDecibels(float arg);
+
+  float getMinDecibels();
+
+  void setMinDecibels(float arg);
+
+  float getSmoothingTimeConstant();
+
+  void setSmoothingTimeConstant(float arg);
+
+  void getByteFrequencyData(Uint8Array array);
+
+  void getByteTimeDomainData(Uint8Array array);
+
+  void getFloatFrequencyData(Float32Array array);
+}
diff --git a/elemental/src/elemental/html/SQLError.java b/elemental/src/elemental/html/SQLError.java
new file mode 100644
index 0000000..c4b45a3
--- /dev/null
+++ b/elemental/src/elemental/html/SQLError.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SQLError {
+
+    static final int CONSTRAINT_ERR = 6;
+
+    static final int DATABASE_ERR = 1;
+
+    static final int QUOTA_ERR = 4;
+
+    static final int SYNTAX_ERR = 5;
+
+    static final int TIMEOUT_ERR = 7;
+
+    static final int TOO_LARGE_ERR = 3;
+
+    static final int UNKNOWN_ERR = 0;
+
+    static final int VERSION_ERR = 2;
+
+  int getCode();
+
+  String getMessage();
+}
diff --git a/elemental/src/elemental/html/SQLException.java b/elemental/src/elemental/html/SQLException.java
new file mode 100644
index 0000000..d5e5729
--- /dev/null
+++ b/elemental/src/elemental/html/SQLException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SQLException {
+
+    static final int CONSTRAINT_ERR = 6;
+
+    static final int DATABASE_ERR = 1;
+
+    static final int QUOTA_ERR = 4;
+
+    static final int SYNTAX_ERR = 5;
+
+    static final int TIMEOUT_ERR = 7;
+
+    static final int TOO_LARGE_ERR = 3;
+
+    static final int UNKNOWN_ERR = 0;
+
+    static final int VERSION_ERR = 2;
+
+  int getCode();
+
+  String getMessage();
+}
diff --git a/elemental/src/elemental/html/SQLResultSet.java b/elemental/src/elemental/html/SQLResultSet.java
new file mode 100644
index 0000000..5c2f6f0
--- /dev/null
+++ b/elemental/src/elemental/html/SQLResultSet.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SQLResultSet {
+
+  int getInsertId();
+
+  SQLResultSetRowList getRows();
+
+  int getRowsAffected();
+}
diff --git a/elemental/src/elemental/html/SQLResultSetRowList.java b/elemental/src/elemental/html/SQLResultSetRowList.java
new file mode 100644
index 0000000..db29a2a
--- /dev/null
+++ b/elemental/src/elemental/html/SQLResultSetRowList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SQLResultSetRowList {
+
+  int getLength();
+
+  Object item(int index);
+}
diff --git a/elemental/src/elemental/html/SQLStatementCallback.java b/elemental/src/elemental/html/SQLStatementCallback.java
new file mode 100644
index 0000000..89d947a
--- /dev/null
+++ b/elemental/src/elemental/html/SQLStatementCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface SQLStatementCallback {
+  boolean onSQLStatementCallback(SQLTransaction transaction, SQLResultSet resultSet);
+}
diff --git a/elemental/src/elemental/html/SQLStatementErrorCallback.java b/elemental/src/elemental/html/SQLStatementErrorCallback.java
new file mode 100644
index 0000000..a6c26d2
--- /dev/null
+++ b/elemental/src/elemental/html/SQLStatementErrorCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface SQLStatementErrorCallback {
+  boolean onSQLStatementErrorCallback(SQLTransaction transaction, SQLError error);
+}
diff --git a/elemental/src/elemental/html/SQLTransaction.java b/elemental/src/elemental/html/SQLTransaction.java
new file mode 100644
index 0000000..5dee666
--- /dev/null
+++ b/elemental/src/elemental/html/SQLTransaction.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SQLTransaction {
+}
diff --git a/elemental/src/elemental/html/SQLTransactionCallback.java b/elemental/src/elemental/html/SQLTransactionCallback.java
new file mode 100644
index 0000000..34209cd
--- /dev/null
+++ b/elemental/src/elemental/html/SQLTransactionCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface SQLTransactionCallback {
+  boolean onSQLTransactionCallback(SQLTransaction transaction);
+}
diff --git a/elemental/src/elemental/html/SQLTransactionErrorCallback.java b/elemental/src/elemental/html/SQLTransactionErrorCallback.java
new file mode 100644
index 0000000..7d88575
--- /dev/null
+++ b/elemental/src/elemental/html/SQLTransactionErrorCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface SQLTransactionErrorCallback {
+  boolean onSQLTransactionErrorCallback(SQLError error);
+}
diff --git a/elemental/src/elemental/html/SQLTransactionSync.java b/elemental/src/elemental/html/SQLTransactionSync.java
new file mode 100644
index 0000000..fdc394f
--- /dev/null
+++ b/elemental/src/elemental/html/SQLTransactionSync.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SQLTransactionSync {
+}
diff --git a/elemental/src/elemental/html/SQLTransactionSyncCallback.java b/elemental/src/elemental/html/SQLTransactionSyncCallback.java
new file mode 100644
index 0000000..50000a1
--- /dev/null
+++ b/elemental/src/elemental/html/SQLTransactionSyncCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface SQLTransactionSyncCallback {
+  boolean onSQLTransactionSyncCallback(SQLTransactionSync transaction);
+}
diff --git a/elemental/src/elemental/html/Screen.java b/elemental/src/elemental/html/Screen.java
new file mode 100644
index 0000000..f8a10f9
--- /dev/null
+++ b/elemental/src/elemental/html/Screen.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Returns a reference to the screen object associated with the window.
+  */
+public interface Screen {
+
+
+  /**
+    * Specifies the height of the screen, in pixels, minus permanent or semipermanent user interface features displayed by the operating system, such as the Taskbar on Windows.
+    */
+  int getAvailHeight();
+
+
+  /**
+    * Returns the first available pixel available from the left side of the screen.
+    */
+  int getAvailLeft();
+
+
+  /**
+    * Specifies the y-coordinate of the first pixel that is not allocated to permanent or semipermanent user interface features.
+    */
+  int getAvailTop();
+
+
+  /**
+    * Returns the amount of horizontal space in pixels available to the window.
+    */
+  int getAvailWidth();
+
+
+  /**
+    * Returns the color depth of the screen.
+    */
+  int getColorDepth();
+
+
+  /**
+    * Returns the height of the screen in pixels.
+    */
+  int getHeight();
+
+
+  /**
+    * Gets the bit depth of the screen.
+    */
+  int getPixelDepth();
+
+
+  /**
+    * Returns the width of the screen.
+    */
+  int getWidth();
+}
diff --git a/elemental/src/elemental/html/ScriptElement.java b/elemental/src/elemental/html/ScriptElement.java
new file mode 100644
index 0000000..90b576c
--- /dev/null
+++ b/elemental/src/elemental/html/ScriptElement.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>script</code> element is used to embed or reference an executable script within an <abbr>HTML</abbr> or <abbr>XHTML</abbr> document.</p>
+<p>Scripts without <code>async</code> or <code>defer</code> attributes are fetched and executed immediately, before the browser continues to parse the page.</p>
+  */
+public interface ScriptElement extends Element {
+
+
+  /**
+    * Set this Boolean attribute to indicate that the browser should, if possible, execute the script asynchronously. It has no effect on inline scripts (i.e., scripts that don't have the <strong>src</strong> attribute). In older browsers that don't support the <strong>async</strong> attribute, parser-inserted scripts block the parser; script-inserted scripts execute asynchronously in IE and WebKit, but synchronously in Opera and pre-4.0 Firefox. In Firefox 4.0, the <code>async</code> DOM&nbsp;property defaults to <code>true</code> for script-created scripts, so the default behavior matches the behavior of IE&nbsp;and WebKit. To request script-inserted external scripts be executed in the insertion order in browsers where the <code>document.createElement("script").async</code> evaluates to <code>true</code> (such as Firefox 4.0), set <code>.async=false</code> on the scripts you want to maintain order. Never call <code>document.write()</code> from an <code>async</code> script. In Gecko 1.9.2, calling <code>document.write()</code> has an unpredictable effect. In Gecko 2.0, calling <code>document.write()</code> from an <code>async</code> script has no effect (other than printing a warning to the error console).
+    */
+  boolean isAsync();
+
+  void setAsync(boolean arg);
+
+  String getCharset();
+
+  void setCharset(String arg);
+
+  String getCrossOrigin();
+
+  void setCrossOrigin(String arg);
+
+
+  /**
+    * This Boolean attribute is set to indicate to a browser that the script is meant to be executed after the document has been parsed. Since this feature hasn't yet been implemented by all other major browsers, authors should not assume that the script’s execution will actually be deferred. Never call <code>document.write()</code> from a <code>defer</code> script (since Gecko 1.9.2, this will blow away the document). The <code>defer</code> attribute shouldn't be used on scripts that don't have the <code>src</code> attribute. Since Gecko 1.9.2, the <code>defer</code> attribute is ignored on scripts that don't have the <code>src</code> attribute. However, in Gecko 1.9.1 even inline scripts are deferred if the <code>defer</code> attribute is set.
+    */
+  boolean isDefer();
+
+  void setDefer(boolean arg);
+
+  String getEvent();
+
+  void setEvent(String arg);
+
+  String getHtmlFor();
+
+  void setHtmlFor(String arg);
+
+
+  /**
+    * This attribute specifies the <abbr>URI</abbr> of an external script; this can be used as an alternative to embedding a script directly within a document. <code>script</code> elements with an <code>src</code> attribute specified should not have a script embedded within its tags.
+    */
+  String getSrc();
+
+  void setSrc(String arg);
+
+  String getText();
+
+  void setText(String arg);
+
+
+  /**
+    * This attribute identifies the scripting language of code embedded within a <code>script</code> element or referenced via the element’s <code>src</code> attribute. This is specified as a <abbr title="Multi-purpose Internet Mail Extensions">MIME</abbr> type; examples of supported <abbr title="Multi-purpose Internet Mail Extensions">MIME</abbr> types include <code>text/javascript</code>, <code>text/ecmascript</code>, <code>application/javascript</code>, and <code>application/ecmascript</code>. If this attribute is absent, the script is treated as JavaScript.
+    */
+  String getType();
+
+  void setType(String arg);
+}
diff --git a/elemental/src/elemental/html/SelectElement.java b/elemental/src/elemental/html/SelectElement.java
new file mode 100644
index 0000000..ebc416d
--- /dev/null
+++ b/elemental/src/elemental/html/SelectElement.java
@@ -0,0 +1,435 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Node;
+import elemental.dom.Element;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <code>DOM select</code> elements share all of the properties and methods of other HTML elements described in the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/element">element</a></code>
+ section. They also have the specialized interface <a class="external" title="http://dev.w3.org/html5/spec/the-button-element.html#htmlselectelement" rel="external" href="http://dev.w3.org/html5/spec/the-button-element.html#htmlselectelement" target="_blank">HTMLSelectElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class="external" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-94282980" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-94282980" target="_blank">HTMLSelectElement</a>).
+  */
+public interface SelectElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/select#attr-autofocus">autofocus</a></code>
+ HTML attribute, which indicates whether the control should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form-associated element in a document can have this attribute specified. 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> 
+<span title="(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+">Requires Gecko 2.0</span>
+    */
+  boolean isAutofocus();
+
+  void setAutofocus(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/select#attr-disabled">disabled</a></code>
+ HTML attribute, which indicates whether the control is disabled. If it is disabled, it does not accept clicks.
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * The form that this element is associated with. If this element is a descendant of a form element, then this attribute is the ID of that form element. If the element is not a descendant of a form element, then: <ul> <li>
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> The attribute can be the ID of any form element in the same document.</li> <li>
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> The attribute is null.</li> </ul> <strong>Read only.</strong>
+    */
+  FormElement getForm();
+
+
+  /**
+    * A list of label elements associated with this select element.
+    */
+  NodeList getLabels();
+
+
+  /**
+    * The number of <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/option">&lt;option&gt;</a></code>
+ elements in this <code>select</code> element.
+    */
+  int getLength();
+
+  void setLength(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/select#attr-multiple">multiple</a></code>
+ HTML attribute, whichindicates whether multiple items can be selected.
+    */
+  boolean isMultiple();
+
+  void setMultiple(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/select#attr-name">name</a></code>
+ HTML attribute, containing the name of this control used by servers and DOM search functions.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * The set of <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/option">&lt;option&gt;</a></code>
+ elements contained by this element. <strong>Read only.</strong>
+    */
+  HTMLOptionsCollection getOptions();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/select#attr-required">required</a></code>
+ HTML attribute, which indicates whether the user is required to select a value before submitting the form. 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> 
+<span title="(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+">Requires Gecko 2.0</span>
+    */
+  boolean isRequired();
+
+  void setRequired(boolean arg);
+
+
+  /**
+    * The index of the first selected <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/option">&lt;option&gt;</a></code>
+ element.
+    */
+  int getSelectedIndex();
+
+  void setSelectedIndex(int arg);
+
+
+  /**
+    * The set of options that are selected. 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>
+    */
+  HTMLCollection getSelectedOptions();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/select#attr-size">size</a></code>
+ HTML attribute, which contains the number of visible items in the control. The default is 1, 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> unless <strong>multiple</strong> is true, in which case it is 4.
+    */
+  int getSize();
+
+  void setSize(int arg);
+
+
+  /**
+    * The form control's type. When <strong>multiple</strong> is true, it returns <code>select-multiple</code>; otherwise, it returns <code>select-one</code>.<strong>Read only.</strong>
+    */
+  String getType();
+
+
+  /**
+    * A localized message that describes the validation constraints that the control does not satisfy (if any). This attribute is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.<strong>Read only.</strong> 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> 
+<span title="(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+">Requires Gecko 2.0</span>
+    */
+  String getValidationMessage();
+
+
+  /**
+    * The validity states that this control is in. <strong>Read only.</strong> 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> 
+<span title="(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+">Requires Gecko 2.0</span>
+    */
+  ValidityState getValidity();
+
+
+  /**
+    * The value of this form control, that is, of the first selected option.
+    */
+  String getValue();
+
+  void setValue(String arg);
+
+
+  /**
+    * Indicates whether the button is a candidate for constraint validation. It is false if any conditions bar it from constraint validation. <strong>Read only.</strong> 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> 
+<span title="(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+">Requires Gecko 2.0</span>
+    */
+  boolean isWillValidate();
+
+
+  /**
+    * <p>Adds an element to the collection of <code>option</code> elements for this <code>select</code> element.</p>
+
+<div id="section_6"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>element</code></dt> <dd>An item to add to the collection of options.</dd> <dt><code>before</code> 
+<span title="(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+">Optional from Gecko 7.0</span>
+</dt> <dd>An item (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span>&nbsp;index of an item) that the new item should be inserted before. If this parameter is <code>null</code> (or the index does not exist), the new element is appended to the end of the collection.</dd>
+</dl>
+<div id="section_7"><span id="Examples"></span><h5 class="editable">Examples</h5>
+<div id="section_8"><span id="Creating_Elements_from_Scratch"></span><h6 class="editable">Creating Elements from Scratch</h6>
+
+          <pre name="code" class="js">var sel = document.createElement("select");
+var opt1 = document.createElement("option");
+var opt2 = document.createElement("option");
+
+opt1.value = "1";
+opt1.text = "Option: Value 1";
+
+opt2.value = "2";
+opt2.text = "Option: Value 2";
+
+sel.add(opt1, null);
+sel.add(opt2, null);
+
+/*
+  Produces the following, conceptually:
+
+  &lt;select&gt;
+    &lt;option value="1"&gt;Option: Value 1&lt;/option&gt;
+    &lt;option value="2"&gt;Option: Value 2&lt;/option&gt;
+  &lt;/select&gt;
+*&#47;</pre>
+        
+<p>From 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> and <span title="(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+">Gecko&nbsp;7.0</span> the before parameter is optional. So the following is accepted.</p>
+<pre class="deki-transform">...
+sel.add(opt1);
+sel.add(opt2);
+...
+</pre>
+</div><div id="section_9"><span id="Append_to_an_Existing_Collection"></span><h6 class="editable">Append to an Existing Collection</h6>
+
+          <pre name="code" class="js">var sel = document.getElementById("existingList");
+
+var opt = document.createElement("option");
+opt.value = "3";
+opt.text = "Option: Value 3";
+
+sel.add(opt, null);
+
+/*
+  Takes the existing following select object:
+
+  &lt;select id="existingList" name="existingList"&gt;
+    &lt;option value="1"&gt;Option: Value 1&lt;/option&gt;
+    &lt;option value="2"&gt;Option: Value 2&lt;/option&gt;
+  &lt;/select&gt;
+
+  And changes it to:
+
+  &lt;select id="existingList" name="existingList"&gt;
+    &lt;option value="1"&gt;Option: Value 1&lt;/option&gt;
+    &lt;option value="2"&gt;Option: Value 2&lt;/option&gt;
+    &lt;option value="3"&gt;Option: Value 3&lt;/option&gt;
+  &lt;/select&gt;
+*&#47;</pre>
+        
+<p>From 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> and <span title="(Firefox 7.0 / Thunderbird 7.0 / SeaMonkey 2.4)
+">Gecko&nbsp;7.0</span> the before parameter is optional. So the following is accepted.</p>
+<pre class="deki-transform">...
+sel.add(opt);
+...
+</pre>
+</div><div id="section_10"><span id="Inserting_to_an_Existing_Collection"></span><h6 class="editable">Inserting to an Existing Collection</h6>
+
+          <pre name="code" class="js">var sel = document.getElementById("existingList");
+
+var opt = document.createElement("option");
+opt.value = "3";
+opt.text = "Option: Value 3";
+
+sel.add(opt, sel.options[1]);
+
+/*
+  Takes the existing following select object:
+
+  &lt;select id="existingList" name="existingList"&gt;
+    &lt;option value="1"&gt;Option: Value 1&lt;/option&gt;
+    &lt;option value="2"&gt;Option: Value 2&lt;/option&gt;
+  &lt;/select&gt;
+
+  And changes it to:
+
+  &lt;select id="existingList" name="existingList"&gt;
+    &lt;option value="1"&gt;Option: Value 1&lt;/option&gt;
+    &lt;option value="3"&gt;Option: Value 3&lt;/option&gt;
+    &lt;option value="2"&gt;Option: Value 2&lt;/option&gt;
+  &lt;/select&gt;
+*&#47;</pre>
+        
+<dl> <dt></dt>
+</dl>
+<p>
+
+</p><div><span>Obsolete since Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+</span><span id="blur()"></span></div></div></div></div>
+    */
+  void add(Element element, Element before);
+
+
+  /**
+    * <div id="section_11"><p><span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> Checks whether the element has any constraints and whether it satisfies them. If the element fails its constraints, the browser fires a cancelable <code>invalid</code> event at the element (and returns false).</p>
+
+</div><div id="section_12"><span id="Parameters_3"></span>
+
+</div><div id="section_13"><span id="Return_value"></span><h6 class="editable">Return value</h6>
+<p>A <code>false</code> value if the <code>select</code> element is a candidate for constraint evaluation and it does not satisfy its constraints. Returns true if the element is not constrained, or if it satisfies its constraints.</p>
+<p>
+
+</p><div><span>Obsolete since Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+</span><span id="focus()"></span></div></div>
+    */
+  boolean checkValidity();
+
+
+  /**
+    * <div id="section_14"><p><span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> Gets an item from the options collection for this <code>select</code> element. You can also access an item by specifying the index in array-style brackets or parentheses, without calling this method explicitly.</p>
+
+</div><div id="section_15"><span id="Parameters_5"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>index</code></dt> <dd>The zero-based index into the collection of the option to get.</dd>
+</dl>
+</div><div id="section_16"><span id="Return_value_2"></span><h6 class="editable">Return value</h6>
+<p>The node at the specified index, or <code>null</code> if such a node does not exist in the collection.</p>
+<p>
+</p><div>
+<span id="namedItem()"></span></div></div>
+    */
+  Node item(int index);
+
+
+  /**
+    * <div id="section_16"><p><span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> Gets the item in the options collection with the specified name. The name string can match either the <strong>id</strong> or the <strong>name</strong> attribute of an option node. You can also access an item by specifying the name in array-style brackets or parentheses, without calling this method explicitly.</p>
+
+</div><div id="section_17"><span id="Parameters_6"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>name</code></dt> <dd>The name of the option to get.</dd>
+</dl>
+</div><div id="section_18"><span id="Return_value_3"></span><h6 class="editable">Return value</h6>
+<ul> <li>A node, if there is exactly one match.</li> <li><code>null</code> if there are no matches.</li> <li>A <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/NodeList">NodeList</a></code>
+ in tree order of nodes whose <strong>name</strong> or <strong>id</strong> attributes match the specified name.</li>
+</ul>
+</div>
+    */
+  Node namedItem(String name);
+
+
+  /**
+    * <p>Removes the element at the specified index from the options collection for this select element.</p>
+
+<div id="section_20"><span id="Parameters_7"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>index</code></dt> <dd>The zero-based index of the option element to remove from the collection.</dd>
+</dl>
+<div id="section_21"><span id="Example"></span><h5 class="editable">Example</h5>
+
+          <pre name="code" class="js">var sel = document.getElementById("existingList");
+sel.remove(1);
+
+/*
+  Takes the existing following select object:
+
+  &lt;select id="existingList" name="existingList"&gt;
+    &lt;option value="1"&gt;Option: Value 1&lt;/option&gt;
+    &lt;option value="2"&gt;Option: Value 2&lt;/option&gt;
+    &lt;option value="3"&gt;Option: Value 3&lt;/option&gt;
+  &lt;/select&gt;
+
+  And changes it to:
+
+  &lt;select id="existingList" name="existingList"&gt;
+    &lt;option value="1"&gt;Option: Value 1&lt;/option&gt;
+    &lt;option value="3"&gt;Option: Value 3&lt;/option&gt;
+  &lt;/select&gt;
+*&#47;</pre>
+        
+<p>
+</p><div>
+<span id="setCustomValidity()"></span></div></div></div>
+    */
+  void remove(int index);
+
+
+  /**
+    * <p>Removes the element at the specified index from the options collection for this select element.</p>
+
+<div id="section_20"><span id="Parameters_7"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>index</code></dt> <dd>The zero-based index of the option element to remove from the collection.</dd>
+</dl>
+<div id="section_21"><span id="Example"></span><h5 class="editable">Example</h5>
+
+          <pre name="code" class="js">var sel = document.getElementById("existingList");
+sel.remove(1);
+
+/*
+  Takes the existing following select object:
+
+  &lt;select id="existingList" name="existingList"&gt;
+    &lt;option value="1"&gt;Option: Value 1&lt;/option&gt;
+    &lt;option value="2"&gt;Option: Value 2&lt;/option&gt;
+    &lt;option value="3"&gt;Option: Value 3&lt;/option&gt;
+  &lt;/select&gt;
+
+  And changes it to:
+
+  &lt;select id="existingList" name="existingList"&gt;
+    &lt;option value="1"&gt;Option: Value 1&lt;/option&gt;
+    &lt;option value="3"&gt;Option: Value 3&lt;/option&gt;
+  &lt;/select&gt;
+*&#47;</pre>
+        
+<p>
+</p><div>
+<span id="setCustomValidity()"></span></div></div></div>
+    */
+  void remove(OptionElement option);
+
+
+  /**
+    * <p><span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> only. Sets the custom validity message for the selection element to the specified message. Use the empty string to indicate that the element does <em>not</em> have a custom validity error.</p>
+
+<div id="section_22"><span id="Parameters_8"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>error</code></dt> <dd>The string to use for the custom validity message.</dd>
+</dl></div>
+    */
+  void setCustomValidity(String error);
+}
diff --git a/elemental/src/elemental/html/Selection.java b/elemental/src/elemental/html/Selection.java
new file mode 100644
index 0000000..dabb669
--- /dev/null
+++ b/elemental/src/elemental/html/Selection.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Node;
+import elemental.ranges.Range;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface Selection {
+
+  Node getAnchorNode();
+
+  int getAnchorOffset();
+
+  Node getBaseNode();
+
+  int getBaseOffset();
+
+  Node getExtentNode();
+
+  int getExtentOffset();
+
+  Node getFocusNode();
+
+  int getFocusOffset();
+
+  boolean isCollapsed();
+
+  int getRangeCount();
+
+  String getType();
+
+  void addRange(Range range);
+
+  void collapse(Node node, int index);
+
+  void collapseToEnd();
+
+  void collapseToStart();
+
+  boolean containsNode(Node node, boolean allowPartial);
+
+  void deleteFromDocument();
+
+  void empty();
+
+  void extend(Node node, int offset);
+
+  Range getRangeAt(int index);
+
+  void modify(String alter, String direction, String granularity);
+
+  void removeAllRanges();
+
+  void selectAllChildren(Node node);
+
+  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset);
+
+  void setPosition(Node node, int offset);
+}
diff --git a/elemental/src/elemental/html/SessionDescription.java b/elemental/src/elemental/html/SessionDescription.java
new file mode 100644
index 0000000..e488691
--- /dev/null
+++ b/elemental/src/elemental/html/SessionDescription.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SessionDescription {
+
+  void addCandidate(IceCandidate candidate);
+
+  String toSdp();
+}
diff --git a/elemental/src/elemental/html/ShadowElement.java b/elemental/src/elemental/html/ShadowElement.java
new file mode 100644
index 0000000..c285e76
--- /dev/null
+++ b/elemental/src/elemental/html/ShadowElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ShadowElement extends Element {
+}
diff --git a/elemental/src/elemental/html/SharedWorker.java b/elemental/src/elemental/html/SharedWorker.java
new file mode 100644
index 0000000..247ea1f
--- /dev/null
+++ b/elemental/src/elemental/html/SharedWorker.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.MessagePort;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Not yet implemented by Firefox.
+  */
+public interface SharedWorker extends AbstractWorker {
+
+  MessagePort getPort();
+}
diff --git a/elemental/src/elemental/html/SharedWorkerGlobalScope.java b/elemental/src/elemental/html/SharedWorkerGlobalScope.java
new file mode 100644
index 0000000..371f151
--- /dev/null
+++ b/elemental/src/elemental/html/SharedWorkerGlobalScope.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SharedWorkerGlobalScope extends WorkerGlobalScope {
+
+  String getName();
+
+  EventListener getOnconnect();
+
+  void setOnconnect(EventListener arg);
+}
diff --git a/elemental/src/elemental/html/SignalingCallback.java b/elemental/src/elemental/html/SignalingCallback.java
new file mode 100644
index 0000000..d0b0927
--- /dev/null
+++ b/elemental/src/elemental/html/SignalingCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface SignalingCallback {
+  boolean onSignalingCallback(String message, DeprecatedPeerConnection source);
+}
diff --git a/elemental/src/elemental/html/SourceElement.java b/elemental/src/elemental/html/SourceElement.java
new file mode 100644
index 0000000..eeeb761
--- /dev/null
+++ b/elemental/src/elemental/html/SourceElement.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SourceElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/source#attr-media">media</a></code>
+ HTML&nbsp;attribute, containing the intended type of the media resource.
+    */
+  String getMedia();
+
+  void setMedia(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/source#attr-src">src</a></code>
+ HTML&nbsp;attribute, containing the URL&nbsp;for the media resource.
+    */
+  String getSrc();
+
+  void setSrc(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/source#attr-type">type</a></code>
+ HTML&nbsp;attribute, containing the type of the media resource.
+    */
+  String getType();
+
+  void setType(String arg);
+}
diff --git a/elemental/src/elemental/html/SpanElement.java b/elemental/src/elemental/html/SpanElement.java
new file mode 100644
index 0000000..964db8d
--- /dev/null
+++ b/elemental/src/elemental/html/SpanElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * This HTML element is a generic inline container for phrasing content, which does not inherently represent anything. It can be used to group elements for styling purposes (using the <strong>class</strong> or <strong>id</strong> attributes), or because they share attribute values, such as <strong>lang</strong>. It should be used only when no other semantic element is appropriate. &lt;span&gt; is very much like a <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/div">&lt;div&gt;</a></code>
+ element, but <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/div">&lt;div&gt;</a></code>
+ is a block-level element whereas a &lt;span&gt; is an inline element.
+  */
+public interface SpanElement extends Element {
+}
diff --git a/elemental/src/elemental/html/Storage.java b/elemental/src/elemental/html/Storage.java
new file mode 100644
index 0000000..c0295c1
--- /dev/null
+++ b/elemental/src/elemental/html/Storage.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><strong>Storage</strong> is a <a class="external" rel="external" href="http://www.sqlite.org/" title="http://www.sqlite.org/" target="_blank">SQLite</a> database API. It is available to trusted callers, meaning extensions and Firefox components only.</p>
+<p>The API is currently "unfrozen", which means it is subject to change at any time; in fact, it has changed somewhat with each release of Firefox since it was introduced, and will likely continue to do so for a while.</p>
+<div class="note"><strong>Note:</strong> Storage is not the same as the <a title="en/DOM/Storage" rel="internal" href="https://developer.mozilla.org/en/DOM/Storage">DOM:Storage</a> feature which can be used by web pages to store persistent data or the <a title="en/Session_store_API" rel="internal" href="https://developer.mozilla.org/en/Session_store_API">Session store API</a> (an <a title="en/XPCOM" rel="internal" href="https://developer.mozilla.org/en/XPCOM">XPCOM</a> storage utility for use by extensions).</div>
+  */
+public interface Storage {
+
+  int getLength();
+
+  void clear();
+
+  String getItem(String key);
+
+  String key(int index);
+
+  void removeItem(String key);
+
+  void setItem(String key, String data);
+}
diff --git a/elemental/src/elemental/html/StorageEvent.java b/elemental/src/elemental/html/StorageEvent.java
new file mode 100644
index 0000000..e4c8fd6
--- /dev/null
+++ b/elemental/src/elemental/html/StorageEvent.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><div>
+
+<a rel="custom" href="http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/storage/nsIDOMStorageEvent.idl"><code>dom/interfaces/storage/nsIDOMStorageEvent.idl</code></a><span><a rel="internal" href="https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces" title="en/Interfaces/About_Scriptable_Interfaces">Scriptable</a></span></div><span>Describes an event occurring on HTML5 client-side storage data.</span><div><div>1.0</div><div>11.0</div><div></div><div>Introduced</div><div>Gecko 2.0</div><div title="Introduced in Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+"></div><div title="Last changed in Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+"></div></div>
+<div>Inherits from: <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMEvent">nsIDOMEvent</a></code>
+<span>Last changed in Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+</span></div></div>
+<p></p>
+<p>A <code>StorageEvent</code> is sent to a window when a storage area changes.</p>
+<div class="geckoVersionNote">
+<p>
+</p><div class="geckoVersionHeading">Gecko 2.0 note<div>(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+</div></div>
+<p></p>
+<p>Although this event existed prior to Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+, it did not match the specification. The old event format is now represented by the <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMStorageEventObsolete">nsIDOMStorageEventObsolete</a></code>
+ interface.</p>
+</div>
+  */
+public interface StorageEvent extends Event {
+
+
+  /**
+    * Represents the key changed. The <code>key</code> attribute is <code>null</code> when the change is caused by the storage <code>clear()</code> method. <strong>Read only.</strong>
+    */
+  String getKey();
+
+
+  /**
+    * The new value of the <code>key</code>. The <code>newValue</code> is <code>null</code> when the change has been invoked by storage <code>clear()</code> method or the <code>key</code> has been removed from the storage. <strong>Read only.</strong>
+    */
+  String getNewValue();
+
+
+  /**
+    * The original value of the <code>key</code>. The <code>oldValue</code> is <code>null</code> when the change has been invoked by storage <code>clear()</code> method or the <code>key</code> has been newly added and therefor doesn't have any previous value. <strong>Read only.</strong>
+    */
+  String getOldValue();
+
+
+  /**
+    * Represents the Storage object that was affected. <strong>Read only.</strong>
+    */
+  Storage getStorageArea();
+
+
+  /**
+    * The URL of the document whose <code>key</code> changed. <strong>Read only.</strong>
+    */
+  String getUrl();
+
+
+  /**
+    * <p>Initializes the event in a manner analogous to the similarly-named method in the DOM Events interfaces.</p>
+
+<div id="section_5"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>typeArg</code></dt> <dd>The name of the event.</dd> <dt><code>canBubbleArg</code></dt> <dd>A boolean indicating whether the event bubbles up through the DOM or not.</dd> <dt><code>cancelableArg</code></dt> <dd>A boolean indicating whether the event is cancelable.</dd> <dt><code>keyArg</code></dt> <dd>The key whose value is changing as a result of this event.</dd> <dt><code>oldValueArg</code></dt> <dd>The key's old value.</dd> <dt><code>newValueArg</code></dt> <dd>The key's new value.</dd> <dt><code>urlArg</code></dt> <dd>Missing Description</dd> <dt><code>storageAreaArg</code></dt> <dd>The DOM&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Storage">Storage</a></code>
+ object representing the storage area on which this event occurred.</dd>
+</dl></div>
+    */
+  void initStorageEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg);
+}
diff --git a/elemental/src/elemental/html/StorageInfo.java b/elemental/src/elemental/html/StorageInfo.java
new file mode 100644
index 0000000..a0735b1
--- /dev/null
+++ b/elemental/src/elemental/html/StorageInfo.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface StorageInfo {
+
+    static final int PERSISTENT = 1;
+
+    static final int TEMPORARY = 0;
+
+  void queryUsageAndQuota(int storageType);
+
+  void queryUsageAndQuota(int storageType, StorageInfoUsageCallback usageCallback);
+
+  void queryUsageAndQuota(int storageType, StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback);
+
+  void requestQuota(int storageType, double newQuotaInBytes);
+
+  void requestQuota(int storageType, double newQuotaInBytes, StorageInfoQuotaCallback quotaCallback);
+
+  void requestQuota(int storageType, double newQuotaInBytes, StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback);
+}
diff --git a/elemental/src/elemental/html/StorageInfoErrorCallback.java b/elemental/src/elemental/html/StorageInfoErrorCallback.java
new file mode 100644
index 0000000..785cf52
--- /dev/null
+++ b/elemental/src/elemental/html/StorageInfoErrorCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface StorageInfoErrorCallback {
+  boolean onStorageInfoErrorCallback(DOMException error);
+}
diff --git a/elemental/src/elemental/html/StorageInfoQuotaCallback.java b/elemental/src/elemental/html/StorageInfoQuotaCallback.java
new file mode 100644
index 0000000..b50d112
--- /dev/null
+++ b/elemental/src/elemental/html/StorageInfoQuotaCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface StorageInfoQuotaCallback {
+  boolean onStorageInfoQuotaCallback(double grantedQuotaInBytes);
+}
diff --git a/elemental/src/elemental/html/StorageInfoUsageCallback.java b/elemental/src/elemental/html/StorageInfoUsageCallback.java
new file mode 100644
index 0000000..b34cc96
--- /dev/null
+++ b/elemental/src/elemental/html/StorageInfoUsageCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface StorageInfoUsageCallback {
+  boolean onStorageInfoUsageCallback(double currentUsageInBytes, double currentQuotaInBytes);
+}
diff --git a/elemental/src/elemental/html/StyleElement.java b/elemental/src/elemental/html/StyleElement.java
new file mode 100644
index 0000000..2380f9f
--- /dev/null
+++ b/elemental/src/elemental/html/StyleElement.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.stylesheets.StyleSheet;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * See <a title="en/DOM/Using_dynamic_styling_information" rel="internal" href="https://developer.mozilla.org/en/DOM/Using_dynamic_styling_information">Using dynamic styling information</a> for an overview of the objects used to manipulate specified CSS properties using the DOM.
+  */
+public interface StyleElement extends Element {
+
+
+  /**
+    * Returns true if the stylesheet is disabled, and false if not
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * Specifies the intended destination medium for style information.
+    */
+  String getMedia();
+
+  void setMedia(String arg);
+
+  boolean isScoped();
+
+  void setScoped(boolean arg);
+
+  StyleSheet getSheet();
+
+
+  /**
+    * Returns the type of style being applied by this statement.
+    */
+  String getType();
+
+  void setType(String arg);
+}
diff --git a/elemental/src/elemental/html/StyleMedia.java b/elemental/src/elemental/html/StyleMedia.java
new file mode 100644
index 0000000..deea813
--- /dev/null
+++ b/elemental/src/elemental/html/StyleMedia.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface StyleMedia {
+
+  String getType();
+
+  boolean matchMedium(String mediaquery);
+}
diff --git a/elemental/src/elemental/html/TableCaptionElement.java b/elemental/src/elemental/html/TableCaptionElement.java
new file mode 100644
index 0000000..efb8f9d
--- /dev/null
+++ b/elemental/src/elemental/html/TableCaptionElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM table caption elements expose the <a title="http://www.w3.org/TR/html5/tabular-data.html#htmltablecaptionelement" class=" external" rel="external nofollow" href="http://www.w3.org/TR/html5/tabular-data.html#htmltablecaptionelement" target="_blank">HTMLTableCaptionElement</a> (or <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <a class=" external" rel="external nofollow" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-12035137" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-12035137" target="_blank"><code>HTMLTableCaptionElement</code></a>) interface, which provides special properties (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating definition list elements. In <span><a rel="custom nofollow" href="https://developer.mozilla.org/en/HTML/HTML5">HTML 5</a></span>, this interface inherits from HTMLElement, but defines no additional members.
+  */
+public interface TableCaptionElement extends Element {
+
+
+  /**
+    * Enumerated attribute indicating alignment of the caption with respect to the table.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+}
diff --git a/elemental/src/elemental/html/TableCellElement.java b/elemental/src/elemental/html/TableCellElement.java
new file mode 100644
index 0000000..b8c07c5
--- /dev/null
+++ b/elemental/src/elemental/html/TableCellElement.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <em>HTML Table Cell Element</em> (<code>&lt;td&gt;</code>) defines a cell that content data.
+  */
+public interface TableCellElement extends Element {
+
+
+  /**
+    * This attribute contains a short abbreviated description of the content of the cell. Some user-agents, such as speech readers, may present this description before the content itself. <div class="note"><strong>Note: </strong>Do not use this attribute as it is obsolete in the latest standard: instead either consider starting the cell content by an independent abbreviated content itself or use the abbreviated content as the cell content and use the long content as the description of the cell by putting it in the <strong>title</strong> attribute.</div>
+    */
+  String getAbbr();
+
+  void setAbbr(String arg);
+
+
+  /**
+    * This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are: <ul> <li><span>left</span>, aligning the content to the left of the cell</li> <li><span>center</span>, centering the content in the cell</li> <li><span>right</span>, aligning the content to the right of the cell</li> <li><span>justify</span>, inserting spaces into the textual content so that the content is justified in the cell</li> <li><span>char</span>, aligning the textual content on a special character with a minimal offset, defined by the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/td#attr-char">char</a></code>
+ and 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/td#attr-charoff">charoff</a></code>
+ attributes 
+<span class="unimplementedInlineTemplate">Unimplemented (see<a rel="external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=2212" class="external" title="">
+bug 2212</a>
+)</span>
+.</li> </ul> <p>If this attribute is not set,&nbsp; the <span>left</span> value is assumed.</p> <div class="note"><strong>Note: </strong>Do not use this attribute as it is obsolete (not supported) in the latest standard. <ul> <li>To achieve the same effect as the <span>left</span>, <span>center</span>, <span>right</span> or <span>justify</span> values, use the CSS <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/text-align">text-align</a></code>
+ property on it.</li> <li>To achieve the same effect as the <span>char</span> value, in CSS3, you can use the value of the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/td#attr-char">char</a></code>
+ as the value of the <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/text-align">text-align</a></code>
+ property 
+<span class="unimplementedInlineTemplate">Unimplemented</span>
+.</li> </ul> </div>
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * This attribute contains a list of space-separated strings. Each string is the ID of a group of cells that this header applies to. <div class="note"><strong>Note: </strong>Do not use this attribute as it is obsolete in the latest standard: instead use the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/td#attr-scope">scope</a></code>
+ attribute.</div>
+    */
+  String getAxis();
+
+  void setAxis(String arg);
+
+  String getBgColor();
+
+  void setBgColor(String arg);
+
+  int getCellIndex();
+
+  String getCh();
+
+  void setCh(String arg);
+
+  String getChOff();
+
+  void setChOff(String arg);
+
+  int getColSpan();
+
+  void setColSpan(int arg);
+
+
+  /**
+    * This attributes a list of space-separated strings, each corresponding to the <strong>id</strong> attribute of the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/th">&lt;th&gt;</a></code>
+ elements that applies to this element.
+    */
+  String getHeaders();
+
+  void setHeaders(String arg);
+
+  String getHeight();
+
+  void setHeight(String arg);
+
+  boolean isNoWrap();
+
+  void setNoWrap(boolean arg);
+
+  int getRowSpan();
+
+  void setRowSpan(int arg);
+
+  String getScope();
+
+  void setScope(String arg);
+
+  String getVAlign();
+
+  void setVAlign(String arg);
+
+  String getWidth();
+
+  void setWidth(String arg);
+}
diff --git a/elemental/src/elemental/html/TableColElement.java b/elemental/src/elemental/html/TableColElement.java
new file mode 100644
index 0000000..1df5f08
--- /dev/null
+++ b/elemental/src/elemental/html/TableColElement.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM table column objects (which may correspond to <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/col">&lt;col&gt;</a></code>
+&nbsp;or <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/colgroup">&lt;colgroup&gt;</a></code>
+ HTML elements) expose the <a target="_blank" href="http://www.w3.org/TR/html5/tabular-data.html#htmltablecolelement" rel="external nofollow" class=" external" title="http://www.w3.org/TR/html5/tabular-data.html#htmltablecolelement">HTMLTableColElement</a> (or <span><a href="https://developer.mozilla.org/en/HTML" rel="custom nofollow">HTML 4</a></span> <a target="_blank" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-84150186" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-84150186" rel="external nofollow" class=" external"><code>HTMLTableColElement</code></a>) interface, which provides special properties (beyond the regular <a href="https://developer.mozilla.org/en/DOM/element" rel="internal">element</a> object interface they also have available to them by inheritance) for manipulating table column elements.
+  */
+public interface TableColElement extends Element {
+
+
+  /**
+    * Indicates the horizontal alignment of the cell data in the column.
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * Alignment character for cell data.
+    */
+  String getCh();
+
+  void setCh(String arg);
+
+
+  /**
+    * Offset for the alignment character.
+    */
+  String getChOff();
+
+  void setChOff(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/col#attr-span">span</a></code>
+ HTML&nbsp;attribute, indicating the number of columns to apply this object's attributes to. Must be a positive integer.
+    */
+  int getSpan();
+
+  void setSpan(int arg);
+
+
+  /**
+    * Indicates the vertical alignment of the cell data in the column.
+    */
+  String getVAlign();
+
+  void setVAlign(String arg);
+
+
+  /**
+    * Default column width.
+    */
+  String getWidth();
+
+  void setWidth(String arg);
+}
diff --git a/elemental/src/elemental/html/TableElement.java b/elemental/src/elemental/html/TableElement.java
new file mode 100644
index 0000000..52c33d2
--- /dev/null
+++ b/elemental/src/elemental/html/TableElement.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <code>table</code> objects expose the <code><a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-64060425" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-64060425" target="_blank">HTMLTableElement</a></code> interface, which provides special properties and methods (beyond the regular <a rel="internal" href="https://developer.mozilla.org/en/DOM/element" title="en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of tables in HTML.
+
+  */
+public interface TableElement extends Element {
+
+
+  /**
+    * <b>align</b> gets/sets the alignment of the table.
+
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * <b>bgColor</b> gets/sets the background color of the table.
+
+    */
+  String getBgColor();
+
+  void setBgColor(String arg);
+
+
+  /**
+    * <b>border</b> gets/sets the table border.
+
+    */
+  String getBorder();
+
+  void setBorder(String arg);
+
+
+  /**
+    * <b>caption</b> returns the table caption.
+
+    */
+  TableCaptionElement getCaption();
+
+  void setCaption(TableCaptionElement arg);
+
+
+  /**
+    * <b>cellPadding</b> gets/sets the cell padding.
+
+    */
+  String getCellPadding();
+
+  void setCellPadding(String arg);
+
+
+  /**
+    * <b>cellSpacing</b> gets/sets the spacing around the table.
+
+    */
+  String getCellSpacing();
+
+  void setCellSpacing(String arg);
+
+
+  /**
+    * <b>frame</b> specifies which sides of the table have borders.
+
+    */
+  String getFrame();
+
+  void setFrame(String arg);
+
+
+  /**
+    * <b>rows</b> returns the rows in the table.
+
+    */
+  HTMLCollection getRows();
+
+
+  /**
+    * <b>rules</b> specifies which interior borders are visible.
+
+    */
+  String getRules();
+
+  void setRules(String arg);
+
+
+  /**
+    * <b>summary</b> gets/sets the table summary.
+
+    */
+  String getSummary();
+
+  void setSummary(String arg);
+
+
+  /**
+    * <b>tBodies</b> returns the table bodies.
+
+    */
+  HTMLCollection getTBodies();
+
+
+  /**
+    * <b>tFoot</b> returns the table footer.
+
+    */
+  TableSectionElement getTFoot();
+
+  void setTFoot(TableSectionElement arg);
+
+
+  /**
+    * <b>tHead</b> returns the table head.
+
+    */
+  TableSectionElement getTHead();
+
+  void setTHead(TableSectionElement arg);
+
+
+  /**
+    * <b>width</b> gets/sets the width of the table.
+
+    */
+  String getWidth();
+
+  void setWidth(String arg);
+
+
+  /**
+    * <b>createCaption</b> creates a new caption for the table.
+
+    */
+  Element createCaption();
+
+  Element createTBody();
+
+
+  /**
+    * <b>createTFoot</b> creates a table footer.
+
+    */
+  Element createTFoot();
+
+
+  /**
+    * <b>createTHead</b> creates a table header.
+
+    */
+  Element createTHead();
+
+
+  /**
+    * <b>deleteCaption</b> removes the table caption.
+
+    */
+  void deleteCaption();
+
+
+  /**
+    * <b>deleteRow</b> removes a row.
+
+    */
+  void deleteRow(int index);
+
+
+  /**
+    * <b>deleteTFoot</b> removes a table footer.
+
+    */
+  void deleteTFoot();
+
+
+  /**
+    * <b>deleteTHead</b> removes the table header.
+
+    */
+  void deleteTHead();
+
+
+  /**
+    * <b>insertRow</b> inserts a new row.
+
+    */
+  Element insertRow(int index);
+}
diff --git a/elemental/src/elemental/html/TableRowElement.java b/elemental/src/elemental/html/TableRowElement.java
new file mode 100644
index 0000000..1fb41ff
--- /dev/null
+++ b/elemental/src/elemental/html/TableRowElement.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM <code>table row</code> objects expose the <code><a class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-6986576" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-6986576" target="_blank">HTMLTableRowElement</a></code> interface, which provides special properties and methods (beyond the regular <a title="en/DOM/element" rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of rows in an HTML table.
+  */
+public interface TableRowElement extends Element {
+
+
+  /**
+    * <a title="en/DOM/tableRow.bgColor" rel="internal" href="https://developer.mozilla.org/en/DOM/tableRow.bgColor" class="new ">row.bgColor</a> 
+
+<span class="deprecatedInlineTemplate" title="">Deprecated</span>
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+
+  /**
+    * row.cells
+    */
+  String getBgColor();
+
+  void setBgColor(String arg);
+
+
+  /**
+    * row.ch
+    */
+  HTMLCollection getCells();
+
+
+  /**
+    * row.chOff
+    */
+  String getCh();
+
+  void setCh(String arg);
+
+
+  /**
+    * row.rowIndex
+    */
+  String getChOff();
+
+  void setChOff(String arg);
+
+
+  /**
+    * row.sectionRowIndex
+    */
+  int getRowIndex();
+
+
+  /**
+    * row.vAlign
+    */
+  int getSectionRowIndex();
+
+  String getVAlign();
+
+  void setVAlign(String arg);
+
+
+  /**
+    * row.insertCell
+    */
+  void deleteCell(int index);
+
+  Element insertCell(int index);
+}
diff --git a/elemental/src/elemental/html/TableSectionElement.java b/elemental/src/elemental/html/TableSectionElement.java
new file mode 100644
index 0000000..b45139f
--- /dev/null
+++ b/elemental/src/elemental/html/TableSectionElement.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <em>HTML Table Head Element</em> (<code>&lt;thead&gt;</code>) defines a set of rows defining the head of the columns of the table.
+  */
+public interface TableSectionElement extends Element {
+
+
+  /**
+    * This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are: <ul> <li><span>left</span>, aligning the content to the left of the cell</li> <li><span>center</span>, centering the content in the cell</li> <li><span>right</span>, aligning the content to the right of the cell</li> <li><span>justify</span>, inserting spaces into the textual content so that the content is justified in the cell</li> <li><span>char</span>, aligning the textual content on a special character with a minimal offset, defined by the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/thead#attr-char">char</a></code>
+ and 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/thead#attr-charoff">charoff</a></code>
+ attributes 
+<span class="unimplementedInlineTemplate">Unimplemented (see<a rel="external" href="https://bugzilla.mozilla.org/show_bug.cgi?id=2212" class="external" title="">
+bug 2212</a>
+)</span>
+.</li> </ul> <p>If this attribute is not set,&nbsp; the <span>left</span> value is assumed.</p> <div class="note"><strong>Note: </strong>Do not use this attribute as it is obsolete (not supported) in the latest standard. <ul> <li>To achieve the same effect as the <span>left</span>, <span>center</span>, <span>right</span> or <span>justify</span> values, use the CSS <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/text-align">text-align</a></code>
+ property on it.</li> <li>To achieve the same effect as the <span>char</span> value, in CSS3, you can use the value of the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/thead#attr-char">char</a></code>
+ as the value of the <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/text-align">text-align</a></code>
+ property 
+<span class="unimplementedInlineTemplate">Unimplemented</span>
+.</li> </ul> </div>
+    */
+  String getAlign();
+
+  void setAlign(String arg);
+
+  String getCh();
+
+  void setCh(String arg);
+
+  String getChOff();
+
+  void setChOff(String arg);
+
+  HTMLCollection getRows();
+
+  String getVAlign();
+
+  void setVAlign(String arg);
+
+  void deleteRow(int index);
+
+  Element insertRow(int index);
+}
diff --git a/elemental/src/elemental/html/TextAreaElement.java b/elemental/src/elemental/html/TextAreaElement.java
new file mode 100644
index 0000000..cf44508
--- /dev/null
+++ b/elemental/src/elemental/html/TextAreaElement.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM <code>TextArea</code> objects expose the <a title="http://dev.w3.org/html5/spec/the-button-element.html#the-textarea-element" class=" external" rel="external" href="http://dev.w3.org/html5/spec/the-button-element.html#the-textarea-element" target="_blank">HTMLTextAreaElement</a> (or 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> <code><a title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-24874179" class="external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-24874179" target="_blank">HTMLTextAreaElement</a></code>) interface, which provides special properties and methods (beyond the regular <a title="en/DOM/element" rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> object interface they also have available to them by inheritance) for manipulating the layout and presentation of <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea">&lt;textarea&gt;</a></code>
+ elements.
+  */
+public interface TextAreaElement extends Element {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-autofocus">autofocus</a></code>
+ HTML&nbsp;attribute, indicating that the control should have input focus when the page loads
+    */
+  boolean isAutofocus();
+
+  void setAutofocus(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-cols">cols</a></code>
+ HTML attribute, indicating the visible width of the text area.
+    */
+  int getCols();
+
+  void setCols(int arg);
+
+
+  /**
+    * The control's default value, which behaves like the <strong><a title="en/DOM/element.textContent" rel="internal" href="https://developer.mozilla.org/En/DOM/Node.textContent">textContent</a></strong> property.
+    */
+  String getDefaultValue();
+
+  void setDefaultValue(String arg);
+
+  String getDirName();
+
+  void setDirName(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-disabled">disabled</a></code>
+ HTML attribute, indicating that the control is not available for interaction.
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * <p>The containing form element, if this element is in a form. If this element is not contained in a form element:</p> <ul> <li>
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> this can be the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form#attr-id">id</a></code>
+ attribute of any <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/form">&lt;form&gt;</a></code>
+ element in the same document.</li> <li>
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML">HTML 4</a></span> this must be <code>null</code>.</li> </ul>
+    */
+  FormElement getForm();
+
+
+  /**
+    * A list of <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/label">&lt;label&gt;</a></code>
+ elements that are labels for this element.
+    */
+  NodeList getLabels();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-maxlength">maxlength</a></code>
+ HTML&nbsp;attribute, indicating the maximum number of characters the user can enter. This constraint is evaluated only when the value changes.
+    */
+  int getMaxLength();
+
+  void setMaxLength(int arg);
+
+
+  /**
+    * Reflects 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-name">name</a></code>
+ HTML attribute, containing the name of the control.
+    */
+  String getName();
+
+  void setName(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-placeholder">placeholder</a></code>
+ HTML attribute, containing a hint to the user about what to enter in the control.
+    */
+  String getPlaceholder();
+
+  void setPlaceholder(String arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-readonly">readonly</a></code>
+ HTML attribute, indicating that the user cannot modify the value of the control.
+    */
+  boolean isReadOnly();
+
+  void setReadOnly(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-required">required</a></code>
+ HTML attribute, indicating that the user must specify a value before submitting the form.
+    */
+  boolean isRequired();
+
+  void setRequired(boolean arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-rows">rows</a></code>
+ HTML attribute, indicating the number of visible text lines for the control.
+    */
+  int getRows();
+
+  void setRows(int arg);
+
+
+  /**
+    * The direction in which selection occurred. This is "forward" if selection was performed in the start-to-end direction of the current locale, or "backward" for the opposite direction. This can also be "none"&nbsp;if the direction is unknown."
+    */
+  String getSelectionDirection();
+
+  void setSelectionDirection(String arg);
+
+
+  /**
+    * The index of the end of selected text. 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if <strong>setSelectionRange</strong>() had been called with this as the second argument, and <strong>selectionStart</strong> as the first argument.
+    */
+  int getSelectionEnd();
+
+  void setSelectionEnd(int arg);
+
+
+  /**
+    * The index of the beginning of selected text. 
+<span><a rel="custom" href="https://developer.mozilla.org/en/HTML/HTML5">HTML5</a></span> If no text is selected, contains the index of the character that follows the input cursor. On being set, the control behaves as if <strong>setSelectionRange</strong>() had been called with this as the first argument, and <strong>selectionEnd</strong> as the second argument.
+    */
+  int getSelectionStart();
+
+  void setSelectionStart(int arg);
+
+
+  /**
+    * The codepoint length of the control's value.
+    */
+  int getTextLength();
+
+
+  /**
+    * The string <code>textarea</code>.
+    */
+  String getType();
+
+
+  /**
+    * A localized message that describes the validation constraints that the control does not satisfy (if any). This is the empty string if the control is not a candidate for constraint validation (<strong>willValidate</strong> is false), or it satisfies its constraints.
+    */
+  String getValidationMessage();
+
+
+  /**
+    * The validity states that this element is in.
+    */
+  ValidityState getValidity();
+
+
+  /**
+    * The raw value contained in the control.
+    */
+  String getValue();
+
+  void setValue(String arg);
+
+
+  /**
+    * Indicates whether the element is a candidate for constraint validation. It is false if any conditions bar it from constraint validation.
+    */
+  boolean isWillValidate();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/textarea#attr-wrap">wrap</a></code>
+ HTML attribute, indicating how the control wraps text.
+    */
+  String getWrap();
+
+  void setWrap(String arg);
+
+
+  /**
+    * Returns false if the button is a candidate for constraint validation, and it does not satisfy its constraints. In this case, it also fires an <code>invalid</code> event at the control. It returns true if the control is not a candidate for constraint validation, or if it satisfies its constraints.
+    */
+  boolean checkValidity();
+
+
+  /**
+    * Selects the contents of the control.
+    */
+  void select();
+
+
+  /**
+    * Sets a custom validity message for the element. If this message is not the empty string, then the element is suffering from a custom validity error, and does not validate.
+    */
+  void setCustomValidity(String error);
+
+
+  /**
+    * Selects a range of text, and sets <code>selectionStart</code> and <code>selectionEnd</code>. If either argument is greater than the length of the value, it is treated as pointing to the end of the value. If <code>end</code> is less than <code>start</code>, then both are treated as the value of <code>end</code>.
+    */
+  void setSelectionRange(int start, int end);
+
+
+  /**
+    * Selects a range of text, and sets <code>selectionStart</code> and <code>selectionEnd</code>. If either argument is greater than the length of the value, it is treated as pointing to the end of the value. If <code>end</code> is less than <code>start</code>, then both are treated as the value of <code>end</code>.
+    */
+  void setSelectionRange(int start, int end, String direction);
+}
diff --git a/elemental/src/elemental/html/TextMetrics.java b/elemental/src/elemental/html/TextMetrics.java
new file mode 100644
index 0000000..f826930
--- /dev/null
+++ b/elemental/src/elemental/html/TextMetrics.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Returned by <a title="CanvasRenderingContext2D" rel="internal" href="https://developer.mozilla.org/CanvasRenderingContext2D" class="new ">CanvasRenderingContext2D</a>'s <a title="CanvasRenderingContext2D.measureText" rel="internal" href="https://developer.mozilla.org/CanvasRenderingContext2D.measureText" class="new ">measureText</a> method.
+  */
+public interface TextMetrics {
+
+  float getWidth();
+}
diff --git a/elemental/src/elemental/html/TextTrack.java b/elemental/src/elemental/html/TextTrack.java
new file mode 100644
index 0000000..dfed586
--- /dev/null
+++ b/elemental/src/elemental/html/TextTrack.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface TextTrack extends EventTarget {
+
+    static final int DISABLED = 0;
+
+    static final int HIDDEN = 1;
+
+    static final int SHOWING = 2;
+
+  TextTrackCueList getActiveCues();
+
+  TextTrackCueList getCues();
+
+  String getKind();
+
+  String getLabel();
+
+  String getLanguage();
+
+  int getMode();
+
+  void setMode(int arg);
+
+  EventListener getOncuechange();
+
+  void setOncuechange(EventListener arg);
+
+  void addCue(TextTrackCue cue);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeCue(TextTrackCue cue);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/TextTrackCue.java b/elemental/src/elemental/html/TextTrackCue.java
new file mode 100644
index 0000000..96f8cea
--- /dev/null
+++ b/elemental/src/elemental/html/TextTrackCue.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.dom.DocumentFragment;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface TextTrackCue extends EventTarget {
+
+  String getAlign();
+
+  void setAlign(String arg);
+
+  double getEndTime();
+
+  void setEndTime(double arg);
+
+  String getId();
+
+  void setId(String arg);
+
+  int getLine();
+
+  void setLine(int arg);
+
+  EventListener getOnenter();
+
+  void setOnenter(EventListener arg);
+
+  EventListener getOnexit();
+
+  void setOnexit(EventListener arg);
+
+  boolean isPauseOnExit();
+
+  void setPauseOnExit(boolean arg);
+
+  int getPosition();
+
+  void setPosition(int arg);
+
+  int getSize();
+
+  void setSize(int arg);
+
+  boolean isSnapToLines();
+
+  void setSnapToLines(boolean arg);
+
+  double getStartTime();
+
+  void setStartTime(double arg);
+
+  String getText();
+
+  void setText(String arg);
+
+  TextTrack getTrack();
+
+  String getVertical();
+
+  void setVertical(String arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  DocumentFragment getCueAsHTML();
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/TextTrackCueList.java b/elemental/src/elemental/html/TextTrackCueList.java
new file mode 100644
index 0000000..21d2a98
--- /dev/null
+++ b/elemental/src/elemental/html/TextTrackCueList.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface TextTrackCueList {
+
+  int getLength();
+
+  TextTrackCue getCueById(String id);
+
+  TextTrackCue item(int index);
+}
diff --git a/elemental/src/elemental/html/TextTrackList.java b/elemental/src/elemental/html/TextTrackList.java
new file mode 100644
index 0000000..6271d9c
--- /dev/null
+++ b/elemental/src/elemental/html/TextTrackList.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface TextTrackList extends EventTarget {
+
+  int getLength();
+
+  EventListener getOnaddtrack();
+
+  void setOnaddtrack(EventListener arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  TextTrack item(int index);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/html/TimeRanges.java b/elemental/src/elemental/html/TimeRanges.java
new file mode 100644
index 0000000..d738b33
--- /dev/null
+++ b/elemental/src/elemental/html/TimeRanges.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>TimeRanges</code> interface is used to represent a set of time ranges, primarily for the purpose of tracking which portions of media have been buffered when loading it for use by the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/audio">&lt;audio&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+&nbsp;elements.</p>
+<p>A <code>TimeRanges</code> object includes one or more ranges of time, each specified by a starting and ending time offset. You reference each time range by using the <code>start()</code> and <code>end()</code> methods, passing the index number of the time range you want to retrieve.</p>
+  */
+public interface TimeRanges {
+
+
+  /**
+    * The number of time ranges represented by the time range object. <strong>Read only.</strong>
+    */
+  int getLength();
+
+
+  /**
+    * Returns the time for the end of the specified range.
+    */
+  float end(int index);
+
+
+  /**
+    * Returns the time for the start of the range with the specified index.
+    */
+  float start(int index);
+}
diff --git a/elemental/src/elemental/html/TitleElement.java b/elemental/src/elemental/html/TitleElement.java
new file mode 100644
index 0000000..1831a9f
--- /dev/null
+++ b/elemental/src/elemental/html/TitleElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>title</code> object exposes the <a target="_blank" class=" external" rel="external" href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-79243169" title="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-79243169">HTMLTitleElement</a> interface which contains the title for a document.&nbsp; This element inherits all of the properties and methods described in the <a title="en/DOM/element" class="internal" rel="internal" href="https://developer.mozilla.org/en/DOM/element">element</a> section.
+  */
+public interface TitleElement extends Element {
+
+
+  /**
+    * Gets or sets the text content of the document's title.
+    */
+  String getText();
+
+  void setText(String arg);
+}
diff --git a/elemental/src/elemental/html/TrackElement.java b/elemental/src/elemental/html/TrackElement.java
new file mode 100644
index 0000000..1515917
--- /dev/null
+++ b/elemental/src/elemental/html/TrackElement.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>track</code>&nbsp;element is used as a child of the media elements—<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/audio">&lt;audio&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video">&lt;video&gt;</a></code>
+—and does not represent anything on its own. It lets you specify timed text tracks (or time-based data).</p>
+<p>The type of data that <code> track</code> adds to the media is set in the <code>kind</code> attribute, which can take values of <code>subtitles</code>, <code>captions</code>, <code>descriptions</code>, <code>chapters</code> or <code>metadata</code>. The element points to a source file containing timed text that the browser exposes when the user requests additional data. </p>
+  */
+public interface TrackElement extends Element {
+
+    static final int ERROR = 3;
+
+    static final int LOADED = 2;
+
+    static final int LOADING = 1;
+
+    static final int NONE = 0;
+
+
+  /**
+    * This attribute indicates that the track should be enabled unless the user's preferences indicate that another track is more appropriate. This may only be used on one <code>track</code> element per media element.
+    */
+  boolean isDefaultValue();
+
+  void setDefaultValue(boolean arg);
+
+
+  /**
+    * Kind of text track. The following keywords are allowed: <ul> <li>subtitles: A transcription or translation of the dialogue.</li> <li>captions: A transcription or translation of the dialogue or other sound effects. Suitable for users who are deaf or when the sound is muted.</li> <li>descriptions: Textual descriptions of the video content. Suitable for users who are blind.</li> <li>chapters: Chapter titles, intended to be used when the user is navigating the media resource.</li> <li>metadata: Tracks used by script. Not visible to the user.</li> </ul>
+    */
+  String getKind();
+
+  void setKind(String arg);
+
+
+  /**
+    * A user-readable title of the text track Used by the browser when listing available text tracks.
+    */
+  String getLabel();
+
+  void setLabel(String arg);
+
+  int getReadyState();
+
+
+  /**
+    * Address of the track. Must be a valid URL. This attribute must be defined.
+    */
+  String getSrc();
+
+  void setSrc(String arg);
+
+
+  /**
+    * Language of the track text data.
+    */
+  String getSrclang();
+
+  void setSrclang(String arg);
+
+  TextTrack getTrack();
+}
diff --git a/elemental/src/elemental/html/TrackEvent.java b/elemental/src/elemental/html/TrackEvent.java
new file mode 100644
index 0000000..eb80986
--- /dev/null
+++ b/elemental/src/elemental/html/TrackEvent.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface TrackEvent extends Event {
+
+  Object getTrack();
+}
diff --git a/elemental/src/elemental/html/UListElement.java b/elemental/src/elemental/html/UListElement.java
new file mode 100644
index 0000000..84231a2
--- /dev/null
+++ b/elemental/src/elemental/html/UListElement.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The HTML <em>unordered list</em> element (<code>&lt;ul&gt;</code>) represents an unordered list of items, namely a collection of items that do not have a numerical ordering, and their order in the list is meaningless. Typically, unordered-list items are displayed with a bullet, which can be of several forms, like a dot, a circle or a squared. The bullet style is not defined in the HTML description of the page, but in its associated CSS, using the <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/list-style-type">list-style-type</a></code>
+ property.</p>
+<p>There is no limitation to the depth and imbrication of lists defined with the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+ elements.</p>
+<div class="note"><strong>Usage note: </strong> The <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+ both represent a list of items. They differ in the way that, with the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ element, the order is meaningful. As a rule of thumb to determine which one to use, try changing the order of the list items; if the meaning is changed, the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ element should be used, else the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ul">&lt;ul&gt;</a></code>
+ is adequate.</div>
+  */
+public interface UListElement extends Element {
+
+
+  /**
+    * This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn't work in all browsers. <div class="note"><strong>Usage note:&nbsp;</strong>Do not use this attribute, as it has been deprecated: the <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/ol">&lt;ol&gt;</a></code>
+ element should be styled using <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a>. To give a similar effect than the <span>compact</span> attribute, the <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a> property <a title="en/CSS/line-height" rel="internal" href="https://developer.mozilla.org/en/CSS/line-height">line-height</a> can be used with a value of <span>80%</span>.</div>
+    */
+  boolean isCompact();
+
+  void setCompact(boolean arg);
+
+
+  /**
+    * Used to set the bullet style for the list. The values defined under <a title="en/HTML3.2" rel="internal" href="https://developer.mozilla.org/en/HTML3.2" class="new ">HTML3.2</a> and the transitional version of <a title="en/HTML4.01" rel="internal" href="https://developer.mozilla.org/en/HTML4.01" class="new ">HTML 4.0/4.01</a> are<span>:</span> <ul> <li><code>circle</code>,</li> <li><code>disc</code>,</li> <li>and <code>square</code>.</li> </ul> <p>A fourth bullet type has been defined in the WebTV interface, but not all browsers support it: <code>triangle.</code></p> <p>If not present and if no <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a> <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/list-style-type">list-style-type</a></code>
+ property does apply to the element, the user agent decide to use a kind of bullets depending on the nesting level of the list.</p> <div class="note"><strong>Usage note:</strong> Do not use this attribute, as it has been deprecated: use the <a title="en/CSS" rel="internal" href="https://developer.mozilla.org/en/CSS">CSS</a> <code><a rel="custom" href="https://developer.mozilla.org/en/CSS/list-style-type">list-style-type</a></code>
+ property instead.</div>
+    */
+  String getType();
+
+  void setType(String arg);
+}
diff --git a/elemental/src/elemental/html/Uint16Array.java b/elemental/src/elemental/html/Uint16Array.java
new file mode 100644
index 0000000..a200d8e
--- /dev/null
+++ b/elemental/src/elemental/html/Uint16Array.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>Uint16Array</code> type represents an array of unsigned 16-bit integers..</p>
+<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>
+  */
+public interface Uint16Array extends ArrayBufferView, IndexableInt {
+
+  /**
+    * The size, in bytes, of each array element.
+    */
+
+    static final int BYTES_PER_ELEMENT = 2;
+
+
+  /**
+    * The number of entries in the array. <strong>Read only.</strong>
+    */
+  int getLength();
+
+  void setElements(Object array);
+
+  void setElements(Object array, int offset);
+
+
+  /**
+    * <p>Returns a new <code>Uint16Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Uint16Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Uint16Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Uint16Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Uint16Array subarray(int start);
+
+
+  /**
+    * <p>Returns a new <code>Uint16Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Uint16Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Uint16Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Uint16Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Uint16Array subarray(int start, int end);
+}
diff --git a/elemental/src/elemental/html/Uint32Array.java b/elemental/src/elemental/html/Uint32Array.java
new file mode 100644
index 0000000..1110451
--- /dev/null
+++ b/elemental/src/elemental/html/Uint32Array.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>Uint32Array</code> type represents an array of 32-bit unsigned integers.</p>
+<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>
+  */
+public interface Uint32Array extends ArrayBufferView, IndexableInt {
+
+  /**
+    * The size, in bytes, of each array element.
+    */
+
+    static final int BYTES_PER_ELEMENT = 4;
+
+
+  /**
+    * The number of entries in the array. <strong>Read only.</strong>
+    */
+  int getLength();
+
+  void setElements(Object array);
+
+  void setElements(Object array, int offset);
+
+
+  /**
+    * <p>Returns a new <code>Uint32Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Uint32Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Uint32Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Uint32Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Uint32Array subarray(int start);
+
+
+  /**
+    * <p>Returns a new <code>Uint32Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Uint32Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Uint32Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the last element in the array to be referenced by the new <code>Uint32Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either <code>begin</code> or <code>end</code> is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div>
+</div>
+    */
+  Uint32Array subarray(int start, int end);
+}
diff --git a/elemental/src/elemental/html/Uint8Array.java b/elemental/src/elemental/html/Uint8Array.java
new file mode 100644
index 0000000..6cc8d17
--- /dev/null
+++ b/elemental/src/elemental/html/Uint8Array.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>UInt8Array</code> type represents an array of 8-bit unsigned integers.</p>
+<p>Once established, you can reference elements in the array using the object's methods, or using standard array index syntax (that is, using bracket notation).</p>
+  */
+public interface Uint8Array extends ArrayBufferView, IndexableInt {
+
+  /**
+    * The size, in bytes, of each array element.
+    */
+
+    static final int BYTES_PER_ELEMENT = 1;
+
+
+  /**
+    * The number of entries in the array; for these 8-bit values, this is the same as the size of the array in bytes. <strong>Read only.</strong>
+    */
+  int getLength();
+
+  void setElements(Object array);
+
+  void setElements(Object array, int offset);
+
+
+  /**
+    * <p>Returns a new <code>Uint8Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Uint8Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Uint8Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the element after last element in the array to be referenced by the new <code>Uint8Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either begin or end is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div></div>
+    */
+  Uint8Array subarray(int start);
+
+
+  /**
+    * <p>Returns a new <code>Uint8Array</code> view on the <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> store for this <code>Uint8Array</code> object.</p>
+
+<div id="section_15"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>begin</code></dt> <dd>The offset to the first element in the array to be referenced by the new <code>Uint8Array</code> object.</dd> <dt><code>end</code> 
+<span title="">Optional</span>
+</dt> <dd>The offset to the element after last element in the array to be referenced by the new <code>Uint8Array</code> object; if not specified, all elements from the one specified by <code>begin</code> to the end of the array are included in the new view.</dd>
+</dl>
+</div><div id="section_16"><span id="Notes_2"></span><h6 class="editable">Notes</h6>
+<p>The range specified by <code>begin</code> and <code>end</code> is clamped to the valid index range for the current array; if the computed length of the new array would be negative, it's clamped to zero. If either begin or end is negative, it refers to an index from the end of the array instead of from the beginning.</p>
+<div class="note"><strong>Note:</strong> Keep in mind that this is creating a new view on the existing buffer; changes to the new object's contents will impact the original object and vice versa.</div></div>
+    */
+  Uint8Array subarray(int start, int end);
+}
diff --git a/elemental/src/elemental/html/Uint8ClampedArray.java b/elemental/src/elemental/html/Uint8ClampedArray.java
new file mode 100644
index 0000000..20e84e4
--- /dev/null
+++ b/elemental/src/elemental/html/Uint8ClampedArray.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface Uint8ClampedArray extends Uint8Array, IndexableInt {
+
+  int getLength();
+
+  void setElements(Object array);
+
+  void setElements(Object array, int offset);
+}
diff --git a/elemental/src/elemental/html/UnknownElement.java b/elemental/src/elemental/html/UnknownElement.java
new file mode 100644
index 0000000..b7b19e5
--- /dev/null
+++ b/elemental/src/elemental/html/UnknownElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>Dies ist die Übersichtsseite der Gecko DOM Referenz.</p>
+<div class="warning">Diese Referenz ist im Moment noch sehr unvollständig. Hilf mit: registriere dich und schreib mit!</div>
+<div class="note">Diese Referenz trennt zwischen Methoden und Eigenschaften die für Webinhalte verfügbar oder nur für Entwickler von Erweiterungen verfügbar sind. Erweiterungsentwickler halten sich bitte an die englische Funktionsreferenz im Mozilla Developer Center.</div>
+  */
+public interface UnknownElement extends Element {
+}
diff --git a/elemental/src/elemental/html/ValidityState.java b/elemental/src/elemental/html/ValidityState.java
new file mode 100644
index 0000000..f2362a1
--- /dev/null
+++ b/elemental/src/elemental/html/ValidityState.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The DOM&nbsp;<code>ValidityState</code> interface represents the <em>validity states</em> that an element can be in, with respect to constraint validation.
+  */
+public interface ValidityState {
+
+
+  /**
+    * The element's custom validity message has been set to a non-empty string by calling the element's setCustomValidity() method.
+    */
+  boolean isCustomError();
+
+
+  /**
+    * The value does not match the specified 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-pattern">pattern</a></code>
+.
+    */
+  boolean isPatternMismatch();
+
+
+  /**
+    * The value is greater than the specified 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-max">max</a></code>
+.
+    */
+  boolean isRangeOverflow();
+
+
+  /**
+    * The value is less than the specified 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-min">min</a></code>
+.
+    */
+  boolean isRangeUnderflow();
+
+
+  /**
+    * The value does not fit the rules determined by 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-step">step</a></code>
+.
+    */
+  boolean isStepMismatch();
+
+
+  /**
+    * <p>The value exceeds the specified <strong>maxlength</strong> for <a title="en/DOM/HTMLInputElement" rel="internal" href="https://developer.mozilla.org/en/DOM/HTMLInputElement">HTMLInputElement</a> or <a title="en/DOM/textarea" rel="internal" href="https://developer.mozilla.org/en/DOM/HTMLTextAreaElement">HTMLTextAreaElement</a> objects.</p> <div class="note"><strong>Note:</strong> This will never be <code>true</code> in Gecko, because elements' values are prevented from being longer than <strong>maxlength</strong>.</div>
+    */
+  boolean isTooLong();
+
+
+  /**
+    * The value is not in the required syntax (when 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-type">type</a></code>
+ is <code>email</code> or <code>url</code>).
+    */
+  boolean isTypeMismatch();
+
+
+  /**
+    * No other constraint validation conditions are true.
+    */
+  boolean isValid();
+
+
+  /**
+    * The element has a 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/input#attr-required">required</a></code>
+ attribute, but no value.
+    */
+  boolean isValueMissing();
+}
diff --git a/elemental/src/elemental/html/VideoElement.java b/elemental/src/elemental/html/VideoElement.java
new file mode 100644
index 0000000..744d238
--- /dev/null
+++ b/elemental/src/elemental/html/VideoElement.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * DOM <code>video</code> objects expose the <a class="external" title="http://www.w3.org/TR/html5/video.html#htmlvideoelement" rel="external" href="http://www.w3.org/TR/html5/video.html#htmlvideoelement" target="_blank">HTMLVideoElement</a> interface, which provides special properties (beyond the regular <a href="https://developer.mozilla.org/en/DOM/element" rel="internal">element</a> object and <a title="en/DOM/HTMLMediaElement" rel="internal" href="https://developer.mozilla.org/en/DOM/HTMLMediaElement">HTMLMediaElement</a> interfaces they also have available to them by inheritance) for manipulating video objects.
+  */
+public interface VideoElement extends MediaElement {
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video#attr-height">height</a></code>
+ HTML attribute, which specifies the height of the display area, in CSS pixels.
+    */
+  int getHeight();
+
+  void setHeight(int arg);
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video#attr-poster">poster</a></code>
+ HTML&nbsp;attribute, which specifies an image to show while no video data is available.
+    */
+  String getPoster();
+
+  void setPoster(String arg);
+
+
+  /**
+    * The intrinsic height of the resource in CSS pixels, taking into account the dimensions, aspect ratio, clean aperture, resolution, and so forth, as defined for the format used by the resource. If the element's ready state is HAVE_NOTHING, the value is 0.
+    */
+  int getVideoHeight();
+
+
+  /**
+    * The intrinsic width of the resource in CSS pixels, taking into account the dimensions, aspect ratio, clean aperture, resolution, and so forth, as defined for the format used by the resource. If the element's ready state is HAVE_NOTHING, the value is 0.
+    */
+  int getVideoWidth();
+
+  int getWebkitDecodedFrameCount();
+
+  boolean isWebkitDisplayingFullscreen();
+
+  int getWebkitDroppedFrameCount();
+
+  boolean isWebkitSupportsFullscreen();
+
+
+  /**
+    * Reflects the 
+
+<code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/video#attr-width">width</a></code>
+&nbsp;HTML&nbsp;attribute, which specifies the width of the display area, in CSS pixels.
+    */
+  int getWidth();
+
+  void setWidth(int arg);
+
+  void webkitEnterFullScreen();
+
+  void webkitEnterFullscreen();
+
+  void webkitExitFullScreen();
+
+  void webkitExitFullscreen();
+}
diff --git a/elemental/src/elemental/html/VoidCallback.java b/elemental/src/elemental/html/VoidCallback.java
new file mode 100644
index 0000000..954323b
--- /dev/null
+++ b/elemental/src/elemental/html/VoidCallback.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+
+/**
+  * 
+  */
+public interface VoidCallback {
+  void onVoidCallback();
+}
diff --git a/elemental/src/elemental/html/WaveShaperNode.java b/elemental/src/elemental/html/WaveShaperNode.java
new file mode 100644
index 0000000..170e6fa
--- /dev/null
+++ b/elemental/src/elemental/html/WaveShaperNode.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WaveShaperNode extends AudioNode {
+
+  Float32Array getCurve();
+
+  void setCurve(Float32Array arg);
+}
diff --git a/elemental/src/elemental/html/WaveTable.java b/elemental/src/elemental/html/WaveTable.java
new file mode 100644
index 0000000..e6087f8
--- /dev/null
+++ b/elemental/src/elemental/html/WaveTable.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WaveTable {
+}
diff --git a/elemental/src/elemental/html/WebGLActiveInfo.java b/elemental/src/elemental/html/WebGLActiveInfo.java
new file mode 100644
index 0000000..537dc0e
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLActiveInfo.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLActiveInfo {
+
+  String getName();
+
+  int getSize();
+
+  int getType();
+}
diff --git a/elemental/src/elemental/html/WebGLBuffer.java b/elemental/src/elemental/html/WebGLBuffer.java
new file mode 100644
index 0000000..22d0b83
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLBuffer.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLBuffer {
+}
diff --git a/elemental/src/elemental/html/WebGLCompressedTextureS3TC.java b/elemental/src/elemental/html/WebGLCompressedTextureS3TC.java
new file mode 100644
index 0000000..11f8f0a
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLCompressedTextureS3TC.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLCompressedTextureS3TC {
+
+    static final int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
+
+    static final int COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;
+
+    static final int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;
+
+    static final int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;
+}
diff --git a/elemental/src/elemental/html/WebGLContextAttributes.java b/elemental/src/elemental/html/WebGLContextAttributes.java
new file mode 100644
index 0000000..ccdca68
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLContextAttributes.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLContextAttributes {
+
+  boolean isAlpha();
+
+  void setAlpha(boolean arg);
+
+  boolean isAntialias();
+
+  void setAntialias(boolean arg);
+
+  boolean isDepth();
+
+  void setDepth(boolean arg);
+
+  boolean isPremultipliedAlpha();
+
+  void setPremultipliedAlpha(boolean arg);
+
+  boolean isPreserveDrawingBuffer();
+
+  void setPreserveDrawingBuffer(boolean arg);
+
+  boolean isStencil();
+
+  void setStencil(boolean arg);
+}
diff --git a/elemental/src/elemental/html/WebGLContextEvent.java b/elemental/src/elemental/html/WebGLContextEvent.java
new file mode 100644
index 0000000..37b11e0
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLContextEvent.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLContextEvent extends Event {
+
+  String getStatusMessage();
+}
diff --git a/elemental/src/elemental/html/WebGLDebugRendererInfo.java b/elemental/src/elemental/html/WebGLDebugRendererInfo.java
new file mode 100644
index 0000000..947bdfe
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLDebugRendererInfo.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLDebugRendererInfo {
+
+    static final int UNMASKED_RENDERER_WEBGL = 0x9246;
+
+    static final int UNMASKED_VENDOR_WEBGL = 0x9245;
+}
diff --git a/elemental/src/elemental/html/WebGLDebugShaders.java b/elemental/src/elemental/html/WebGLDebugShaders.java
new file mode 100644
index 0000000..15932c9
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLDebugShaders.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLDebugShaders {
+
+  String getTranslatedShaderSource(WebGLShader shader);
+}
diff --git a/elemental/src/elemental/html/WebGLFramebuffer.java b/elemental/src/elemental/html/WebGLFramebuffer.java
new file mode 100644
index 0000000..b3f4f54
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLFramebuffer.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLFramebuffer {
+}
diff --git a/elemental/src/elemental/html/WebGLLoseContext.java b/elemental/src/elemental/html/WebGLLoseContext.java
new file mode 100644
index 0000000..f663148
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLLoseContext.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLLoseContext {
+
+  void loseContext();
+
+  void restoreContext();
+}
diff --git a/elemental/src/elemental/html/WebGLProgram.java b/elemental/src/elemental/html/WebGLProgram.java
new file mode 100644
index 0000000..e5a41b4
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLProgram.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLProgram {
+}
diff --git a/elemental/src/elemental/html/WebGLRenderbuffer.java b/elemental/src/elemental/html/WebGLRenderbuffer.java
new file mode 100644
index 0000000..d27a35b
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLRenderbuffer.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLRenderbuffer {
+}
diff --git a/elemental/src/elemental/html/WebGLRenderingContext.java b/elemental/src/elemental/html/WebGLRenderingContext.java
new file mode 100644
index 0000000..661c51a
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLRenderingContext.java
@@ -0,0 +1,920 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.util.Indexable;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLRenderingContext extends CanvasRenderingContext {
+
+    static final int ACTIVE_ATTRIBUTES = 0x8B89;
+
+    static final int ACTIVE_TEXTURE = 0x84E0;
+
+    static final int ACTIVE_UNIFORMS = 0x8B86;
+
+    static final int ALIASED_LINE_WIDTH_RANGE = 0x846E;
+
+    static final int ALIASED_POINT_SIZE_RANGE = 0x846D;
+
+    static final int ALPHA = 0x1906;
+
+    static final int ALPHA_BITS = 0x0D55;
+
+    static final int ALWAYS = 0x0207;
+
+    static final int ARRAY_BUFFER = 0x8892;
+
+    static final int ARRAY_BUFFER_BINDING = 0x8894;
+
+    static final int ATTACHED_SHADERS = 0x8B85;
+
+    static final int BACK = 0x0405;
+
+    static final int BLEND = 0x0BE2;
+
+    static final int BLEND_COLOR = 0x8005;
+
+    static final int BLEND_DST_ALPHA = 0x80CA;
+
+    static final int BLEND_DST_RGB = 0x80C8;
+
+    static final int BLEND_EQUATION = 0x8009;
+
+    static final int BLEND_EQUATION_ALPHA = 0x883D;
+
+    static final int BLEND_EQUATION_RGB = 0x8009;
+
+    static final int BLEND_SRC_ALPHA = 0x80CB;
+
+    static final int BLEND_SRC_RGB = 0x80C9;
+
+    static final int BLUE_BITS = 0x0D54;
+
+    static final int BOOL = 0x8B56;
+
+    static final int BOOL_VEC2 = 0x8B57;
+
+    static final int BOOL_VEC3 = 0x8B58;
+
+    static final int BOOL_VEC4 = 0x8B59;
+
+    static final int BROWSER_DEFAULT_WEBGL = 0x9244;
+
+    static final int BUFFER_SIZE = 0x8764;
+
+    static final int BUFFER_USAGE = 0x8765;
+
+    static final int BYTE = 0x1400;
+
+    static final int CCW = 0x0901;
+
+    static final int CLAMP_TO_EDGE = 0x812F;
+
+    static final int COLOR_ATTACHMENT0 = 0x8CE0;
+
+    static final int COLOR_BUFFER_BIT = 0x00004000;
+
+    static final int COLOR_CLEAR_VALUE = 0x0C22;
+
+    static final int COLOR_WRITEMASK = 0x0C23;
+
+    static final int COMPILE_STATUS = 0x8B81;
+
+    static final int COMPRESSED_TEXTURE_FORMATS = 0x86A3;
+
+    static final int CONSTANT_ALPHA = 0x8003;
+
+    static final int CONSTANT_COLOR = 0x8001;
+
+    static final int CONTEXT_LOST_WEBGL = 0x9242;
+
+    static final int CULL_FACE = 0x0B44;
+
+    static final int CULL_FACE_MODE = 0x0B45;
+
+    static final int CURRENT_PROGRAM = 0x8B8D;
+
+    static final int CURRENT_VERTEX_ATTRIB = 0x8626;
+
+    static final int CW = 0x0900;
+
+    static final int DECR = 0x1E03;
+
+    static final int DECR_WRAP = 0x8508;
+
+    static final int DELETE_STATUS = 0x8B80;
+
+    static final int DEPTH_ATTACHMENT = 0x8D00;
+
+    static final int DEPTH_BITS = 0x0D56;
+
+    static final int DEPTH_BUFFER_BIT = 0x00000100;
+
+    static final int DEPTH_CLEAR_VALUE = 0x0B73;
+
+    static final int DEPTH_COMPONENT = 0x1902;
+
+    static final int DEPTH_COMPONENT16 = 0x81A5;
+
+    static final int DEPTH_FUNC = 0x0B74;
+
+    static final int DEPTH_RANGE = 0x0B70;
+
+    static final int DEPTH_STENCIL = 0x84F9;
+
+    static final int DEPTH_STENCIL_ATTACHMENT = 0x821A;
+
+    static final int DEPTH_TEST = 0x0B71;
+
+    static final int DEPTH_WRITEMASK = 0x0B72;
+
+    static final int DITHER = 0x0BD0;
+
+    static final int DONT_CARE = 0x1100;
+
+    static final int DST_ALPHA = 0x0304;
+
+    static final int DST_COLOR = 0x0306;
+
+    static final int DYNAMIC_DRAW = 0x88E8;
+
+    static final int ELEMENT_ARRAY_BUFFER = 0x8893;
+
+    static final int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;
+
+    static final int EQUAL = 0x0202;
+
+    static final int FASTEST = 0x1101;
+
+    static final int FLOAT = 0x1406;
+
+    static final int FLOAT_MAT2 = 0x8B5A;
+
+    static final int FLOAT_MAT3 = 0x8B5B;
+
+    static final int FLOAT_MAT4 = 0x8B5C;
+
+    static final int FLOAT_VEC2 = 0x8B50;
+
+    static final int FLOAT_VEC3 = 0x8B51;
+
+    static final int FLOAT_VEC4 = 0x8B52;
+
+    static final int FRAGMENT_SHADER = 0x8B30;
+
+    static final int FRAMEBUFFER = 0x8D40;
+
+    static final int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;
+
+    static final int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;
+
+    static final int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;
+
+    static final int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;
+
+    static final int FRAMEBUFFER_BINDING = 0x8CA6;
+
+    static final int FRAMEBUFFER_COMPLETE = 0x8CD5;
+
+    static final int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;
+
+    static final int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;
+
+    static final int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;
+
+    static final int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;
+
+    static final int FRONT = 0x0404;
+
+    static final int FRONT_AND_BACK = 0x0408;
+
+    static final int FRONT_FACE = 0x0B46;
+
+    static final int FUNC_ADD = 0x8006;
+
+    static final int FUNC_REVERSE_SUBTRACT = 0x800B;
+
+    static final int FUNC_SUBTRACT = 0x800A;
+
+    static final int GENERATE_MIPMAP_HINT = 0x8192;
+
+    static final int GEQUAL = 0x0206;
+
+    static final int GREATER = 0x0204;
+
+    static final int GREEN_BITS = 0x0D53;
+
+    static final int HIGH_FLOAT = 0x8DF2;
+
+    static final int HIGH_INT = 0x8DF5;
+
+    static final int INCR = 0x1E02;
+
+    static final int INCR_WRAP = 0x8507;
+
+    static final int INT = 0x1404;
+
+    static final int INT_VEC2 = 0x8B53;
+
+    static final int INT_VEC3 = 0x8B54;
+
+    static final int INT_VEC4 = 0x8B55;
+
+    static final int INVALID_ENUM = 0x0500;
+
+    static final int INVALID_FRAMEBUFFER_OPERATION = 0x0506;
+
+    static final int INVALID_OPERATION = 0x0502;
+
+    static final int INVALID_VALUE = 0x0501;
+
+    static final int INVERT = 0x150A;
+
+    static final int KEEP = 0x1E00;
+
+    static final int LEQUAL = 0x0203;
+
+    static final int LESS = 0x0201;
+
+    static final int LINEAR = 0x2601;
+
+    static final int LINEAR_MIPMAP_LINEAR = 0x2703;
+
+    static final int LINEAR_MIPMAP_NEAREST = 0x2701;
+
+    static final int LINES = 0x0001;
+
+    static final int LINE_LOOP = 0x0002;
+
+    static final int LINE_STRIP = 0x0003;
+
+    static final int LINE_WIDTH = 0x0B21;
+
+    static final int LINK_STATUS = 0x8B82;
+
+    static final int LOW_FLOAT = 0x8DF0;
+
+    static final int LOW_INT = 0x8DF3;
+
+    static final int LUMINANCE = 0x1909;
+
+    static final int LUMINANCE_ALPHA = 0x190A;
+
+    static final int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;
+
+    static final int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;
+
+    static final int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;
+
+    static final int MAX_RENDERBUFFER_SIZE = 0x84E8;
+
+    static final int MAX_TEXTURE_IMAGE_UNITS = 0x8872;
+
+    static final int MAX_TEXTURE_SIZE = 0x0D33;
+
+    static final int MAX_VARYING_VECTORS = 0x8DFC;
+
+    static final int MAX_VERTEX_ATTRIBS = 0x8869;
+
+    static final int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;
+
+    static final int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;
+
+    static final int MAX_VIEWPORT_DIMS = 0x0D3A;
+
+    static final int MEDIUM_FLOAT = 0x8DF1;
+
+    static final int MEDIUM_INT = 0x8DF4;
+
+    static final int MIRRORED_REPEAT = 0x8370;
+
+    static final int NEAREST = 0x2600;
+
+    static final int NEAREST_MIPMAP_LINEAR = 0x2702;
+
+    static final int NEAREST_MIPMAP_NEAREST = 0x2700;
+
+    static final int NEVER = 0x0200;
+
+    static final int NICEST = 0x1102;
+
+    static final int NONE = 0;
+
+    static final int NOTEQUAL = 0x0205;
+
+    static final int NO_ERROR = 0;
+
+    static final int ONE = 1;
+
+    static final int ONE_MINUS_CONSTANT_ALPHA = 0x8004;
+
+    static final int ONE_MINUS_CONSTANT_COLOR = 0x8002;
+
+    static final int ONE_MINUS_DST_ALPHA = 0x0305;
+
+    static final int ONE_MINUS_DST_COLOR = 0x0307;
+
+    static final int ONE_MINUS_SRC_ALPHA = 0x0303;
+
+    static final int ONE_MINUS_SRC_COLOR = 0x0301;
+
+    static final int OUT_OF_MEMORY = 0x0505;
+
+    static final int PACK_ALIGNMENT = 0x0D05;
+
+    static final int POINTS = 0x0000;
+
+    static final int POLYGON_OFFSET_FACTOR = 0x8038;
+
+    static final int POLYGON_OFFSET_FILL = 0x8037;
+
+    static final int POLYGON_OFFSET_UNITS = 0x2A00;
+
+    static final int RED_BITS = 0x0D52;
+
+    static final int RENDERBUFFER = 0x8D41;
+
+    static final int RENDERBUFFER_ALPHA_SIZE = 0x8D53;
+
+    static final int RENDERBUFFER_BINDING = 0x8CA7;
+
+    static final int RENDERBUFFER_BLUE_SIZE = 0x8D52;
+
+    static final int RENDERBUFFER_DEPTH_SIZE = 0x8D54;
+
+    static final int RENDERBUFFER_GREEN_SIZE = 0x8D51;
+
+    static final int RENDERBUFFER_HEIGHT = 0x8D43;
+
+    static final int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;
+
+    static final int RENDERBUFFER_RED_SIZE = 0x8D50;
+
+    static final int RENDERBUFFER_STENCIL_SIZE = 0x8D55;
+
+    static final int RENDERBUFFER_WIDTH = 0x8D42;
+
+    static final int RENDERER = 0x1F01;
+
+    static final int REPEAT = 0x2901;
+
+    static final int REPLACE = 0x1E01;
+
+    static final int RGB = 0x1907;
+
+    static final int RGB565 = 0x8D62;
+
+    static final int RGB5_A1 = 0x8057;
+
+    static final int RGBA = 0x1908;
+
+    static final int RGBA4 = 0x8056;
+
+    static final int SAMPLER_2D = 0x8B5E;
+
+    static final int SAMPLER_CUBE = 0x8B60;
+
+    static final int SAMPLES = 0x80A9;
+
+    static final int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;
+
+    static final int SAMPLE_BUFFERS = 0x80A8;
+
+    static final int SAMPLE_COVERAGE = 0x80A0;
+
+    static final int SAMPLE_COVERAGE_INVERT = 0x80AB;
+
+    static final int SAMPLE_COVERAGE_VALUE = 0x80AA;
+
+    static final int SCISSOR_BOX = 0x0C10;
+
+    static final int SCISSOR_TEST = 0x0C11;
+
+    static final int SHADER_TYPE = 0x8B4F;
+
+    static final int SHADING_LANGUAGE_VERSION = 0x8B8C;
+
+    static final int SHORT = 0x1402;
+
+    static final int SRC_ALPHA = 0x0302;
+
+    static final int SRC_ALPHA_SATURATE = 0x0308;
+
+    static final int SRC_COLOR = 0x0300;
+
+    static final int STATIC_DRAW = 0x88E4;
+
+    static final int STENCIL_ATTACHMENT = 0x8D20;
+
+    static final int STENCIL_BACK_FAIL = 0x8801;
+
+    static final int STENCIL_BACK_FUNC = 0x8800;
+
+    static final int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;
+
+    static final int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;
+
+    static final int STENCIL_BACK_REF = 0x8CA3;
+
+    static final int STENCIL_BACK_VALUE_MASK = 0x8CA4;
+
+    static final int STENCIL_BACK_WRITEMASK = 0x8CA5;
+
+    static final int STENCIL_BITS = 0x0D57;
+
+    static final int STENCIL_BUFFER_BIT = 0x00000400;
+
+    static final int STENCIL_CLEAR_VALUE = 0x0B91;
+
+    static final int STENCIL_FAIL = 0x0B94;
+
+    static final int STENCIL_FUNC = 0x0B92;
+
+    static final int STENCIL_INDEX = 0x1901;
+
+    static final int STENCIL_INDEX8 = 0x8D48;
+
+    static final int STENCIL_PASS_DEPTH_FAIL = 0x0B95;
+
+    static final int STENCIL_PASS_DEPTH_PASS = 0x0B96;
+
+    static final int STENCIL_REF = 0x0B97;
+
+    static final int STENCIL_TEST = 0x0B90;
+
+    static final int STENCIL_VALUE_MASK = 0x0B93;
+
+    static final int STENCIL_WRITEMASK = 0x0B98;
+
+    static final int STREAM_DRAW = 0x88E0;
+
+    static final int SUBPIXEL_BITS = 0x0D50;
+
+    static final int TEXTURE = 0x1702;
+
+    static final int TEXTURE0 = 0x84C0;
+
+    static final int TEXTURE1 = 0x84C1;
+
+    static final int TEXTURE10 = 0x84CA;
+
+    static final int TEXTURE11 = 0x84CB;
+
+    static final int TEXTURE12 = 0x84CC;
+
+    static final int TEXTURE13 = 0x84CD;
+
+    static final int TEXTURE14 = 0x84CE;
+
+    static final int TEXTURE15 = 0x84CF;
+
+    static final int TEXTURE16 = 0x84D0;
+
+    static final int TEXTURE17 = 0x84D1;
+
+    static final int TEXTURE18 = 0x84D2;
+
+    static final int TEXTURE19 = 0x84D3;
+
+    static final int TEXTURE2 = 0x84C2;
+
+    static final int TEXTURE20 = 0x84D4;
+
+    static final int TEXTURE21 = 0x84D5;
+
+    static final int TEXTURE22 = 0x84D6;
+
+    static final int TEXTURE23 = 0x84D7;
+
+    static final int TEXTURE24 = 0x84D8;
+
+    static final int TEXTURE25 = 0x84D9;
+
+    static final int TEXTURE26 = 0x84DA;
+
+    static final int TEXTURE27 = 0x84DB;
+
+    static final int TEXTURE28 = 0x84DC;
+
+    static final int TEXTURE29 = 0x84DD;
+
+    static final int TEXTURE3 = 0x84C3;
+
+    static final int TEXTURE30 = 0x84DE;
+
+    static final int TEXTURE31 = 0x84DF;
+
+    static final int TEXTURE4 = 0x84C4;
+
+    static final int TEXTURE5 = 0x84C5;
+
+    static final int TEXTURE6 = 0x84C6;
+
+    static final int TEXTURE7 = 0x84C7;
+
+    static final int TEXTURE8 = 0x84C8;
+
+    static final int TEXTURE9 = 0x84C9;
+
+    static final int TEXTURE_2D = 0x0DE1;
+
+    static final int TEXTURE_BINDING_2D = 0x8069;
+
+    static final int TEXTURE_BINDING_CUBE_MAP = 0x8514;
+
+    static final int TEXTURE_CUBE_MAP = 0x8513;
+
+    static final int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
+
+    static final int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
+
+    static final int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
+
+    static final int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
+
+    static final int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
+
+    static final int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
+
+    static final int TEXTURE_MAG_FILTER = 0x2800;
+
+    static final int TEXTURE_MIN_FILTER = 0x2801;
+
+    static final int TEXTURE_WRAP_S = 0x2802;
+
+    static final int TEXTURE_WRAP_T = 0x2803;
+
+    static final int TRIANGLES = 0x0004;
+
+    static final int TRIANGLE_FAN = 0x0006;
+
+    static final int TRIANGLE_STRIP = 0x0005;
+
+    static final int UNPACK_ALIGNMENT = 0x0CF5;
+
+    static final int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
+
+    static final int UNPACK_FLIP_Y_WEBGL = 0x9240;
+
+    static final int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;
+
+    static final int UNSIGNED_BYTE = 0x1401;
+
+    static final int UNSIGNED_INT = 0x1405;
+
+    static final int UNSIGNED_SHORT = 0x1403;
+
+    static final int UNSIGNED_SHORT_4_4_4_4 = 0x8033;
+
+    static final int UNSIGNED_SHORT_5_5_5_1 = 0x8034;
+
+    static final int UNSIGNED_SHORT_5_6_5 = 0x8363;
+
+    static final int VALIDATE_STATUS = 0x8B83;
+
+    static final int VENDOR = 0x1F00;
+
+    static final int VERSION = 0x1F02;
+
+    static final int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;
+
+    static final int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;
+
+    static final int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;
+
+    static final int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;
+
+    static final int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;
+
+    static final int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;
+
+    static final int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;
+
+    static final int VERTEX_SHADER = 0x8B31;
+
+    static final int VIEWPORT = 0x0BA2;
+
+    static final int ZERO = 0;
+
+  int getDrawingBufferHeight();
+
+  int getDrawingBufferWidth();
+
+  void activeTexture(int texture);
+
+  void attachShader(WebGLProgram program, WebGLShader shader);
+
+  void bindAttribLocation(WebGLProgram program, int index, String name);
+
+  void bindBuffer(int target, WebGLBuffer buffer);
+
+  void bindFramebuffer(int target, WebGLFramebuffer framebuffer);
+
+  void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer);
+
+  void bindTexture(int target, WebGLTexture texture);
+
+  void blendColor(float red, float green, float blue, float alpha);
+
+  void blendEquation(int mode);
+
+  void blendEquationSeparate(int modeRGB, int modeAlpha);
+
+  void blendFunc(int sfactor, int dfactor);
+
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha);
+
+  void bufferData(int target, ArrayBuffer data, int usage);
+
+  void bufferData(int target, ArrayBufferView data, int usage);
+
+  void bufferData(int target, double size, int usage);
+
+  void bufferSubData(int target, double offset, ArrayBuffer data);
+
+  void bufferSubData(int target, double offset, ArrayBufferView data);
+
+  int checkFramebufferStatus(int target);
+
+  void clear(int mask);
+
+  void clearColor(float red, float green, float blue, float alpha);
+
+  void clearDepth(float depth);
+
+  void clearStencil(int s);
+
+  void colorMask(boolean red, boolean green, boolean blue, boolean alpha);
+
+  void compileShader(WebGLShader shader);
+
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data);
+
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data);
+
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border);
+
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height);
+
+  WebGLBuffer createBuffer();
+
+  WebGLFramebuffer createFramebuffer();
+
+  WebGLProgram createProgram();
+
+  WebGLRenderbuffer createRenderbuffer();
+
+  WebGLShader createShader(int type);
+
+  WebGLTexture createTexture();
+
+  void cullFace(int mode);
+
+  void deleteBuffer(WebGLBuffer buffer);
+
+  void deleteFramebuffer(WebGLFramebuffer framebuffer);
+
+  void deleteProgram(WebGLProgram program);
+
+  void deleteRenderbuffer(WebGLRenderbuffer renderbuffer);
+
+  void deleteShader(WebGLShader shader);
+
+  void deleteTexture(WebGLTexture texture);
+
+  void depthFunc(int func);
+
+  void depthMask(boolean flag);
+
+  void depthRange(float zNear, float zFar);
+
+  void detachShader(WebGLProgram program, WebGLShader shader);
+
+  void disable(int cap);
+
+  void disableVertexAttribArray(int index);
+
+  void drawArrays(int mode, int first, int count);
+
+  void drawElements(int mode, int count, int type, double offset);
+
+  void enable(int cap);
+
+  void enableVertexAttribArray(int index);
+
+  void finish();
+
+  void flush();
+
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer);
+
+  void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level);
+
+  void frontFace(int mode);
+
+  void generateMipmap(int target);
+
+  WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index);
+
+  WebGLActiveInfo getActiveUniform(WebGLProgram program, int index);
+
+  Indexable getAttachedShaders(WebGLProgram program);
+
+  int getAttribLocation(WebGLProgram program, String name);
+
+  Object getBufferParameter(int target, int pname);
+
+  WebGLContextAttributes getContextAttributes();
+
+  int getError();
+
+  Object getExtension(String name);
+
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname);
+
+  Object getParameter(int pname);
+
+  String getProgramInfoLog(WebGLProgram program);
+
+  Object getProgramParameter(WebGLProgram program, int pname);
+
+  Object getRenderbufferParameter(int target, int pname);
+
+  String getShaderInfoLog(WebGLShader shader);
+
+  Object getShaderParameter(WebGLShader shader, int pname);
+
+  WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype);
+
+  String getShaderSource(WebGLShader shader);
+
+  Object getTexParameter(int target, int pname);
+
+  Object getUniform(WebGLProgram program, WebGLUniformLocation location);
+
+  WebGLUniformLocation getUniformLocation(WebGLProgram program, String name);
+
+  Object getVertexAttrib(int index, int pname);
+
+  double getVertexAttribOffset(int index, int pname);
+
+  void hint(int target, int mode);
+
+  boolean isBuffer(WebGLBuffer buffer);
+
+  boolean isContextLost();
+
+  boolean isEnabled(int cap);
+
+  boolean isFramebuffer(WebGLFramebuffer framebuffer);
+
+  boolean isProgram(WebGLProgram program);
+
+  boolean isRenderbuffer(WebGLRenderbuffer renderbuffer);
+
+  boolean isShader(WebGLShader shader);
+
+  boolean isTexture(WebGLTexture texture);
+
+  void lineWidth(float width);
+
+  void linkProgram(WebGLProgram program);
+
+  void pixelStorei(int pname, int param);
+
+  void polygonOffset(float factor, float units);
+
+  void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels);
+
+  void releaseShaderCompiler();
+
+  void renderbufferStorage(int target, int internalformat, int width, int height);
+
+  void sampleCoverage(float value, boolean invert);
+
+  void scissor(int x, int y, int width, int height);
+
+  void shaderSource(WebGLShader shader, String string);
+
+  void stencilFunc(int func, int ref, int mask);
+
+  void stencilFuncSeparate(int face, int func, int ref, int mask);
+
+  void stencilMask(int mask);
+
+  void stencilMaskSeparate(int face, int mask);
+
+  void stencilOp(int fail, int zfail, int zpass);
+
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass);
+
+  void texImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ArrayBufferView pixels);
+
+  void texImage2D(int target, int level, int internalformat, int format, int type, ImageData pixels);
+
+  void texImage2D(int target, int level, int internalformat, int format, int type, ImageElement image);
+
+  void texImage2D(int target, int level, int internalformat, int format, int type, CanvasElement canvas);
+
+  void texImage2D(int target, int level, int internalformat, int format, int type, VideoElement video);
+
+  void texParameterf(int target, int pname, float param);
+
+  void texParameteri(int target, int pname, int param);
+
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ArrayBufferView pixels);
+
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels);
+
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image);
+
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas);
+
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video);
+
+  void uniform1f(WebGLUniformLocation location, float x);
+
+  void uniform1fv(WebGLUniformLocation location, Float32Array v);
+
+  void uniform1i(WebGLUniformLocation location, int x);
+
+  void uniform1iv(WebGLUniformLocation location, Int32Array v);
+
+  void uniform2f(WebGLUniformLocation location, float x, float y);
+
+  void uniform2fv(WebGLUniformLocation location, Float32Array v);
+
+  void uniform2i(WebGLUniformLocation location, int x, int y);
+
+  void uniform2iv(WebGLUniformLocation location, Int32Array v);
+
+  void uniform3f(WebGLUniformLocation location, float x, float y, float z);
+
+  void uniform3fv(WebGLUniformLocation location, Float32Array v);
+
+  void uniform3i(WebGLUniformLocation location, int x, int y, int z);
+
+  void uniform3iv(WebGLUniformLocation location, Int32Array v);
+
+  void uniform4f(WebGLUniformLocation location, float x, float y, float z, float w);
+
+  void uniform4fv(WebGLUniformLocation location, Float32Array v);
+
+  void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w);
+
+  void uniform4iv(WebGLUniformLocation location, Int32Array v);
+
+  void uniformMatrix2fv(WebGLUniformLocation location, boolean transpose, Float32Array array);
+
+  void uniformMatrix3fv(WebGLUniformLocation location, boolean transpose, Float32Array array);
+
+  void uniformMatrix4fv(WebGLUniformLocation location, boolean transpose, Float32Array array);
+
+  void useProgram(WebGLProgram program);
+
+  void validateProgram(WebGLProgram program);
+
+  void vertexAttrib1f(int indx, float x);
+
+  void vertexAttrib1fv(int indx, Float32Array values);
+
+  void vertexAttrib2f(int indx, float x, float y);
+
+  void vertexAttrib2fv(int indx, Float32Array values);
+
+  void vertexAttrib3f(int indx, float x, float y, float z);
+
+  void vertexAttrib3fv(int indx, Float32Array values);
+
+  void vertexAttrib4f(int indx, float x, float y, float z, float w);
+
+  void vertexAttrib4fv(int indx, Float32Array values);
+
+  void vertexAttribPointer(int indx, int size, int type, boolean normalized, int stride, double offset);
+
+  void viewport(int x, int y, int width, int height);
+}
diff --git a/elemental/src/elemental/html/WebGLShader.java b/elemental/src/elemental/html/WebGLShader.java
new file mode 100644
index 0000000..ecd0d82
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLShader.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLShader {
+}
diff --git a/elemental/src/elemental/html/WebGLShaderPrecisionFormat.java b/elemental/src/elemental/html/WebGLShaderPrecisionFormat.java
new file mode 100644
index 0000000..afac55c
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLShaderPrecisionFormat.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLShaderPrecisionFormat {
+
+  int getPrecision();
+
+  int getRangeMax();
+
+  int getRangeMin();
+}
diff --git a/elemental/src/elemental/html/WebGLTexture.java b/elemental/src/elemental/html/WebGLTexture.java
new file mode 100644
index 0000000..71b3c1d
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLTexture.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLTexture {
+}
diff --git a/elemental/src/elemental/html/WebGLUniformLocation.java b/elemental/src/elemental/html/WebGLUniformLocation.java
new file mode 100644
index 0000000..41f26bd
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLUniformLocation.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLUniformLocation {
+}
diff --git a/elemental/src/elemental/html/WebGLVertexArrayObjectOES.java b/elemental/src/elemental/html/WebGLVertexArrayObjectOES.java
new file mode 100644
index 0000000..7d17331
--- /dev/null
+++ b/elemental/src/elemental/html/WebGLVertexArrayObjectOES.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WebGLVertexArrayObjectOES {
+}
diff --git a/elemental/src/elemental/html/WebSocket.java b/elemental/src/elemental/html/WebSocket.java
new file mode 100644
index 0000000..a911aa5
--- /dev/null
+++ b/elemental/src/elemental/html/WebSocket.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><p><strong>This is an experimental feature</strong><br>Because this feature is still in development in some browsers, check the <a href="#AutoCompatibilityTable">compatibility table</a> for the proper prefixes to use in various browsers.</p></div>
+<p></p>
+<p>The <code>WebSocket</code> object provides the API&nbsp;for creating and managing a <a title="en/WebSockets" rel="internal" href="https://developer.mozilla.org/en/WebSockets">WebSocket</a> connection to a server, as well as for sending and receiving data on the connection.</p>
+  */
+public interface WebSocket extends EventTarget {
+
+  /**
+    * The connection is closed or couldn't be opened.
+    */
+
+    static final int CLOSED = 3;
+
+  /**
+    * The connection is in the process of closing.
+    */
+
+    static final int CLOSING = 2;
+
+  /**
+    * The connection is not yet open.
+    */
+
+    static final int CONNECTING = 0;
+
+  /**
+    * The connection is open and ready to communicate.
+    */
+
+    static final int OPEN = 1;
+
+  String getURL();
+
+
+  /**
+    * A string indicating the type of binary data being transmitted by the connection. This should be either "blob"&nbsp;if DOM&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+&nbsp;objects are being used or "arraybuffer" if <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a> objects are being used.
+    */
+  String getBinaryType();
+
+  void setBinaryType(String arg);
+
+
+  /**
+    * The number of bytes of data that have been queued using calls to  but not yet transmitted to the network. This value does not reset to zero when the connection is closed; if you keep calling , this will continue to climb. <strong>Read only.</strong>
+    */
+  int getBufferedAmount();
+
+
+  /**
+    * The extensions selected by the server. This is currently only the empty string or a list of extensions as negotiated by the connection.
+    */
+  String getExtensions();
+
+
+  /**
+    * An event listener to be called when the WebSocket connection's <code>readyState</code> changes to <code>CLOSED</code>. The listener receives a <a title="en/WebSockets/WebSockets reference/CloseEvent" rel="internal" href="https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent"><code>CloseEvent</code></a> named "close".
+    */
+  EventListener getOnclose();
+
+  void setOnclose(EventListener arg);
+
+
+  /**
+    * An event listener to be called when an error occurs. This is a simple event named "error".
+    */
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+
+  /**
+    * An event listener to be called when a message is received from the server. The listener receives a <a title="en/WebSockets/WebSockets reference/MessageEvent" rel="internal" href="https://developer.mozilla.org/en/WebSockets/WebSockets_reference/MessageEvent"><code>MessageEvent</code></a> named "message".
+    */
+  EventListener getOnmessage();
+
+  void setOnmessage(EventListener arg);
+
+
+  /**
+    * An event listener to be called when the WebSocket connection's <code>readyState</code> changes to <code>OPEN</code>; this indicates that the connection is ready to send and receive data. The event is a simple one with the name "open".
+    */
+  EventListener getOnopen();
+
+  void setOnopen(EventListener arg);
+
+
+  /**
+    * A string indicating the name of the sub-protocol the server selected; this will be one of the strings specified in the <code>protocols</code> parameter when creating the WebSocket object.
+    */
+  String getProtocol();
+
+
+  /**
+    * The current state of the connection; this is one of the <a rel="custom" href="https://developer.mozilla.org/en/WebSockets/WebSockets_reference/WebSocket#Ready_state_constants">Ready state constants</a>. <strong>Read only.</strong>
+    */
+  int getReadyState();
+
+
+  /**
+    * The URL&nbsp;as resolved by the constructor. This is always an absolute URL. <strong>Read only.</strong>
+    */
+  String getUrl();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+
+  /**
+    * <p>Closes the WebSocket connection or connection attempt, if any. If the connection is already <code>CLOSED</code>, this method does nothing.</p>
+
+<div id="section_7"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>code</code> 
+<span title="">Optional</span>
+</dt> <dd>A numeric value indicating the status code explaining why the connection is being closed. If this parameter is not specified, a default value of 1000 (indicating a normal "transaction complete"&nbsp;closure)&nbsp;is assumed. See the <a title="en/WebSockets/WebSockets reference/CloseEvent#Status codes" rel="internal" href="https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent#Status_codes">list of status codes</a> on the <a title="en/WebSockets/WebSockets reference/CloseEvent" rel="internal" href="https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent"><code>CloseEvent</code></a> page for permitted values.</dd> <dt><code>reason</code> 
+<span title="">Optional</span>
+</dt> <dd>A human-readable string explaining why the connection is closing. This string must be no longer than 123 UTF-8 characters.</dd>
+</dl>
+</div><div id="section_8"><span id="Exceptions_thrown"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INVALID_ACCESS_ERR</code></dt> <dd>An invalid <code>code</code> was specified.</dd> <dt><code>SYNTAX_ERR</code></dt> <dd>The <code>reason</code> string is too long or contains unpaired surrogates.</dd>
+</dl>
+</div>
+    */
+  void close();
+
+
+  /**
+    * <p>Closes the WebSocket connection or connection attempt, if any. If the connection is already <code>CLOSED</code>, this method does nothing.</p>
+
+<div id="section_7"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>code</code> 
+<span title="">Optional</span>
+</dt> <dd>A numeric value indicating the status code explaining why the connection is being closed. If this parameter is not specified, a default value of 1000 (indicating a normal "transaction complete"&nbsp;closure)&nbsp;is assumed. See the <a title="en/WebSockets/WebSockets reference/CloseEvent#Status codes" rel="internal" href="https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent#Status_codes">list of status codes</a> on the <a title="en/WebSockets/WebSockets reference/CloseEvent" rel="internal" href="https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent"><code>CloseEvent</code></a> page for permitted values.</dd> <dt><code>reason</code> 
+<span title="">Optional</span>
+</dt> <dd>A human-readable string explaining why the connection is closing. This string must be no longer than 123 UTF-8 characters.</dd>
+</dl>
+</div><div id="section_8"><span id="Exceptions_thrown"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INVALID_ACCESS_ERR</code></dt> <dd>An invalid <code>code</code> was specified.</dd> <dt><code>SYNTAX_ERR</code></dt> <dd>The <code>reason</code> string is too long or contains unpaired surrogates.</dd>
+</dl>
+</div>
+    */
+  void close(int code);
+
+
+  /**
+    * <p>Closes the WebSocket connection or connection attempt, if any. If the connection is already <code>CLOSED</code>, this method does nothing.</p>
+
+<div id="section_7"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>code</code> 
+<span title="">Optional</span>
+</dt> <dd>A numeric value indicating the status code explaining why the connection is being closed. If this parameter is not specified, a default value of 1000 (indicating a normal "transaction complete"&nbsp;closure)&nbsp;is assumed. See the <a title="en/WebSockets/WebSockets reference/CloseEvent#Status codes" rel="internal" href="https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent#Status_codes">list of status codes</a> on the <a title="en/WebSockets/WebSockets reference/CloseEvent" rel="internal" href="https://developer.mozilla.org/en/WebSockets/WebSockets_reference/CloseEvent"><code>CloseEvent</code></a> page for permitted values.</dd> <dt><code>reason</code> 
+<span title="">Optional</span>
+</dt> <dd>A human-readable string explaining why the connection is closing. This string must be no longer than 123 UTF-8 characters.</dd>
+</dl>
+</div><div id="section_8"><span id="Exceptions_thrown"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INVALID_ACCESS_ERR</code></dt> <dd>An invalid <code>code</code> was specified.</dd> <dt><code>SYNTAX_ERR</code></dt> <dd>The <code>reason</code> string is too long or contains unpaired surrogates.</dd>
+</dl>
+</div>
+    */
+  void close(int code, String reason);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+
+  /**
+    * <p>Transmits data to the server over the WebSocket connection.</p>
+
+<div id="section_11"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>data</code></dt> <dd>A text string to send to the server.</dd>
+</dl>
+</div><div id="section_12"><span id="Exceptions_thrown_2"></span><h6 class="editable">Exceptions thrown</h6>
+<dl> <dt><code>INVALID_STATE_ERR</code></dt> <dd>The connection is not currently <code>OPEN</code>.</dd> <dt><code>SYNTAX_ERR</code></dt> <dd>The data is a string that has unpaired surrogates.</dd>
+</dl>
+</div><div id="section_13"><span id="Remarks"></span><h6 class="editable">Remarks</h6>
+<div class="geckoVersionNote"> <p>
+</p><div class="geckoVersionHeading">Gecko 6.0 note<div>(Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)
+</div></div>
+<p></p> <p>Gecko's implementation of the <code>send()</code>&nbsp;method differs somewhat from the specification in Gecko 6.0; Gecko returns a <code>boolean</code> indicating whether or not the connection is still open (and, by extension, that the data was successfully queued or transmitted); this is corrected in Gecko 8.0 (Firefox 8.0 / Thunderbird 8.0 / SeaMonkey 2.5)
+. In addition, at this time, Gecko does not support <code><a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer">ArrayBuffer</a></code> or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+ data types.</p>
+</div>
+</div>
+    */
+  boolean send(String data);
+}
diff --git a/elemental/src/elemental/html/Window.java b/elemental/src/elemental/html/Window.java
new file mode 100644
index 0000000..075377e
--- /dev/null
+++ b/elemental/src/elemental/html/Window.java
@@ -0,0 +1,670 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.Node;
+import elemental.dom.Element;
+import elemental.util.Indexable;
+import elemental.events.EventTarget;
+import elemental.dom.RequestAnimationFrameCallback;
+import elemental.css.CSSRuleList;
+import elemental.events.EventListener;
+import elemental.dom.TimeoutHandler;
+import elemental.dom.Document;
+import elemental.css.CSSStyleDeclaration;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+import elemental.xpath.*;
+import elemental.xml.*;
+
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface Window extends EventTarget {
+  void clearOpener();
+
+    static final int PERSISTENT = 1;
+
+    static final int TEMPORARY = 0;
+
+  ApplicationCache getApplicationCache();
+
+  Navigator getClientInformation();
+
+  boolean isClosed();
+
+  Console getConsole();
+
+  Crypto getCrypto();
+
+  String getDefaultStatus();
+
+  void setDefaultStatus(String arg);
+
+  String getDefaultstatus();
+
+  void setDefaultstatus(String arg);
+
+  double getDevicePixelRatio();
+
+  Document getDocument();
+
+  Event getEvent();
+
+  Element getFrameElement();
+
+  Window getFrames();
+
+  History getHistory();
+
+  int getInnerHeight();
+
+  int getInnerWidth();
+
+  int getLength();
+
+  Storage getLocalStorage();
+
+  Location getLocation();
+
+  void setLocation(Location arg);
+
+  BarProp getLocationbar();
+
+  BarProp getMenubar();
+
+  String getName();
+
+  void setName(String arg);
+
+  Navigator getNavigator();
+
+  boolean isOffscreenBuffering();
+
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+  EventListener getOnbeforeunload();
+
+  void setOnbeforeunload(EventListener arg);
+
+  EventListener getOnblur();
+
+  void setOnblur(EventListener arg);
+
+  EventListener getOncanplay();
+
+  void setOncanplay(EventListener arg);
+
+  EventListener getOncanplaythrough();
+
+  void setOncanplaythrough(EventListener arg);
+
+  EventListener getOnchange();
+
+  void setOnchange(EventListener arg);
+
+  EventListener getOnclick();
+
+  void setOnclick(EventListener arg);
+
+  EventListener getOncontextmenu();
+
+  void setOncontextmenu(EventListener arg);
+
+  EventListener getOndblclick();
+
+  void setOndblclick(EventListener arg);
+
+  EventListener getOndevicemotion();
+
+  void setOndevicemotion(EventListener arg);
+
+  EventListener getOndeviceorientation();
+
+  void setOndeviceorientation(EventListener arg);
+
+  EventListener getOndrag();
+
+  void setOndrag(EventListener arg);
+
+  EventListener getOndragend();
+
+  void setOndragend(EventListener arg);
+
+  EventListener getOndragenter();
+
+  void setOndragenter(EventListener arg);
+
+  EventListener getOndragleave();
+
+  void setOndragleave(EventListener arg);
+
+  EventListener getOndragover();
+
+  void setOndragover(EventListener arg);
+
+  EventListener getOndragstart();
+
+  void setOndragstart(EventListener arg);
+
+  EventListener getOndrop();
+
+  void setOndrop(EventListener arg);
+
+  EventListener getOndurationchange();
+
+  void setOndurationchange(EventListener arg);
+
+  EventListener getOnemptied();
+
+  void setOnemptied(EventListener arg);
+
+  EventListener getOnended();
+
+  void setOnended(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnfocus();
+
+  void setOnfocus(EventListener arg);
+
+  EventListener getOnhashchange();
+
+  void setOnhashchange(EventListener arg);
+
+  EventListener getOninput();
+
+  void setOninput(EventListener arg);
+
+  EventListener getOninvalid();
+
+  void setOninvalid(EventListener arg);
+
+  EventListener getOnkeydown();
+
+  void setOnkeydown(EventListener arg);
+
+  EventListener getOnkeypress();
+
+  void setOnkeypress(EventListener arg);
+
+  EventListener getOnkeyup();
+
+  void setOnkeyup(EventListener arg);
+
+  EventListener getOnload();
+
+  void setOnload(EventListener arg);
+
+  EventListener getOnloadeddata();
+
+  void setOnloadeddata(EventListener arg);
+
+  EventListener getOnloadedmetadata();
+
+  void setOnloadedmetadata(EventListener arg);
+
+  EventListener getOnloadstart();
+
+  void setOnloadstart(EventListener arg);
+
+  EventListener getOnmessage();
+
+  void setOnmessage(EventListener arg);
+
+  EventListener getOnmousedown();
+
+  void setOnmousedown(EventListener arg);
+
+  EventListener getOnmousemove();
+
+  void setOnmousemove(EventListener arg);
+
+  EventListener getOnmouseout();
+
+  void setOnmouseout(EventListener arg);
+
+  EventListener getOnmouseover();
+
+  void setOnmouseover(EventListener arg);
+
+  EventListener getOnmouseup();
+
+  void setOnmouseup(EventListener arg);
+
+  EventListener getOnmousewheel();
+
+  void setOnmousewheel(EventListener arg);
+
+  EventListener getOnoffline();
+
+  void setOnoffline(EventListener arg);
+
+  EventListener getOnonline();
+
+  void setOnonline(EventListener arg);
+
+  EventListener getOnpagehide();
+
+  void setOnpagehide(EventListener arg);
+
+  EventListener getOnpageshow();
+
+  void setOnpageshow(EventListener arg);
+
+  EventListener getOnpause();
+
+  void setOnpause(EventListener arg);
+
+  EventListener getOnplay();
+
+  void setOnplay(EventListener arg);
+
+  EventListener getOnplaying();
+
+  void setOnplaying(EventListener arg);
+
+  EventListener getOnpopstate();
+
+  void setOnpopstate(EventListener arg);
+
+  EventListener getOnprogress();
+
+  void setOnprogress(EventListener arg);
+
+  EventListener getOnratechange();
+
+  void setOnratechange(EventListener arg);
+
+  EventListener getOnreset();
+
+  void setOnreset(EventListener arg);
+
+  EventListener getOnresize();
+
+  void setOnresize(EventListener arg);
+
+  EventListener getOnscroll();
+
+  void setOnscroll(EventListener arg);
+
+  EventListener getOnsearch();
+
+  void setOnsearch(EventListener arg);
+
+  EventListener getOnseeked();
+
+  void setOnseeked(EventListener arg);
+
+  EventListener getOnseeking();
+
+  void setOnseeking(EventListener arg);
+
+  EventListener getOnselect();
+
+  void setOnselect(EventListener arg);
+
+  EventListener getOnstalled();
+
+  void setOnstalled(EventListener arg);
+
+  EventListener getOnstorage();
+
+  void setOnstorage(EventListener arg);
+
+  EventListener getOnsubmit();
+
+  void setOnsubmit(EventListener arg);
+
+  EventListener getOnsuspend();
+
+  void setOnsuspend(EventListener arg);
+
+  EventListener getOntimeupdate();
+
+  void setOntimeupdate(EventListener arg);
+
+  EventListener getOntouchcancel();
+
+  void setOntouchcancel(EventListener arg);
+
+  EventListener getOntouchend();
+
+  void setOntouchend(EventListener arg);
+
+  EventListener getOntouchmove();
+
+  void setOntouchmove(EventListener arg);
+
+  EventListener getOntouchstart();
+
+  void setOntouchstart(EventListener arg);
+
+  EventListener getOnunload();
+
+  void setOnunload(EventListener arg);
+
+  EventListener getOnvolumechange();
+
+  void setOnvolumechange(EventListener arg);
+
+  EventListener getOnwaiting();
+
+  void setOnwaiting(EventListener arg);
+
+  EventListener getOnwebkitanimationend();
+
+  void setOnwebkitanimationend(EventListener arg);
+
+  EventListener getOnwebkitanimationiteration();
+
+  void setOnwebkitanimationiteration(EventListener arg);
+
+  EventListener getOnwebkitanimationstart();
+
+  void setOnwebkitanimationstart(EventListener arg);
+
+  EventListener getOnwebkittransitionend();
+
+  void setOnwebkittransitionend(EventListener arg);
+
+  Window getOpener();
+
+  int getOuterHeight();
+
+  int getOuterWidth();
+
+  PagePopupController getPagePopupController();
+
+  int getPageXOffset();
+
+  int getPageYOffset();
+
+  Window getParent();
+
+  Performance getPerformance();
+
+  BarProp getPersonalbar();
+
+  Screen getScreen();
+
+  int getScreenLeft();
+
+  int getScreenTop();
+
+  int getScreenX();
+
+  int getScreenY();
+
+  int getScrollX();
+
+  int getScrollY();
+
+  BarProp getScrollbars();
+
+  Window getSelf();
+
+  Storage getSessionStorage();
+
+  String getStatus();
+
+  void setStatus(String arg);
+
+  BarProp getStatusbar();
+
+  StyleMedia getStyleMedia();
+
+  BarProp getToolbar();
+
+  Window getTop();
+
+  IDBFactory getWebkitIndexedDB();
+
+  NotificationCenter getWebkitNotifications();
+
+  StorageInfo getWebkitStorageInfo();
+
+  Window getWindow();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  void alert(String message);
+
+  String atob(String string);
+
+  void blur();
+
+  String btoa(String string);
+
+  void captureEvents();
+
+  void clearInterval(int handle);
+
+  void clearTimeout(int handle);
+
+  void close();
+
+  boolean confirm(String message);
+
+  boolean dispatchEvent(Event evt);
+
+  boolean find(String string, boolean caseSensitive, boolean backwards, boolean wrap, boolean wholeWord, boolean searchInFrames, boolean showDialog);
+
+  void focus();
+
+  CSSStyleDeclaration getComputedStyle(Element element, String pseudoElement);
+
+  CSSRuleList getMatchedCSSRules(Element element, String pseudoElement);
+
+  Selection getSelection();
+
+  MediaQueryList matchMedia(String query);
+
+  void moveBy(float x, float y);
+
+  void moveTo(float x, float y);
+
+  Window open(String url, String name);
+
+  Window open(String url, String name, String options);
+
+  Database openDatabase(String name, String version, String displayName, int estimatedSize, DatabaseCallback creationCallback);
+
+  Database openDatabase(String name, String version, String displayName, int estimatedSize);
+
+  void postMessage(Object message, String targetOrigin);
+
+  void postMessage(Object message, String targetOrigin, Indexable messagePorts);
+
+  void print();
+
+  String prompt(String message, String defaultValue);
+
+  void releaseEvents();
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  void resizeBy(float x, float y);
+
+  void resizeTo(float width, float height);
+
+  void scroll(int x, int y);
+
+  void scrollBy(int x, int y);
+
+  void scrollTo(int x, int y);
+
+  int setInterval(TimeoutHandler handler, int timeout);
+
+  int setTimeout(TimeoutHandler handler, int timeout);
+
+  Object showModalDialog(String url);
+
+  Object showModalDialog(String url, Object dialogArgs);
+
+  Object showModalDialog(String url, Object dialogArgs, String featureArgs);
+
+  void stop();
+
+  void webkitCancelAnimationFrame(int id);
+
+  void webkitCancelRequestAnimationFrame(int id);
+
+  Point webkitConvertPointFromNodeToPage(Node node, Point p);
+
+  Point webkitConvertPointFromPageToNode(Node node, Point p);
+
+  void webkitPostMessage(Object message, String targetOrigin);
+
+  void webkitPostMessage(Object message, String targetOrigin, Indexable transferList);
+
+  int webkitRequestAnimationFrame(RequestAnimationFrameCallback callback);
+
+  void webkitRequestFileSystem(int type, double size, FileSystemCallback successCallback, ErrorCallback errorCallback);
+
+  void webkitRequestFileSystem(int type, double size, FileSystemCallback successCallback);
+
+  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback);
+
+  void webkitResolveLocalFileSystemURL(String url);
+
+  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, ErrorCallback errorCallback);
+
+  AudioElement newAudioElement(String src);
+
+  CSSMatrix newCSSMatrix(String cssValue);
+
+  DOMParser newDOMParser();
+
+  DOMURL newDOMURL();
+
+  DeprecatedPeerConnection newDeprecatedPeerConnection(String serverConfiguration, SignalingCallback signalingCallback);
+
+  EventSource newEventSource(String scriptUrl);
+
+  FileReader newFileReader();
+
+  FileReaderSync newFileReaderSync();
+
+  Float32Array newFloat32Array(int length);
+
+  Float32Array newFloat32Array(IndexableNumber list);
+
+  Float32Array newFloat32Array(ArrayBuffer buffer, int byteOffset, int length);
+
+  Float64Array newFloat64Array(int length);
+
+  Float64Array newFloat64Array(IndexableNumber list);
+
+  Float64Array newFloat64Array(ArrayBuffer buffer, int byteOffset, int length);
+
+  IceCandidate newIceCandidate(String label, String candidateLine);
+
+  Int16Array newInt16Array(int length);
+
+  Int16Array newInt16Array(IndexableNumber list);
+
+  Int16Array newInt16Array(ArrayBuffer buffer, int byteOffset, int length);
+
+  Int32Array newInt32Array(int length);
+
+  Int32Array newInt32Array(IndexableNumber list);
+
+  Int32Array newInt32Array(ArrayBuffer buffer, int byteOffset, int length);
+
+  Int8Array newInt8Array(int length);
+
+  Int8Array newInt8Array(IndexableNumber list);
+
+  Int8Array newInt8Array(ArrayBuffer buffer, int byteOffset, int length);
+
+  MediaController newMediaController();
+
+  MediaStream newMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks);
+
+  MessageChannel newMessageChannel();
+
+  Notification newNotification(String title, Mappable options);
+
+  OptionElement newOptionElement(String data, String value, boolean defaultSelected, boolean selected);
+
+  PeerConnection00 newPeerConnection00(String serverConfiguration, IceCallback iceCallback);
+
+  SessionDescription newSessionDescription(String sdp);
+
+  ShadowRoot newShadowRoot(Element host);
+
+  SharedWorker newSharedWorker(String scriptURL, String name);
+
+  SpeechGrammar newSpeechGrammar();
+
+  SpeechGrammarList newSpeechGrammarList();
+
+  SpeechRecognition newSpeechRecognition();
+
+  TextTrackCue newTextTrackCue(String id, double startTime, double endTime, String text, String settings, boolean pauseOnExit);
+
+  Uint16Array newUint16Array(int length);
+
+  Uint16Array newUint16Array(IndexableNumber list);
+
+  Uint16Array newUint16Array(ArrayBuffer buffer, int byteOffset, int length);
+
+  Uint32Array newUint32Array(int length);
+
+  Uint32Array newUint32Array(IndexableNumber list);
+
+  Uint32Array newUint32Array(ArrayBuffer buffer, int byteOffset, int length);
+
+  Uint8Array newUint8Array(int length);
+
+  Uint8Array newUint8Array(IndexableNumber list);
+
+  Uint8Array newUint8Array(ArrayBuffer buffer, int byteOffset, int length);
+
+  Uint8ClampedArray newUint8ClampedArray(int length);
+
+  Uint8ClampedArray newUint8ClampedArray(IndexableNumber list);
+
+  Uint8ClampedArray newUint8ClampedArray(ArrayBuffer buffer, int byteOffset, int length);
+
+  Worker newWorker(String scriptUrl);
+
+  XMLHttpRequest newXMLHttpRequest();
+
+  XMLSerializer newXMLSerializer();
+
+  XPathEvaluator newXPathEvaluator();
+
+  XSLTProcessor newXSLTProcessor();
+}
diff --git a/elemental/src/elemental/html/Worker.java b/elemental/src/elemental/html/Worker.java
new file mode 100644
index 0000000..79eff0c
--- /dev/null
+++ b/elemental/src/elemental/html/Worker.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.util.Indexable;
+import elemental.events.EventListener;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>Workers are background tasks that can be easily created and can send messages back to their creators. Creating a worker is as simple as calling the <code>Worker()</code>&nbsp;constructor, specifying a script to be run in the worker thread.</p>
+<p>Of note is the fact that workers may in turn spawn new workers as long as those workers are hosted within the same origin as the parent page.&nbsp; In addition, workers may use <a title="En/XMLHttpRequest" class="internal" rel="internal" href="https://developer.mozilla.org/en/DOM/XMLHttpRequest"><code>XMLHttpRequest</code></a> for network I/O, with the exception that the <code>responseXML</code> and <code>channel</code> attributes on <code>XMLHttpRequest</code> always return <code>null</code>.</p>
+<p>For a list of global functions available to workers, see <a title="En/DOM/Worker/Functions available to workers" rel="internal" href="https://developer.mozilla.org/En/DOM/Worker/Functions_available_to_workers">Functions available to workers</a>.</p>
+<div class="geckoVersionNote">
+<p>
+</p><div class="geckoVersionHeading">Gecko 2.0 note<div>(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+</div></div>
+<p></p>
+<p>If you want to use workers in extensions, and would like to have access to <a title="en/js-ctypes" rel="internal" href="https://developer.mozilla.org/en/js-ctypes">js-ctypes</a>, you should use the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/ChromeWorker">ChromeWorker</a></code>
+ object instead.</p>
+</div>
+<p>See <a class="internal" title="en/Using DOM workers" rel="internal" href="https://developer.mozilla.org/En/Using_web_workers">Using web workers</a> for examples and details.</p>
+  */
+public interface Worker extends AbstractWorker {
+
+
+  /**
+    * An event listener that is called whenever a <code>MessageEvent</code> with type <code>message</code> bubbles through the worker. The message is stored in the event's <code>data</code> member.
+    */
+  EventListener getOnmessage();
+
+  void setOnmessage(EventListener arg);
+
+
+  /**
+    * <p>Sends a message to the worker's inner scope. This accepts a single parameter, which is the data to send to the worker. The data may be any value or JavaScript object that does not contain functions or cyclical references (since the object is converted to <a class="internal" title="En/JSON" rel="internal" href="https://developer.mozilla.org/en/JSON">JSON</a> internally).</p>
+
+<div id="section_10"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>aMessage<br> </code></dt> <dd>The object to deliver to the worker; this will be in the data field in the event delivered to the <code>onmessage</code> handler. This may be any value or JavaScript object that does not contain functions or cyclical references (since the object is converted to <a class="internal" title="En/JSON" rel="internal" href="https://developer.mozilla.org/en/JSON">JSON</a> internally).</dd>
+</dl>
+</div>
+    */
+  void postMessage(Object message);
+
+
+  /**
+    * <p>Sends a message to the worker's inner scope. This accepts a single parameter, which is the data to send to the worker. The data may be any value or JavaScript object that does not contain functions or cyclical references (since the object is converted to <a class="internal" title="En/JSON" rel="internal" href="https://developer.mozilla.org/en/JSON">JSON</a> internally).</p>
+
+<div id="section_10"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>aMessage<br> </code></dt> <dd>The object to deliver to the worker; this will be in the data field in the event delivered to the <code>onmessage</code> handler. This may be any value or JavaScript object that does not contain functions or cyclical references (since the object is converted to <a class="internal" title="En/JSON" rel="internal" href="https://developer.mozilla.org/en/JSON">JSON</a> internally).</dd>
+</dl>
+</div>
+    */
+  void postMessage(Object message, Indexable messagePorts);
+
+
+  /**
+    * <p>Immediately terminates the worker. This does not offer the worker an opportunity to finish its operations; it is simply stopped at once.</p>
+<pre>void terminate();
+</pre>
+    */
+  void terminate();
+
+  void webkitPostMessage(Object message);
+
+  void webkitPostMessage(Object message, Indexable messagePorts);
+}
diff --git a/elemental/src/elemental/html/WorkerGlobalScope.java b/elemental/src/elemental/html/WorkerGlobalScope.java
new file mode 100644
index 0000000..9982cbf
--- /dev/null
+++ b/elemental/src/elemental/html/WorkerGlobalScope.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+import elemental.dom.TimeoutHandler;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WorkerGlobalScope extends EventTarget {
+
+    static final int PERSISTENT = 1;
+
+    static final int TEMPORARY = 0;
+
+  WorkerLocation getLocation();
+
+  WorkerNavigator getNavigator();
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  WorkerGlobalScope getSelf();
+
+  IDBFactory getWebkitIndexedDB();
+
+  NotificationCenter getWebkitNotifications();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  void clearInterval(int handle);
+
+  void clearTimeout(int handle);
+
+  void close();
+
+  boolean dispatchEvent(Event evt);
+
+  void importScripts();
+
+  Database openDatabase(String name, String version, String displayName, int estimatedSize, DatabaseCallback creationCallback);
+
+  Database openDatabase(String name, String version, String displayName, int estimatedSize);
+
+  DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, DatabaseCallback creationCallback);
+
+  DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+  int setInterval(TimeoutHandler handler, int timeout);
+
+  int setTimeout(TimeoutHandler handler, int timeout);
+
+  void webkitRequestFileSystem(int type, double size, FileSystemCallback successCallback, ErrorCallback errorCallback);
+
+  void webkitRequestFileSystem(int type, double size, FileSystemCallback successCallback);
+
+  void webkitRequestFileSystem(int type, double size);
+
+  DOMFileSystemSync webkitRequestFileSystemSync(int type, double size);
+
+  EntrySync webkitResolveLocalFileSystemSyncURL(String url);
+
+  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback);
+
+  void webkitResolveLocalFileSystemURL(String url);
+
+  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, ErrorCallback errorCallback);
+}
diff --git a/elemental/src/elemental/html/WorkerLocation.java b/elemental/src/elemental/html/WorkerLocation.java
new file mode 100644
index 0000000..d2d97c1
--- /dev/null
+++ b/elemental/src/elemental/html/WorkerLocation.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WorkerLocation {
+
+  String getHash();
+
+  String getHost();
+
+  String getHostname();
+
+  String getHref();
+
+  String getPathname();
+
+  String getPort();
+
+  String getProtocol();
+
+  String getSearch();
+}
diff --git a/elemental/src/elemental/html/WorkerNavigator.java b/elemental/src/elemental/html/WorkerNavigator.java
new file mode 100644
index 0000000..a0b57a8
--- /dev/null
+++ b/elemental/src/elemental/html/WorkerNavigator.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface WorkerNavigator {
+
+  String getAppName();
+
+  String getAppVersion();
+
+  boolean isOnLine();
+
+  String getPlatform();
+
+  String getUserAgent();
+}
diff --git a/elemental/src/elemental/js/JsBrowser.java b/elemental/src/elemental/js/JsBrowser.java
new file mode 100755
index 0000000..553b10c
--- /dev/null
+++ b/elemental/src/elemental/js/JsBrowser.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js;
+
+import com.google.gwt.core.client.GWT;
+
+import elemental.client.Browser;
+import elemental.html.Navigator;
+import elemental.js.dom.JsDocument;
+import elemental.js.html.JsWindow;
+
+/**
+ * JavaScript native implementation of {@link elemental.client.Browser}.
+ */
+public class JsBrowser {
+  /**
+   * A {@link Browser.Info} implementation for when the browser is known to be
+   * Gecko at compile time.
+   */
+  @SuppressWarnings("unused")
+  private static class InfoWhenKnownGecko extends InfoWhenUnknown {
+    @Override
+    public boolean isGecko() {
+      return true;
+    }
+
+    @Override
+    public boolean isSupported() {
+      return true;
+    }
+
+    @Override
+    public boolean isWebKit() {
+      return false;
+    }
+  }
+
+  /**
+   * A {@link Browser.Info} implementation for when the browser is known to be
+   * Unsupported at compile time.
+   */
+  @SuppressWarnings("unused")
+  private static class InfoWhenKnownUnsupported extends InfoWhenUnknown {
+    @Override
+    public boolean isGecko() {
+      return false;
+    }
+
+    @Override
+    public boolean isSupported() {
+      return false;
+    }
+
+    @Override
+    public boolean isWebKit() {
+      return false;
+    }
+  }
+
+  /**
+   * A {@link Browser.Info} implementation for when the browser is known to be
+   * WebKit at compile time.
+   */
+  @SuppressWarnings("unused")
+  private static class InfoWhenKnownWebKit extends InfoWhenUnknown {
+    @Override
+    public boolean isGecko() {
+      return false;
+    }
+
+    @Override
+    public boolean isSupported() {
+      return true;
+    }
+
+    @Override
+    public boolean isWebKit() {
+      return true;
+    }
+  }
+
+  /**
+   * A {@link Browser.Info} implementation for when the browser is not known
+   * until runtime.
+   *
+   * <p>
+   * Careful Captain! All those static fields are intentional. In order to
+   * ensure good dead stripping of the entire InfoWhen class hierarchy, the
+   * instance returned by {@link JsBrowser#getInfo()} must not be aliased, so it
+   * instead returns a fly-weight instance referencing static fields.
+   * </p>
+   */
+  private static class InfoWhenUnknown implements Browser.Info {
+    private native static double getGeckoVersion(String userAgent) /*-{
+      var r = / rv\:(\d+\.\d+)/.exec(userAgent);
+      return r ? parseFloat(r[1]) : 0.0;
+    }-*/;
+
+    private native static String getProduct(Navigator nav) /*-{
+      return nav.product;
+    }-*/;
+
+    private native static double getWebKitVersion(String userAgent) /*-{
+      var r = /WebKit\/(\d+\.\d+)/.exec(userAgent);
+      return r ? parseFloat(r[1]) : 0.0;
+    }-*/;
+
+    private static boolean browserDetected;
+
+    private static boolean platformDetected;
+
+    private static boolean isWebKit;
+
+    private static boolean isGecko;
+
+    private static boolean isMac;
+
+    private static boolean isWindows;
+
+    private static boolean isLinux;
+
+    private void ensurePlatformDetected() {
+      if (!platformDetected) {
+        platformDetected = true;
+        final String userAgent = getWindow().getNavigator().getUserAgent();
+        isWindows = userAgent.indexOf("Win") >= 0;
+        if (isWindows) {
+          return;
+        }
+
+        isMac = userAgent.indexOf("Mac") >= 0;
+        if (isMac) {
+          return;
+        }
+
+        isLinux = userAgent.indexOf("Linux") >= 0;
+      }
+    }
+
+    private void ensureBrowserDetected() {
+      if (!browserDetected) {
+        browserDetected = true;
+        final Navigator nav = getWindow().getNavigator();
+        final String ua = nav.getUserAgent();
+        boolean isWebKitBased = ua.indexOf("WebKit") >= 0;
+        if (isWebKitBased) {
+          isWebKit = getWebKitVersion(ua) >= SUPPORTED_WEBKIT_VERSION;
+          return;
+        }
+
+        assert !isWebKitBased;
+        isGecko = getProduct(nav).equals("Gecko") && getGeckoVersion(ua) >= SUPPORTED_GECKO_VERSION;
+      }
+    }
+
+    @Override
+    public boolean isGecko() {
+      ensureBrowserDetected();
+      return isGecko;
+    }
+
+    @Override
+    public boolean isSupported() {
+      ensureBrowserDetected();
+      return isGecko || isWebKit;
+    }
+
+    @Override
+    public boolean isWebKit() {
+      ensureBrowserDetected();
+      return isWebKit;
+    }
+
+    @Override
+    public boolean isLinux() {
+      ensurePlatformDetected();
+      return isLinux;
+    }
+
+    @Override
+    public boolean isMac() {
+      ensurePlatformDetected();
+      return isMac;
+    }
+
+    public boolean isWindows() {
+      ensurePlatformDetected();
+      return isWindows;
+    }
+  }
+
+  /**
+   * The minimum version of WebKit that is supported.
+   *
+   * This equates to >= Safari 5.0.2
+   */
+  private static final double SUPPORTED_WEBKIT_VERSION = 533.18;
+
+  /**
+   * The minimum version of Gecko that is supported.
+   *
+   * This equates to >= Firefox 4.0
+   */
+  private static final double SUPPORTED_GECKO_VERSION = 2.0;
+
+  /**
+   * Gets the document within which this script is running.
+   */
+  public static native JsDocument getDocument() /*-{
+    return $doc;
+  }-*/;
+
+  public static Browser.Info getInfo() {
+    return GWT.create(InfoWhenUnknown.class);
+  }
+
+  /**
+   * Gets the window within which this script is running.
+   */
+  public static native JsWindow getWindow() /*-{
+    return $wnd;
+  }-*/;
+
+  // Non-instantiable.
+  private JsBrowser() {
+  }
+}
diff --git a/elemental/src/elemental/js/css/JsCSSCharsetRule.java b/elemental/src/elemental/js/css/JsCSSCharsetRule.java
new file mode 100644
index 0000000..bd0280f
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSCharsetRule.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSCharsetRule;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSCharsetRule extends JsCSSRule  implements CSSCharsetRule {
+  protected JsCSSCharsetRule() {}
+
+  public final native String getEncoding() /*-{
+    return this.encoding;
+  }-*/;
+
+  public final native void setEncoding(String param_encoding) /*-{
+    this.encoding = param_encoding;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSFontFaceRule.java b/elemental/src/elemental/js/css/JsCSSFontFaceRule.java
new file mode 100644
index 0000000..3225e5a
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSFontFaceRule.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSFontFaceRule;
+import elemental.css.CSSStyleDeclaration;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSFontFaceRule extends JsCSSRule  implements CSSFontFaceRule {
+  protected JsCSSFontFaceRule() {}
+
+  public final native JsCSSStyleDeclaration getStyle() /*-{
+    return this.style;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSImportRule.java b/elemental/src/elemental/js/css/JsCSSImportRule.java
new file mode 100644
index 0000000..b89920e
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSImportRule.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.js.stylesheets.JsMediaList;
+import elemental.css.CSSImportRule;
+import elemental.css.CSSStyleSheet;
+import elemental.stylesheets.MediaList;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSImportRule extends JsCSSRule  implements CSSImportRule {
+  protected JsCSSImportRule() {}
+
+  public final native String getHref() /*-{
+    return this.href;
+  }-*/;
+
+  public final native JsMediaList getMedia() /*-{
+    return this.media;
+  }-*/;
+
+  public final native JsCSSStyleSheet getStyleSheet() /*-{
+    return this.styleSheet;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSKeyframeRule.java b/elemental/src/elemental/js/css/JsCSSKeyframeRule.java
new file mode 100644
index 0000000..cdf32b6
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSKeyframeRule.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSKeyframeRule;
+import elemental.css.CSSStyleDeclaration;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSKeyframeRule extends JsCSSRule  implements CSSKeyframeRule {
+  protected JsCSSKeyframeRule() {}
+
+  public final native String getKeyText() /*-{
+    return this.keyText;
+  }-*/;
+
+  public final native void setKeyText(String param_keyText) /*-{
+    this.keyText = param_keyText;
+  }-*/;
+
+  public final native JsCSSStyleDeclaration getStyle() /*-{
+    return this.style;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSKeyframesRule.java b/elemental/src/elemental/js/css/JsCSSKeyframesRule.java
new file mode 100644
index 0000000..33f18e9
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSKeyframesRule.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSKeyframesRule;
+import elemental.css.CSSRule;
+import elemental.css.CSSKeyframeRule;
+import elemental.css.CSSRuleList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSKeyframesRule extends JsCSSRule  implements CSSKeyframesRule {
+  protected JsCSSKeyframesRule() {}
+
+  public final native JsCSSRuleList getCssRules() /*-{
+    return this.cssRules;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native void deleteRule(String key) /*-{
+    this.deleteRule(key);
+  }-*/;
+
+  public final native JsCSSKeyframeRule findRule(String key) /*-{
+    return this.findRule(key);
+  }-*/;
+
+  public final native void insertRule(String rule) /*-{
+    this.insertRule(rule);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSMatrix.java b/elemental/src/elemental/js/css/JsCSSMatrix.java
new file mode 100644
index 0000000..1546715
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSMatrix.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSMatrix;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSMatrix extends JsElementalMixinBase  implements CSSMatrix {
+  protected JsCSSMatrix() {}
+
+  public final native double getA() /*-{
+    return this.a;
+  }-*/;
+
+  public final native void setA(double param_a) /*-{
+    this.a = param_a;
+  }-*/;
+
+  public final native double getB() /*-{
+    return this.b;
+  }-*/;
+
+  public final native void setB(double param_b) /*-{
+    this.b = param_b;
+  }-*/;
+
+  public final native double getC() /*-{
+    return this.c;
+  }-*/;
+
+  public final native void setC(double param_c) /*-{
+    this.c = param_c;
+  }-*/;
+
+  public final native double getD() /*-{
+    return this.d;
+  }-*/;
+
+  public final native void setD(double param_d) /*-{
+    this.d = param_d;
+  }-*/;
+
+  public final native double getE() /*-{
+    return this.e;
+  }-*/;
+
+  public final native void setE(double param_e) /*-{
+    this.e = param_e;
+  }-*/;
+
+  public final native double getF() /*-{
+    return this.f;
+  }-*/;
+
+  public final native void setF(double param_f) /*-{
+    this.f = param_f;
+  }-*/;
+
+  public final native double getM11() /*-{
+    return this.m11;
+  }-*/;
+
+  public final native void setM11(double param_m11) /*-{
+    this.m11 = param_m11;
+  }-*/;
+
+  public final native double getM12() /*-{
+    return this.m12;
+  }-*/;
+
+  public final native void setM12(double param_m12) /*-{
+    this.m12 = param_m12;
+  }-*/;
+
+  public final native double getM13() /*-{
+    return this.m13;
+  }-*/;
+
+  public final native void setM13(double param_m13) /*-{
+    this.m13 = param_m13;
+  }-*/;
+
+  public final native double getM14() /*-{
+    return this.m14;
+  }-*/;
+
+  public final native void setM14(double param_m14) /*-{
+    this.m14 = param_m14;
+  }-*/;
+
+  public final native double getM21() /*-{
+    return this.m21;
+  }-*/;
+
+  public final native void setM21(double param_m21) /*-{
+    this.m21 = param_m21;
+  }-*/;
+
+  public final native double getM22() /*-{
+    return this.m22;
+  }-*/;
+
+  public final native void setM22(double param_m22) /*-{
+    this.m22 = param_m22;
+  }-*/;
+
+  public final native double getM23() /*-{
+    return this.m23;
+  }-*/;
+
+  public final native void setM23(double param_m23) /*-{
+    this.m23 = param_m23;
+  }-*/;
+
+  public final native double getM24() /*-{
+    return this.m24;
+  }-*/;
+
+  public final native void setM24(double param_m24) /*-{
+    this.m24 = param_m24;
+  }-*/;
+
+  public final native double getM31() /*-{
+    return this.m31;
+  }-*/;
+
+  public final native void setM31(double param_m31) /*-{
+    this.m31 = param_m31;
+  }-*/;
+
+  public final native double getM32() /*-{
+    return this.m32;
+  }-*/;
+
+  public final native void setM32(double param_m32) /*-{
+    this.m32 = param_m32;
+  }-*/;
+
+  public final native double getM33() /*-{
+    return this.m33;
+  }-*/;
+
+  public final native void setM33(double param_m33) /*-{
+    this.m33 = param_m33;
+  }-*/;
+
+  public final native double getM34() /*-{
+    return this.m34;
+  }-*/;
+
+  public final native void setM34(double param_m34) /*-{
+    this.m34 = param_m34;
+  }-*/;
+
+  public final native double getM41() /*-{
+    return this.m41;
+  }-*/;
+
+  public final native void setM41(double param_m41) /*-{
+    this.m41 = param_m41;
+  }-*/;
+
+  public final native double getM42() /*-{
+    return this.m42;
+  }-*/;
+
+  public final native void setM42(double param_m42) /*-{
+    this.m42 = param_m42;
+  }-*/;
+
+  public final native double getM43() /*-{
+    return this.m43;
+  }-*/;
+
+  public final native void setM43(double param_m43) /*-{
+    this.m43 = param_m43;
+  }-*/;
+
+  public final native double getM44() /*-{
+    return this.m44;
+  }-*/;
+
+  public final native void setM44(double param_m44) /*-{
+    this.m44 = param_m44;
+  }-*/;
+
+  public final native JsCSSMatrix inverse() /*-{
+    return this.inverse();
+  }-*/;
+
+  public final native JsCSSMatrix multiply(CSSMatrix secondMatrix) /*-{
+    return this.multiply(secondMatrix);
+  }-*/;
+
+  public final native JsCSSMatrix rotate(double rotX, double rotY, double rotZ) /*-{
+    return this.rotate(rotX, rotY, rotZ);
+  }-*/;
+
+  public final native JsCSSMatrix rotateAxisAngle(double x, double y, double z, double angle) /*-{
+    return this.rotateAxisAngle(x, y, z, angle);
+  }-*/;
+
+  public final native JsCSSMatrix scale(double scaleX, double scaleY, double scaleZ) /*-{
+    return this.scale(scaleX, scaleY, scaleZ);
+  }-*/;
+
+  public final native void setMatrixValue(String string) /*-{
+    this.setMatrixValue(string);
+  }-*/;
+
+  public final native JsCSSMatrix skewX(double angle) /*-{
+    return this.skewX(angle);
+  }-*/;
+
+  public final native JsCSSMatrix skewY(double angle) /*-{
+    return this.skewY(angle);
+  }-*/;
+
+  public final native JsCSSMatrix translate(double x, double y, double z) /*-{
+    return this.translate(x, y, z);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSMediaRule.java b/elemental/src/elemental/js/css/JsCSSMediaRule.java
new file mode 100644
index 0000000..81dd1d6
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSMediaRule.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.js.stylesheets.JsMediaList;
+import elemental.css.CSSRule;
+import elemental.stylesheets.MediaList;
+import elemental.css.CSSMediaRule;
+import elemental.css.CSSRuleList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSMediaRule extends JsCSSRule  implements CSSMediaRule {
+  protected JsCSSMediaRule() {}
+
+  public final native JsCSSRuleList getCssRules() /*-{
+    return this.cssRules;
+  }-*/;
+
+  public final native JsMediaList getMedia() /*-{
+    return this.media;
+  }-*/;
+
+  public final native void deleteRule(int index) /*-{
+    this.deleteRule(index);
+  }-*/;
+
+  public final native int insertRule(String rule, int index) /*-{
+    return this.insertRule(rule, index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSPageRule.java b/elemental/src/elemental/js/css/JsCSSPageRule.java
new file mode 100644
index 0000000..687ed81
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSPageRule.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSStyleDeclaration;
+import elemental.css.CSSPageRule;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSPageRule extends JsCSSRule  implements CSSPageRule {
+  protected JsCSSPageRule() {}
+
+  public final native String getSelectorText() /*-{
+    return this.selectorText;
+  }-*/;
+
+  public final native void setSelectorText(String param_selectorText) /*-{
+    this.selectorText = param_selectorText;
+  }-*/;
+
+  public final native JsCSSStyleDeclaration getStyle() /*-{
+    return this.style;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSPrimitiveValue.java b/elemental/src/elemental/js/css/JsCSSPrimitiveValue.java
new file mode 100644
index 0000000..7c35766
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSPrimitiveValue.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.Counter;
+import elemental.css.RGBColor;
+import elemental.css.CSSValue;
+import elemental.css.CSSPrimitiveValue;
+import elemental.css.Rect;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSPrimitiveValue extends JsCSSValue  implements CSSPrimitiveValue {
+  protected JsCSSPrimitiveValue() {}
+
+  public final native int getPrimitiveType() /*-{
+    return this.primitiveType;
+  }-*/;
+
+  public final native JsCounter getCounterValue() /*-{
+    return this.getCounterValue();
+  }-*/;
+
+  public final native float getFloatValue(int unitType) /*-{
+    return this.getFloatValue(unitType);
+  }-*/;
+
+  public final native JsRGBColor getRGBColorValue() /*-{
+    return this.getRGBColorValue();
+  }-*/;
+
+  public final native JsRect getRectValue() /*-{
+    return this.getRectValue();
+  }-*/;
+
+  public final native String getStringValue() /*-{
+    return this.getStringValue();
+  }-*/;
+
+  public final native void setFloatValue(int unitType, float floatValue) /*-{
+    this.setFloatValue(unitType, floatValue);
+  }-*/;
+
+  public final native void setStringValue(int stringType, String stringValue) /*-{
+    this.setStringValue(stringType, stringValue);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSRule.java b/elemental/src/elemental/js/css/JsCSSRule.java
new file mode 100644
index 0000000..a17f2e6
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSRule.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSStyleSheet;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSRule extends JsElementalMixinBase  implements CSSRule {
+  protected JsCSSRule() {}
+
+  public final native String getCssText() /*-{
+    return this.cssText;
+  }-*/;
+
+  public final native void setCssText(String param_cssText) /*-{
+    this.cssText = param_cssText;
+  }-*/;
+
+  public final native JsCSSRule getParentRule() /*-{
+    return this.parentRule;
+  }-*/;
+
+  public final native JsCSSStyleSheet getParentStyleSheet() /*-{
+    return this.parentStyleSheet;
+  }-*/;
+
+  public final native int getType() /*-{
+    return this.type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSRuleList.java b/elemental/src/elemental/js/css/JsCSSRuleList.java
new file mode 100644
index 0000000..b7baee9
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSRuleList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSRuleList;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSRuleList extends JsElementalMixinBase  implements CSSRuleList {
+  protected JsCSSRuleList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsCSSRule item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSStyleDeclaration.java b/elemental/src/elemental/js/css/JsCSSStyleDeclaration.java
new file mode 100644
index 0000000..772ca07
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSStyleDeclaration.java
@@ -0,0 +1,1129 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSValue;
+import elemental.css.CSSStyleDeclaration;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSStyleDeclaration extends JsElementalMixinBase  implements CSSStyleDeclaration {
+  protected JsCSSStyleDeclaration() {}
+
+  public final native String getCssText() /*-{
+    return this.cssText;
+  }-*/;
+
+  public final native void setCssText(String param_cssText) /*-{
+    this.cssText = param_cssText;
+  }-*/;
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsCSSRule getParentRule() /*-{
+    return this.parentRule;
+  }-*/;
+
+  public final native JsCSSValue getPropertyCSSValue(String propertyName) /*-{
+    return this.getPropertyCSSValue(propertyName);
+  }-*/;
+
+  public final native String getPropertyPriority(String propertyName) /*-{
+    return this.getPropertyPriority(propertyName);
+  }-*/;
+
+  public final native String getPropertyShorthand(String propertyName) /*-{
+    return this.getPropertyShorthand(propertyName);
+  }-*/;
+
+  public final native String getPropertyValue(String propertyName) /*-{
+    return this.getPropertyValue(propertyName);
+  }-*/;
+
+  public final native boolean isPropertyImplicit(String propertyName) /*-{
+    return this.isPropertyImplicit(propertyName);
+  }-*/;
+
+  public final native String item(int index) /*-{
+    return this.item(index);
+  }-*/;
+
+  public final native String removeProperty(String propertyName) /*-{
+    return this.removeProperty(propertyName);
+  }-*/;
+
+  public final native void setProperty(String propertyName, String value) /*-{
+    this.setProperty(propertyName, value);
+  }-*/;
+
+  public final native void setProperty(String propertyName, String value, String priority) /*-{
+    this.setProperty(propertyName, value, priority);
+  }-*/;
+
+public final native String getColor() /*-{ return this.color; }-*/;
+public final native void setColor(String value) /*-{ this.color = value; }-*/;
+public final native void clearColor() /*-{ this.color = ""; }-*/;
+public final native String getDirection() /*-{ return this.direction; }-*/;
+public final native void setDirection(String value) /*-{ this.direction = value; }-*/;
+public final native void clearDirection() /*-{ this.direction = ""; }-*/;
+public final native String getDisplay() /*-{ return this.display; }-*/;
+public final native void setDisplay(String value) /*-{ this.display = value; }-*/;
+public final native void clearDisplay() /*-{ this.display = ""; }-*/;
+public final native String getFont() /*-{ return this.font; }-*/;
+public final native void setFont(String value) /*-{ this.font = value; }-*/;
+public final native void clearFont() /*-{ this.font = ""; }-*/;
+public final native String getFontFamily() /*-{ return this.fontFamily; }-*/;
+public final native void setFontFamily(String value) /*-{ this.fontFamily = value; }-*/;
+public final native void clearFontFamily() /*-{ this.fontFamily = ""; }-*/;
+public final native String getFontSize() /*-{ return this.fontSize; }-*/;
+public final native void setFontSize(String value) /*-{ this.fontSize = value; }-*/;
+public final native void clearFontSize() /*-{ this.fontSize = ""; }-*/;
+public final native void setFontSize(double value, String unit) /*-{ this.fontSize = value + unit; }-*/;
+public final native String getFontStyle() /*-{ return this.fontStyle; }-*/;
+public final native void setFontStyle(String value) /*-{ this.fontStyle = value; }-*/;
+public final native void clearFontStyle() /*-{ this.fontStyle = ""; }-*/;
+public final native String getFontWeight() /*-{ return this.fontWeight; }-*/;
+public final native void setFontWeight(String value) /*-{ this.fontWeight = value; }-*/;
+public final native void clearFontWeight() /*-{ this.fontWeight = ""; }-*/;
+public final native String getFontVariant() /*-{ return this.fontVariant; }-*/;
+public final native void setFontVariant(String value) /*-{ this.fontVariant = value; }-*/;
+public final native void clearFontVariant() /*-{ this.fontVariant = ""; }-*/;
+public final native String getTextRendering() /*-{ return this.textRendering; }-*/;
+public final native void setTextRendering(String value) /*-{ this.textRendering = value; }-*/;
+public final native void clearTextRendering() /*-{ this.textRendering = ""; }-*/;
+public final native String getWebkitFontFeatureSettings() /*-{ return this.webkitFontFeatureSettings; }-*/;
+public final native void setWebkitFontFeatureSettings(String value) /*-{ this.webkitFontFeatureSettings = value; }-*/;
+public final native void clearWebkitFontFeatureSettings() /*-{ this.webkitFontFeatureSettings = ""; }-*/;
+public final native String getWebkitFontKerning() /*-{ return this.webkitFontKerning; }-*/;
+public final native void setWebkitFontKerning(String value) /*-{ this.webkitFontKerning = value; }-*/;
+public final native void clearWebkitFontKerning() /*-{ this.webkitFontKerning = ""; }-*/;
+public final native String getWebkitFontSmoothing() /*-{ return this.webkitFontSmoothing; }-*/;
+public final native void setWebkitFontSmoothing(String value) /*-{ this.webkitFontSmoothing = value; }-*/;
+public final native void clearWebkitFontSmoothing() /*-{ this.webkitFontSmoothing = ""; }-*/;
+public final native String getWebkitFontVariantLigatures() /*-{ return this.webkitFontVariantLigatures; }-*/;
+public final native void setWebkitFontVariantLigatures(String value) /*-{ this.webkitFontVariantLigatures = value; }-*/;
+public final native void clearWebkitFontVariantLigatures() /*-{ this.webkitFontVariantLigatures = ""; }-*/;
+public final native String getWebkitLocale() /*-{ return this.webkitLocale; }-*/;
+public final native void setWebkitLocale(String value) /*-{ this.webkitLocale = value; }-*/;
+public final native void clearWebkitLocale() /*-{ this.webkitLocale = ""; }-*/;
+public final native String getWebkitTextOrientation() /*-{ return this.webkitTextOrientation; }-*/;
+public final native void setWebkitTextOrientation(String value) /*-{ this.webkitTextOrientation = value; }-*/;
+public final native void clearWebkitTextOrientation() /*-{ this.webkitTextOrientation = ""; }-*/;
+public final native String getWebkitTextSizeAdjust() /*-{ return this.webkitTextSizeAdjust; }-*/;
+public final native void setWebkitTextSizeAdjust(String value) /*-{ this.webkitTextSizeAdjust = value; }-*/;
+public final native void clearWebkitTextSizeAdjust() /*-{ this.webkitTextSizeAdjust = ""; }-*/;
+public final native String getWebkitWritingMode() /*-{ return this.webkitWritingMode; }-*/;
+public final native void setWebkitWritingMode(String value) /*-{ this.webkitWritingMode = value; }-*/;
+public final native void clearWebkitWritingMode() /*-{ this.webkitWritingMode = ""; }-*/;
+public final native String getZoom() /*-{ return this.zoom; }-*/;
+public final native void setZoom(String value) /*-{ this.zoom = value; }-*/;
+public final native void clearZoom() /*-{ this.zoom = ""; }-*/;
+public final native String getLineHeight() /*-{ return this.lineHeight; }-*/;
+public final native void setLineHeight(String value) /*-{ this.lineHeight = value; }-*/;
+public final native void clearLineHeight() /*-{ this.lineHeight = ""; }-*/;
+public final native String getBackground() /*-{ return this.background; }-*/;
+public final native void setBackground(String value) /*-{ this.background = value; }-*/;
+public final native void clearBackground() /*-{ this.background = ""; }-*/;
+public final native String getBackgroundAttachment() /*-{ return this.backgroundAttachment; }-*/;
+public final native void setBackgroundAttachment(String value) /*-{ this.backgroundAttachment = value; }-*/;
+public final native void clearBackgroundAttachment() /*-{ this.backgroundAttachment = ""; }-*/;
+public final native String getBackgroundClip() /*-{ return this.backgroundClip; }-*/;
+public final native void setBackgroundClip(String value) /*-{ this.backgroundClip = value; }-*/;
+public final native void clearBackgroundClip() /*-{ this.backgroundClip = ""; }-*/;
+public final native String getBackgroundColor() /*-{ return this.backgroundColor; }-*/;
+public final native void setBackgroundColor(String value) /*-{ this.backgroundColor = value; }-*/;
+public final native void clearBackgroundColor() /*-{ this.backgroundColor = ""; }-*/;
+public final native String getBackgroundImage() /*-{ return this.backgroundImage; }-*/;
+public final native void setBackgroundImage(String value) /*-{ this.backgroundImage = value; }-*/;
+public final native void clearBackgroundImage() /*-{ this.backgroundImage = ""; }-*/;
+public final native String getBackgroundOrigin() /*-{ return this.backgroundOrigin; }-*/;
+public final native void setBackgroundOrigin(String value) /*-{ this.backgroundOrigin = value; }-*/;
+public final native void clearBackgroundOrigin() /*-{ this.backgroundOrigin = ""; }-*/;
+public final native String getBackgroundPosition() /*-{ return this.backgroundPosition; }-*/;
+public final native void setBackgroundPosition(String value) /*-{ this.backgroundPosition = value; }-*/;
+public final native void clearBackgroundPosition() /*-{ this.backgroundPosition = ""; }-*/;
+public final native String getBackgroundPositionX() /*-{ return this.backgroundPositionX; }-*/;
+public final native void setBackgroundPositionX(String value) /*-{ this.backgroundPositionX = value; }-*/;
+public final native void clearBackgroundPositionX() /*-{ this.backgroundPositionX = ""; }-*/;
+public final native String getBackgroundPositionY() /*-{ return this.backgroundPositionY; }-*/;
+public final native void setBackgroundPositionY(String value) /*-{ this.backgroundPositionY = value; }-*/;
+public final native void clearBackgroundPositionY() /*-{ this.backgroundPositionY = ""; }-*/;
+public final native String getBackgroundRepeat() /*-{ return this.backgroundRepeat; }-*/;
+public final native void setBackgroundRepeat(String value) /*-{ this.backgroundRepeat = value; }-*/;
+public final native void clearBackgroundRepeat() /*-{ this.backgroundRepeat = ""; }-*/;
+public final native String getBackgroundRepeatX() /*-{ return this.backgroundRepeatX; }-*/;
+public final native void setBackgroundRepeatX(String value) /*-{ this.backgroundRepeatX = value; }-*/;
+public final native void clearBackgroundRepeatX() /*-{ this.backgroundRepeatX = ""; }-*/;
+public final native String getBackgroundRepeatY() /*-{ return this.backgroundRepeatY; }-*/;
+public final native void setBackgroundRepeatY(String value) /*-{ this.backgroundRepeatY = value; }-*/;
+public final native void clearBackgroundRepeatY() /*-{ this.backgroundRepeatY = ""; }-*/;
+public final native String getBackgroundSize() /*-{ return this.backgroundSize; }-*/;
+public final native void setBackgroundSize(String value) /*-{ this.backgroundSize = value; }-*/;
+public final native void clearBackgroundSize() /*-{ this.backgroundSize = ""; }-*/;
+public final native String getBorder() /*-{ return this.border; }-*/;
+public final native void setBorder(String value) /*-{ this.border = value; }-*/;
+public final native void clearBorder() /*-{ this.border = ""; }-*/;
+public final native String getBorderBottom() /*-{ return this.borderBottom; }-*/;
+public final native void setBorderBottom(String value) /*-{ this.borderBottom = value; }-*/;
+public final native void clearBorderBottom() /*-{ this.borderBottom = ""; }-*/;
+public final native String getBorderBottomColor() /*-{ return this.borderBottomColor; }-*/;
+public final native void setBorderBottomColor(String value) /*-{ this.borderBottomColor = value; }-*/;
+public final native void clearBorderBottomColor() /*-{ this.borderBottomColor = ""; }-*/;
+public final native String getBorderBottomLeftRadius() /*-{ return this.borderBottomLeftRadius; }-*/;
+public final native void setBorderBottomLeftRadius(String value) /*-{ this.borderBottomLeftRadius = value; }-*/;
+public final native void clearBorderBottomLeftRadius() /*-{ this.borderBottomLeftRadius = ""; }-*/;
+public final native String getBorderBottomRightRadius() /*-{ return this.borderBottomRightRadius; }-*/;
+public final native void setBorderBottomRightRadius(String value) /*-{ this.borderBottomRightRadius = value; }-*/;
+public final native void clearBorderBottomRightRadius() /*-{ this.borderBottomRightRadius = ""; }-*/;
+public final native String getBorderBottomStyle() /*-{ return this.borderBottomStyle; }-*/;
+public final native void setBorderBottomStyle(String value) /*-{ this.borderBottomStyle = value; }-*/;
+public final native void clearBorderBottomStyle() /*-{ this.borderBottomStyle = ""; }-*/;
+public final native String getBorderBottomWidth() /*-{ return this.borderBottomWidth; }-*/;
+public final native void setBorderBottomWidth(String value) /*-{ this.borderBottomWidth = value; }-*/;
+public final native void clearBorderBottomWidth() /*-{ this.borderBottomWidth = ""; }-*/;
+public final native String getBorderCollapse() /*-{ return this.borderCollapse; }-*/;
+public final native void setBorderCollapse(String value) /*-{ this.borderCollapse = value; }-*/;
+public final native void clearBorderCollapse() /*-{ this.borderCollapse = ""; }-*/;
+public final native String getBorderColor() /*-{ return this.borderColor; }-*/;
+public final native void setBorderColor(String value) /*-{ this.borderColor = value; }-*/;
+public final native void clearBorderColor() /*-{ this.borderColor = ""; }-*/;
+public final native String getBorderImage() /*-{ return this.borderImage; }-*/;
+public final native void setBorderImage(String value) /*-{ this.borderImage = value; }-*/;
+public final native void clearBorderImage() /*-{ this.borderImage = ""; }-*/;
+public final native String getBorderImageOutset() /*-{ return this.borderImageOutset; }-*/;
+public final native void setBorderImageOutset(String value) /*-{ this.borderImageOutset = value; }-*/;
+public final native void clearBorderImageOutset() /*-{ this.borderImageOutset = ""; }-*/;
+public final native String getBorderImageRepeat() /*-{ return this.borderImageRepeat; }-*/;
+public final native void setBorderImageRepeat(String value) /*-{ this.borderImageRepeat = value; }-*/;
+public final native void clearBorderImageRepeat() /*-{ this.borderImageRepeat = ""; }-*/;
+public final native String getBorderImageSlice() /*-{ return this.borderImageSlice; }-*/;
+public final native void setBorderImageSlice(String value) /*-{ this.borderImageSlice = value; }-*/;
+public final native void clearBorderImageSlice() /*-{ this.borderImageSlice = ""; }-*/;
+public final native String getBorderImageSource() /*-{ return this.borderImageSource; }-*/;
+public final native void setBorderImageSource(String value) /*-{ this.borderImageSource = value; }-*/;
+public final native void clearBorderImageSource() /*-{ this.borderImageSource = ""; }-*/;
+public final native String getBorderImageWidth() /*-{ return this.borderImageWidth; }-*/;
+public final native void setBorderImageWidth(String value) /*-{ this.borderImageWidth = value; }-*/;
+public final native void clearBorderImageWidth() /*-{ this.borderImageWidth = ""; }-*/;
+public final native String getBorderLeft() /*-{ return this.borderLeft; }-*/;
+public final native void setBorderLeft(String value) /*-{ this.borderLeft = value; }-*/;
+public final native void clearBorderLeft() /*-{ this.borderLeft = ""; }-*/;
+public final native String getBorderLeftColor() /*-{ return this.borderLeftColor; }-*/;
+public final native void setBorderLeftColor(String value) /*-{ this.borderLeftColor = value; }-*/;
+public final native void clearBorderLeftColor() /*-{ this.borderLeftColor = ""; }-*/;
+public final native String getBorderLeftStyle() /*-{ return this.borderLeftStyle; }-*/;
+public final native void setBorderLeftStyle(String value) /*-{ this.borderLeftStyle = value; }-*/;
+public final native void clearBorderLeftStyle() /*-{ this.borderLeftStyle = ""; }-*/;
+public final native String getBorderLeftWidth() /*-{ return this.borderLeftWidth; }-*/;
+public final native void setBorderLeftWidth(String value) /*-{ this.borderLeftWidth = value; }-*/;
+public final native void clearBorderLeftWidth() /*-{ this.borderLeftWidth = ""; }-*/;
+public final native String getBorderRadius() /*-{ return this.borderRadius; }-*/;
+public final native void setBorderRadius(String value) /*-{ this.borderRadius = value; }-*/;
+public final native void clearBorderRadius() /*-{ this.borderRadius = ""; }-*/;
+public final native String getBorderRight() /*-{ return this.borderRight; }-*/;
+public final native void setBorderRight(String value) /*-{ this.borderRight = value; }-*/;
+public final native void clearBorderRight() /*-{ this.borderRight = ""; }-*/;
+public final native String getBorderRightColor() /*-{ return this.borderRightColor; }-*/;
+public final native void setBorderRightColor(String value) /*-{ this.borderRightColor = value; }-*/;
+public final native void clearBorderRightColor() /*-{ this.borderRightColor = ""; }-*/;
+public final native String getBorderRightStyle() /*-{ return this.borderRightStyle; }-*/;
+public final native void setBorderRightStyle(String value) /*-{ this.borderRightStyle = value; }-*/;
+public final native void clearBorderRightStyle() /*-{ this.borderRightStyle = ""; }-*/;
+public final native String getBorderRightWidth() /*-{ return this.borderRightWidth; }-*/;
+public final native void setBorderRightWidth(String value) /*-{ this.borderRightWidth = value; }-*/;
+public final native void clearBorderRightWidth() /*-{ this.borderRightWidth = ""; }-*/;
+public final native String getBorderSpacing() /*-{ return this.borderSpacing; }-*/;
+public final native void setBorderSpacing(String value) /*-{ this.borderSpacing = value; }-*/;
+public final native void clearBorderSpacing() /*-{ this.borderSpacing = ""; }-*/;
+public final native String getBorderStyle() /*-{ return this.borderStyle; }-*/;
+public final native void setBorderStyle(String value) /*-{ this.borderStyle = value; }-*/;
+public final native void clearBorderStyle() /*-{ this.borderStyle = ""; }-*/;
+public final native String getBorderTop() /*-{ return this.borderTop; }-*/;
+public final native void setBorderTop(String value) /*-{ this.borderTop = value; }-*/;
+public final native void clearBorderTop() /*-{ this.borderTop = ""; }-*/;
+public final native String getBorderTopColor() /*-{ return this.borderTopColor; }-*/;
+public final native void setBorderTopColor(String value) /*-{ this.borderTopColor = value; }-*/;
+public final native void clearBorderTopColor() /*-{ this.borderTopColor = ""; }-*/;
+public final native String getBorderTopLeftRadius() /*-{ return this.borderTopLeftRadius; }-*/;
+public final native void setBorderTopLeftRadius(String value) /*-{ this.borderTopLeftRadius = value; }-*/;
+public final native void clearBorderTopLeftRadius() /*-{ this.borderTopLeftRadius = ""; }-*/;
+public final native String getBorderTopRightRadius() /*-{ return this.borderTopRightRadius; }-*/;
+public final native void setBorderTopRightRadius(String value) /*-{ this.borderTopRightRadius = value; }-*/;
+public final native void clearBorderTopRightRadius() /*-{ this.borderTopRightRadius = ""; }-*/;
+public final native String getBorderTopStyle() /*-{ return this.borderTopStyle; }-*/;
+public final native void setBorderTopStyle(String value) /*-{ this.borderTopStyle = value; }-*/;
+public final native void clearBorderTopStyle() /*-{ this.borderTopStyle = ""; }-*/;
+public final native String getBorderTopWidth() /*-{ return this.borderTopWidth; }-*/;
+public final native void setBorderTopWidth(String value) /*-{ this.borderTopWidth = value; }-*/;
+public final native void clearBorderTopWidth() /*-{ this.borderTopWidth = ""; }-*/;
+public final native String getBorderWidth() /*-{ return this.borderWidth; }-*/;
+public final native void setBorderWidth(String value) /*-{ this.borderWidth = value; }-*/;
+public final native void clearBorderWidth() /*-{ this.borderWidth = ""; }-*/;
+public final native void setBorderWidth(double value, String unit) /*-{ this.borderWidth = value + unit; }-*/;
+public final native String getBottom() /*-{ return this.bottom; }-*/;
+public final native void setBottom(String value) /*-{ this.bottom = value; }-*/;
+public final native void clearBottom() /*-{ this.bottom = ""; }-*/;
+public final native void setBottom(double value, String unit) /*-{ this.bottom = value + unit; }-*/;
+public final native String getBoxShadow() /*-{ return this.boxShadow; }-*/;
+public final native void setBoxShadow(String value) /*-{ this.boxShadow = value; }-*/;
+public final native void clearBoxShadow() /*-{ this.boxShadow = ""; }-*/;
+public final native String getBoxSizing() /*-{ return this.boxSizing; }-*/;
+public final native void setBoxSizing(String value) /*-{ this.boxSizing = value; }-*/;
+public final native void clearBoxSizing() /*-{ this.boxSizing = ""; }-*/;
+public final native String getCaptionSide() /*-{ return this.captionSide; }-*/;
+public final native void setCaptionSide(String value) /*-{ this.captionSide = value; }-*/;
+public final native void clearCaptionSide() /*-{ this.captionSide = ""; }-*/;
+public final native String getClear() /*-{ return this.clear; }-*/;
+public final native void setClear(String value) /*-{ this.clear = value; }-*/;
+public final native void clearClear() /*-{ this.clear = ""; }-*/;
+public final native String getClip() /*-{ return this.clip; }-*/;
+public final native void setClip(String value) /*-{ this.clip = value; }-*/;
+public final native void clearClip() /*-{ this.clip = ""; }-*/;
+public final native String getContent() /*-{ return this.content; }-*/;
+public final native void setContent(String value) /*-{ this.content = value; }-*/;
+public final native void clearContent() /*-{ this.content = ""; }-*/;
+public final native String getCounterIncrement() /*-{ return this.counterIncrement; }-*/;
+public final native void setCounterIncrement(String value) /*-{ this.counterIncrement = value; }-*/;
+public final native void clearCounterIncrement() /*-{ this.counterIncrement = ""; }-*/;
+public final native String getCounterReset() /*-{ return this.counterReset; }-*/;
+public final native void setCounterReset(String value) /*-{ this.counterReset = value; }-*/;
+public final native void clearCounterReset() /*-{ this.counterReset = ""; }-*/;
+public final native String getCursor() /*-{ return this.cursor; }-*/;
+public final native void setCursor(String value) /*-{ this.cursor = value; }-*/;
+public final native void clearCursor() /*-{ this.cursor = ""; }-*/;
+public final native String getEmptyCells() /*-{ return this.emptyCells; }-*/;
+public final native void setEmptyCells(String value) /*-{ this.emptyCells = value; }-*/;
+public final native void clearEmptyCells() /*-{ this.emptyCells = ""; }-*/;
+public final native String getFloat() /*-{ return this['float']; }-*/;
+public final native void setFloat(String value) /*-{ this['float'] = value; }-*/;
+public final native void clearFloat() /*-{ this['float'] = ""; }-*/;
+public final native String getFontStretch() /*-{ return this.fontStretch; }-*/;
+public final native void setFontStretch(String value) /*-{ this.fontStretch = value; }-*/;
+public final native void clearFontStretch() /*-{ this.fontStretch = ""; }-*/;
+public final native String getHeight() /*-{ return this.height; }-*/;
+public final native void setHeight(String value) /*-{ this.height = value; }-*/;
+public final native void clearHeight() /*-{ this.height = ""; }-*/;
+public final native void setHeight(double value, String unit) /*-{ this.height = value + unit; }-*/;
+public final native String getImageRendering() /*-{ return this.imageRendering; }-*/;
+public final native void setImageRendering(String value) /*-{ this.imageRendering = value; }-*/;
+public final native void clearImageRendering() /*-{ this.imageRendering = ""; }-*/;
+public final native String getLeft() /*-{ return this.left; }-*/;
+public final native void setLeft(String value) /*-{ this.left = value; }-*/;
+public final native void clearLeft() /*-{ this.left = ""; }-*/;
+public final native void setLeft(double value, String unit) /*-{ this.left = value + unit; }-*/;
+public final native String getLetterSpacing() /*-{ return this.letterSpacing; }-*/;
+public final native void setLetterSpacing(String value) /*-{ this.letterSpacing = value; }-*/;
+public final native void clearLetterSpacing() /*-{ this.letterSpacing = ""; }-*/;
+public final native String getListStyle() /*-{ return this.listStyle; }-*/;
+public final native void setListStyle(String value) /*-{ this.listStyle = value; }-*/;
+public final native void clearListStyle() /*-{ this.listStyle = ""; }-*/;
+public final native String getListStyleType() /*-{ return this.listStyleType; }-*/;
+public final native void setListStyleType(String value) /*-{ this.listStyleType = value; }-*/;
+public final native void clearListStyleType() /*-{ this.listStyleType = ""; }-*/;
+public final native String getListStyleImage() /*-{ return this.listStyleImage; }-*/;
+public final native void setListStyleImage(String value) /*-{ this.listStyleImage = value; }-*/;
+public final native void clearListStyleImage() /*-{ this.listStyleImage = ""; }-*/;
+public final native String getListStylePosition() /*-{ return this.listStylePosition; }-*/;
+public final native void setListStylePosition(String value) /*-{ this.listStylePosition = value; }-*/;
+public final native void clearListStylePosition() /*-{ this.listStylePosition = ""; }-*/;
+public final native String getMargin() /*-{ return this.margin; }-*/;
+public final native void setMargin(String value) /*-{ this.margin = value; }-*/;
+public final native void clearMargin() /*-{ this.margin = ""; }-*/;
+public final native void setMargin(double value, String unit) /*-{ this.margin = value + unit; }-*/;
+public final native String getMarginBottom() /*-{ return this.marginBottom; }-*/;
+public final native void setMarginBottom(String value) /*-{ this.marginBottom = value; }-*/;
+public final native void clearMarginBottom() /*-{ this.marginBottom = ""; }-*/;
+public final native void setMarginBottom(double value, String unit) /*-{ this.marginBottom = value + unit; }-*/;
+public final native String getMarginLeft() /*-{ return this.marginLeft; }-*/;
+public final native void setMarginLeft(String value) /*-{ this.marginLeft = value; }-*/;
+public final native void clearMarginLeft() /*-{ this.marginLeft = ""; }-*/;
+public final native void setMarginLeft(double value, String unit) /*-{ this.marginLeft = value + unit; }-*/;
+public final native String getMarginRight() /*-{ return this.marginRight; }-*/;
+public final native void setMarginRight(String value) /*-{ this.marginRight = value; }-*/;
+public final native void clearMarginRight() /*-{ this.marginRight = ""; }-*/;
+public final native void setMarginRight(double value, String unit) /*-{ this.marginRight = value + unit; }-*/;
+public final native String getMarginTop() /*-{ return this.marginTop; }-*/;
+public final native void setMarginTop(String value) /*-{ this.marginTop = value; }-*/;
+public final native void clearMarginTop() /*-{ this.marginTop = ""; }-*/;
+public final native void setMarginTop(double value, String unit) /*-{ this.marginTop = value + unit; }-*/;
+public final native String getMaxHeight() /*-{ return this.maxHeight; }-*/;
+public final native void setMaxHeight(String value) /*-{ this.maxHeight = value; }-*/;
+public final native void clearMaxHeight() /*-{ this.maxHeight = ""; }-*/;
+public final native String getMaxWidth() /*-{ return this.maxWidth; }-*/;
+public final native void setMaxWidth(String value) /*-{ this.maxWidth = value; }-*/;
+public final native void clearMaxWidth() /*-{ this.maxWidth = ""; }-*/;
+public final native String getMinHeight() /*-{ return this.minHeight; }-*/;
+public final native void setMinHeight(String value) /*-{ this.minHeight = value; }-*/;
+public final native void clearMinHeight() /*-{ this.minHeight = ""; }-*/;
+public final native String getMinWidth() /*-{ return this.minWidth; }-*/;
+public final native void setMinWidth(String value) /*-{ this.minWidth = value; }-*/;
+public final native void clearMinWidth() /*-{ this.minWidth = ""; }-*/;
+public final native double getOpacity() /*-{ return this.opacity; }-*/;
+public final native void setOpacity(double value) /*-{ this.opacity = value; }-*/;
+public final native void clearOpacity() /*-{ this.opacity = ""; }-*/;
+public final native String getOrphans() /*-{ return this.orphans; }-*/;
+public final native void setOrphans(String value) /*-{ this.orphans = value; }-*/;
+public final native void clearOrphans() /*-{ this.orphans = ""; }-*/;
+public final native String getOutline() /*-{ return this.outline; }-*/;
+public final native void setOutline(String value) /*-{ this.outline = value; }-*/;
+public final native void clearOutline() /*-{ this.outline = ""; }-*/;
+public final native String getOutlineColor() /*-{ return this.outlineColor; }-*/;
+public final native void setOutlineColor(String value) /*-{ this.outlineColor = value; }-*/;
+public final native void clearOutlineColor() /*-{ this.outlineColor = ""; }-*/;
+public final native String getOutlineOffset() /*-{ return this.outlineOffset; }-*/;
+public final native void setOutlineOffset(String value) /*-{ this.outlineOffset = value; }-*/;
+public final native void clearOutlineOffset() /*-{ this.outlineOffset = ""; }-*/;
+public final native String getOutlineStyle() /*-{ return this.outlineStyle; }-*/;
+public final native void setOutlineStyle(String value) /*-{ this.outlineStyle = value; }-*/;
+public final native void clearOutlineStyle() /*-{ this.outlineStyle = ""; }-*/;
+public final native String getOutlineWidth() /*-{ return this.outlineWidth; }-*/;
+public final native void setOutlineWidth(String value) /*-{ this.outlineWidth = value; }-*/;
+public final native void clearOutlineWidth() /*-{ this.outlineWidth = ""; }-*/;
+public final native String getOverflow() /*-{ return this.overflow; }-*/;
+public final native void setOverflow(String value) /*-{ this.overflow = value; }-*/;
+public final native void clearOverflow() /*-{ this.overflow = ""; }-*/;
+public final native String getOverflowX() /*-{ return this.overflowX; }-*/;
+public final native void setOverflowX(String value) /*-{ this.overflowX = value; }-*/;
+public final native void clearOverflowX() /*-{ this.overflowX = ""; }-*/;
+public final native String getOverflowY() /*-{ return this.overflowY; }-*/;
+public final native void setOverflowY(String value) /*-{ this.overflowY = value; }-*/;
+public final native void clearOverflowY() /*-{ this.overflowY = ""; }-*/;
+public final native String getPadding() /*-{ return this.padding; }-*/;
+public final native void setPadding(String value) /*-{ this.padding = value; }-*/;
+public final native void clearPadding() /*-{ this.padding = ""; }-*/;
+public final native void setPadding(double value, String unit) /*-{ this.padding = value + unit; }-*/;
+public final native String getPaddingBottom() /*-{ return this.paddingBottom; }-*/;
+public final native void setPaddingBottom(String value) /*-{ this.paddingBottom = value; }-*/;
+public final native void clearPaddingBottom() /*-{ this.paddingBottom = ""; }-*/;
+public final native void setPaddingBottom(double value, String unit) /*-{ this.paddingBottom = value + unit; }-*/;
+public final native String getPaddingLeft() /*-{ return this.paddingLeft; }-*/;
+public final native void setPaddingLeft(String value) /*-{ this.paddingLeft = value; }-*/;
+public final native void clearPaddingLeft() /*-{ this.paddingLeft = ""; }-*/;
+public final native void setPaddingLeft(double value, String unit) /*-{ this.paddingLeft = value + unit; }-*/;
+public final native String getPaddingRight() /*-{ return this.paddingRight; }-*/;
+public final native void setPaddingRight(String value) /*-{ this.paddingRight = value; }-*/;
+public final native void clearPaddingRight() /*-{ this.paddingRight = ""; }-*/;
+public final native void setPaddingRight(double value, String unit) /*-{ this.paddingRight = value + unit; }-*/;
+public final native String getPaddingTop() /*-{ return this.paddingTop; }-*/;
+public final native void setPaddingTop(String value) /*-{ this.paddingTop = value; }-*/;
+public final native void clearPaddingTop() /*-{ this.paddingTop = ""; }-*/;
+public final native void setPaddingTop(double value, String unit) /*-{ this.paddingTop = value + unit; }-*/;
+public final native String getPage() /*-{ return this.page; }-*/;
+public final native void setPage(String value) /*-{ this.page = value; }-*/;
+public final native void clearPage() /*-{ this.page = ""; }-*/;
+public final native String getPageBreakAfter() /*-{ return this.pageBreakAfter; }-*/;
+public final native void setPageBreakAfter(String value) /*-{ this.pageBreakAfter = value; }-*/;
+public final native void clearPageBreakAfter() /*-{ this.pageBreakAfter = ""; }-*/;
+public final native String getPageBreakBefore() /*-{ return this.pageBreakBefore; }-*/;
+public final native void setPageBreakBefore(String value) /*-{ this.pageBreakBefore = value; }-*/;
+public final native void clearPageBreakBefore() /*-{ this.pageBreakBefore = ""; }-*/;
+public final native String getPageBreakInside() /*-{ return this.pageBreakInside; }-*/;
+public final native void setPageBreakInside(String value) /*-{ this.pageBreakInside = value; }-*/;
+public final native void clearPageBreakInside() /*-{ this.pageBreakInside = ""; }-*/;
+public final native String getPointerEvents() /*-{ return this.pointerEvents; }-*/;
+public final native void setPointerEvents(String value) /*-{ this.pointerEvents = value; }-*/;
+public final native void clearPointerEvents() /*-{ this.pointerEvents = ""; }-*/;
+public final native String getPosition() /*-{ return this.position; }-*/;
+public final native void setPosition(String value) /*-{ this.position = value; }-*/;
+public final native void clearPosition() /*-{ this.position = ""; }-*/;
+public final native String getQuotes() /*-{ return this.quotes; }-*/;
+public final native void setQuotes(String value) /*-{ this.quotes = value; }-*/;
+public final native void clearQuotes() /*-{ this.quotes = ""; }-*/;
+public final native String getResize() /*-{ return this.resize; }-*/;
+public final native void setResize(String value) /*-{ this.resize = value; }-*/;
+public final native void clearResize() /*-{ this.resize = ""; }-*/;
+public final native String getRight() /*-{ return this.right; }-*/;
+public final native void setRight(String value) /*-{ this.right = value; }-*/;
+public final native void clearRight() /*-{ this.right = ""; }-*/;
+public final native void setRight(double value, String unit) /*-{ this.right = value + unit; }-*/;
+public final native String getSize() /*-{ return this.size; }-*/;
+public final native void setSize(String value) /*-{ this.size = value; }-*/;
+public final native void clearSize() /*-{ this.size = ""; }-*/;
+public final native String getSrc() /*-{ return this.src; }-*/;
+public final native void setSrc(String value) /*-{ this.src = value; }-*/;
+public final native void clearSrc() /*-{ this.src = ""; }-*/;
+public final native String getSpeak() /*-{ return this.speak; }-*/;
+public final native void setSpeak(String value) /*-{ this.speak = value; }-*/;
+public final native void clearSpeak() /*-{ this.speak = ""; }-*/;
+public final native String getTableLayout() /*-{ return this.tableLayout; }-*/;
+public final native void setTableLayout(String value) /*-{ this.tableLayout = value; }-*/;
+public final native void clearTableLayout() /*-{ this.tableLayout = ""; }-*/;
+public final native String getTabSize() /*-{ return this.tabSize; }-*/;
+public final native void setTabSize(String value) /*-{ this.tabSize = value; }-*/;
+public final native void clearTabSize() /*-{ this.tabSize = ""; }-*/;
+public final native String getTextAlign() /*-{ return this.textAlign; }-*/;
+public final native void setTextAlign(String value) /*-{ this.textAlign = value; }-*/;
+public final native void clearTextAlign() /*-{ this.textAlign = ""; }-*/;
+public final native String getTextDecoration() /*-{ return this.textDecoration; }-*/;
+public final native void setTextDecoration(String value) /*-{ this.textDecoration = value; }-*/;
+public final native void clearTextDecoration() /*-{ this.textDecoration = ""; }-*/;
+public final native String getTextIndent() /*-{ return this.textIndent; }-*/;
+public final native void setTextIndent(String value) /*-{ this.textIndent = value; }-*/;
+public final native void clearTextIndent() /*-{ this.textIndent = ""; }-*/;
+public final native String getTextLineThrough() /*-{ return this.textLineThrough; }-*/;
+public final native void setTextLineThrough(String value) /*-{ this.textLineThrough = value; }-*/;
+public final native void clearTextLineThrough() /*-{ this.textLineThrough = ""; }-*/;
+public final native String getTextLineThroughColor() /*-{ return this.textLineThroughColor; }-*/;
+public final native void setTextLineThroughColor(String value) /*-{ this.textLineThroughColor = value; }-*/;
+public final native void clearTextLineThroughColor() /*-{ this.textLineThroughColor = ""; }-*/;
+public final native String getTextLineThroughMode() /*-{ return this.textLineThroughMode; }-*/;
+public final native void setTextLineThroughMode(String value) /*-{ this.textLineThroughMode = value; }-*/;
+public final native void clearTextLineThroughMode() /*-{ this.textLineThroughMode = ""; }-*/;
+public final native String getTextLineThroughStyle() /*-{ return this.textLineThroughStyle; }-*/;
+public final native void setTextLineThroughStyle(String value) /*-{ this.textLineThroughStyle = value; }-*/;
+public final native void clearTextLineThroughStyle() /*-{ this.textLineThroughStyle = ""; }-*/;
+public final native String getTextLineThroughWidth() /*-{ return this.textLineThroughWidth; }-*/;
+public final native void setTextLineThroughWidth(String value) /*-{ this.textLineThroughWidth = value; }-*/;
+public final native void clearTextLineThroughWidth() /*-{ this.textLineThroughWidth = ""; }-*/;
+public final native String getTextOverflow() /*-{ return this.textOverflow; }-*/;
+public final native void setTextOverflow(String value) /*-{ this.textOverflow = value; }-*/;
+public final native void clearTextOverflow() /*-{ this.textOverflow = ""; }-*/;
+public final native String getTextOverline() /*-{ return this.textOverline; }-*/;
+public final native void setTextOverline(String value) /*-{ this.textOverline = value; }-*/;
+public final native void clearTextOverline() /*-{ this.textOverline = ""; }-*/;
+public final native String getTextOverlineColor() /*-{ return this.textOverlineColor; }-*/;
+public final native void setTextOverlineColor(String value) /*-{ this.textOverlineColor = value; }-*/;
+public final native void clearTextOverlineColor() /*-{ this.textOverlineColor = ""; }-*/;
+public final native String getTextOverlineMode() /*-{ return this.textOverlineMode; }-*/;
+public final native void setTextOverlineMode(String value) /*-{ this.textOverlineMode = value; }-*/;
+public final native void clearTextOverlineMode() /*-{ this.textOverlineMode = ""; }-*/;
+public final native String getTextOverlineStyle() /*-{ return this.textOverlineStyle; }-*/;
+public final native void setTextOverlineStyle(String value) /*-{ this.textOverlineStyle = value; }-*/;
+public final native void clearTextOverlineStyle() /*-{ this.textOverlineStyle = ""; }-*/;
+public final native String getTextOverlineWidth() /*-{ return this.textOverlineWidth; }-*/;
+public final native void setTextOverlineWidth(String value) /*-{ this.textOverlineWidth = value; }-*/;
+public final native void clearTextOverlineWidth() /*-{ this.textOverlineWidth = ""; }-*/;
+public final native String getTextShadow() /*-{ return this.textShadow; }-*/;
+public final native void setTextShadow(String value) /*-{ this.textShadow = value; }-*/;
+public final native void clearTextShadow() /*-{ this.textShadow = ""; }-*/;
+public final native String getTextTransform() /*-{ return this.textTransform; }-*/;
+public final native void setTextTransform(String value) /*-{ this.textTransform = value; }-*/;
+public final native void clearTextTransform() /*-{ this.textTransform = ""; }-*/;
+public final native String getTextUnderline() /*-{ return this.textUnderline; }-*/;
+public final native void setTextUnderline(String value) /*-{ this.textUnderline = value; }-*/;
+public final native void clearTextUnderline() /*-{ this.textUnderline = ""; }-*/;
+public final native String getTextUnderlineColor() /*-{ return this.textUnderlineColor; }-*/;
+public final native void setTextUnderlineColor(String value) /*-{ this.textUnderlineColor = value; }-*/;
+public final native void clearTextUnderlineColor() /*-{ this.textUnderlineColor = ""; }-*/;
+public final native String getTextUnderlineMode() /*-{ return this.textUnderlineMode; }-*/;
+public final native void setTextUnderlineMode(String value) /*-{ this.textUnderlineMode = value; }-*/;
+public final native void clearTextUnderlineMode() /*-{ this.textUnderlineMode = ""; }-*/;
+public final native String getTextUnderlineStyle() /*-{ return this.textUnderlineStyle; }-*/;
+public final native void setTextUnderlineStyle(String value) /*-{ this.textUnderlineStyle = value; }-*/;
+public final native void clearTextUnderlineStyle() /*-{ this.textUnderlineStyle = ""; }-*/;
+public final native String getTextUnderlineWidth() /*-{ return this.textUnderlineWidth; }-*/;
+public final native void setTextUnderlineWidth(String value) /*-{ this.textUnderlineWidth = value; }-*/;
+public final native void clearTextUnderlineWidth() /*-{ this.textUnderlineWidth = ""; }-*/;
+public final native String getTop() /*-{ return this.top; }-*/;
+public final native void setTop(String value) /*-{ this.top = value; }-*/;
+public final native void clearTop() /*-{ this.top = ""; }-*/;
+public final native void setTop(double value, String unit) /*-{ this.top = value + unit; }-*/;
+public final native String getUnicodeBidi() /*-{ return this.unicodeBidi; }-*/;
+public final native void setUnicodeBidi(String value) /*-{ this.unicodeBidi = value; }-*/;
+public final native void clearUnicodeBidi() /*-{ this.unicodeBidi = ""; }-*/;
+public final native String getUnicodeRange() /*-{ return this.unicodeRange; }-*/;
+public final native void setUnicodeRange(String value) /*-{ this.unicodeRange = value; }-*/;
+public final native void clearUnicodeRange() /*-{ this.unicodeRange = ""; }-*/;
+public final native String getVerticalAlign() /*-{ return this.verticalAlign; }-*/;
+public final native void setVerticalAlign(String value) /*-{ this.verticalAlign = value; }-*/;
+public final native void clearVerticalAlign() /*-{ this.verticalAlign = ""; }-*/;
+public final native String getVisibility() /*-{ return this.visibility; }-*/;
+public final native void setVisibility(String value) /*-{ this.visibility = value; }-*/;
+public final native void clearVisibility() /*-{ this.visibility = ""; }-*/;
+public final native String getWhiteSpace() /*-{ return this.whiteSpace; }-*/;
+public final native void setWhiteSpace(String value) /*-{ this.whiteSpace = value; }-*/;
+public final native void clearWhiteSpace() /*-{ this.whiteSpace = ""; }-*/;
+public final native String getWidows() /*-{ return this.widows; }-*/;
+public final native void setWidows(String value) /*-{ this.widows = value; }-*/;
+public final native void clearWidows() /*-{ this.widows = ""; }-*/;
+public final native String getWidth() /*-{ return this.width; }-*/;
+public final native void setWidth(String value) /*-{ this.width = value; }-*/;
+public final native void clearWidth() /*-{ this.width = ""; }-*/;
+public final native void setWidth(double value, String unit) /*-{ this.width = value + unit; }-*/;
+public final native String getWordBreak() /*-{ return this.wordBreak; }-*/;
+public final native void setWordBreak(String value) /*-{ this.wordBreak = value; }-*/;
+public final native void clearWordBreak() /*-{ this.wordBreak = ""; }-*/;
+public final native String getWordSpacing() /*-{ return this.wordSpacing; }-*/;
+public final native void setWordSpacing(String value) /*-{ this.wordSpacing = value; }-*/;
+public final native void clearWordSpacing() /*-{ this.wordSpacing = ""; }-*/;
+public final native String getWordWrap() /*-{ return this.wordWrap; }-*/;
+public final native void setWordWrap(String value) /*-{ this.wordWrap = value; }-*/;
+public final native void clearWordWrap() /*-{ this.wordWrap = ""; }-*/;
+public final native int getZIndex() /*-{ return this.zIndex; }-*/;
+public final native void setZIndex(int value) /*-{ this.zIndex = value; }-*/;
+public final native void clearZIndex() /*-{ this.zIndex = ""; }-*/;
+public final native String getWebkitAnimation() /*-{ return this.webkitAnimation; }-*/;
+public final native void setWebkitAnimation(String value) /*-{ this.webkitAnimation = value; }-*/;
+public final native void clearWebkitAnimation() /*-{ this.webkitAnimation = ""; }-*/;
+public final native String getWebkitAnimationDelay() /*-{ return this.webkitAnimationDelay; }-*/;
+public final native void setWebkitAnimationDelay(String value) /*-{ this.webkitAnimationDelay = value; }-*/;
+public final native void clearWebkitAnimationDelay() /*-{ this.webkitAnimationDelay = ""; }-*/;
+public final native String getWebkitAnimationDirection() /*-{ return this.webkitAnimationDirection; }-*/;
+public final native void setWebkitAnimationDirection(String value) /*-{ this.webkitAnimationDirection = value; }-*/;
+public final native void clearWebkitAnimationDirection() /*-{ this.webkitAnimationDirection = ""; }-*/;
+public final native String getWebkitAnimationDuration() /*-{ return this.webkitAnimationDuration; }-*/;
+public final native void setWebkitAnimationDuration(String value) /*-{ this.webkitAnimationDuration = value; }-*/;
+public final native void clearWebkitAnimationDuration() /*-{ this.webkitAnimationDuration = ""; }-*/;
+public final native String getWebkitAnimationFillMode() /*-{ return this.webkitAnimationFillMode; }-*/;
+public final native void setWebkitAnimationFillMode(String value) /*-{ this.webkitAnimationFillMode = value; }-*/;
+public final native void clearWebkitAnimationFillMode() /*-{ this.webkitAnimationFillMode = ""; }-*/;
+public final native String getWebkitAnimationIterationCount() /*-{ return this.webkitAnimationIterationCount; }-*/;
+public final native void setWebkitAnimationIterationCount(String value) /*-{ this.webkitAnimationIterationCount = value; }-*/;
+public final native void clearWebkitAnimationIterationCount() /*-{ this.webkitAnimationIterationCount = ""; }-*/;
+public final native String getWebkitAnimationName() /*-{ return this.webkitAnimationName; }-*/;
+public final native void setWebkitAnimationName(String value) /*-{ this.webkitAnimationName = value; }-*/;
+public final native void clearWebkitAnimationName() /*-{ this.webkitAnimationName = ""; }-*/;
+public final native String getWebkitAnimationPlayState() /*-{ return this.webkitAnimationPlayState; }-*/;
+public final native void setWebkitAnimationPlayState(String value) /*-{ this.webkitAnimationPlayState = value; }-*/;
+public final native void clearWebkitAnimationPlayState() /*-{ this.webkitAnimationPlayState = ""; }-*/;
+public final native String getWebkitAnimationTimingFunction() /*-{ return this.webkitAnimationTimingFunction; }-*/;
+public final native void setWebkitAnimationTimingFunction(String value) /*-{ this.webkitAnimationTimingFunction = value; }-*/;
+public final native void clearWebkitAnimationTimingFunction() /*-{ this.webkitAnimationTimingFunction = ""; }-*/;
+public final native String getWebkitAppearance() /*-{ return this.webkitAppearance; }-*/;
+public final native void setWebkitAppearance(String value) /*-{ this.webkitAppearance = value; }-*/;
+public final native void clearWebkitAppearance() /*-{ this.webkitAppearance = ""; }-*/;
+public final native String getWebkitAspectRatio() /*-{ return this.webkitAspectRatio; }-*/;
+public final native void setWebkitAspectRatio(String value) /*-{ this.webkitAspectRatio = value; }-*/;
+public final native void clearWebkitAspectRatio() /*-{ this.webkitAspectRatio = ""; }-*/;
+public final native String getWebkitBackfaceVisibility() /*-{ return this.webkitBackfaceVisibility; }-*/;
+public final native void setWebkitBackfaceVisibility(String value) /*-{ this.webkitBackfaceVisibility = value; }-*/;
+public final native void clearWebkitBackfaceVisibility() /*-{ this.webkitBackfaceVisibility = ""; }-*/;
+public final native String getWebkitBackgroundClip() /*-{ return this.webkitBackgroundClip; }-*/;
+public final native void setWebkitBackgroundClip(String value) /*-{ this.webkitBackgroundClip = value; }-*/;
+public final native void clearWebkitBackgroundClip() /*-{ this.webkitBackgroundClip = ""; }-*/;
+public final native String getWebkitBackgroundComposite() /*-{ return this.webkitBackgroundComposite; }-*/;
+public final native void setWebkitBackgroundComposite(String value) /*-{ this.webkitBackgroundComposite = value; }-*/;
+public final native void clearWebkitBackgroundComposite() /*-{ this.webkitBackgroundComposite = ""; }-*/;
+public final native String getWebkitBackgroundOrigin() /*-{ return this.webkitBackgroundOrigin; }-*/;
+public final native void setWebkitBackgroundOrigin(String value) /*-{ this.webkitBackgroundOrigin = value; }-*/;
+public final native void clearWebkitBackgroundOrigin() /*-{ this.webkitBackgroundOrigin = ""; }-*/;
+public final native String getWebkitBackgroundSize() /*-{ return this.webkitBackgroundSize; }-*/;
+public final native void setWebkitBackgroundSize(String value) /*-{ this.webkitBackgroundSize = value; }-*/;
+public final native void clearWebkitBackgroundSize() /*-{ this.webkitBackgroundSize = ""; }-*/;
+public final native String getWebkitBorderAfter() /*-{ return this.webkitBorderAfter; }-*/;
+public final native void setWebkitBorderAfter(String value) /*-{ this.webkitBorderAfter = value; }-*/;
+public final native void clearWebkitBorderAfter() /*-{ this.webkitBorderAfter = ""; }-*/;
+public final native String getWebkitBorderAfterColor() /*-{ return this.webkitBorderAfterColor; }-*/;
+public final native void setWebkitBorderAfterColor(String value) /*-{ this.webkitBorderAfterColor = value; }-*/;
+public final native void clearWebkitBorderAfterColor() /*-{ this.webkitBorderAfterColor = ""; }-*/;
+public final native String getWebkitBorderAfterStyle() /*-{ return this.webkitBorderAfterStyle; }-*/;
+public final native void setWebkitBorderAfterStyle(String value) /*-{ this.webkitBorderAfterStyle = value; }-*/;
+public final native void clearWebkitBorderAfterStyle() /*-{ this.webkitBorderAfterStyle = ""; }-*/;
+public final native String getWebkitBorderAfterWidth() /*-{ return this.webkitBorderAfterWidth; }-*/;
+public final native void setWebkitBorderAfterWidth(String value) /*-{ this.webkitBorderAfterWidth = value; }-*/;
+public final native void clearWebkitBorderAfterWidth() /*-{ this.webkitBorderAfterWidth = ""; }-*/;
+public final native String getWebkitBorderBefore() /*-{ return this.webkitBorderBefore; }-*/;
+public final native void setWebkitBorderBefore(String value) /*-{ this.webkitBorderBefore = value; }-*/;
+public final native void clearWebkitBorderBefore() /*-{ this.webkitBorderBefore = ""; }-*/;
+public final native String getWebkitBorderBeforeColor() /*-{ return this.webkitBorderBeforeColor; }-*/;
+public final native void setWebkitBorderBeforeColor(String value) /*-{ this.webkitBorderBeforeColor = value; }-*/;
+public final native void clearWebkitBorderBeforeColor() /*-{ this.webkitBorderBeforeColor = ""; }-*/;
+public final native String getWebkitBorderBeforeStyle() /*-{ return this.webkitBorderBeforeStyle; }-*/;
+public final native void setWebkitBorderBeforeStyle(String value) /*-{ this.webkitBorderBeforeStyle = value; }-*/;
+public final native void clearWebkitBorderBeforeStyle() /*-{ this.webkitBorderBeforeStyle = ""; }-*/;
+public final native String getWebkitBorderBeforeWidth() /*-{ return this.webkitBorderBeforeWidth; }-*/;
+public final native void setWebkitBorderBeforeWidth(String value) /*-{ this.webkitBorderBeforeWidth = value; }-*/;
+public final native void clearWebkitBorderBeforeWidth() /*-{ this.webkitBorderBeforeWidth = ""; }-*/;
+public final native String getWebkitBorderEnd() /*-{ return this.webkitBorderEnd; }-*/;
+public final native void setWebkitBorderEnd(String value) /*-{ this.webkitBorderEnd = value; }-*/;
+public final native void clearWebkitBorderEnd() /*-{ this.webkitBorderEnd = ""; }-*/;
+public final native String getWebkitBorderEndColor() /*-{ return this.webkitBorderEndColor; }-*/;
+public final native void setWebkitBorderEndColor(String value) /*-{ this.webkitBorderEndColor = value; }-*/;
+public final native void clearWebkitBorderEndColor() /*-{ this.webkitBorderEndColor = ""; }-*/;
+public final native String getWebkitBorderEndStyle() /*-{ return this.webkitBorderEndStyle; }-*/;
+public final native void setWebkitBorderEndStyle(String value) /*-{ this.webkitBorderEndStyle = value; }-*/;
+public final native void clearWebkitBorderEndStyle() /*-{ this.webkitBorderEndStyle = ""; }-*/;
+public final native String getWebkitBorderEndWidth() /*-{ return this.webkitBorderEndWidth; }-*/;
+public final native void setWebkitBorderEndWidth(String value) /*-{ this.webkitBorderEndWidth = value; }-*/;
+public final native void clearWebkitBorderEndWidth() /*-{ this.webkitBorderEndWidth = ""; }-*/;
+public final native String getWebkitBorderFit() /*-{ return this.webkitBorderFit; }-*/;
+public final native void setWebkitBorderFit(String value) /*-{ this.webkitBorderFit = value; }-*/;
+public final native void clearWebkitBorderFit() /*-{ this.webkitBorderFit = ""; }-*/;
+public final native String getWebkitBorderHorizontalSpacing() /*-{ return this.webkitBorderHorizontalSpacing; }-*/;
+public final native void setWebkitBorderHorizontalSpacing(String value) /*-{ this.webkitBorderHorizontalSpacing = value; }-*/;
+public final native void clearWebkitBorderHorizontalSpacing() /*-{ this.webkitBorderHorizontalSpacing = ""; }-*/;
+public final native String getWebkitBorderImage() /*-{ return this.webkitBorderImage; }-*/;
+public final native void setWebkitBorderImage(String value) /*-{ this.webkitBorderImage = value; }-*/;
+public final native void clearWebkitBorderImage() /*-{ this.webkitBorderImage = ""; }-*/;
+public final native String getWebkitBorderRadius() /*-{ return this.webkitBorderRadius; }-*/;
+public final native void setWebkitBorderRadius(String value) /*-{ this.webkitBorderRadius = value; }-*/;
+public final native void clearWebkitBorderRadius() /*-{ this.webkitBorderRadius = ""; }-*/;
+public final native String getWebkitBorderStart() /*-{ return this.webkitBorderStart; }-*/;
+public final native void setWebkitBorderStart(String value) /*-{ this.webkitBorderStart = value; }-*/;
+public final native void clearWebkitBorderStart() /*-{ this.webkitBorderStart = ""; }-*/;
+public final native String getWebkitBorderStartColor() /*-{ return this.webkitBorderStartColor; }-*/;
+public final native void setWebkitBorderStartColor(String value) /*-{ this.webkitBorderStartColor = value; }-*/;
+public final native void clearWebkitBorderStartColor() /*-{ this.webkitBorderStartColor = ""; }-*/;
+public final native String getWebkitBorderStartStyle() /*-{ return this.webkitBorderStartStyle; }-*/;
+public final native void setWebkitBorderStartStyle(String value) /*-{ this.webkitBorderStartStyle = value; }-*/;
+public final native void clearWebkitBorderStartStyle() /*-{ this.webkitBorderStartStyle = ""; }-*/;
+public final native String getWebkitBorderStartWidth() /*-{ return this.webkitBorderStartWidth; }-*/;
+public final native void setWebkitBorderStartWidth(String value) /*-{ this.webkitBorderStartWidth = value; }-*/;
+public final native void clearWebkitBorderStartWidth() /*-{ this.webkitBorderStartWidth = ""; }-*/;
+public final native String getWebkitBorderVerticalSpacing() /*-{ return this.webkitBorderVerticalSpacing; }-*/;
+public final native void setWebkitBorderVerticalSpacing(String value) /*-{ this.webkitBorderVerticalSpacing = value; }-*/;
+public final native void clearWebkitBorderVerticalSpacing() /*-{ this.webkitBorderVerticalSpacing = ""; }-*/;
+public final native String getWebkitBoxAlign() /*-{ return this.webkitBoxAlign; }-*/;
+public final native void setWebkitBoxAlign(String value) /*-{ this.webkitBoxAlign = value; }-*/;
+public final native void clearWebkitBoxAlign() /*-{ this.webkitBoxAlign = ""; }-*/;
+public final native String getWebkitBoxDirection() /*-{ return this.webkitBoxDirection; }-*/;
+public final native void setWebkitBoxDirection(String value) /*-{ this.webkitBoxDirection = value; }-*/;
+public final native void clearWebkitBoxDirection() /*-{ this.webkitBoxDirection = ""; }-*/;
+public final native String getWebkitBoxFlex() /*-{ return this.webkitBoxFlex; }-*/;
+public final native void setWebkitBoxFlex(String value) /*-{ this.webkitBoxFlex = value; }-*/;
+public final native void clearWebkitBoxFlex() /*-{ this.webkitBoxFlex = ""; }-*/;
+public final native String getWebkitBoxFlexGroup() /*-{ return this.webkitBoxFlexGroup; }-*/;
+public final native void setWebkitBoxFlexGroup(String value) /*-{ this.webkitBoxFlexGroup = value; }-*/;
+public final native void clearWebkitBoxFlexGroup() /*-{ this.webkitBoxFlexGroup = ""; }-*/;
+public final native String getWebkitBoxLines() /*-{ return this.webkitBoxLines; }-*/;
+public final native void setWebkitBoxLines(String value) /*-{ this.webkitBoxLines = value; }-*/;
+public final native void clearWebkitBoxLines() /*-{ this.webkitBoxLines = ""; }-*/;
+public final native String getWebkitBoxOrdinalGroup() /*-{ return this.webkitBoxOrdinalGroup; }-*/;
+public final native void setWebkitBoxOrdinalGroup(String value) /*-{ this.webkitBoxOrdinalGroup = value; }-*/;
+public final native void clearWebkitBoxOrdinalGroup() /*-{ this.webkitBoxOrdinalGroup = ""; }-*/;
+public final native String getWebkitBoxOrient() /*-{ return this.webkitBoxOrient; }-*/;
+public final native void setWebkitBoxOrient(String value) /*-{ this.webkitBoxOrient = value; }-*/;
+public final native void clearWebkitBoxOrient() /*-{ this.webkitBoxOrient = ""; }-*/;
+public final native String getWebkitBoxPack() /*-{ return this.webkitBoxPack; }-*/;
+public final native void setWebkitBoxPack(String value) /*-{ this.webkitBoxPack = value; }-*/;
+public final native void clearWebkitBoxPack() /*-{ this.webkitBoxPack = ""; }-*/;
+public final native String getWebkitBoxReflect() /*-{ return this.webkitBoxReflect; }-*/;
+public final native void setWebkitBoxReflect(String value) /*-{ this.webkitBoxReflect = value; }-*/;
+public final native void clearWebkitBoxReflect() /*-{ this.webkitBoxReflect = ""; }-*/;
+public final native String getWebkitBoxShadow() /*-{ return this.webkitBoxShadow; }-*/;
+public final native void setWebkitBoxShadow(String value) /*-{ this.webkitBoxShadow = value; }-*/;
+public final native void clearWebkitBoxShadow() /*-{ this.webkitBoxShadow = ""; }-*/;
+public final native String getWebkitColorCorrection() /*-{ return this.webkitColorCorrection; }-*/;
+public final native void setWebkitColorCorrection(String value) /*-{ this.webkitColorCorrection = value; }-*/;
+public final native void clearWebkitColorCorrection() /*-{ this.webkitColorCorrection = ""; }-*/;
+public final native String getWebkitColumnAxis() /*-{ return this.webkitColumnAxis; }-*/;
+public final native void setWebkitColumnAxis(String value) /*-{ this.webkitColumnAxis = value; }-*/;
+public final native void clearWebkitColumnAxis() /*-{ this.webkitColumnAxis = ""; }-*/;
+public final native String getWebkitColumnBreakAfter() /*-{ return this.webkitColumnBreakAfter; }-*/;
+public final native void setWebkitColumnBreakAfter(String value) /*-{ this.webkitColumnBreakAfter = value; }-*/;
+public final native void clearWebkitColumnBreakAfter() /*-{ this.webkitColumnBreakAfter = ""; }-*/;
+public final native String getWebkitColumnBreakBefore() /*-{ return this.webkitColumnBreakBefore; }-*/;
+public final native void setWebkitColumnBreakBefore(String value) /*-{ this.webkitColumnBreakBefore = value; }-*/;
+public final native void clearWebkitColumnBreakBefore() /*-{ this.webkitColumnBreakBefore = ""; }-*/;
+public final native String getWebkitColumnBreakInside() /*-{ return this.webkitColumnBreakInside; }-*/;
+public final native void setWebkitColumnBreakInside(String value) /*-{ this.webkitColumnBreakInside = value; }-*/;
+public final native void clearWebkitColumnBreakInside() /*-{ this.webkitColumnBreakInside = ""; }-*/;
+public final native String getWebkitColumnCount() /*-{ return this.webkitColumnCount; }-*/;
+public final native void setWebkitColumnCount(String value) /*-{ this.webkitColumnCount = value; }-*/;
+public final native void clearWebkitColumnCount() /*-{ this.webkitColumnCount = ""; }-*/;
+public final native String getWebkitColumnGap() /*-{ return this.webkitColumnGap; }-*/;
+public final native void setWebkitColumnGap(String value) /*-{ this.webkitColumnGap = value; }-*/;
+public final native void clearWebkitColumnGap() /*-{ this.webkitColumnGap = ""; }-*/;
+public final native String getWebkitColumnRule() /*-{ return this.webkitColumnRule; }-*/;
+public final native void setWebkitColumnRule(String value) /*-{ this.webkitColumnRule = value; }-*/;
+public final native void clearWebkitColumnRule() /*-{ this.webkitColumnRule = ""; }-*/;
+public final native String getWebkitColumnRuleColor() /*-{ return this.webkitColumnRuleColor; }-*/;
+public final native void setWebkitColumnRuleColor(String value) /*-{ this.webkitColumnRuleColor = value; }-*/;
+public final native void clearWebkitColumnRuleColor() /*-{ this.webkitColumnRuleColor = ""; }-*/;
+public final native String getWebkitColumnRuleStyle() /*-{ return this.webkitColumnRuleStyle; }-*/;
+public final native void setWebkitColumnRuleStyle(String value) /*-{ this.webkitColumnRuleStyle = value; }-*/;
+public final native void clearWebkitColumnRuleStyle() /*-{ this.webkitColumnRuleStyle = ""; }-*/;
+public final native String getWebkitColumnRuleWidth() /*-{ return this.webkitColumnRuleWidth; }-*/;
+public final native void setWebkitColumnRuleWidth(String value) /*-{ this.webkitColumnRuleWidth = value; }-*/;
+public final native void clearWebkitColumnRuleWidth() /*-{ this.webkitColumnRuleWidth = ""; }-*/;
+public final native String getWebkitColumnSpan() /*-{ return this.webkitColumnSpan; }-*/;
+public final native void setWebkitColumnSpan(String value) /*-{ this.webkitColumnSpan = value; }-*/;
+public final native void clearWebkitColumnSpan() /*-{ this.webkitColumnSpan = ""; }-*/;
+public final native String getWebkitColumnWidth() /*-{ return this.webkitColumnWidth; }-*/;
+public final native void setWebkitColumnWidth(String value) /*-{ this.webkitColumnWidth = value; }-*/;
+public final native void clearWebkitColumnWidth() /*-{ this.webkitColumnWidth = ""; }-*/;
+public final native String getWebkitColumns() /*-{ return this.webkitColumns; }-*/;
+public final native void setWebkitColumns(String value) /*-{ this.webkitColumns = value; }-*/;
+public final native void clearWebkitColumns() /*-{ this.webkitColumns = ""; }-*/;
+public final native String getWebkitFilter() /*-{ return this.webkitFilter; }-*/;
+public final native void setWebkitFilter(String value) /*-{ this.webkitFilter = value; }-*/;
+public final native void clearWebkitFilter() /*-{ this.webkitFilter = ""; }-*/;
+public final native String getWebkitFlex() /*-{ return this.webkitFlex; }-*/;
+public final native void setWebkitFlex(String value) /*-{ this.webkitFlex = value; }-*/;
+public final native void clearWebkitFlex() /*-{ this.webkitFlex = ""; }-*/;
+public final native String getWebkitFlexAlign() /*-{ return this.webkitFlexAlign; }-*/;
+public final native void setWebkitFlexAlign(String value) /*-{ this.webkitFlexAlign = value; }-*/;
+public final native void clearWebkitFlexAlign() /*-{ this.webkitFlexAlign = ""; }-*/;
+public final native String getWebkitFlexDirection() /*-{ return this.webkitFlexDirection; }-*/;
+public final native void setWebkitFlexDirection(String value) /*-{ this.webkitFlexDirection = value; }-*/;
+public final native void clearWebkitFlexDirection() /*-{ this.webkitFlexDirection = ""; }-*/;
+public final native String getWebkitFlexFlow() /*-{ return this.webkitFlexFlow; }-*/;
+public final native void setWebkitFlexFlow(String value) /*-{ this.webkitFlexFlow = value; }-*/;
+public final native void clearWebkitFlexFlow() /*-{ this.webkitFlexFlow = ""; }-*/;
+public final native String getWebkitFlexItemAlign() /*-{ return this.webkitFlexItemAlign; }-*/;
+public final native void setWebkitFlexItemAlign(String value) /*-{ this.webkitFlexItemAlign = value; }-*/;
+public final native void clearWebkitFlexItemAlign() /*-{ this.webkitFlexItemAlign = ""; }-*/;
+public final native String getWebkitFlexLinePack() /*-{ return this.webkitFlexLinePack; }-*/;
+public final native void setWebkitFlexLinePack(String value) /*-{ this.webkitFlexLinePack = value; }-*/;
+public final native void clearWebkitFlexLinePack() /*-{ this.webkitFlexLinePack = ""; }-*/;
+public final native String getWebkitFlexOrder() /*-{ return this.webkitFlexOrder; }-*/;
+public final native void setWebkitFlexOrder(String value) /*-{ this.webkitFlexOrder = value; }-*/;
+public final native void clearWebkitFlexOrder() /*-{ this.webkitFlexOrder = ""; }-*/;
+public final native String getWebkitFlexPack() /*-{ return this.webkitFlexPack; }-*/;
+public final native void setWebkitFlexPack(String value) /*-{ this.webkitFlexPack = value; }-*/;
+public final native void clearWebkitFlexPack() /*-{ this.webkitFlexPack = ""; }-*/;
+public final native String getWebkitFlexWrap() /*-{ return this.webkitFlexWrap; }-*/;
+public final native void setWebkitFlexWrap(String value) /*-{ this.webkitFlexWrap = value; }-*/;
+public final native void clearWebkitFlexWrap() /*-{ this.webkitFlexWrap = ""; }-*/;
+public final native String getWebkitFontSizeDelta() /*-{ return this.webkitFontSizeDelta; }-*/;
+public final native void setWebkitFontSizeDelta(String value) /*-{ this.webkitFontSizeDelta = value; }-*/;
+public final native void clearWebkitFontSizeDelta() /*-{ this.webkitFontSizeDelta = ""; }-*/;
+public final native String getWebkitGridColumns() /*-{ return this.webkitGridColumns; }-*/;
+public final native void setWebkitGridColumns(String value) /*-{ this.webkitGridColumns = value; }-*/;
+public final native void clearWebkitGridColumns() /*-{ this.webkitGridColumns = ""; }-*/;
+public final native String getWebkitGridRows() /*-{ return this.webkitGridRows; }-*/;
+public final native void setWebkitGridRows(String value) /*-{ this.webkitGridRows = value; }-*/;
+public final native void clearWebkitGridRows() /*-{ this.webkitGridRows = ""; }-*/;
+public final native String getWebkitGridColumn() /*-{ return this.webkitGridColumn; }-*/;
+public final native void setWebkitGridColumn(String value) /*-{ this.webkitGridColumn = value; }-*/;
+public final native void clearWebkitGridColumn() /*-{ this.webkitGridColumn = ""; }-*/;
+public final native String getWebkitGridRow() /*-{ return this.webkitGridRow; }-*/;
+public final native void setWebkitGridRow(String value) /*-{ this.webkitGridRow = value; }-*/;
+public final native void clearWebkitGridRow() /*-{ this.webkitGridRow = ""; }-*/;
+public final native String getWebkitHighlight() /*-{ return this.webkitHighlight; }-*/;
+public final native void setWebkitHighlight(String value) /*-{ this.webkitHighlight = value; }-*/;
+public final native void clearWebkitHighlight() /*-{ this.webkitHighlight = ""; }-*/;
+public final native String getWebkitHyphenateCharacter() /*-{ return this.webkitHyphenateCharacter; }-*/;
+public final native void setWebkitHyphenateCharacter(String value) /*-{ this.webkitHyphenateCharacter = value; }-*/;
+public final native void clearWebkitHyphenateCharacter() /*-{ this.webkitHyphenateCharacter = ""; }-*/;
+public final native String getWebkitHyphenateLimitAfter() /*-{ return this.webkitHyphenateLimitAfter; }-*/;
+public final native void setWebkitHyphenateLimitAfter(String value) /*-{ this.webkitHyphenateLimitAfter = value; }-*/;
+public final native void clearWebkitHyphenateLimitAfter() /*-{ this.webkitHyphenateLimitAfter = ""; }-*/;
+public final native String getWebkitHyphenateLimitBefore() /*-{ return this.webkitHyphenateLimitBefore; }-*/;
+public final native void setWebkitHyphenateLimitBefore(String value) /*-{ this.webkitHyphenateLimitBefore = value; }-*/;
+public final native void clearWebkitHyphenateLimitBefore() /*-{ this.webkitHyphenateLimitBefore = ""; }-*/;
+public final native String getWebkitHyphenateLimitLines() /*-{ return this.webkitHyphenateLimitLines; }-*/;
+public final native void setWebkitHyphenateLimitLines(String value) /*-{ this.webkitHyphenateLimitLines = value; }-*/;
+public final native void clearWebkitHyphenateLimitLines() /*-{ this.webkitHyphenateLimitLines = ""; }-*/;
+public final native String getWebkitHyphens() /*-{ return this.webkitHyphens; }-*/;
+public final native void setWebkitHyphens(String value) /*-{ this.webkitHyphens = value; }-*/;
+public final native void clearWebkitHyphens() /*-{ this.webkitHyphens = ""; }-*/;
+public final native String getWebkitLineBoxContain() /*-{ return this.webkitLineBoxContain; }-*/;
+public final native void setWebkitLineBoxContain(String value) /*-{ this.webkitLineBoxContain = value; }-*/;
+public final native void clearWebkitLineBoxContain() /*-{ this.webkitLineBoxContain = ""; }-*/;
+public final native String getWebkitLineAlign() /*-{ return this.webkitLineAlign; }-*/;
+public final native void setWebkitLineAlign(String value) /*-{ this.webkitLineAlign = value; }-*/;
+public final native void clearWebkitLineAlign() /*-{ this.webkitLineAlign = ""; }-*/;
+public final native String getWebkitLineBreak() /*-{ return this.webkitLineBreak; }-*/;
+public final native void setWebkitLineBreak(String value) /*-{ this.webkitLineBreak = value; }-*/;
+public final native void clearWebkitLineBreak() /*-{ this.webkitLineBreak = ""; }-*/;
+public final native String getWebkitLineClamp() /*-{ return this.webkitLineClamp; }-*/;
+public final native void setWebkitLineClamp(String value) /*-{ this.webkitLineClamp = value; }-*/;
+public final native void clearWebkitLineClamp() /*-{ this.webkitLineClamp = ""; }-*/;
+public final native String getWebkitLineGrid() /*-{ return this.webkitLineGrid; }-*/;
+public final native void setWebkitLineGrid(String value) /*-{ this.webkitLineGrid = value; }-*/;
+public final native void clearWebkitLineGrid() /*-{ this.webkitLineGrid = ""; }-*/;
+public final native String getWebkitLineSnap() /*-{ return this.webkitLineSnap; }-*/;
+public final native void setWebkitLineSnap(String value) /*-{ this.webkitLineSnap = value; }-*/;
+public final native void clearWebkitLineSnap() /*-{ this.webkitLineSnap = ""; }-*/;
+public final native String getWebkitLogicalWidth() /*-{ return this.webkitLogicalWidth; }-*/;
+public final native void setWebkitLogicalWidth(String value) /*-{ this.webkitLogicalWidth = value; }-*/;
+public final native void clearWebkitLogicalWidth() /*-{ this.webkitLogicalWidth = ""; }-*/;
+public final native String getWebkitLogicalHeight() /*-{ return this.webkitLogicalHeight; }-*/;
+public final native void setWebkitLogicalHeight(String value) /*-{ this.webkitLogicalHeight = value; }-*/;
+public final native void clearWebkitLogicalHeight() /*-{ this.webkitLogicalHeight = ""; }-*/;
+public final native String getWebkitMarginAfterCollapse() /*-{ return this.webkitMarginAfterCollapse; }-*/;
+public final native void setWebkitMarginAfterCollapse(String value) /*-{ this.webkitMarginAfterCollapse = value; }-*/;
+public final native void clearWebkitMarginAfterCollapse() /*-{ this.webkitMarginAfterCollapse = ""; }-*/;
+public final native String getWebkitMarginBeforeCollapse() /*-{ return this.webkitMarginBeforeCollapse; }-*/;
+public final native void setWebkitMarginBeforeCollapse(String value) /*-{ this.webkitMarginBeforeCollapse = value; }-*/;
+public final native void clearWebkitMarginBeforeCollapse() /*-{ this.webkitMarginBeforeCollapse = ""; }-*/;
+public final native String getWebkitMarginBottomCollapse() /*-{ return this.webkitMarginBottomCollapse; }-*/;
+public final native void setWebkitMarginBottomCollapse(String value) /*-{ this.webkitMarginBottomCollapse = value; }-*/;
+public final native void clearWebkitMarginBottomCollapse() /*-{ this.webkitMarginBottomCollapse = ""; }-*/;
+public final native String getWebkitMarginTopCollapse() /*-{ return this.webkitMarginTopCollapse; }-*/;
+public final native void setWebkitMarginTopCollapse(String value) /*-{ this.webkitMarginTopCollapse = value; }-*/;
+public final native void clearWebkitMarginTopCollapse() /*-{ this.webkitMarginTopCollapse = ""; }-*/;
+public final native String getWebkitMarginCollapse() /*-{ return this.webkitMarginCollapse; }-*/;
+public final native void setWebkitMarginCollapse(String value) /*-{ this.webkitMarginCollapse = value; }-*/;
+public final native void clearWebkitMarginCollapse() /*-{ this.webkitMarginCollapse = ""; }-*/;
+public final native String getWebkitMarginAfter() /*-{ return this.webkitMarginAfter; }-*/;
+public final native void setWebkitMarginAfter(String value) /*-{ this.webkitMarginAfter = value; }-*/;
+public final native void clearWebkitMarginAfter() /*-{ this.webkitMarginAfter = ""; }-*/;
+public final native String getWebkitMarginBefore() /*-{ return this.webkitMarginBefore; }-*/;
+public final native void setWebkitMarginBefore(String value) /*-{ this.webkitMarginBefore = value; }-*/;
+public final native void clearWebkitMarginBefore() /*-{ this.webkitMarginBefore = ""; }-*/;
+public final native String getWebkitMarginEnd() /*-{ return this.webkitMarginEnd; }-*/;
+public final native void setWebkitMarginEnd(String value) /*-{ this.webkitMarginEnd = value; }-*/;
+public final native void clearWebkitMarginEnd() /*-{ this.webkitMarginEnd = ""; }-*/;
+public final native String getWebkitMarginStart() /*-{ return this.webkitMarginStart; }-*/;
+public final native void setWebkitMarginStart(String value) /*-{ this.webkitMarginStart = value; }-*/;
+public final native void clearWebkitMarginStart() /*-{ this.webkitMarginStart = ""; }-*/;
+public final native String getWebkitMarquee() /*-{ return this.webkitMarquee; }-*/;
+public final native void setWebkitMarquee(String value) /*-{ this.webkitMarquee = value; }-*/;
+public final native void clearWebkitMarquee() /*-{ this.webkitMarquee = ""; }-*/;
+public final native String getWebkitMarqueeDirection() /*-{ return this.webkitMarqueeDirection; }-*/;
+public final native void setWebkitMarqueeDirection(String value) /*-{ this.webkitMarqueeDirection = value; }-*/;
+public final native void clearWebkitMarqueeDirection() /*-{ this.webkitMarqueeDirection = ""; }-*/;
+public final native String getWebkitMarqueeIncrement() /*-{ return this.webkitMarqueeIncrement; }-*/;
+public final native void setWebkitMarqueeIncrement(String value) /*-{ this.webkitMarqueeIncrement = value; }-*/;
+public final native void clearWebkitMarqueeIncrement() /*-{ this.webkitMarqueeIncrement = ""; }-*/;
+public final native String getWebkitMarqueeRepetition() /*-{ return this.webkitMarqueeRepetition; }-*/;
+public final native void setWebkitMarqueeRepetition(String value) /*-{ this.webkitMarqueeRepetition = value; }-*/;
+public final native void clearWebkitMarqueeRepetition() /*-{ this.webkitMarqueeRepetition = ""; }-*/;
+public final native String getWebkitMarqueeSpeed() /*-{ return this.webkitMarqueeSpeed; }-*/;
+public final native void setWebkitMarqueeSpeed(String value) /*-{ this.webkitMarqueeSpeed = value; }-*/;
+public final native void clearWebkitMarqueeSpeed() /*-{ this.webkitMarqueeSpeed = ""; }-*/;
+public final native String getWebkitMarqueeStyle() /*-{ return this.webkitMarqueeStyle; }-*/;
+public final native void setWebkitMarqueeStyle(String value) /*-{ this.webkitMarqueeStyle = value; }-*/;
+public final native void clearWebkitMarqueeStyle() /*-{ this.webkitMarqueeStyle = ""; }-*/;
+public final native String getWebkitMask() /*-{ return this.webkitMask; }-*/;
+public final native void setWebkitMask(String value) /*-{ this.webkitMask = value; }-*/;
+public final native void clearWebkitMask() /*-{ this.webkitMask = ""; }-*/;
+public final native String getWebkitMaskAttachment() /*-{ return this.webkitMaskAttachment; }-*/;
+public final native void setWebkitMaskAttachment(String value) /*-{ this.webkitMaskAttachment = value; }-*/;
+public final native void clearWebkitMaskAttachment() /*-{ this.webkitMaskAttachment = ""; }-*/;
+public final native String getWebkitMaskBoxImage() /*-{ return this.webkitMaskBoxImage; }-*/;
+public final native void setWebkitMaskBoxImage(String value) /*-{ this.webkitMaskBoxImage = value; }-*/;
+public final native void clearWebkitMaskBoxImage() /*-{ this.webkitMaskBoxImage = ""; }-*/;
+public final native String getWebkitMaskBoxImageOutset() /*-{ return this.webkitMaskBoxImageOutset; }-*/;
+public final native void setWebkitMaskBoxImageOutset(String value) /*-{ this.webkitMaskBoxImageOutset = value; }-*/;
+public final native void clearWebkitMaskBoxImageOutset() /*-{ this.webkitMaskBoxImageOutset = ""; }-*/;
+public final native String getWebkitMaskBoxImageRepeat() /*-{ return this.webkitMaskBoxImageRepeat; }-*/;
+public final native void setWebkitMaskBoxImageRepeat(String value) /*-{ this.webkitMaskBoxImageRepeat = value; }-*/;
+public final native void clearWebkitMaskBoxImageRepeat() /*-{ this.webkitMaskBoxImageRepeat = ""; }-*/;
+public final native String getWebkitMaskBoxImageSlice() /*-{ return this.webkitMaskBoxImageSlice; }-*/;
+public final native void setWebkitMaskBoxImageSlice(String value) /*-{ this.webkitMaskBoxImageSlice = value; }-*/;
+public final native void clearWebkitMaskBoxImageSlice() /*-{ this.webkitMaskBoxImageSlice = ""; }-*/;
+public final native String getWebkitMaskBoxImageSource() /*-{ return this.webkitMaskBoxImageSource; }-*/;
+public final native void setWebkitMaskBoxImageSource(String value) /*-{ this.webkitMaskBoxImageSource = value; }-*/;
+public final native void clearWebkitMaskBoxImageSource() /*-{ this.webkitMaskBoxImageSource = ""; }-*/;
+public final native String getWebkitMaskBoxImageWidth() /*-{ return this.webkitMaskBoxImageWidth; }-*/;
+public final native void setWebkitMaskBoxImageWidth(String value) /*-{ this.webkitMaskBoxImageWidth = value; }-*/;
+public final native void clearWebkitMaskBoxImageWidth() /*-{ this.webkitMaskBoxImageWidth = ""; }-*/;
+public final native String getWebkitMaskClip() /*-{ return this.webkitMaskClip; }-*/;
+public final native void setWebkitMaskClip(String value) /*-{ this.webkitMaskClip = value; }-*/;
+public final native void clearWebkitMaskClip() /*-{ this.webkitMaskClip = ""; }-*/;
+public final native String getWebkitMaskComposite() /*-{ return this.webkitMaskComposite; }-*/;
+public final native void setWebkitMaskComposite(String value) /*-{ this.webkitMaskComposite = value; }-*/;
+public final native void clearWebkitMaskComposite() /*-{ this.webkitMaskComposite = ""; }-*/;
+public final native String getWebkitMaskImage() /*-{ return this.webkitMaskImage; }-*/;
+public final native void setWebkitMaskImage(String value) /*-{ this.webkitMaskImage = value; }-*/;
+public final native void clearWebkitMaskImage() /*-{ this.webkitMaskImage = ""; }-*/;
+public final native String getWebkitMaskOrigin() /*-{ return this.webkitMaskOrigin; }-*/;
+public final native void setWebkitMaskOrigin(String value) /*-{ this.webkitMaskOrigin = value; }-*/;
+public final native void clearWebkitMaskOrigin() /*-{ this.webkitMaskOrigin = ""; }-*/;
+public final native String getWebkitMaskPosition() /*-{ return this.webkitMaskPosition; }-*/;
+public final native void setWebkitMaskPosition(String value) /*-{ this.webkitMaskPosition = value; }-*/;
+public final native void clearWebkitMaskPosition() /*-{ this.webkitMaskPosition = ""; }-*/;
+public final native String getWebkitMaskPositionX() /*-{ return this.webkitMaskPositionX; }-*/;
+public final native void setWebkitMaskPositionX(String value) /*-{ this.webkitMaskPositionX = value; }-*/;
+public final native void clearWebkitMaskPositionX() /*-{ this.webkitMaskPositionX = ""; }-*/;
+public final native String getWebkitMaskPositionY() /*-{ return this.webkitMaskPositionY; }-*/;
+public final native void setWebkitMaskPositionY(String value) /*-{ this.webkitMaskPositionY = value; }-*/;
+public final native void clearWebkitMaskPositionY() /*-{ this.webkitMaskPositionY = ""; }-*/;
+public final native String getWebkitMaskRepeat() /*-{ return this.webkitMaskRepeat; }-*/;
+public final native void setWebkitMaskRepeat(String value) /*-{ this.webkitMaskRepeat = value; }-*/;
+public final native void clearWebkitMaskRepeat() /*-{ this.webkitMaskRepeat = ""; }-*/;
+public final native String getWebkitMaskRepeatX() /*-{ return this.webkitMaskRepeatX; }-*/;
+public final native void setWebkitMaskRepeatX(String value) /*-{ this.webkitMaskRepeatX = value; }-*/;
+public final native void clearWebkitMaskRepeatX() /*-{ this.webkitMaskRepeatX = ""; }-*/;
+public final native String getWebkitMaskRepeatY() /*-{ return this.webkitMaskRepeatY; }-*/;
+public final native void setWebkitMaskRepeatY(String value) /*-{ this.webkitMaskRepeatY = value; }-*/;
+public final native void clearWebkitMaskRepeatY() /*-{ this.webkitMaskRepeatY = ""; }-*/;
+public final native String getWebkitMaskSize() /*-{ return this.webkitMaskSize; }-*/;
+public final native void setWebkitMaskSize(String value) /*-{ this.webkitMaskSize = value; }-*/;
+public final native void clearWebkitMaskSize() /*-{ this.webkitMaskSize = ""; }-*/;
+public final native String getWebkitMatchNearestMailBlockquoteColor() /*-{ return this.webkitMatchNearestMailBlockquoteColor; }-*/;
+public final native void setWebkitMatchNearestMailBlockquoteColor(String value) /*-{ this.webkitMatchNearestMailBlockquoteColor = value; }-*/;
+public final native void clearWebkitMatchNearestMailBlockquoteColor() /*-{ this.webkitMatchNearestMailBlockquoteColor = ""; }-*/;
+public final native String getWebkitMaxLogicalWidth() /*-{ return this.webkitMaxLogicalWidth; }-*/;
+public final native void setWebkitMaxLogicalWidth(String value) /*-{ this.webkitMaxLogicalWidth = value; }-*/;
+public final native void clearWebkitMaxLogicalWidth() /*-{ this.webkitMaxLogicalWidth = ""; }-*/;
+public final native String getWebkitMaxLogicalHeight() /*-{ return this.webkitMaxLogicalHeight; }-*/;
+public final native void setWebkitMaxLogicalHeight(String value) /*-{ this.webkitMaxLogicalHeight = value; }-*/;
+public final native void clearWebkitMaxLogicalHeight() /*-{ this.webkitMaxLogicalHeight = ""; }-*/;
+public final native String getWebkitMinLogicalWidth() /*-{ return this.webkitMinLogicalWidth; }-*/;
+public final native void setWebkitMinLogicalWidth(String value) /*-{ this.webkitMinLogicalWidth = value; }-*/;
+public final native void clearWebkitMinLogicalWidth() /*-{ this.webkitMinLogicalWidth = ""; }-*/;
+public final native String getWebkitMinLogicalHeight() /*-{ return this.webkitMinLogicalHeight; }-*/;
+public final native void setWebkitMinLogicalHeight(String value) /*-{ this.webkitMinLogicalHeight = value; }-*/;
+public final native void clearWebkitMinLogicalHeight() /*-{ this.webkitMinLogicalHeight = ""; }-*/;
+public final native String getWebkitNbspMode() /*-{ return this.webkitNbspMode; }-*/;
+public final native void setWebkitNbspMode(String value) /*-{ this.webkitNbspMode = value; }-*/;
+public final native void clearWebkitNbspMode() /*-{ this.webkitNbspMode = ""; }-*/;
+public final native String getWebkitPaddingAfter() /*-{ return this.webkitPaddingAfter; }-*/;
+public final native void setWebkitPaddingAfter(String value) /*-{ this.webkitPaddingAfter = value; }-*/;
+public final native void clearWebkitPaddingAfter() /*-{ this.webkitPaddingAfter = ""; }-*/;
+public final native String getWebkitPaddingBefore() /*-{ return this.webkitPaddingBefore; }-*/;
+public final native void setWebkitPaddingBefore(String value) /*-{ this.webkitPaddingBefore = value; }-*/;
+public final native void clearWebkitPaddingBefore() /*-{ this.webkitPaddingBefore = ""; }-*/;
+public final native String getWebkitPaddingEnd() /*-{ return this.webkitPaddingEnd; }-*/;
+public final native void setWebkitPaddingEnd(String value) /*-{ this.webkitPaddingEnd = value; }-*/;
+public final native void clearWebkitPaddingEnd() /*-{ this.webkitPaddingEnd = ""; }-*/;
+public final native String getWebkitPaddingStart() /*-{ return this.webkitPaddingStart; }-*/;
+public final native void setWebkitPaddingStart(String value) /*-{ this.webkitPaddingStart = value; }-*/;
+public final native void clearWebkitPaddingStart() /*-{ this.webkitPaddingStart = ""; }-*/;
+public final native String getWebkitPerspective() /*-{ return this.webkitPerspective; }-*/;
+public final native void setWebkitPerspective(String value) /*-{ this.webkitPerspective = value; }-*/;
+public final native void clearWebkitPerspective() /*-{ this.webkitPerspective = ""; }-*/;
+public final native String getWebkitPerspectiveOrigin() /*-{ return this.webkitPerspectiveOrigin; }-*/;
+public final native void setWebkitPerspectiveOrigin(String value) /*-{ this.webkitPerspectiveOrigin = value; }-*/;
+public final native void clearWebkitPerspectiveOrigin() /*-{ this.webkitPerspectiveOrigin = ""; }-*/;
+public final native String getWebkitPerspectiveOriginX() /*-{ return this.webkitPerspectiveOriginX; }-*/;
+public final native void setWebkitPerspectiveOriginX(String value) /*-{ this.webkitPerspectiveOriginX = value; }-*/;
+public final native void clearWebkitPerspectiveOriginX() /*-{ this.webkitPerspectiveOriginX = ""; }-*/;
+public final native String getWebkitPerspectiveOriginY() /*-{ return this.webkitPerspectiveOriginY; }-*/;
+public final native void setWebkitPerspectiveOriginY(String value) /*-{ this.webkitPerspectiveOriginY = value; }-*/;
+public final native void clearWebkitPerspectiveOriginY() /*-{ this.webkitPerspectiveOriginY = ""; }-*/;
+public final native String getWebkitPrintColorAdjust() /*-{ return this.webkitPrintColorAdjust; }-*/;
+public final native void setWebkitPrintColorAdjust(String value) /*-{ this.webkitPrintColorAdjust = value; }-*/;
+public final native void clearWebkitPrintColorAdjust() /*-{ this.webkitPrintColorAdjust = ""; }-*/;
+public final native String getWebkitRtlOrdering() /*-{ return this.webkitRtlOrdering; }-*/;
+public final native void setWebkitRtlOrdering(String value) /*-{ this.webkitRtlOrdering = value; }-*/;
+public final native void clearWebkitRtlOrdering() /*-{ this.webkitRtlOrdering = ""; }-*/;
+public final native String getWebkitTextCombine() /*-{ return this.webkitTextCombine; }-*/;
+public final native void setWebkitTextCombine(String value) /*-{ this.webkitTextCombine = value; }-*/;
+public final native void clearWebkitTextCombine() /*-{ this.webkitTextCombine = ""; }-*/;
+public final native String getWebkitTextDecorationsInEffect() /*-{ return this.webkitTextDecorationsInEffect; }-*/;
+public final native void setWebkitTextDecorationsInEffect(String value) /*-{ this.webkitTextDecorationsInEffect = value; }-*/;
+public final native void clearWebkitTextDecorationsInEffect() /*-{ this.webkitTextDecorationsInEffect = ""; }-*/;
+public final native String getWebkitTextEmphasis() /*-{ return this.webkitTextEmphasis; }-*/;
+public final native void setWebkitTextEmphasis(String value) /*-{ this.webkitTextEmphasis = value; }-*/;
+public final native void clearWebkitTextEmphasis() /*-{ this.webkitTextEmphasis = ""; }-*/;
+public final native String getWebkitTextEmphasisColor() /*-{ return this.webkitTextEmphasisColor; }-*/;
+public final native void setWebkitTextEmphasisColor(String value) /*-{ this.webkitTextEmphasisColor = value; }-*/;
+public final native void clearWebkitTextEmphasisColor() /*-{ this.webkitTextEmphasisColor = ""; }-*/;
+public final native String getWebkitTextEmphasisPosition() /*-{ return this.webkitTextEmphasisPosition; }-*/;
+public final native void setWebkitTextEmphasisPosition(String value) /*-{ this.webkitTextEmphasisPosition = value; }-*/;
+public final native void clearWebkitTextEmphasisPosition() /*-{ this.webkitTextEmphasisPosition = ""; }-*/;
+public final native String getWebkitTextEmphasisStyle() /*-{ return this.webkitTextEmphasisStyle; }-*/;
+public final native void setWebkitTextEmphasisStyle(String value) /*-{ this.webkitTextEmphasisStyle = value; }-*/;
+public final native void clearWebkitTextEmphasisStyle() /*-{ this.webkitTextEmphasisStyle = ""; }-*/;
+public final native String getWebkitTextFillColor() /*-{ return this.webkitTextFillColor; }-*/;
+public final native void setWebkitTextFillColor(String value) /*-{ this.webkitTextFillColor = value; }-*/;
+public final native void clearWebkitTextFillColor() /*-{ this.webkitTextFillColor = ""; }-*/;
+public final native String getWebkitTextSecurity() /*-{ return this.webkitTextSecurity; }-*/;
+public final native void setWebkitTextSecurity(String value) /*-{ this.webkitTextSecurity = value; }-*/;
+public final native void clearWebkitTextSecurity() /*-{ this.webkitTextSecurity = ""; }-*/;
+public final native String getWebkitTextStroke() /*-{ return this.webkitTextStroke; }-*/;
+public final native void setWebkitTextStroke(String value) /*-{ this.webkitTextStroke = value; }-*/;
+public final native void clearWebkitTextStroke() /*-{ this.webkitTextStroke = ""; }-*/;
+public final native String getWebkitTextStrokeColor() /*-{ return this.webkitTextStrokeColor; }-*/;
+public final native void setWebkitTextStrokeColor(String value) /*-{ this.webkitTextStrokeColor = value; }-*/;
+public final native void clearWebkitTextStrokeColor() /*-{ this.webkitTextStrokeColor = ""; }-*/;
+public final native String getWebkitTextStrokeWidth() /*-{ return this.webkitTextStrokeWidth; }-*/;
+public final native void setWebkitTextStrokeWidth(String value) /*-{ this.webkitTextStrokeWidth = value; }-*/;
+public final native void clearWebkitTextStrokeWidth() /*-{ this.webkitTextStrokeWidth = ""; }-*/;
+public final native String getWebkitTransform() /*-{ return this.webkitTransform; }-*/;
+public final native void setWebkitTransform(String value) /*-{ this.webkitTransform = value; }-*/;
+public final native void clearWebkitTransform() /*-{ this.webkitTransform = ""; }-*/;
+public final native String getWebkitTransformOrigin() /*-{ return this.webkitTransformOrigin; }-*/;
+public final native void setWebkitTransformOrigin(String value) /*-{ this.webkitTransformOrigin = value; }-*/;
+public final native void clearWebkitTransformOrigin() /*-{ this.webkitTransformOrigin = ""; }-*/;
+public final native String getWebkitTransformOriginX() /*-{ return this.webkitTransformOriginX; }-*/;
+public final native void setWebkitTransformOriginX(String value) /*-{ this.webkitTransformOriginX = value; }-*/;
+public final native void clearWebkitTransformOriginX() /*-{ this.webkitTransformOriginX = ""; }-*/;
+public final native String getWebkitTransformOriginY() /*-{ return this.webkitTransformOriginY; }-*/;
+public final native void setWebkitTransformOriginY(String value) /*-{ this.webkitTransformOriginY = value; }-*/;
+public final native void clearWebkitTransformOriginY() /*-{ this.webkitTransformOriginY = ""; }-*/;
+public final native String getWebkitTransformOriginZ() /*-{ return this.webkitTransformOriginZ; }-*/;
+public final native void setWebkitTransformOriginZ(String value) /*-{ this.webkitTransformOriginZ = value; }-*/;
+public final native void clearWebkitTransformOriginZ() /*-{ this.webkitTransformOriginZ = ""; }-*/;
+public final native String getWebkitTransformStyle() /*-{ return this.webkitTransformStyle; }-*/;
+public final native void setWebkitTransformStyle(String value) /*-{ this.webkitTransformStyle = value; }-*/;
+public final native void clearWebkitTransformStyle() /*-{ this.webkitTransformStyle = ""; }-*/;
+public final native String getWebkitTransition() /*-{ return this.webkitTransition; }-*/;
+public final native void setWebkitTransition(String value) /*-{ this.webkitTransition = value; }-*/;
+public final native void clearWebkitTransition() /*-{ this.webkitTransition = ""; }-*/;
+public final native String getWebkitTransitionDelay() /*-{ return this.webkitTransitionDelay; }-*/;
+public final native void setWebkitTransitionDelay(String value) /*-{ this.webkitTransitionDelay = value; }-*/;
+public final native void clearWebkitTransitionDelay() /*-{ this.webkitTransitionDelay = ""; }-*/;
+public final native String getWebkitTransitionDuration() /*-{ return this.webkitTransitionDuration; }-*/;
+public final native void setWebkitTransitionDuration(String value) /*-{ this.webkitTransitionDuration = value; }-*/;
+public final native void clearWebkitTransitionDuration() /*-{ this.webkitTransitionDuration = ""; }-*/;
+public final native String getWebkitTransitionProperty() /*-{ return this.webkitTransitionProperty; }-*/;
+public final native void setWebkitTransitionProperty(String value) /*-{ this.webkitTransitionProperty = value; }-*/;
+public final native void clearWebkitTransitionProperty() /*-{ this.webkitTransitionProperty = ""; }-*/;
+public final native String getWebkitTransitionTimingFunction() /*-{ return this.webkitTransitionTimingFunction; }-*/;
+public final native void setWebkitTransitionTimingFunction(String value) /*-{ this.webkitTransitionTimingFunction = value; }-*/;
+public final native void clearWebkitTransitionTimingFunction() /*-{ this.webkitTransitionTimingFunction = ""; }-*/;
+public final native String getWebkitUserDrag() /*-{ return this.webkitUserDrag; }-*/;
+public final native void setWebkitUserDrag(String value) /*-{ this.webkitUserDrag = value; }-*/;
+public final native void clearWebkitUserDrag() /*-{ this.webkitUserDrag = ""; }-*/;
+public final native String getWebkitUserModify() /*-{ return this.webkitUserModify; }-*/;
+public final native void setWebkitUserModify(String value) /*-{ this.webkitUserModify = value; }-*/;
+public final native void clearWebkitUserModify() /*-{ this.webkitUserModify = ""; }-*/;
+public final native String getWebkitUserSelect() /*-{ return this.webkitUserSelect; }-*/;
+public final native void setWebkitUserSelect(String value) /*-{ this.webkitUserSelect = value; }-*/;
+public final native void clearWebkitUserSelect() /*-{ this.webkitUserSelect = ""; }-*/;
+public final native String getWebkitFlowInto() /*-{ return this.webkitFlowInto; }-*/;
+public final native void setWebkitFlowInto(String value) /*-{ this.webkitFlowInto = value; }-*/;
+public final native void clearWebkitFlowInto() /*-{ this.webkitFlowInto = ""; }-*/;
+public final native String getWebkitFlowFrom() /*-{ return this.webkitFlowFrom; }-*/;
+public final native void setWebkitFlowFrom(String value) /*-{ this.webkitFlowFrom = value; }-*/;
+public final native void clearWebkitFlowFrom() /*-{ this.webkitFlowFrom = ""; }-*/;
+public final native String getWebkitRegionOverflow() /*-{ return this.webkitRegionOverflow; }-*/;
+public final native void setWebkitRegionOverflow(String value) /*-{ this.webkitRegionOverflow = value; }-*/;
+public final native void clearWebkitRegionOverflow() /*-{ this.webkitRegionOverflow = ""; }-*/;
+public final native String getWebkitShapeInside() /*-{ return this.webkitShapeInside; }-*/;
+public final native void setWebkitShapeInside(String value) /*-{ this.webkitShapeInside = value; }-*/;
+public final native void clearWebkitShapeInside() /*-{ this.webkitShapeInside = ""; }-*/;
+public final native String getWebkitShapeOutside() /*-{ return this.webkitShapeOutside; }-*/;
+public final native void setWebkitShapeOutside(String value) /*-{ this.webkitShapeOutside = value; }-*/;
+public final native void clearWebkitShapeOutside() /*-{ this.webkitShapeOutside = ""; }-*/;
+public final native String getWebkitWrapMargin() /*-{ return this.webkitWrapMargin; }-*/;
+public final native void setWebkitWrapMargin(String value) /*-{ this.webkitWrapMargin = value; }-*/;
+public final native void clearWebkitWrapMargin() /*-{ this.webkitWrapMargin = ""; }-*/;
+public final native String getWebkitWrapPadding() /*-{ return this.webkitWrapPadding; }-*/;
+public final native void setWebkitWrapPadding(String value) /*-{ this.webkitWrapPadding = value; }-*/;
+public final native void clearWebkitWrapPadding() /*-{ this.webkitWrapPadding = ""; }-*/;
+public final native String getWebkitRegionBreakAfter() /*-{ return this.webkitRegionBreakAfter; }-*/;
+public final native void setWebkitRegionBreakAfter(String value) /*-{ this.webkitRegionBreakAfter = value; }-*/;
+public final native void clearWebkitRegionBreakAfter() /*-{ this.webkitRegionBreakAfter = ""; }-*/;
+public final native String getWebkitRegionBreakBefore() /*-{ return this.webkitRegionBreakBefore; }-*/;
+public final native void setWebkitRegionBreakBefore(String value) /*-{ this.webkitRegionBreakBefore = value; }-*/;
+public final native void clearWebkitRegionBreakBefore() /*-{ this.webkitRegionBreakBefore = ""; }-*/;
+public final native String getWebkitRegionBreakInside() /*-{ return this.webkitRegionBreakInside; }-*/;
+public final native void setWebkitRegionBreakInside(String value) /*-{ this.webkitRegionBreakInside = value; }-*/;
+public final native void clearWebkitRegionBreakInside() /*-{ this.webkitRegionBreakInside = ""; }-*/;
+public final native String getWebkitWrapFlow() /*-{ return this.webkitWrapFlow; }-*/;
+public final native void setWebkitWrapFlow(String value) /*-{ this.webkitWrapFlow = value; }-*/;
+public final native void clearWebkitWrapFlow() /*-{ this.webkitWrapFlow = ""; }-*/;
+public final native String getWebkitWrapThrough() /*-{ return this.webkitWrapThrough; }-*/;
+public final native void setWebkitWrapThrough(String value) /*-{ this.webkitWrapThrough = value; }-*/;
+public final native void clearWebkitWrapThrough() /*-{ this.webkitWrapThrough = ""; }-*/;
+public final native String getWebkitWrap() /*-{ return this.webkitWrap; }-*/;
+public final native void setWebkitWrap(String value) /*-{ this.webkitWrap = value; }-*/;
+public final native void clearWebkitWrap() /*-{ this.webkitWrap = ""; }-*/;
+public final native String getWebkitTapHighlightColor() /*-{ return this.webkitTapHighlightColor; }-*/;
+public final native void setWebkitTapHighlightColor(String value) /*-{ this.webkitTapHighlightColor = value; }-*/;
+public final native void clearWebkitTapHighlightColor() /*-{ this.webkitTapHighlightColor = ""; }-*/;
+public final native String getWebkitDashboardRegion() /*-{ return this.webkitDashboardRegion; }-*/;
+public final native void setWebkitDashboardRegion(String value) /*-{ this.webkitDashboardRegion = value; }-*/;
+public final native void clearWebkitDashboardRegion() /*-{ this.webkitDashboardRegion = ""; }-*/;
+public final native String getWebkitOverflowScrolling() /*-{ return this.webkitOverflowScrolling; }-*/;
+public final native void setWebkitOverflowScrolling(String value) /*-{ this.webkitOverflowScrolling = value; }-*/;
+public final native void clearWebkitOverflowScrolling() /*-{ this.webkitOverflowScrolling = ""; }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSStyleRule.java b/elemental/src/elemental/js/css/JsCSSStyleRule.java
new file mode 100644
index 0000000..66ba8b3
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSStyleRule.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSStyleDeclaration;
+import elemental.css.CSSStyleRule;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSStyleRule extends JsCSSRule  implements CSSStyleRule {
+  protected JsCSSStyleRule() {}
+
+  public final native String getSelectorText() /*-{
+    return this.selectorText;
+  }-*/;
+
+  public final native void setSelectorText(String param_selectorText) /*-{
+    this.selectorText = param_selectorText;
+  }-*/;
+
+  public final native JsCSSStyleDeclaration getStyle() /*-{
+    return this.style;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSStyleSheet.java b/elemental/src/elemental/js/css/JsCSSStyleSheet.java
new file mode 100644
index 0000000..b0b0a46
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSStyleSheet.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.js.stylesheets.JsStyleSheet;
+import elemental.stylesheets.StyleSheet;
+import elemental.css.CSSRule;
+import elemental.css.CSSStyleSheet;
+import elemental.css.CSSRuleList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSStyleSheet extends JsStyleSheet  implements CSSStyleSheet {
+  protected JsCSSStyleSheet() {}
+
+  public final native JsCSSRuleList getCssRules() /*-{
+    return this.cssRules;
+  }-*/;
+
+  public final native JsCSSRule getOwnerRule() /*-{
+    return this.ownerRule;
+  }-*/;
+
+  public final native JsCSSRuleList getRules() /*-{
+    return this.rules;
+  }-*/;
+
+  public final native int addRule(String selector, String style) /*-{
+    return this.addRule(selector, style);
+  }-*/;
+
+  public final native int addRule(String selector, String style, int index) /*-{
+    return this.addRule(selector, style, index);
+  }-*/;
+
+  public final native void deleteRule(int index) /*-{
+    this.deleteRule(index);
+  }-*/;
+
+  public final native int insertRule(String rule, int index) /*-{
+    return this.insertRule(rule, index);
+  }-*/;
+
+  public final native void removeRule(int index) /*-{
+    this.removeRule(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSTransformValue.java b/elemental/src/elemental/js/css/JsCSSTransformValue.java
new file mode 100644
index 0000000..35b7929
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSTransformValue.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSTransformValue;
+import elemental.css.CSSValueList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSTransformValue extends JsCSSValueList  implements CSSTransformValue {
+  protected JsCSSTransformValue() {}
+
+  public final native int getOperationType() /*-{
+    return this.operationType;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSUnknownRule.java b/elemental/src/elemental/js/css/JsCSSUnknownRule.java
new file mode 100644
index 0000000..0679e3f
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSUnknownRule.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSUnknownRule;
+import elemental.css.CSSRule;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSUnknownRule extends JsCSSRule  implements CSSUnknownRule {
+  protected JsCSSUnknownRule() {}
+}
diff --git a/elemental/src/elemental/js/css/JsCSSValue.java b/elemental/src/elemental/js/css/JsCSSValue.java
new file mode 100644
index 0000000..149ea86
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSValue.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSValue;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSValue extends JsElementalMixinBase  implements CSSValue {
+  protected JsCSSValue() {}
+
+  public final native String getCssText() /*-{
+    return this.cssText;
+  }-*/;
+
+  public final native void setCssText(String param_cssText) /*-{
+    this.cssText = param_cssText;
+  }-*/;
+
+  public final native int getCssValueType() /*-{
+    return this.cssValueType;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCSSValueList.java b/elemental/src/elemental/js/css/JsCSSValueList.java
new file mode 100644
index 0000000..8b9fbec
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCSSValueList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSValueList;
+import elemental.css.CSSValue;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCSSValueList extends JsCSSValue  implements CSSValueList {
+  protected JsCSSValueList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsCSSValue item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsCounter.java b/elemental/src/elemental/js/css/JsCounter.java
new file mode 100644
index 0000000..d39a583
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsCounter.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.Counter;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCounter extends JsElementalMixinBase  implements Counter {
+  protected JsCounter() {}
+
+  public final native String getIdentifier() /*-{
+    return this.identifier;
+  }-*/;
+
+  public final native String getListStyle() /*-{
+    return this.listStyle;
+  }-*/;
+
+  public final native String getSeparator() /*-{
+    return this.separator;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsRGBColor.java b/elemental/src/elemental/js/css/JsRGBColor.java
new file mode 100644
index 0000000..a972271
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsRGBColor.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSPrimitiveValue;
+import elemental.css.RGBColor;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsRGBColor extends JsElementalMixinBase  implements RGBColor {
+  protected JsRGBColor() {}
+
+  public final native JsCSSPrimitiveValue getBlue() /*-{
+    return this.blue;
+  }-*/;
+
+  public final native JsCSSPrimitiveValue getGreen() /*-{
+    return this.green;
+  }-*/;
+
+  public final native JsCSSPrimitiveValue getRed() /*-{
+    return this.red;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsRect.java b/elemental/src/elemental/js/css/JsRect.java
new file mode 100644
index 0000000..cb2e305
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsRect.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.CSSPrimitiveValue;
+import elemental.css.Rect;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsRect extends JsElementalMixinBase  implements Rect {
+  protected JsRect() {}
+
+  public final native JsCSSPrimitiveValue getBottom() /*-{
+    return this.bottom;
+  }-*/;
+
+  public final native JsCSSPrimitiveValue getLeft() /*-{
+    return this.left;
+  }-*/;
+
+  public final native JsCSSPrimitiveValue getRight() /*-{
+    return this.right;
+  }-*/;
+
+  public final native JsCSSPrimitiveValue getTop() /*-{
+    return this.top;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsWebKitCSSFilterValue.java b/elemental/src/elemental/js/css/JsWebKitCSSFilterValue.java
new file mode 100644
index 0000000..df8d05a
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsWebKitCSSFilterValue.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.WebKitCSSFilterValue;
+import elemental.css.CSSValueList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebKitCSSFilterValue extends JsCSSValueList  implements WebKitCSSFilterValue {
+  protected JsWebKitCSSFilterValue() {}
+
+  public final native int getOperationType() /*-{
+    return this.operationType;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/css/JsWebKitCSSRegionRule.java b/elemental/src/elemental/js/css/JsWebKitCSSRegionRule.java
new file mode 100644
index 0000000..3347023
--- /dev/null
+++ b/elemental/src/elemental/js/css/JsWebKitCSSRegionRule.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.css;
+import elemental.css.WebKitCSSRegionRule;
+import elemental.css.CSSRule;
+import elemental.css.CSSRuleList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebKitCSSRegionRule extends JsCSSRule  implements WebKitCSSRegionRule {
+  protected JsWebKitCSSRegionRule() {}
+
+  public final native JsCSSRuleList getCssRules() /*-{
+    return this.cssRules;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsAttr.java b/elemental/src/elemental/js/dom/JsAttr.java
new file mode 100644
index 0000000..e51be97
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsAttr.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.Element;
+import elemental.dom.Attr;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAttr extends JsNode  implements Attr {
+  protected JsAttr() {}
+
+  public final native boolean isId() /*-{
+    return this.isId;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native JsElement getOwnerElement() /*-{
+    return this.ownerElement;
+  }-*/;
+
+  public final native boolean isSpecified() /*-{
+    return this.specified;
+  }-*/;
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsCDATASection.java b/elemental/src/elemental/js/dom/JsCDATASection.java
new file mode 100644
index 0000000..8f148cf
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsCDATASection.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Text;
+import elemental.dom.CDATASection;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCDATASection extends JsText  implements CDATASection {
+  protected JsCDATASection() {}
+}
diff --git a/elemental/src/elemental/js/dom/JsCharacterData.java b/elemental/src/elemental/js/dom/JsCharacterData.java
new file mode 100644
index 0000000..927c9d9
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsCharacterData.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.CharacterData;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCharacterData extends JsNode  implements CharacterData {
+  protected JsCharacterData() {}
+
+  public final native String getData() /*-{
+    return this.data;
+  }-*/;
+
+  public final native void setData(String param_data) /*-{
+    this.data = param_data;
+  }-*/;
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void appendData(String data) /*-{
+    this.appendData(data);
+  }-*/;
+
+  public final native void deleteData(int offset, int length) /*-{
+    this.deleteData(offset, length);
+  }-*/;
+
+  public final native void insertData(int offset, String data) /*-{
+    this.insertData(offset, data);
+  }-*/;
+
+  public final native void replaceData(int offset, int length, String data) /*-{
+    this.replaceData(offset, length, data);
+  }-*/;
+
+  public final native String substringData(int offset, int length) /*-{
+    return this.substringData(offset, length);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsClipboard.java b/elemental/src/elemental/js/dom/JsClipboard.java
new file mode 100644
index 0000000..593229c
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsClipboard.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.DataTransferItemList;
+import elemental.js.html.JsImageElement;
+import elemental.util.Indexable;
+import elemental.js.html.JsFileList;
+import elemental.html.FileList;
+import elemental.js.util.JsIndexable;
+import elemental.dom.Clipboard;
+import elemental.html.ImageElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsClipboard extends JsElementalMixinBase  implements Clipboard {
+  protected JsClipboard() {}
+
+  public final native String getDropEffect() /*-{
+    return this.dropEffect;
+  }-*/;
+
+  public final native void setDropEffect(String param_dropEffect) /*-{
+    this.dropEffect = param_dropEffect;
+  }-*/;
+
+  public final native String getEffectAllowed() /*-{
+    return this.effectAllowed;
+  }-*/;
+
+  public final native void setEffectAllowed(String param_effectAllowed) /*-{
+    this.effectAllowed = param_effectAllowed;
+  }-*/;
+
+  public final native JsFileList getFiles() /*-{
+    return this.files;
+  }-*/;
+
+  public final native JsDataTransferItemList getItems() /*-{
+    return this.items;
+  }-*/;
+
+  public final native JsIndexable getTypes() /*-{
+    return this.types;
+  }-*/;
+
+  public final native void clearData() /*-{
+    this.clearData();
+  }-*/;
+
+  public final native void clearData(String type) /*-{
+    this.clearData(type);
+  }-*/;
+
+  public final native String getData(String type) /*-{
+    return this.getData(type);
+  }-*/;
+
+  public final native boolean setData(String type, String data) /*-{
+    return this.setData(type, data);
+  }-*/;
+
+  public final native void setDragImage(ImageElement image, int x, int y) /*-{
+    this.setDragImage(image, x, y);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsComment.java b/elemental/src/elemental/js/dom/JsComment.java
new file mode 100644
index 0000000..5f114ee
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsComment.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Comment;
+import elemental.dom.CharacterData;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsComment extends JsCharacterData  implements Comment {
+  protected JsComment() {}
+}
diff --git a/elemental/src/elemental/js/dom/JsCoordinates.java b/elemental/src/elemental/js/dom/JsCoordinates.java
new file mode 100644
index 0000000..760c0c8
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsCoordinates.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Coordinates;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCoordinates extends JsElementalMixinBase  implements Coordinates {
+  protected JsCoordinates() {}
+
+  public final native double getAccuracy() /*-{
+    return this.accuracy;
+  }-*/;
+
+  public final native double getAltitude() /*-{
+    return this.altitude;
+  }-*/;
+
+  public final native double getAltitudeAccuracy() /*-{
+    return this.altitudeAccuracy;
+  }-*/;
+
+  public final native double getHeading() /*-{
+    return this.heading;
+  }-*/;
+
+  public final native double getLatitude() /*-{
+    return this.latitude;
+  }-*/;
+
+  public final native double getLongitude() /*-{
+    return this.longitude;
+  }-*/;
+
+  public final native double getSpeed() /*-{
+    return this.speed;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDOMError.java b/elemental/src/elemental/js/dom/JsDOMError.java
new file mode 100644
index 0000000..04366d0
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDOMError.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.DOMError;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMError extends JsElementalMixinBase  implements DOMError {
+  protected JsDOMError() {}
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDOMException.java b/elemental/src/elemental/js/dom/JsDOMException.java
new file mode 100644
index 0000000..42cb65f
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDOMException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.DOMException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMException extends JsElementalMixinBase  implements DOMException {
+  protected JsDOMException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDOMImplementation.java b/elemental/src/elemental/js/dom/JsDOMImplementation.java
new file mode 100644
index 0000000..bce8a68
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDOMImplementation.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.DocumentType;
+import elemental.js.css.JsCSSStyleSheet;
+import elemental.css.CSSStyleSheet;
+import elemental.dom.DOMImplementation;
+import elemental.dom.Document;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMImplementation extends JsElementalMixinBase  implements DOMImplementation {
+  protected JsDOMImplementation() {}
+
+  public final native JsCSSStyleSheet createCSSStyleSheet(String title, String media) /*-{
+    return this.createCSSStyleSheet(title, media);
+  }-*/;
+
+  public final native JsDocument createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) /*-{
+    return this.createDocument(namespaceURI, qualifiedName, doctype);
+  }-*/;
+
+  public final native JsDocumentType createDocumentType(String qualifiedName, String publicId, String systemId) /*-{
+    return this.createDocumentType(qualifiedName, publicId, systemId);
+  }-*/;
+
+  public final native JsDocument createHTMLDocument(String title) /*-{
+    return this.createHTMLDocument(title);
+  }-*/;
+
+  public final native boolean hasFeature(String feature, String version) /*-{
+    return this.hasFeature(feature, version);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDOMSettableTokenList.java b/elemental/src/elemental/js/dom/JsDOMSettableTokenList.java
new file mode 100644
index 0000000..2ea4c97
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDOMSettableTokenList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.DOMSettableTokenList;
+import elemental.dom.DOMTokenList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMSettableTokenList extends JsDOMTokenList  implements DOMSettableTokenList {
+  protected JsDOMSettableTokenList() {}
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDOMStringList.java b/elemental/src/elemental/js/dom/JsDOMStringList.java
new file mode 100644
index 0000000..5d43435
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDOMStringList.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.util.Indexable;
+import elemental.js.util.JsIndexable;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMStringList extends JsIndexable  implements Indexable {
+  protected JsDOMStringList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native boolean contains(String string) /*-{
+    return this.contains(string);
+  }-*/;
+
+  public final native String item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDOMStringMap.java b/elemental/src/elemental/js/dom/JsDOMStringMap.java
new file mode 100644
index 0000000..bdd7f65
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDOMStringMap.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.util.Mappable;
+import elemental.js.util.JsMappable;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMStringMap extends JsElementalMixinBase  implements Mappable {
+  protected JsDOMStringMap() {}
+}
diff --git a/elemental/src/elemental/js/dom/JsDOMTokenList.java b/elemental/src/elemental/js/dom/JsDOMTokenList.java
new file mode 100644
index 0000000..a768135
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDOMTokenList.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.DOMTokenList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMTokenList extends JsElementalMixinBase  implements DOMTokenList {
+  protected JsDOMTokenList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void add(String token) /*-{
+    this.add(token);
+  }-*/;
+
+  public final native boolean contains(String token) /*-{
+    return this.contains(token);
+  }-*/;
+
+  public final native String item(int index) /*-{
+    return this.item(index);
+  }-*/;
+
+  public final native void remove(String token) /*-{
+    this.remove(token);
+  }-*/;
+
+  public final native boolean toggle(String token) /*-{
+    return this.toggle(token);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDataTransferItem.java b/elemental/src/elemental/js/dom/JsDataTransferItem.java
new file mode 100644
index 0000000..bdc5d9e
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDataTransferItem.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.js.html.JsBlob;
+import elemental.dom.StringCallback;
+import elemental.dom.DataTransferItem;
+import elemental.html.Blob;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDataTransferItem extends JsElementalMixinBase  implements DataTransferItem {
+  protected JsDataTransferItem() {}
+
+  public final native String getKind() /*-{
+    return this.kind;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native JsBlob getAsFile() /*-{
+    return this.getAsFile();
+  }-*/;
+
+  public final native void getAsString() /*-{
+    this.getAsString();
+  }-*/;
+
+  public final native void getAsString(StringCallback callback) /*-{
+    this.getAsString($entry(callback.@elemental.dom.StringCallback::onStringCallback(Ljava/lang/String;)).bind(callback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDataTransferItemList.java b/elemental/src/elemental/js/dom/JsDataTransferItemList.java
new file mode 100644
index 0000000..06ee28f
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDataTransferItemList.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.html.File;
+import elemental.dom.DataTransferItemList;
+import elemental.js.html.JsFile;
+import elemental.dom.DataTransferItem;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDataTransferItemList extends JsElementalMixinBase  implements DataTransferItemList {
+  protected JsDataTransferItemList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void add(File file) /*-{
+    this.add(file);
+  }-*/;
+
+  public final native void add(String data, String type) /*-{
+    this.add(data, type);
+  }-*/;
+
+  public final native void clear() /*-{
+    this.clear();
+  }-*/;
+
+  public final native JsDataTransferItem item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDeviceMotionEvent.java b/elemental/src/elemental/js/dom/JsDeviceMotionEvent.java
new file mode 100644
index 0000000..31149f2
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDeviceMotionEvent.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.events.Event;
+import elemental.js.events.JsEvent;
+import elemental.dom.DeviceMotionEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDeviceMotionEvent extends JsEvent  implements DeviceMotionEvent {
+  protected JsDeviceMotionEvent() {}
+
+  public final native double getInterval() /*-{
+    return this.interval;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDeviceOrientationEvent.java b/elemental/src/elemental/js/dom/JsDeviceOrientationEvent.java
new file mode 100644
index 0000000..505b7a5
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDeviceOrientationEvent.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.js.events.JsEvent;
+import elemental.dom.DeviceOrientationEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDeviceOrientationEvent extends JsEvent  implements DeviceOrientationEvent {
+  protected JsDeviceOrientationEvent() {}
+
+  public final native boolean isAbsolute() /*-{
+    return this.absolute;
+  }-*/;
+
+  public final native double getAlpha() /*-{
+    return this.alpha;
+  }-*/;
+
+  public final native double getBeta() /*-{
+    return this.beta;
+  }-*/;
+
+  public final native double getGamma() /*-{
+    return this.gamma;
+  }-*/;
+
+  public final native void initDeviceOrientationEvent(String type, boolean bubbles, boolean cancelable, double alpha, double beta, double gamma, boolean absolute) /*-{
+    this.initDeviceOrientationEvent(type, bubbles, cancelable, alpha, beta, gamma, absolute);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsDocument.java b/elemental/src/elemental/js/dom/JsDocument.java
new file mode 100644
index 0000000..c2eccd4
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDocument.java
@@ -0,0 +1,1516 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.js.css.JsCSSStyleDeclaration;
+import elemental.js.ranges.JsRange;
+import elemental.js.traversal.JsTreeWalker;
+import elemental.js.html.JsHTMLCollection;
+import elemental.js.traversal.JsNodeIterator;
+import elemental.js.html.JsSelection;
+import elemental.css.CSSStyleDeclaration;
+import elemental.stylesheets.StyleSheetList;
+import elemental.js.stylesheets.JsStyleSheetList;
+import elemental.dom.Text;
+import elemental.xpath.XPathNSResolver;
+import elemental.xpath.XPathExpression;
+import elemental.traversal.NodeIterator;
+import elemental.traversal.TreeWalker;
+import elemental.events.TouchList;
+import elemental.js.events.JsEventListener;
+import elemental.dom.Document;
+import elemental.dom.Node;
+import elemental.html.HTMLAllCollection;
+import elemental.js.events.JsTouchList;
+import elemental.dom.ProcessingInstruction;
+import elemental.js.html.JsCanvasRenderingContext;
+import elemental.dom.DocumentFragment;
+import elemental.ranges.Range;
+import elemental.html.Location;
+import elemental.xpath.XPathResult;
+import elemental.dom.DOMImplementation;
+import elemental.dom.Comment;
+import elemental.html.Selection;
+import elemental.js.xpath.JsXPathExpression;
+import elemental.html.HeadElement;
+import elemental.dom.Element;
+import elemental.js.html.JsWindow;
+import elemental.html.HTMLCollection;
+import elemental.dom.EntityReference;
+import elemental.events.Touch;
+import elemental.js.html.JsHeadElement;
+import elemental.js.traversal.JsNodeFilter;
+import elemental.js.xpath.JsXPathResult;
+import elemental.js.events.JsTouch;
+import elemental.events.Event;
+import elemental.html.CanvasRenderingContext;
+import elemental.events.EventTarget;
+import elemental.traversal.NodeFilter;
+import elemental.dom.NodeList;
+import elemental.js.html.JsHTMLAllCollection;
+import elemental.js.events.JsEvent;
+import elemental.js.xpath.JsXPathNSResolver;
+import elemental.js.html.JsLocation;
+import elemental.events.EventListener;
+import elemental.dom.Attr;
+import elemental.html.Window;
+import elemental.dom.DocumentType;
+import elemental.dom.CDATASection;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.svg.*;
+import elemental.svg.*;
+
+import java.util.Date;
+
+public class JsDocument extends JsNode  implements Document {
+  protected JsDocument() {}
+
+  public final native void clearOpener() /*-{
+    this.opener = null;
+  }-*/;
+
+  public final JsElement createSvgElement(String tag) {
+    return createElementNS("http://www.w3.org/2000/svg", tag).cast();
+  }
+
+
+  public final native String getURL() /*-{
+    return this.URL;
+  }-*/;
+
+  public final native JsElement getActiveElement() /*-{
+    return this.activeElement;
+  }-*/;
+
+  public final native String getAlinkColor() /*-{
+    return this.alinkColor;
+  }-*/;
+
+  public final native void setAlinkColor(String param_alinkColor) /*-{
+    this.alinkColor = param_alinkColor;
+  }-*/;
+
+  public final native JsHTMLAllCollection getAll() /*-{
+    return this.all;
+  }-*/;
+
+  public final native void setAll(HTMLAllCollection param_all) /*-{
+    this.all = param_all;
+  }-*/;
+
+  public final native JsHTMLCollection getAnchors() /*-{
+    return this.anchors;
+  }-*/;
+
+  public final native JsHTMLCollection getApplets() /*-{
+    return this.applets;
+  }-*/;
+
+  public final native String getBgColor() /*-{
+    return this.bgColor;
+  }-*/;
+
+  public final native void setBgColor(String param_bgColor) /*-{
+    this.bgColor = param_bgColor;
+  }-*/;
+
+  public final native JsElement getBody() /*-{
+    return this.body;
+  }-*/;
+
+  public final native void setBody(Element param_body) /*-{
+    this.body = param_body;
+  }-*/;
+
+  public final native String getCharacterSet() /*-{
+    return this.characterSet;
+  }-*/;
+
+  public final native String getCharset() /*-{
+    return this.charset;
+  }-*/;
+
+  public final native void setCharset(String param_charset) /*-{
+    this.charset = param_charset;
+  }-*/;
+
+  public final native String getCompatMode() /*-{
+    return this.compatMode;
+  }-*/;
+
+  public final native String getCookie() /*-{
+    return this.cookie;
+  }-*/;
+
+  public final native void setCookie(String param_cookie) /*-{
+    this.cookie = param_cookie;
+  }-*/;
+
+  public final native String getDefaultCharset() /*-{
+    return this.defaultCharset;
+  }-*/;
+
+  public final native JsWindow getDefaultView() /*-{
+    return this.defaultView;
+  }-*/;
+
+  public final native String getDesignMode() /*-{
+    return this.designMode;
+  }-*/;
+
+  public final native void setDesignMode(String param_designMode) /*-{
+    this.designMode = param_designMode;
+  }-*/;
+
+  public final native String getDir() /*-{
+    return this.dir;
+  }-*/;
+
+  public final native void setDir(String param_dir) /*-{
+    this.dir = param_dir;
+  }-*/;
+
+  public final native JsDocumentType getDoctype() /*-{
+    return this.doctype;
+  }-*/;
+
+  public final native JsElement getDocumentElement() /*-{
+    return this.documentElement;
+  }-*/;
+
+  public final native String getDocumentURI() /*-{
+    return this.documentURI;
+  }-*/;
+
+  public final native void setDocumentURI(String param_documentURI) /*-{
+    this.documentURI = param_documentURI;
+  }-*/;
+
+  public final native String getDomain() /*-{
+    return this.domain;
+  }-*/;
+
+  public final native void setDomain(String param_domain) /*-{
+    this.domain = param_domain;
+  }-*/;
+
+  public final native JsHTMLCollection getEmbeds() /*-{
+    return this.embeds;
+  }-*/;
+
+  public final native String getFgColor() /*-{
+    return this.fgColor;
+  }-*/;
+
+  public final native void setFgColor(String param_fgColor) /*-{
+    this.fgColor = param_fgColor;
+  }-*/;
+
+  public final native JsHTMLCollection getForms() /*-{
+    return this.forms;
+  }-*/;
+
+  public final native JsHeadElement getHead() /*-{
+    return this.head;
+  }-*/;
+
+  public final native int getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native JsHTMLCollection getImages() /*-{
+    return this.images;
+  }-*/;
+
+  public final native JsDOMImplementation getImplementation() /*-{
+    return this.implementation;
+  }-*/;
+
+  public final native String getInputEncoding() /*-{
+    return this.inputEncoding;
+  }-*/;
+
+  public final native String getLastModified() /*-{
+    return this.lastModified;
+  }-*/;
+
+  public final native String getLinkColor() /*-{
+    return this.linkColor;
+  }-*/;
+
+  public final native void setLinkColor(String param_linkColor) /*-{
+    this.linkColor = param_linkColor;
+  }-*/;
+
+  public final native JsHTMLCollection getLinks() /*-{
+    return this.links;
+  }-*/;
+
+  public final native JsLocation getLocation() /*-{
+    return this.location;
+  }-*/;
+
+  public final native void setLocation(Location param_location) /*-{
+    this.location = param_location;
+  }-*/;
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforecopy() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforecopy);
+  }-*/;
+
+  public final native void setOnbeforecopy(EventListener listener) /*-{
+    this.onbeforecopy = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforecut() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforecut);
+  }-*/;
+
+  public final native void setOnbeforecut(EventListener listener) /*-{
+    this.onbeforecut = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforepaste() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforepaste);
+  }-*/;
+
+  public final native void setOnbeforepaste(EventListener listener) /*-{
+    this.onbeforepaste = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnblur() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onblur);
+  }-*/;
+
+  public final native void setOnblur(EventListener listener) /*-{
+    this.onblur = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onchange);
+  }-*/;
+
+  public final native void setOnchange(EventListener listener) /*-{
+    this.onchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnclick() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onclick);
+  }-*/;
+
+  public final native void setOnclick(EventListener listener) /*-{
+    this.onclick = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncontextmenu() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncontextmenu);
+  }-*/;
+
+  public final native void setOncontextmenu(EventListener listener) /*-{
+    this.oncontextmenu = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncopy() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncopy);
+  }-*/;
+
+  public final native void setOncopy(EventListener listener) /*-{
+    this.oncopy = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncut() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncut);
+  }-*/;
+
+  public final native void setOncut(EventListener listener) /*-{
+    this.oncut = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndblclick() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondblclick);
+  }-*/;
+
+  public final native void setOndblclick(EventListener listener) /*-{
+    this.ondblclick = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndrag() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondrag);
+  }-*/;
+
+  public final native void setOndrag(EventListener listener) /*-{
+    this.ondrag = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragend);
+  }-*/;
+
+  public final native void setOndragend(EventListener listener) /*-{
+    this.ondragend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragenter() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragenter);
+  }-*/;
+
+  public final native void setOndragenter(EventListener listener) /*-{
+    this.ondragenter = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragleave() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragleave);
+  }-*/;
+
+  public final native void setOndragleave(EventListener listener) /*-{
+    this.ondragleave = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragover() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragover);
+  }-*/;
+
+  public final native void setOndragover(EventListener listener) /*-{
+    this.ondragover = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragstart);
+  }-*/;
+
+  public final native void setOndragstart(EventListener listener) /*-{
+    this.ondragstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndrop() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondrop);
+  }-*/;
+
+  public final native void setOndrop(EventListener listener) /*-{
+    this.ondrop = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnfocus() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onfocus);
+  }-*/;
+
+  public final native void setOnfocus(EventListener listener) /*-{
+    this.onfocus = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOninput() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oninput);
+  }-*/;
+
+  public final native void setOninput(EventListener listener) /*-{
+    this.oninput = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOninvalid() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oninvalid);
+  }-*/;
+
+  public final native void setOninvalid(EventListener listener) /*-{
+    this.oninvalid = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeydown() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeydown);
+  }-*/;
+
+  public final native void setOnkeydown(EventListener listener) /*-{
+    this.onkeydown = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeypress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeypress);
+  }-*/;
+
+  public final native void setOnkeypress(EventListener listener) /*-{
+    this.onkeypress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeyup() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeyup);
+  }-*/;
+
+  public final native void setOnkeyup(EventListener listener) /*-{
+    this.onkeyup = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onload);
+  }-*/;
+
+  public final native void setOnload(EventListener listener) /*-{
+    this.onload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousedown() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousedown);
+  }-*/;
+
+  public final native void setOnmousedown(EventListener listener) /*-{
+    this.onmousedown = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousemove() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousemove);
+  }-*/;
+
+  public final native void setOnmousemove(EventListener listener) /*-{
+    this.onmousemove = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseout() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseout);
+  }-*/;
+
+  public final native void setOnmouseout(EventListener listener) /*-{
+    this.onmouseout = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseover() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseover);
+  }-*/;
+
+  public final native void setOnmouseover(EventListener listener) /*-{
+    this.onmouseover = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseup() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseup);
+  }-*/;
+
+  public final native void setOnmouseup(EventListener listener) /*-{
+    this.onmouseup = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousewheel() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousewheel);
+  }-*/;
+
+  public final native void setOnmousewheel(EventListener listener) /*-{
+    this.onmousewheel = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnpaste() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onpaste);
+  }-*/;
+
+  public final native void setOnpaste(EventListener listener) /*-{
+    this.onpaste = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnreadystatechange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onreadystatechange);
+  }-*/;
+
+  public final native void setOnreadystatechange(EventListener listener) /*-{
+    this.onreadystatechange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnreset() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onreset);
+  }-*/;
+
+  public final native void setOnreset(EventListener listener) /*-{
+    this.onreset = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnscroll() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onscroll);
+  }-*/;
+
+  public final native void setOnscroll(EventListener listener) /*-{
+    this.onscroll = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsearch() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsearch);
+  }-*/;
+
+  public final native void setOnsearch(EventListener listener) /*-{
+    this.onsearch = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnselect() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onselect);
+  }-*/;
+
+  public final native void setOnselect(EventListener listener) /*-{
+    this.onselect = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnselectionchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onselectionchange);
+  }-*/;
+
+  public final native void setOnselectionchange(EventListener listener) /*-{
+    this.onselectionchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnselectstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onselectstart);
+  }-*/;
+
+  public final native void setOnselectstart(EventListener listener) /*-{
+    this.onselectstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsubmit() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsubmit);
+  }-*/;
+
+  public final native void setOnsubmit(EventListener listener) /*-{
+    this.onsubmit = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchcancel() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchcancel);
+  }-*/;
+
+  public final native void setOntouchcancel(EventListener listener) /*-{
+    this.ontouchcancel = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchend);
+  }-*/;
+
+  public final native void setOntouchend(EventListener listener) /*-{
+    this.ontouchend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchmove() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchmove);
+  }-*/;
+
+  public final native void setOntouchmove(EventListener listener) /*-{
+    this.ontouchmove = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchstart);
+  }-*/;
+
+  public final native void setOntouchstart(EventListener listener) /*-{
+    this.ontouchstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitfullscreenchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitfullscreenchange);
+  }-*/;
+
+  public final native void setOnwebkitfullscreenchange(EventListener listener) /*-{
+    this.onwebkitfullscreenchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitfullscreenerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitfullscreenerror);
+  }-*/;
+
+  public final native void setOnwebkitfullscreenerror(EventListener listener) /*-{
+    this.onwebkitfullscreenerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native JsHTMLCollection getPlugins() /*-{
+    return this.plugins;
+  }-*/;
+
+  public final native String getPreferredStylesheetSet() /*-{
+    return this.preferredStylesheetSet;
+  }-*/;
+
+  public final native String getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native String getReferrer() /*-{
+    return this.referrer;
+  }-*/;
+
+  public final native JsHTMLCollection getScripts() /*-{
+    return this.scripts;
+  }-*/;
+
+  public final native String getSelectedStylesheetSet() /*-{
+    return this.selectedStylesheetSet;
+  }-*/;
+
+  public final native void setSelectedStylesheetSet(String param_selectedStylesheetSet) /*-{
+    this.selectedStylesheetSet = param_selectedStylesheetSet;
+  }-*/;
+
+  public final native JsStyleSheetList getStyleSheets() /*-{
+    return this.styleSheets;
+  }-*/;
+
+  public final native String getTitle() /*-{
+    return this.title;
+  }-*/;
+
+  public final native void setTitle(String param_title) /*-{
+    this.title = param_title;
+  }-*/;
+
+  public final native String getVlinkColor() /*-{
+    return this.vlinkColor;
+  }-*/;
+
+  public final native void setVlinkColor(String param_vlinkColor) /*-{
+    this.vlinkColor = param_vlinkColor;
+  }-*/;
+
+  public final native JsElement getWebkitCurrentFullScreenElement() /*-{
+    return this.webkitCurrentFullScreenElement;
+  }-*/;
+
+  public final native boolean isWebkitFullScreenKeyboardInputAllowed() /*-{
+    return this.webkitFullScreenKeyboardInputAllowed;
+  }-*/;
+
+  public final native JsElement getWebkitFullscreenElement() /*-{
+    return this.webkitFullscreenElement;
+  }-*/;
+
+  public final native boolean isWebkitFullscreenEnabled() /*-{
+    return this.webkitFullscreenEnabled;
+  }-*/;
+
+  public final native boolean isWebkitHidden() /*-{
+    return this.webkitHidden;
+  }-*/;
+
+  public final native boolean isWebkitIsFullScreen() /*-{
+    return this.webkitIsFullScreen;
+  }-*/;
+
+  public final native String getWebkitVisibilityState() /*-{
+    return this.webkitVisibilityState;
+  }-*/;
+
+  public final native int getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native String getXmlEncoding() /*-{
+    return this.xmlEncoding;
+  }-*/;
+
+  public final native boolean isXmlStandalone() /*-{
+    return this.xmlStandalone;
+  }-*/;
+
+  public final native void setXmlStandalone(boolean param_xmlStandalone) /*-{
+    this.xmlStandalone = param_xmlStandalone;
+  }-*/;
+
+  public final native String getXmlVersion() /*-{
+    return this.xmlVersion;
+  }-*/;
+
+  public final native void setXmlVersion(String param_xmlVersion) /*-{
+    this.xmlVersion = param_xmlVersion;
+  }-*/;
+
+  public final native JsNode adoptNode(Node source) /*-{
+    return this.adoptNode(source);
+  }-*/;
+
+  public final native JsRange caretRangeFromPoint(int x, int y) /*-{
+    return this.caretRangeFromPoint(x, y);
+  }-*/;
+
+  public final native JsAttr createAttribute(String name) /*-{
+    return this.createAttribute(name);
+  }-*/;
+
+  public final native JsAttr createAttributeNS(String namespaceURI, String qualifiedName) /*-{
+    return this.createAttributeNS(namespaceURI, qualifiedName);
+  }-*/;
+
+  public final native JsCDATASection createCDATASection(String data) /*-{
+    return this.createCDATASection(data);
+  }-*/;
+
+  public final native JsComment createComment(String data) /*-{
+    return this.createComment(data);
+  }-*/;
+
+  public final native JsDocumentFragment createDocumentFragment() /*-{
+    return this.createDocumentFragment();
+  }-*/;
+
+  public final native JsElement createElement(String tagName) /*-{
+    return this.createElement(tagName);
+  }-*/;
+
+  public final native JsElement createElementNS(String namespaceURI, String qualifiedName) /*-{
+    return this.createElementNS(namespaceURI, qualifiedName);
+  }-*/;
+
+  public final native JsEntityReference createEntityReference(String name) /*-{
+    return this.createEntityReference(name);
+  }-*/;
+
+  public final native JsEvent createEvent(String eventType) /*-{
+    return this.createEvent(eventType);
+  }-*/;
+
+  public final native JsXPathExpression createExpression(String expression, XPathNSResolver resolver) /*-{
+    return this.createExpression(expression, resolver);
+  }-*/;
+
+  public final native JsXPathNSResolver createNSResolver(Node nodeResolver) /*-{
+    return this.createNSResolver(nodeResolver);
+  }-*/;
+
+  public final native JsNodeIterator createNodeIterator(Node root, int whatToShow, NodeFilter filter, boolean expandEntityReferences) /*-{
+    return this.createNodeIterator(root, whatToShow, filter, expandEntityReferences);
+  }-*/;
+
+  public final native JsProcessingInstruction createProcessingInstruction(String target, String data) /*-{
+    return this.createProcessingInstruction(target, data);
+  }-*/;
+
+  public final native JsRange createRange() /*-{
+    return this.createRange();
+  }-*/;
+
+  public final native JsText createTextNode(String data) /*-{
+    return this.createTextNode(data);
+  }-*/;
+
+  public final native JsTouch createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, float webkitRotationAngle, float webkitForce) /*-{
+    return this.createTouch(window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
+  }-*/;
+
+  public final native JsTouchList createTouchList() /*-{
+    return this.createTouchList();
+  }-*/;
+
+  public final native JsTreeWalker createTreeWalker(Node root, int whatToShow, NodeFilter filter, boolean expandEntityReferences) /*-{
+    return this.createTreeWalker(root, whatToShow, filter, expandEntityReferences);
+  }-*/;
+
+  public final native JsElement elementFromPoint(int x, int y) /*-{
+    return this.elementFromPoint(x, y);
+  }-*/;
+
+  public final native JsXPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) /*-{
+    return this.evaluate(expression, contextNode, resolver, type, inResult);
+  }-*/;
+
+  public final native boolean execCommand(String command, boolean userInterface, String value) /*-{
+    return this.execCommand(command, userInterface, value);
+  }-*/;
+
+  public final native JsCanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height) /*-{
+    return this.getCSSCanvasContext(contextId, name, width, height);
+  }-*/;
+
+  public final native JsElement getElementById(String elementId) /*-{
+    return this.getElementById(elementId);
+  }-*/;
+
+  public final native JsNodeList getElementsByClassName(String tagname) /*-{
+    return this.getElementsByClassName(tagname);
+  }-*/;
+
+  public final native JsNodeList getElementsByName(String elementName) /*-{
+    return this.getElementsByName(elementName);
+  }-*/;
+
+  public final native JsNodeList getElementsByTagName(String tagname) /*-{
+    return this.getElementsByTagName(tagname);
+  }-*/;
+
+  public final native JsNodeList getElementsByTagNameNS(String namespaceURI, String localName) /*-{
+    return this.getElementsByTagNameNS(namespaceURI, localName);
+  }-*/;
+
+  public final native JsCSSStyleDeclaration getOverrideStyle(Element element, String pseudoElement) /*-{
+    return this.getOverrideStyle(element, pseudoElement);
+  }-*/;
+
+  public final native JsSelection getSelection() /*-{
+    return this.getSelection();
+  }-*/;
+
+  public final native JsNode importNode(Node importedNode) /*-{
+    return this.importNode(importedNode);
+  }-*/;
+
+  public final native JsNode importNode(Node importedNode, boolean deep) /*-{
+    return this.importNode(importedNode, deep);
+  }-*/;
+
+  public final native boolean queryCommandEnabled(String command) /*-{
+    return this.queryCommandEnabled(command);
+  }-*/;
+
+  public final native boolean queryCommandIndeterm(String command) /*-{
+    return this.queryCommandIndeterm(command);
+  }-*/;
+
+  public final native boolean queryCommandState(String command) /*-{
+    return this.queryCommandState(command);
+  }-*/;
+
+  public final native boolean queryCommandSupported(String command) /*-{
+    return this.queryCommandSupported(command);
+  }-*/;
+
+  public final native String queryCommandValue(String command) /*-{
+    return this.queryCommandValue(command);
+  }-*/;
+
+  public final native void webkitCancelFullScreen() /*-{
+    this.webkitCancelFullScreen();
+  }-*/;
+
+  public final native void webkitExitFullscreen() /*-{
+    this.webkitExitFullscreen();
+  }-*/;
+
+  public final native void captureEvents() /*-{
+    this.captureEvents();
+  }-*/;
+
+  public final native void clear() /*-{
+    this.clear();
+  }-*/;
+
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+
+  public final native boolean hasFocus() /*-{
+    return this.hasFocus();
+  }-*/;
+
+  public final native void open() /*-{
+    this.open();
+  }-*/;
+
+  public final native void releaseEvents() /*-{
+    this.releaseEvents();
+  }-*/;
+
+  public final native void write(String text) /*-{
+    this.write(text);
+  }-*/;
+
+  public final native void writeln(String text) /*-{
+    this.writeln(text);
+  }-*/;
+
+  public final JsAnchorElement createAnchorElement() {
+    return createElement("anchor").cast();
+  }
+
+  public final JsAppletElement createAppletElement() {
+    return createElement("applet").cast();
+  }
+
+  public final JsAreaElement createAreaElement() {
+    return createElement("area").cast();
+  }
+
+  public final JsAudioElement createAudioElement() {
+    return createElement("audio").cast();
+  }
+
+  public final JsBRElement createBRElement() {
+    return createElement("br").cast();
+  }
+
+  public final JsBaseElement createBaseElement() {
+    return createElement("base").cast();
+  }
+
+  public final JsBaseFontElement createBaseFontElement() {
+    return createElement("basefont").cast();
+  }
+
+  public final JsBodyElement createBodyElement() {
+    return createElement("body").cast();
+  }
+
+  public final JsButtonElement createButtonElement() {
+    return createElement("button").cast();
+  }
+
+  public final JsCanvasElement createCanvasElement() {
+    return createElement("canvas").cast();
+  }
+
+  public final JsContentElement createContentElement() {
+    return createElement("content").cast();
+  }
+
+  public final JsDListElement createDListElement() {
+    return createElement("dlist").cast();
+  }
+
+  public final JsDetailsElement createDetailsElement() {
+    return createElement("details").cast();
+  }
+
+  public final JsDirectoryElement createDirectoryElement() {
+    return createElement("directory").cast();
+  }
+
+  public final JsDivElement createDivElement() {
+    return createElement("div").cast();
+  }
+
+  public final JsEmbedElement createEmbedElement() {
+    return createElement("embed").cast();
+  }
+
+  public final JsFieldSetElement createFieldSetElement() {
+    return createElement("fieldset").cast();
+  }
+
+  public final JsFontElement createFontElement() {
+    return createElement("font").cast();
+  }
+
+  public final JsFormElement createFormElement() {
+    return createElement("form").cast();
+  }
+
+  public final JsFrameElement createFrameElement() {
+    return createElement("frame").cast();
+  }
+
+  public final JsFrameSetElement createFrameSetElement() {
+    return createElement("frameset").cast();
+  }
+
+  public final JsHRElement createHRElement() {
+    return createElement("hr").cast();
+  }
+
+  public final JsHeadElement createHeadElement() {
+    return createElement("head").cast();
+  }
+
+  public final JsHeadingElement createHeadingElement() {
+    return createElement("heading").cast();
+  }
+
+  public final JsHtmlElement createHtmlElement() {
+    return createElement("html").cast();
+  }
+
+  public final JsIFrameElement createIFrameElement() {
+    return createElement("iframe").cast();
+  }
+
+  public final JsImageElement createImageElement() {
+    return createElement("image").cast();
+  }
+
+  public final JsInputElement createInputElement() {
+    return createElement("input").cast();
+  }
+
+  public final JsKeygenElement createKeygenElement() {
+    return createElement("keygen").cast();
+  }
+
+  public final JsLIElement createLIElement() {
+    return createElement("li").cast();
+  }
+
+  public final JsLabelElement createLabelElement() {
+    return createElement("label").cast();
+  }
+
+  public final JsLegendElement createLegendElement() {
+    return createElement("legend").cast();
+  }
+
+  public final JsLinkElement createLinkElement() {
+    return createElement("link").cast();
+  }
+
+  public final JsMapElement createMapElement() {
+    return createElement("map").cast();
+  }
+
+  public final JsMarqueeElement createMarqueeElement() {
+    return createElement("marquee").cast();
+  }
+
+  public final JsMediaElement createMediaElement() {
+    return createElement("media").cast();
+  }
+
+  public final JsMenuElement createMenuElement() {
+    return createElement("menu").cast();
+  }
+
+  public final JsMetaElement createMetaElement() {
+    return createElement("meta").cast();
+  }
+
+  public final JsMeterElement createMeterElement() {
+    return createElement("meter").cast();
+  }
+
+  public final JsModElement createModElement() {
+    return createElement("mod").cast();
+  }
+
+  public final JsOListElement createOListElement() {
+    return createElement("olist").cast();
+  }
+
+  public final JsObjectElement createObjectElement() {
+    return createElement("object").cast();
+  }
+
+  public final JsOptGroupElement createOptGroupElement() {
+    return createElement("optgroup").cast();
+  }
+
+  public final JsOptionElement createOptionElement() {
+    return createElement("option").cast();
+  }
+
+  public final JsOutputElement createOutputElement() {
+    return createElement("output").cast();
+  }
+
+  public final JsParagraphElement createParagraphElement() {
+    return createElement("paragraph").cast();
+  }
+
+  public final JsParamElement createParamElement() {
+    return createElement("param").cast();
+  }
+
+  public final JsPreElement createPreElement() {
+    return createElement("pre").cast();
+  }
+
+  public final JsProgressElement createProgressElement() {
+    return createElement("progress").cast();
+  }
+
+  public final JsQuoteElement createQuoteElement() {
+    return createElement("quote").cast();
+  }
+
+  public final JsSVGAElement createSVGAElement() {
+    return createSvgElement("a").cast();
+  }
+
+  public final JsSVGAltGlyphDefElement createSVGAltGlyphDefElement() {
+    return createSvgElement("altglyphdef").cast();
+  }
+
+  public final JsSVGAltGlyphElement createSVGAltGlyphElement() {
+    return createSvgElement("altglyph").cast();
+  }
+
+  public final JsSVGAltGlyphItemElement createSVGAltGlyphItemElement() {
+    return createSvgElement("altglyphitem").cast();
+  }
+
+  public final JsSVGAnimateColorElement createSVGAnimateColorElement() {
+    return createSvgElement("animatecolor").cast();
+  }
+
+  public final JsSVGAnimateElement createSVGAnimateElement() {
+    return createSvgElement("animate").cast();
+  }
+
+  public final JsSVGAnimateMotionElement createSVGAnimateMotionElement() {
+    return createSvgElement("animatemotion").cast();
+  }
+
+  public final JsSVGAnimateTransformElement createSVGAnimateTransformElement() {
+    return createSvgElement("animatetransform").cast();
+  }
+
+  public final JsSVGAnimationElement createSVGAnimationElement() {
+    return createSvgElement("animation").cast();
+  }
+
+  public final JsSVGCircleElement createSVGCircleElement() {
+    return createSvgElement("circle").cast();
+  }
+
+  public final JsSVGClipPathElement createSVGClipPathElement() {
+    return createSvgElement("clippath").cast();
+  }
+
+  public final JsSVGComponentTransferFunctionElement createSVGComponentTransferFunctionElement() {
+    return createSvgElement("componenttransferfunction").cast();
+  }
+
+  public final JsSVGCursorElement createSVGCursorElement() {
+    return createSvgElement("cursor").cast();
+  }
+
+  public final JsSVGDefsElement createSVGDefsElement() {
+    return createSvgElement("defs").cast();
+  }
+
+  public final JsSVGDescElement createSVGDescElement() {
+    return createSvgElement("desc").cast();
+  }
+
+  public final JsSVGEllipseElement createSVGEllipseElement() {
+    return createSvgElement("ellipse").cast();
+  }
+
+  public final JsSVGFEBlendElement createSVGFEBlendElement() {
+    return createSvgElement("feblend").cast();
+  }
+
+  public final JsSVGFEColorMatrixElement createSVGFEColorMatrixElement() {
+    return createSvgElement("fecolormatrix").cast();
+  }
+
+  public final JsSVGFEComponentTransferElement createSVGFEComponentTransferElement() {
+    return createSvgElement("fecomponenttransfer").cast();
+  }
+
+  public final JsSVGFECompositeElement createSVGFECompositeElement() {
+    return createSvgElement("fecomposite").cast();
+  }
+
+  public final JsSVGFEConvolveMatrixElement createSVGFEConvolveMatrixElement() {
+    return createSvgElement("feconvolvematrix").cast();
+  }
+
+  public final JsSVGFEDiffuseLightingElement createSVGFEDiffuseLightingElement() {
+    return createSvgElement("fediffuselighting").cast();
+  }
+
+  public final JsSVGFEDisplacementMapElement createSVGFEDisplacementMapElement() {
+    return createSvgElement("fedisplacementmap").cast();
+  }
+
+  public final JsSVGFEDistantLightElement createSVGFEDistantLightElement() {
+    return createSvgElement("fedistantlight").cast();
+  }
+
+  public final JsSVGFEDropShadowElement createSVGFEDropShadowElement() {
+    return createSvgElement("fedropshadow").cast();
+  }
+
+  public final JsSVGFEFloodElement createSVGFEFloodElement() {
+    return createSvgElement("feflood").cast();
+  }
+
+  public final JsSVGFEFuncAElement createSVGFEFuncAElement() {
+    return createSvgElement("fefunca").cast();
+  }
+
+  public final JsSVGFEFuncBElement createSVGFEFuncBElement() {
+    return createSvgElement("fefuncb").cast();
+  }
+
+  public final JsSVGFEFuncGElement createSVGFEFuncGElement() {
+    return createSvgElement("fefuncg").cast();
+  }
+
+  public final JsSVGFEFuncRElement createSVGFEFuncRElement() {
+    return createSvgElement("fefuncr").cast();
+  }
+
+  public final JsSVGFEGaussianBlurElement createSVGFEGaussianBlurElement() {
+    return createSvgElement("fegaussianblur").cast();
+  }
+
+  public final JsSVGFEImageElement createSVGFEImageElement() {
+    return createSvgElement("feimage").cast();
+  }
+
+  public final JsSVGFEMergeElement createSVGFEMergeElement() {
+    return createSvgElement("femerge").cast();
+  }
+
+  public final JsSVGFEMergeNodeElement createSVGFEMergeNodeElement() {
+    return createSvgElement("femergenode").cast();
+  }
+
+  public final JsSVGFEMorphologyElement createSVGFEMorphologyElement() {
+    return createSvgElement("femorphology").cast();
+  }
+
+  public final JsSVGFEOffsetElement createSVGFEOffsetElement() {
+    return createSvgElement("feoffset").cast();
+  }
+
+  public final JsSVGFEPointLightElement createSVGFEPointLightElement() {
+    return createSvgElement("fepointlight").cast();
+  }
+
+  public final JsSVGFESpecularLightingElement createSVGFESpecularLightingElement() {
+    return createSvgElement("fespecularlighting").cast();
+  }
+
+  public final JsSVGFESpotLightElement createSVGFESpotLightElement() {
+    return createSvgElement("fespotlight").cast();
+  }
+
+  public final JsSVGFETileElement createSVGFETileElement() {
+    return createSvgElement("fetile").cast();
+  }
+
+  public final JsSVGFETurbulenceElement createSVGFETurbulenceElement() {
+    return createSvgElement("feturbulence").cast();
+  }
+
+  public final JsSVGFilterElement createSVGFilterElement() {
+    return createSvgElement("filter").cast();
+  }
+
+  public final JsSVGFontElement createSVGFontElement() {
+    return createSvgElement("font").cast();
+  }
+
+  public final JsSVGFontFaceElement createSVGFontFaceElement() {
+    return createSvgElement("fontface").cast();
+  }
+
+  public final JsSVGFontFaceFormatElement createSVGFontFaceFormatElement() {
+    return createSvgElement("fontfaceformat").cast();
+  }
+
+  public final JsSVGFontFaceNameElement createSVGFontFaceNameElement() {
+    return createSvgElement("fontfacename").cast();
+  }
+
+  public final JsSVGFontFaceSrcElement createSVGFontFaceSrcElement() {
+    return createSvgElement("fontfacesrc").cast();
+  }
+
+  public final JsSVGFontFaceUriElement createSVGFontFaceUriElement() {
+    return createSvgElement("fontfaceuri").cast();
+  }
+
+  public final JsSVGForeignObjectElement createSVGForeignObjectElement() {
+    return createSvgElement("foreignobject").cast();
+  }
+
+  public final JsSVGGElement createSVGGElement() {
+    return createSvgElement("g").cast();
+  }
+
+  public final JsSVGGlyphElement createSVGGlyphElement() {
+    return createSvgElement("glyph").cast();
+  }
+
+  public final JsSVGGlyphRefElement createSVGGlyphRefElement() {
+    return createSvgElement("glyphref").cast();
+  }
+
+  public final JsSVGGradientElement createSVGGradientElement() {
+    return createSvgElement("gradient").cast();
+  }
+
+  public final JsSVGHKernElement createSVGHKernElement() {
+    return createSvgElement("hkern").cast();
+  }
+
+  public final JsSVGImageElement createSVGImageElement() {
+    return createSvgElement("image").cast();
+  }
+
+  public final JsSVGLineElement createSVGLineElement() {
+    return createSvgElement("line").cast();
+  }
+
+  public final JsSVGLinearGradientElement createSVGLinearGradientElement() {
+    return createSvgElement("lineargradient").cast();
+  }
+
+  public final JsSVGMPathElement createSVGMPathElement() {
+    return createSvgElement("mpath").cast();
+  }
+
+  public final JsSVGMarkerElement createSVGMarkerElement() {
+    return createSvgElement("marker").cast();
+  }
+
+  public final JsSVGMaskElement createSVGMaskElement() {
+    return createSvgElement("mask").cast();
+  }
+
+  public final JsSVGMetadataElement createSVGMetadataElement() {
+    return createSvgElement("metadata").cast();
+  }
+
+  public final JsSVGMissingGlyphElement createSVGMissingGlyphElement() {
+    return createSvgElement("missingglyph").cast();
+  }
+
+  public final JsSVGPathElement createSVGPathElement() {
+    return createSvgElement("path").cast();
+  }
+
+  public final JsSVGPatternElement createSVGPatternElement() {
+    return createSvgElement("pattern").cast();
+  }
+
+  public final JsSVGPolygonElement createSVGPolygonElement() {
+    return createSvgElement("polygon").cast();
+  }
+
+  public final JsSVGPolylineElement createSVGPolylineElement() {
+    return createSvgElement("polyline").cast();
+  }
+
+  public final JsSVGRadialGradientElement createSVGRadialGradientElement() {
+    return createSvgElement("radialgradient").cast();
+  }
+
+  public final JsSVGRectElement createSVGRectElement() {
+    return createSvgElement("rect").cast();
+  }
+
+  public final JsSVGSVGElement createSVGElement() {
+    return createSvgElement("svg").cast();
+  }
+
+  public final JsSVGScriptElement createSVGScriptElement() {
+    return createSvgElement("script").cast();
+  }
+
+  public final JsSVGSetElement createSVGSetElement() {
+    return createSvgElement("set").cast();
+  }
+
+  public final JsSVGStopElement createSVGStopElement() {
+    return createSvgElement("stop").cast();
+  }
+
+  public final JsSVGStyleElement createSVGStyleElement() {
+    return createSvgElement("style").cast();
+  }
+
+  public final JsSVGSwitchElement createSVGSwitchElement() {
+    return createSvgElement("switch").cast();
+  }
+
+  public final JsSVGSymbolElement createSVGSymbolElement() {
+    return createSvgElement("symbol").cast();
+  }
+
+  public final JsSVGTRefElement createSVGTRefElement() {
+    return createSvgElement("tref").cast();
+  }
+
+  public final JsSVGTSpanElement createSVGTSpanElement() {
+    return createSvgElement("tspan").cast();
+  }
+
+  public final JsSVGTextContentElement createSVGTextContentElement() {
+    return createSvgElement("textcontent").cast();
+  }
+
+  public final JsSVGTextElement createSVGTextElement() {
+    return createSvgElement("text").cast();
+  }
+
+  public final JsSVGTextPathElement createSVGTextPathElement() {
+    return createSvgElement("textpath").cast();
+  }
+
+  public final JsSVGTextPositioningElement createSVGTextPositioningElement() {
+    return createSvgElement("textpositioning").cast();
+  }
+
+  public final JsSVGTitleElement createSVGTitleElement() {
+    return createSvgElement("title").cast();
+  }
+
+  public final JsSVGUseElement createSVGUseElement() {
+    return createSvgElement("use").cast();
+  }
+
+  public final JsSVGVKernElement createSVGVKernElement() {
+    return createSvgElement("vkern").cast();
+  }
+
+  public final JsSVGViewElement createSVGViewElement() {
+    return createSvgElement("view").cast();
+  }
+
+  public final JsScriptElement createScriptElement() {
+    return createElement("script").cast();
+  }
+
+  public final JsSelectElement createSelectElement() {
+    return createElement("select").cast();
+  }
+
+  public final JsShadowElement createShadowElement() {
+    return createElement("shadow").cast();
+  }
+
+  public final JsSourceElement createSourceElement() {
+    return createElement("source").cast();
+  }
+
+  public final JsSpanElement createSpanElement() {
+    return createElement("span").cast();
+  }
+
+  public final JsStyleElement createStyleElement() {
+    return createElement("style").cast();
+  }
+
+  public final JsTableCaptionElement createTableCaptionElement() {
+    return createElement("caption").cast();
+  }
+
+  public final JsTableCellElement createTableCellElement() {
+    return createElement("tablecell").cast();
+  }
+
+  public final JsTableColElement createTableColElement() {
+    return createElement("tablecol").cast();
+  }
+
+  public final JsTableElement createTableElement() {
+    return createElement("table").cast();
+  }
+
+  public final JsTableRowElement createTableRowElement() {
+    return createElement("tablerow").cast();
+  }
+
+  public final JsTableSectionElement createTableSectionElement() {
+    return createElement("tablesection").cast();
+  }
+
+  public final JsTextAreaElement createTextAreaElement() {
+    return createElement("textarea").cast();
+  }
+
+  public final JsTitleElement createTitleElement() {
+    return createElement("title").cast();
+  }
+
+  public final JsTrackElement createTrackElement() {
+    return createElement("track").cast();
+  }
+
+  public final JsUListElement createUListElement() {
+    return createElement("ulist").cast();
+  }
+
+  public final JsUnknownElement createUnknownElement() {
+    return createElement("unknown").cast();
+  }
+
+  public final JsVideoElement createVideoElement() {
+    return createElement("video").cast();
+  }
+}
diff --git a/elemental/src/elemental/js/dom/JsDocumentFragment.java b/elemental/src/elemental/js/dom/JsDocumentFragment.java
new file mode 100644
index 0000000..aaeba85
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDocumentFragment.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.Element;
+import elemental.dom.NodeList;
+import elemental.dom.DocumentFragment;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDocumentFragment extends JsNode  implements DocumentFragment {
+  protected JsDocumentFragment() {}
+}
diff --git a/elemental/src/elemental/js/dom/JsDocumentType.java b/elemental/src/elemental/js/dom/JsDocumentType.java
new file mode 100644
index 0000000..c61d6e4
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsDocumentType.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.NamedNodeMap;
+import elemental.dom.DocumentType;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDocumentType extends JsNode  implements DocumentType {
+  protected JsDocumentType() {}
+
+  public final native JsNamedNodeMap getEntities() /*-{
+    return this.entities;
+  }-*/;
+
+  public final native String getInternalSubset() /*-{
+    return this.internalSubset;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native JsNamedNodeMap getNotations() /*-{
+    return this.notations;
+  }-*/;
+
+  public final native String getPublicId() /*-{
+    return this.publicId;
+  }-*/;
+
+  public final native String getSystemId() /*-{
+    return this.systemId;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsElement.java b/elemental/src/elemental/js/dom/JsElement.java
new file mode 100644
index 0000000..13583e2
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsElement.java
@@ -0,0 +1,726 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.Element;
+import elemental.js.css.JsCSSStyleDeclaration;
+import elemental.html.HTMLCollection;
+import elemental.dom.NodeList;
+import elemental.html.ClientRect;
+import elemental.js.html.JsHTMLCollection;
+import elemental.js.util.JsMappable;
+import elemental.js.html.JsClientRect;
+import elemental.util.Mappable;
+import elemental.events.EventListener;
+import elemental.js.html.JsClientRectList;
+import elemental.dom.Attr;
+import elemental.dom.DOMTokenList;
+import elemental.css.CSSStyleDeclaration;
+import elemental.js.events.JsEventListener;
+import elemental.html.ClientRectList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsElement extends JsNode  implements Element {
+  protected JsElement() {}
+
+  public final native String getAccessKey() /*-{
+    return this.accessKey;
+  }-*/;
+
+  public final native void setAccessKey(String param_accessKey) /*-{
+    this.accessKey = param_accessKey;
+  }-*/;
+
+  public final native JsHTMLCollection getChildren() /*-{
+    return this.children;
+  }-*/;
+
+  public final native JsDOMTokenList getClassList() /*-{
+    return this.classList;
+  }-*/;
+
+  public final native String getClassName() /*-{
+    return this.className;
+  }-*/;
+
+  public final native void setClassName(String param_className) /*-{
+    this.className = param_className;
+  }-*/;
+
+  public final native int getClientHeight() /*-{
+    return this.clientHeight;
+  }-*/;
+
+  public final native int getClientLeft() /*-{
+    return this.clientLeft;
+  }-*/;
+
+  public final native int getClientTop() /*-{
+    return this.clientTop;
+  }-*/;
+
+  public final native int getClientWidth() /*-{
+    return this.clientWidth;
+  }-*/;
+
+  public final native String getContentEditable() /*-{
+    return this.contentEditable;
+  }-*/;
+
+  public final native void setContentEditable(String param_contentEditable) /*-{
+    this.contentEditable = param_contentEditable;
+  }-*/;
+
+  public final native JsMappable getDataset() /*-{
+    return this.dataset;
+  }-*/;
+
+  public final native String getDir() /*-{
+    return this.dir;
+  }-*/;
+
+  public final native void setDir(String param_dir) /*-{
+    this.dir = param_dir;
+  }-*/;
+
+  public final native boolean isDraggable() /*-{
+    return this.draggable;
+  }-*/;
+
+  public final native void setDraggable(boolean param_draggable) /*-{
+    this.draggable = param_draggable;
+  }-*/;
+
+  public final native boolean isHidden() /*-{
+    return this.hidden;
+  }-*/;
+
+  public final native void setHidden(boolean param_hidden) /*-{
+    this.hidden = param_hidden;
+  }-*/;
+
+  public final native String getId() /*-{
+    return this.id;
+  }-*/;
+
+  public final native void setId(String param_id) /*-{
+    this.id = param_id;
+  }-*/;
+
+  public final native String getInnerHTML() /*-{
+    return this.innerHTML;
+  }-*/;
+
+  public final native void setInnerHTML(String param_innerHTML) /*-{
+    this.innerHTML = param_innerHTML;
+  }-*/;
+
+  public final native String getInnerText() /*-{
+    return this.innerText;
+  }-*/;
+
+  public final native void setInnerText(String param_innerText) /*-{
+    this.innerText = param_innerText;
+  }-*/;
+
+  public final native boolean isContentEditable() /*-{
+    return this.isContentEditable;
+  }-*/;
+
+  public final native String getLang() /*-{
+    return this.lang;
+  }-*/;
+
+  public final native void setLang(String param_lang) /*-{
+    this.lang = param_lang;
+  }-*/;
+
+  public final native int getOffsetHeight() /*-{
+    return this.offsetHeight;
+  }-*/;
+
+  public final native int getOffsetLeft() /*-{
+    return this.offsetLeft;
+  }-*/;
+
+  public final native JsElement getOffsetParent() /*-{
+    return this.offsetParent;
+  }-*/;
+
+  public final native int getOffsetTop() /*-{
+    return this.offsetTop;
+  }-*/;
+
+  public final native int getOffsetWidth() /*-{
+    return this.offsetWidth;
+  }-*/;
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforecopy() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforecopy);
+  }-*/;
+
+  public final native void setOnbeforecopy(EventListener listener) /*-{
+    this.onbeforecopy = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforecut() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforecut);
+  }-*/;
+
+  public final native void setOnbeforecut(EventListener listener) /*-{
+    this.onbeforecut = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforepaste() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforepaste);
+  }-*/;
+
+  public final native void setOnbeforepaste(EventListener listener) /*-{
+    this.onbeforepaste = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnblur() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onblur);
+  }-*/;
+
+  public final native void setOnblur(EventListener listener) /*-{
+    this.onblur = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onchange);
+  }-*/;
+
+  public final native void setOnchange(EventListener listener) /*-{
+    this.onchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnclick() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onclick);
+  }-*/;
+
+  public final native void setOnclick(EventListener listener) /*-{
+    this.onclick = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncontextmenu() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncontextmenu);
+  }-*/;
+
+  public final native void setOncontextmenu(EventListener listener) /*-{
+    this.oncontextmenu = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncopy() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncopy);
+  }-*/;
+
+  public final native void setOncopy(EventListener listener) /*-{
+    this.oncopy = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncut() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncut);
+  }-*/;
+
+  public final native void setOncut(EventListener listener) /*-{
+    this.oncut = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndblclick() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondblclick);
+  }-*/;
+
+  public final native void setOndblclick(EventListener listener) /*-{
+    this.ondblclick = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndrag() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondrag);
+  }-*/;
+
+  public final native void setOndrag(EventListener listener) /*-{
+    this.ondrag = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragend);
+  }-*/;
+
+  public final native void setOndragend(EventListener listener) /*-{
+    this.ondragend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragenter() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragenter);
+  }-*/;
+
+  public final native void setOndragenter(EventListener listener) /*-{
+    this.ondragenter = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragleave() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragleave);
+  }-*/;
+
+  public final native void setOndragleave(EventListener listener) /*-{
+    this.ondragleave = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragover() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragover);
+  }-*/;
+
+  public final native void setOndragover(EventListener listener) /*-{
+    this.ondragover = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragstart);
+  }-*/;
+
+  public final native void setOndragstart(EventListener listener) /*-{
+    this.ondragstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndrop() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondrop);
+  }-*/;
+
+  public final native void setOndrop(EventListener listener) /*-{
+    this.ondrop = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnfocus() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onfocus);
+  }-*/;
+
+  public final native void setOnfocus(EventListener listener) /*-{
+    this.onfocus = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOninput() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oninput);
+  }-*/;
+
+  public final native void setOninput(EventListener listener) /*-{
+    this.oninput = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOninvalid() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oninvalid);
+  }-*/;
+
+  public final native void setOninvalid(EventListener listener) /*-{
+    this.oninvalid = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeydown() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeydown);
+  }-*/;
+
+  public final native void setOnkeydown(EventListener listener) /*-{
+    this.onkeydown = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeypress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeypress);
+  }-*/;
+
+  public final native void setOnkeypress(EventListener listener) /*-{
+    this.onkeypress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeyup() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeyup);
+  }-*/;
+
+  public final native void setOnkeyup(EventListener listener) /*-{
+    this.onkeyup = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onload);
+  }-*/;
+
+  public final native void setOnload(EventListener listener) /*-{
+    this.onload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousedown() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousedown);
+  }-*/;
+
+  public final native void setOnmousedown(EventListener listener) /*-{
+    this.onmousedown = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousemove() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousemove);
+  }-*/;
+
+  public final native void setOnmousemove(EventListener listener) /*-{
+    this.onmousemove = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseout() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseout);
+  }-*/;
+
+  public final native void setOnmouseout(EventListener listener) /*-{
+    this.onmouseout = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseover() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseover);
+  }-*/;
+
+  public final native void setOnmouseover(EventListener listener) /*-{
+    this.onmouseover = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseup() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseup);
+  }-*/;
+
+  public final native void setOnmouseup(EventListener listener) /*-{
+    this.onmouseup = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousewheel() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousewheel);
+  }-*/;
+
+  public final native void setOnmousewheel(EventListener listener) /*-{
+    this.onmousewheel = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnpaste() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onpaste);
+  }-*/;
+
+  public final native void setOnpaste(EventListener listener) /*-{
+    this.onpaste = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnreset() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onreset);
+  }-*/;
+
+  public final native void setOnreset(EventListener listener) /*-{
+    this.onreset = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnscroll() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onscroll);
+  }-*/;
+
+  public final native void setOnscroll(EventListener listener) /*-{
+    this.onscroll = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsearch() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsearch);
+  }-*/;
+
+  public final native void setOnsearch(EventListener listener) /*-{
+    this.onsearch = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnselect() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onselect);
+  }-*/;
+
+  public final native void setOnselect(EventListener listener) /*-{
+    this.onselect = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnselectstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onselectstart);
+  }-*/;
+
+  public final native void setOnselectstart(EventListener listener) /*-{
+    this.onselectstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsubmit() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsubmit);
+  }-*/;
+
+  public final native void setOnsubmit(EventListener listener) /*-{
+    this.onsubmit = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchcancel() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchcancel);
+  }-*/;
+
+  public final native void setOntouchcancel(EventListener listener) /*-{
+    this.ontouchcancel = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchend);
+  }-*/;
+
+  public final native void setOntouchend(EventListener listener) /*-{
+    this.ontouchend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchmove() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchmove);
+  }-*/;
+
+  public final native void setOntouchmove(EventListener listener) /*-{
+    this.ontouchmove = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchstart);
+  }-*/;
+
+  public final native void setOntouchstart(EventListener listener) /*-{
+    this.ontouchstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitfullscreenchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitfullscreenchange);
+  }-*/;
+
+  public final native void setOnwebkitfullscreenchange(EventListener listener) /*-{
+    this.onwebkitfullscreenchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitfullscreenerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitfullscreenerror);
+  }-*/;
+
+  public final native void setOnwebkitfullscreenerror(EventListener listener) /*-{
+    this.onwebkitfullscreenerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native String getOuterHTML() /*-{
+    return this.outerHTML;
+  }-*/;
+
+  public final native void setOuterHTML(String param_outerHTML) /*-{
+    this.outerHTML = param_outerHTML;
+  }-*/;
+
+  public final native String getOuterText() /*-{
+    return this.outerText;
+  }-*/;
+
+  public final native void setOuterText(String param_outerText) /*-{
+    this.outerText = param_outerText;
+  }-*/;
+
+  public final native int getScrollHeight() /*-{
+    return this.scrollHeight;
+  }-*/;
+
+  public final native int getScrollLeft() /*-{
+    return this.scrollLeft;
+  }-*/;
+
+  public final native void setScrollLeft(int param_scrollLeft) /*-{
+    this.scrollLeft = param_scrollLeft;
+  }-*/;
+
+  public final native int getScrollTop() /*-{
+    return this.scrollTop;
+  }-*/;
+
+  public final native void setScrollTop(int param_scrollTop) /*-{
+    this.scrollTop = param_scrollTop;
+  }-*/;
+
+  public final native int getScrollWidth() /*-{
+    return this.scrollWidth;
+  }-*/;
+
+  public final native boolean isSpellcheck() /*-{
+    return this.spellcheck;
+  }-*/;
+
+  public final native void setSpellcheck(boolean param_spellcheck) /*-{
+    this.spellcheck = param_spellcheck;
+  }-*/;
+
+  public final native JsCSSStyleDeclaration getStyle() /*-{
+    return this.style;
+  }-*/;
+
+  public final native int getTabIndex() /*-{
+    return this.tabIndex;
+  }-*/;
+
+  public final native void setTabIndex(int param_tabIndex) /*-{
+    this.tabIndex = param_tabIndex;
+  }-*/;
+
+  public final native String getTagName() /*-{
+    return this.tagName;
+  }-*/;
+
+  public final native String getTitle() /*-{
+    return this.title;
+  }-*/;
+
+  public final native void setTitle(String param_title) /*-{
+    this.title = param_title;
+  }-*/;
+
+  public final native boolean isTranslate() /*-{
+    return this.translate;
+  }-*/;
+
+  public final native void setTranslate(boolean param_translate) /*-{
+    this.translate = param_translate;
+  }-*/;
+
+  public final native String getWebkitRegionOverflow() /*-{
+    return this.webkitRegionOverflow;
+  }-*/;
+
+  public final native String getWebkitdropzone() /*-{
+    return this.webkitdropzone;
+  }-*/;
+
+  public final native void setWebkitdropzone(String param_webkitdropzone) /*-{
+    this.webkitdropzone = param_webkitdropzone;
+  }-*/;
+
+  public final native void blur() /*-{
+    this.blur();
+  }-*/;
+
+  public final native void focus() /*-{
+    this.focus();
+  }-*/;
+
+  public final native String getAttribute(String name) /*-{
+    return this.getAttribute(name);
+  }-*/;
+
+  public final native String getAttributeNS(String namespaceURI, String localName) /*-{
+    return this.getAttributeNS(namespaceURI, localName);
+  }-*/;
+
+  public final native JsAttr getAttributeNode(String name) /*-{
+    return this.getAttributeNode(name);
+  }-*/;
+
+  public final native JsAttr getAttributeNodeNS(String namespaceURI, String localName) /*-{
+    return this.getAttributeNodeNS(namespaceURI, localName);
+  }-*/;
+
+  public final native JsClientRect getBoundingClientRect() /*-{
+    return this.getBoundingClientRect();
+  }-*/;
+
+  public final native JsClientRectList getClientRects() /*-{
+    return this.getClientRects();
+  }-*/;
+
+  public final native JsNodeList getElementsByClassName(String name) /*-{
+    return this.getElementsByClassName(name);
+  }-*/;
+
+  public final native JsNodeList getElementsByTagName(String name) /*-{
+    return this.getElementsByTagName(name);
+  }-*/;
+
+  public final native JsNodeList getElementsByTagNameNS(String namespaceURI, String localName) /*-{
+    return this.getElementsByTagNameNS(namespaceURI, localName);
+  }-*/;
+
+  public final native boolean hasAttribute(String name) /*-{
+    return this.hasAttribute(name);
+  }-*/;
+
+  public final native boolean hasAttributeNS(String namespaceURI, String localName) /*-{
+    return this.hasAttributeNS(namespaceURI, localName);
+  }-*/;
+
+  public final native void removeAttribute(String name) /*-{
+    this.removeAttribute(name);
+  }-*/;
+
+  public final native void removeAttributeNS(String namespaceURI, String localName) /*-{
+    this.removeAttributeNS(namespaceURI, localName);
+  }-*/;
+
+  public final native JsAttr removeAttributeNode(Attr oldAttr) /*-{
+    return this.removeAttributeNode(oldAttr);
+  }-*/;
+
+  public final native void scrollByLines(int lines) /*-{
+    this.scrollByLines(lines);
+  }-*/;
+
+  public final native void scrollByPages(int pages) /*-{
+    this.scrollByPages(pages);
+  }-*/;
+
+  public final native void scrollIntoView() /*-{
+    this.scrollIntoView();
+  }-*/;
+
+  public final native void scrollIntoView(boolean alignWithTop) /*-{
+    this.scrollIntoView(alignWithTop);
+  }-*/;
+
+  public final native void scrollIntoViewIfNeeded() /*-{
+    this.scrollIntoViewIfNeeded();
+  }-*/;
+
+  public final native void scrollIntoViewIfNeeded(boolean centerIfNeeded) /*-{
+    this.scrollIntoViewIfNeeded(centerIfNeeded);
+  }-*/;
+
+  public final native void setAttribute(String name, String value) /*-{
+    this.setAttribute(name, value);
+  }-*/;
+
+  public final native void setAttributeNS(String namespaceURI, String qualifiedName, String value) /*-{
+    this.setAttributeNS(namespaceURI, qualifiedName, value);
+  }-*/;
+
+  public final native JsAttr setAttributeNode(Attr newAttr) /*-{
+    return this.setAttributeNode(newAttr);
+  }-*/;
+
+  public final native JsAttr setAttributeNodeNS(Attr newAttr) /*-{
+    return this.setAttributeNodeNS(newAttr);
+  }-*/;
+
+  public final native boolean webkitMatchesSelector(String selectors) /*-{
+    return this.webkitMatchesSelector(selectors);
+  }-*/;
+
+  public final native void webkitRequestFullScreen(int flags) /*-{
+    this.webkitRequestFullScreen(flags);
+  }-*/;
+
+  public final native void webkitRequestFullscreen() /*-{
+    this.webkitRequestFullscreen();
+  }-*/;
+
+  public final native void click() /*-{
+    this.click();
+  }-*/;
+
+  public final native JsElement insertAdjacentElement(String where, Element element) /*-{
+    return this.insertAdjacentElement(where, element);
+  }-*/;
+
+  public final native void insertAdjacentHTML(String where, String html) /*-{
+    this.insertAdjacentHTML(where, html);
+  }-*/;
+
+  public final native void insertAdjacentText(String where, String text) /*-{
+    this.insertAdjacentText(where, text);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsElementalMixinBase.java b/elemental/src/elemental/js/dom/JsElementalMixinBase.java
new file mode 100644
index 0000000..e65658c
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsElementalMixinBase.java
@@ -0,0 +1,381 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.svg.SVGStringList;
+import elemental.js.svg.JsSVGStringList;
+import elemental.dom.ElementalMixinBase;
+import elemental.js.events.JsEventListener;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGAnimatedString;
+import elemental.js.svg.JsSVGAnimatedTransformList;
+import elemental.css.CSSValue;
+import elemental.js.svg.JsSVGAnimatedBoolean;
+import elemental.js.svg.JsSVGElement;
+import elemental.svg.SVGRect;
+import elemental.dom.NodeList;
+import elemental.dom.Element;
+import elemental.svg.SVGAnimatedTransformList;
+import elemental.svg.SVGAnimatedBoolean;
+import elemental.svg.SVGMatrix;
+import elemental.js.svg.JsSVGRect;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedPreserveAspectRatio;
+import elemental.js.svg.JsSVGMatrix;
+import elemental.js.svg.JsSVGAnimatedString;
+import elemental.events.Event;
+import elemental.js.css.JsCSSStyleDeclaration;
+import elemental.js.events.JsEvent;
+import elemental.js.svg.JsSVGAnimatedLength;
+import elemental.svg.SVGAnimatedRect;
+import elemental.events.EventListener;
+import elemental.js.svg.JsSVGAnimatedRect;
+import elemental.js.css.JsCSSValue;
+import elemental.css.CSSStyleDeclaration;
+import elemental.js.svg.JsSVGAnimatedPreserveAspectRatio;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.svg.*;
+import elemental.js.util.JsElementalBase;
+
+import java.util.Date;
+
+/**
+  * A base class containing all of the IDL interfaces which are shared
+  * between disjoint type hierarchies. Because of the GWT compiler
+  * SingleJsoImpl restriction that only a single JavaScriptObject
+  * may implement a given interface, we hoist all of the explicit
+  * mixin classes into a base JSO used by all of elemental.
+  */
+public class JsElementalMixinBase  extends JsElementalBase  implements ElementalMixinBase, EventTarget, SVGZoomAndPan, SVGLocatable, SVGLangSpace, SVGFilterPrimitiveStandardAttributes, ElementTimeControl, SVGTests, SVGURIReference, IndexableInt, IndexableNumber, SVGFitToViewBox, SVGTransformable, NodeSelector, SVGExternalResourcesRequired, SVGStylable, ElementTraversal {
+  protected JsElementalMixinBase() {}
+
+  public final native int getChildElementCount() /*-{
+    return this.childElementCount;
+  }-*/;
+
+  public final native JsSVGAnimatedString getAnimatedClassName() /*-{
+    return this.className;
+  }-*/;
+
+  public final native JsSVGAnimatedBoolean getExternalResourcesRequired() /*-{
+    return this.externalResourcesRequired;
+  }-*/;
+
+  public final native JsSVGElement getFarthestViewportElement() /*-{
+    return this.farthestViewportElement;
+  }-*/;
+
+  public final native JsElement getFirstElementChild() /*-{
+    return this.firstElementChild;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getAnimatedHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native JsSVGAnimatedString getAnimatedHref() /*-{
+    return this.href;
+  }-*/;
+
+  public final native JsElement getLastElementChild() /*-{
+    return this.lastElementChild;
+  }-*/;
+
+  public final native JsSVGElement getNearestViewportElement() /*-{
+    return this.nearestViewportElement;
+  }-*/;
+
+  public final native JsElement getNextElementSibling() /*-{
+    return this.nextElementSibling;
+  }-*/;
+
+  public final native JsSVGAnimatedPreserveAspectRatio getPreserveAspectRatio() /*-{
+    return this.preserveAspectRatio;
+  }-*/;
+
+  public final native JsElement getPreviousElementSibling() /*-{
+    return this.previousElementSibling;
+  }-*/;
+
+  public final native JsSVGStringList getRequiredExtensions() /*-{
+    return this.requiredExtensions;
+  }-*/;
+
+  public final native JsSVGStringList getRequiredFeatures() /*-{
+    return this.requiredFeatures;
+  }-*/;
+
+  public final native JsSVGAnimatedString getAnimatedResult() /*-{
+    return this.result;
+  }-*/;
+
+  public final native JsCSSStyleDeclaration getSvgStyle() /*-{
+    return this.style;
+  }-*/;
+
+  public final native JsSVGStringList getSystemLanguage() /*-{
+    return this.systemLanguage;
+  }-*/;
+
+  public final native JsSVGAnimatedTransformList getAnimatedTransform() /*-{
+    return this.transform;
+  }-*/;
+
+  public final native JsSVGAnimatedRect getViewBox() /*-{
+    return this.viewBox;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getAnimatedWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getAnimatedX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native String getXmllang() /*-{
+    return this.xmllang;
+  }-*/;
+
+  public final native void setXmllang(String param_xmllang) /*-{
+    this.xmllang = param_xmllang;
+  }-*/;
+
+  public final native String getXmlspace() /*-{
+    return this.xmlspace;
+  }-*/;
+
+  public final native void setXmlspace(String param_xmlspace) /*-{
+    this.xmlspace = param_xmlspace;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getAnimatedY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native int getZoomAndPan() /*-{
+    return this.zoomAndPan;
+  }-*/;
+
+  public final native void setZoomAndPan(int param_zoomAndPan) /*-{
+    this.zoomAndPan = param_zoomAndPan;
+  }-*/;
+
+  public final native boolean dispatchEvent(Event event) /*-{
+    return this.dispatchEvent(event);
+  }-*/;
+
+  public final native JsSVGRect getBBox() /*-{
+    return this.getBBox();
+  }-*/;
+
+  public final native JsSVGMatrix getCTM() /*-{
+    return this.getCTM();
+  }-*/;
+
+  public final native JsSVGMatrix getScreenCTM() /*-{
+    return this.getScreenCTM();
+  }-*/;
+
+  public final native JsSVGMatrix getTransformToElement(SVGElement element) /*-{
+    return this.getTransformToElement(element);
+  }-*/;
+
+  public final native void beginElement() /*-{
+    this.beginElement();
+  }-*/;
+
+  public final native void beginElementAt(float offset) /*-{
+    this.beginElementAt(offset);
+  }-*/;
+
+  public final native void endElement() /*-{
+    this.endElement();
+  }-*/;
+
+  public final native void endElementAt(float offset) /*-{
+    this.endElementAt(offset);
+  }-*/;
+
+  public final native boolean hasExtension(String extension) /*-{
+    return this.hasExtension(extension);
+  }-*/;
+
+  public final native JsElement querySelector(String selectors) /*-{
+    return this.querySelector(selectors);
+  }-*/;
+
+  public final native JsNodeList querySelectorAll(String selectors) /*-{
+    return this.querySelectorAll(selectors);
+  }-*/;
+
+  public final native JsCSSValue getPresentationAttribute(String name) /*-{
+    return this.getPresentationAttribute(name);
+  }-*/;
+
+
+private static class Remover implements EventRemover {
+  private final EventTarget target;
+  private final String type;
+  private final JavaScriptObject handler;
+  private final boolean useCapture;
+
+  private Remover(EventTarget target, String type, JavaScriptObject handler,
+      boolean useCapture) {
+    this.target = target;
+    this.type = type;
+    this.handler = handler;
+    this.useCapture = useCapture;
+  }
+
+  @Override
+  public void remove() {
+    removeEventListener(target, type, handler, useCapture);
+  }
+
+  private static Remover create(EventTarget target, String type, JavaScriptObject handler,
+      boolean useCapture) {
+    return new Remover(target, type, handler, useCapture);
+  }
+}
+
+// NOTES:
+// - This handler/listener structure is currently the same in DevMode and ProdMode but it is
+//   subject to change. In fact, I would like to use:
+//     { listener : listener, handleEvent : function() }
+//   but Firefox doesn't properly support that form of handler for onEvent type events.
+// - The handler property on listener can be removed when removeEventListener is removed.
+private native static JavaScriptObject createHandler(EventListener listener) /*-{
+  var handler = listener.handler;
+  if (!handler) {
+    handler = $entry(function(event) {
+      @elemental.js.dom.JsElementalMixinBase::handleEvent(Lelemental/events/EventListener;Lelemental/events/Event;)(listener, event);
+    });
+    handler.listener = listener;
+    // TODO(knorton): Remove at Christmas when removeEventListener is removed.
+    listener.handler = handler;
+  }
+  return handler;
+}-*/;
+
+private static class ForDevMode {
+  private static java.util.Map<EventListener, JavaScriptObject> handlers;
+
+  static {
+    if (!com.google.gwt.core.client.GWT.isScript()) {
+      handlers = new java.util.HashMap<EventListener, JavaScriptObject>();
+    }
+  }
+
+  private static JavaScriptObject getHandlerFor(EventListener listener) {
+    if (listener == null) {
+      return null;
+    }
+
+    JavaScriptObject handler = handlers.get(listener);
+    if (handler == null) {
+      handler = createHandler(listener);
+      handlers.put(listener, handler);
+    }
+    return handler;
+  }
+
+  private native static JavaScriptObject createHandler(EventListener listener) /*-{
+    var handler = $entry(function(event) {
+      @elemental.js.dom.JsElementalMixinBase::handleEvent(Lelemental/events/EventListener;Lelemental/events/Event;)(listener, event);
+    });
+    handler.listener = listener;
+    return handler;
+  }-*/;
+
+  private native static EventListener getListenerFor(JavaScriptObject handler) /*-{
+    return handler && handler.listener;
+  }-*/;
+}
+
+private static class ForProdMode {
+  private static JavaScriptObject getHandlerFor(EventListener listener) {
+    return listener == null ? null : createHandler(listener);
+  }
+
+  private native static EventListener getListenerFor(JavaScriptObject handler) /*-{
+    return handler && handler.listener;
+  }-*/;
+}
+
+private static void handleEvent(EventListener listener, Event event) {
+  listener.handleEvent(event);
+}
+
+private static EventListener getListenerFor(JavaScriptObject handler) {
+  return com.google.gwt.core.client.GWT.isScript()
+    ? ForProdMode.getListenerFor(handler)
+    : ForDevMode.getListenerFor(handler);
+}
+
+private static JavaScriptObject getHandlerFor(EventListener listener) {
+  return com.google.gwt.core.client.GWT.isScript()
+    ? ForProdMode.getHandlerFor(listener)
+    : ForDevMode.getHandlerFor(listener);
+}
+ 
+public native final EventRemover addEventListener(String type, EventListener listener, boolean useCapture) /*-{
+  var handler = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  this.addEventListener(type, handler, useCapture);
+  return @elemental.js.dom.JsElementalMixinBase.Remover::create(Lelemental/events/EventTarget;Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;Z)
+      (this, type, handler, useCapture);
+}-*/;
+
+public native final EventRemover addEventListener(String type, EventListener listener) /*-{
+  var handler = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  this.addEventListener(type, handler);
+  return @elemental.js.dom.JsElementalMixinBase.Remover::create(Lelemental/events/EventTarget;Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;Z)
+      (this, type, handler, useCapture);
+}-*/;
+
+@Deprecated
+public final void removeEventListener(String type, EventListener listener, boolean useCapture) {
+  final JavaScriptObject handler = getHandlerFor(listener);
+  if (handler != null) {
+    removeEventListener(this, type, handler, useCapture);
+  }
+}
+
+@Deprecated
+public final void removeEventListener(String type, EventListener listener) {
+  final JavaScriptObject handler = getHandlerFor(listener);
+  if (handler != null) {
+    removeEventListener(this, type, handler);
+  }
+}
+
+private static native void removeEventListener(EventTarget target, String type,
+    JavaScriptObject handler, boolean useCapture) /*-{
+  target.removeEventListener(type, handler, useCapture);
+}-*/;
+
+private static native void removeEventListener(EventTarget target, String type,
+    JavaScriptObject handler) /*-{
+  target.removeEventListener(type, handler);
+}-*/;
+
+}
diff --git a/elemental/src/elemental/js/dom/JsEntity.java b/elemental/src/elemental/js/dom/JsEntity.java
new file mode 100644
index 0000000..760c064
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsEntity.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.Entity;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEntity extends JsNode  implements Entity {
+  protected JsEntity() {}
+
+  public final native String getNotationName() /*-{
+    return this.notationName;
+  }-*/;
+
+  public final native String getPublicId() /*-{
+    return this.publicId;
+  }-*/;
+
+  public final native String getSystemId() /*-{
+    return this.systemId;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsEntityReference.java b/elemental/src/elemental/js/dom/JsEntityReference.java
new file mode 100644
index 0000000..c58afc7
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsEntityReference.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.EntityReference;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEntityReference extends JsNode  implements EntityReference {
+  protected JsEntityReference() {}
+}
diff --git a/elemental/src/elemental/js/dom/JsGeolocation.java b/elemental/src/elemental/js/dom/JsGeolocation.java
new file mode 100644
index 0000000..1e1474d
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsGeolocation.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Geolocation;
+import elemental.dom.PositionCallback;
+import elemental.dom.PositionErrorCallback;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsGeolocation extends JsElementalMixinBase  implements Geolocation {
+  protected JsGeolocation() {}
+
+  public final native void clearWatch(int watchId) /*-{
+    this.clearWatch(watchId);
+  }-*/;
+
+  public final native void getCurrentPosition(PositionCallback successCallback) /*-{
+    this.getCurrentPosition($entry(successCallback.@elemental.dom.PositionCallback::onPositionCallback(Lelemental/dom/Geoposition;)).bind(successCallback));
+  }-*/;
+
+  public final native void getCurrentPosition(PositionCallback successCallback, PositionErrorCallback errorCallback) /*-{
+    this.getCurrentPosition($entry(successCallback.@elemental.dom.PositionCallback::onPositionCallback(Lelemental/dom/Geoposition;)).bind(successCallback), $entry(errorCallback.@elemental.dom.PositionErrorCallback::onPositionErrorCallback(Lelemental/dom/PositionError;)).bind(errorCallback));
+  }-*/;
+
+  public final native int watchPosition(PositionCallback successCallback) /*-{
+    return this.watchPosition($entry(successCallback.@elemental.dom.PositionCallback::onPositionCallback(Lelemental/dom/Geoposition;)).bind(successCallback));
+  }-*/;
+
+  public final native int watchPosition(PositionCallback successCallback, PositionErrorCallback errorCallback) /*-{
+    return this.watchPosition($entry(successCallback.@elemental.dom.PositionCallback::onPositionCallback(Lelemental/dom/Geoposition;)).bind(successCallback), $entry(errorCallback.@elemental.dom.PositionErrorCallback::onPositionErrorCallback(Lelemental/dom/PositionError;)).bind(errorCallback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsGeoposition.java b/elemental/src/elemental/js/dom/JsGeoposition.java
new file mode 100644
index 0000000..e9d5422
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsGeoposition.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Coordinates;
+import elemental.dom.Geoposition;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsGeoposition extends JsElementalMixinBase  implements Geoposition {
+  protected JsGeoposition() {}
+
+  public final native JsCoordinates getCoords() /*-{
+    return this.coords;
+  }-*/;
+
+  public final native double getTimestamp() /*-{
+    return this.timestamp;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsLocalMediaStream.java b/elemental/src/elemental/js/dom/JsLocalMediaStream.java
new file mode 100644
index 0000000..b6ca8db
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsLocalMediaStream.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.MediaStream;
+import elemental.dom.LocalMediaStream;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsLocalMediaStream extends JsMediaStream  implements LocalMediaStream {
+  protected JsLocalMediaStream() {}
+
+  public final native void stop() /*-{
+    this.stop();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsMediaStream.java b/elemental/src/elemental/js/dom/JsMediaStream.java
new file mode 100644
index 0000000..cbf0926
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsMediaStream.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.MediaStream;
+import elemental.dom.MediaStreamTrackList;
+import elemental.js.events.JsEvent;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaStream extends JsElementalMixinBase  implements MediaStream {
+  protected JsMediaStream() {}
+
+  public final native JsMediaStreamTrackList getAudioTracks() /*-{
+    return this.audioTracks;
+  }-*/;
+
+  public final native String getLabel() /*-{
+    return this.label;
+  }-*/;
+
+  public final native EventListener getOnended() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onended);
+  }-*/;
+
+  public final native void setOnended(EventListener listener) /*-{
+    this.onended = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native JsMediaStreamTrackList getVideoTracks() /*-{
+    return this.videoTracks;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsMediaStreamList.java b/elemental/src/elemental/js/dom/JsMediaStreamList.java
new file mode 100644
index 0000000..aba65fb
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsMediaStreamList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.MediaStream;
+import elemental.dom.MediaStreamList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaStreamList extends JsElementalMixinBase  implements MediaStreamList {
+  protected JsMediaStreamList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsMediaStream item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsMediaStreamTrack.java b/elemental/src/elemental/js/dom/JsMediaStreamTrack.java
new file mode 100644
index 0000000..eda6b20
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsMediaStreamTrack.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.MediaStreamTrack;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaStreamTrack extends JsElementalMixinBase  implements MediaStreamTrack {
+  protected JsMediaStreamTrack() {}
+
+  public final native boolean isEnabled() /*-{
+    return this.enabled;
+  }-*/;
+
+  public final native void setEnabled(boolean param_enabled) /*-{
+    this.enabled = param_enabled;
+  }-*/;
+
+  public final native String getKind() /*-{
+    return this.kind;
+  }-*/;
+
+  public final native String getLabel() /*-{
+    return this.label;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsMediaStreamTrackList.java b/elemental/src/elemental/js/dom/JsMediaStreamTrackList.java
new file mode 100644
index 0000000..c7a6e9f
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsMediaStreamTrackList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.MediaStreamTrack;
+import elemental.dom.MediaStreamTrackList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaStreamTrackList extends JsElementalMixinBase  implements MediaStreamTrackList {
+  protected JsMediaStreamTrackList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsMediaStreamTrack item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsMutationRecord.java b/elemental/src/elemental/js/dom/JsMutationRecord.java
new file mode 100644
index 0000000..32adb1b
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsMutationRecord.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.MutationRecord;
+import elemental.dom.NodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMutationRecord extends JsElementalMixinBase  implements MutationRecord {
+  protected JsMutationRecord() {}
+
+  public final native JsNodeList getAddedNodes() /*-{
+    return this.addedNodes;
+  }-*/;
+
+  public final native String getAttributeName() /*-{
+    return this.attributeName;
+  }-*/;
+
+  public final native String getAttributeNamespace() /*-{
+    return this.attributeNamespace;
+  }-*/;
+
+  public final native JsNode getNextSibling() /*-{
+    return this.nextSibling;
+  }-*/;
+
+  public final native String getOldValue() /*-{
+    return this.oldValue;
+  }-*/;
+
+  public final native JsNode getPreviousSibling() /*-{
+    return this.previousSibling;
+  }-*/;
+
+  public final native JsNodeList getRemovedNodes() /*-{
+    return this.removedNodes;
+  }-*/;
+
+  public final native JsNode getTarget() /*-{
+    return this.target;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsNamedNodeMap.java b/elemental/src/elemental/js/dom/JsNamedNodeMap.java
new file mode 100644
index 0000000..e4a5062
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsNamedNodeMap.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.NamedNodeMap;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNamedNodeMap extends JsIndexable  implements NamedNodeMap, Indexable {
+  protected JsNamedNodeMap() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsNode getNamedItem(String name) /*-{
+    return this.getNamedItem(name);
+  }-*/;
+
+  public final native JsNode getNamedItemNS(String namespaceURI, String localName) /*-{
+    return this.getNamedItemNS(namespaceURI, localName);
+  }-*/;
+
+  public final native JsNode item(int index) /*-{
+    return this.item(index);
+  }-*/;
+
+  public final native JsNode removeNamedItem(String name) /*-{
+    return this.removeNamedItem(name);
+  }-*/;
+
+  public final native JsNode removeNamedItemNS(String namespaceURI, String localName) /*-{
+    return this.removeNamedItemNS(namespaceURI, localName);
+  }-*/;
+
+  public final native JsNode setNamedItem(Node node) /*-{
+    return this.setNamedItem(node);
+  }-*/;
+
+  public final native JsNode setNamedItemNS(Node node) /*-{
+    return this.setNamedItemNS(node);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsNode.java b/elemental/src/elemental/js/dom/JsNode.java
new file mode 100644
index 0000000..14cb352
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsNode.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.Element;
+import elemental.dom.NamedNodeMap;
+import elemental.js.events.JsEvent;
+import elemental.events.EventListener;
+import elemental.events.Event;
+import elemental.dom.NodeList;
+import elemental.js.events.JsEventListener;
+import elemental.dom.Document;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNode extends JsElementalMixinBase  implements Node {
+  protected JsNode() {}
+
+  public final native JsNamedNodeMap getAttributes() /*-{
+    return this.attributes;
+  }-*/;
+
+  public final native String getBaseURI() /*-{
+    return this.baseURI;
+  }-*/;
+
+  public final native JsNodeList getChildNodes() /*-{
+    return this.childNodes;
+  }-*/;
+
+  public final native JsNode getFirstChild() /*-{
+    return this.firstChild;
+  }-*/;
+
+  public final native JsNode getLastChild() /*-{
+    return this.lastChild;
+  }-*/;
+
+  public final native String getLocalName() /*-{
+    return this.localName;
+  }-*/;
+
+  public final native String getNamespaceURI() /*-{
+    return this.namespaceURI;
+  }-*/;
+
+  public final native JsNode getNextSibling() /*-{
+    return this.nextSibling;
+  }-*/;
+
+  public final native String getNodeName() /*-{
+    return this.nodeName;
+  }-*/;
+
+  public final native int getNodeType() /*-{
+    return this.nodeType;
+  }-*/;
+
+  public final native String getNodeValue() /*-{
+    return this.nodeValue;
+  }-*/;
+
+  public final native void setNodeValue(String param_nodeValue) /*-{
+    this.nodeValue = param_nodeValue;
+  }-*/;
+
+  public final native JsDocument getOwnerDocument() /*-{
+    return this.ownerDocument;
+  }-*/;
+
+  public final native JsElement getParentElement() /*-{
+    return this.parentElement;
+  }-*/;
+
+  public final native JsNode getParentNode() /*-{
+    return this.parentNode;
+  }-*/;
+
+  public final native String getPrefix() /*-{
+    return this.prefix;
+  }-*/;
+
+  public final native void setPrefix(String param_prefix) /*-{
+    this.prefix = param_prefix;
+  }-*/;
+
+  public final native JsNode getPreviousSibling() /*-{
+    return this.previousSibling;
+  }-*/;
+
+  public final native String getTextContent() /*-{
+    return this.textContent;
+  }-*/;
+
+  public final native void setTextContent(String param_textContent) /*-{
+    this.textContent = param_textContent;
+  }-*/;
+
+  public final native JsNode appendChild(Node newChild) /*-{
+    return this.appendChild(newChild);
+  }-*/;
+
+  public final native JsNode cloneNode(boolean deep) /*-{
+    return this.cloneNode(deep);
+  }-*/;
+
+  public final native int compareDocumentPosition(Node other) /*-{
+    return this.compareDocumentPosition(other);
+  }-*/;
+
+  public final native boolean contains(Node other) /*-{
+    return this.contains(other);
+  }-*/;
+
+  public final native boolean hasAttributes() /*-{
+    return this.hasAttributes();
+  }-*/;
+
+  public final native boolean hasChildNodes() /*-{
+    return this.hasChildNodes();
+  }-*/;
+
+  public final native JsNode insertBefore(Node newChild, Node refChild) /*-{
+    return this.insertBefore(newChild, refChild);
+  }-*/;
+
+  public final native boolean isDefaultNamespace(String namespaceURI) /*-{
+    return this.isDefaultNamespace(namespaceURI);
+  }-*/;
+
+  public final native boolean isEqualNode(Node other) /*-{
+    return this.isEqualNode(other);
+  }-*/;
+
+  public final native boolean isSameNode(Node other) /*-{
+    return this.isSameNode(other);
+  }-*/;
+
+  public final native boolean isSupported(String feature, String version) /*-{
+    return this.isSupported(feature, version);
+  }-*/;
+
+  public final native String lookupNamespaceURI(String prefix) /*-{
+    return this.lookupNamespaceURI(prefix);
+  }-*/;
+
+  public final native String lookupPrefix(String namespaceURI) /*-{
+    return this.lookupPrefix(namespaceURI);
+  }-*/;
+
+  public final native void normalize() /*-{
+    this.normalize();
+  }-*/;
+
+  public final native JsNode removeChild(Node oldChild) /*-{
+    return this.removeChild(oldChild);
+  }-*/;
+
+  public final native JsNode replaceChild(Node newChild, Node oldChild) /*-{
+    return this.replaceChild(newChild, oldChild);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsNodeList.java b/elemental/src/elemental/js/dom/JsNodeList.java
new file mode 100644
index 0000000..4a0bfb7
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsNodeList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.NodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNodeList extends JsIndexable  implements NodeList, Indexable {
+  protected JsNodeList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsNode item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsNotation.java b/elemental/src/elemental/js/dom/JsNotation.java
new file mode 100644
index 0000000..0ad86dc
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsNotation.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.Notation;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNotation extends JsNode  implements Notation {
+  protected JsNotation() {}
+
+  public final native String getPublicId() /*-{
+    return this.publicId;
+  }-*/;
+
+  public final native String getSystemId() /*-{
+    return this.systemId;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsPointerLock.java b/elemental/src/elemental/js/dom/JsPointerLock.java
new file mode 100644
index 0000000..cbb29ce
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsPointerLock.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Element;
+import elemental.dom.PointerLock;
+import elemental.html.VoidCallback;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPointerLock extends JsElementalMixinBase  implements PointerLock {
+  protected JsPointerLock() {}
+
+  public final native boolean isLocked() /*-{
+    return this.isLocked;
+  }-*/;
+
+  public final native void lock(Element target) /*-{
+    this.lock(target);
+  }-*/;
+
+  public final native void lock(Element target, VoidCallback successCallback) /*-{
+    this.lock(target, $entry(successCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(successCallback));
+  }-*/;
+
+  public final native void lock(Element target, VoidCallback successCallback, VoidCallback failureCallback) /*-{
+    this.lock(target, $entry(successCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(successCallback), $entry(failureCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(failureCallback));
+  }-*/;
+
+  public final native void unlock() /*-{
+    this.unlock();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsPositionError.java b/elemental/src/elemental/js/dom/JsPositionError.java
new file mode 100644
index 0000000..e05c941
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsPositionError.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.PositionError;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPositionError extends JsElementalMixinBase  implements PositionError {
+  protected JsPositionError() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsProcessingInstruction.java b/elemental/src/elemental/js/dom/JsProcessingInstruction.java
new file mode 100644
index 0000000..2cffb85
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsProcessingInstruction.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.js.stylesheets.JsStyleSheet;
+import elemental.dom.Node;
+import elemental.dom.ProcessingInstruction;
+import elemental.stylesheets.StyleSheet;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsProcessingInstruction extends JsNode  implements ProcessingInstruction {
+  protected JsProcessingInstruction() {}
+
+  public final native String getData() /*-{
+    return this.data;
+  }-*/;
+
+  public final native void setData(String param_data) /*-{
+    this.data = param_data;
+  }-*/;
+
+  public final native JsStyleSheet getSheet() /*-{
+    return this.sheet;
+  }-*/;
+
+  public final native String getTarget() /*-{
+    return this.target;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsScriptProfile.java b/elemental/src/elemental/js/dom/JsScriptProfile.java
new file mode 100644
index 0000000..900c509
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsScriptProfile.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.ScriptProfile;
+import elemental.dom.ScriptProfileNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsScriptProfile extends JsElementalMixinBase  implements ScriptProfile {
+  protected JsScriptProfile() {}
+
+  public final native JsScriptProfileNode getHead() /*-{
+    return this.head;
+  }-*/;
+
+  public final native String getTitle() /*-{
+    return this.title;
+  }-*/;
+
+  public final native int getUid() /*-{
+    return this.uid;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsScriptProfileNode.java b/elemental/src/elemental/js/dom/JsScriptProfileNode.java
new file mode 100644
index 0000000..e9a5063
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsScriptProfileNode.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.ScriptProfileNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsScriptProfileNode extends JsElementalMixinBase  implements ScriptProfileNode {
+  protected JsScriptProfileNode() {}
+
+  public final native int getCallUID() /*-{
+    return this.callUID;
+  }-*/;
+
+  public final native JsIndexable getChildren() /*-{
+    return this.children;
+  }-*/;
+
+  public final native String getFunctionName() /*-{
+    return this.functionName;
+  }-*/;
+
+  public final native int getLineNumber() /*-{
+    return this.lineNumber;
+  }-*/;
+
+  public final native int getNumberOfCalls() /*-{
+    return this.numberOfCalls;
+  }-*/;
+
+  public final native double getSelfTime() /*-{
+    return this.selfTime;
+  }-*/;
+
+  public final native double getTotalTime() /*-{
+    return this.totalTime;
+  }-*/;
+
+  public final native String getUrl() /*-{
+    return this.url;
+  }-*/;
+
+  public final native boolean isVisible() /*-{
+    return this.visible;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsShadowRoot.java b/elemental/src/elemental/js/dom/JsShadowRoot.java
new file mode 100644
index 0000000..13c6969
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsShadowRoot.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Element;
+import elemental.dom.ShadowRoot;
+import elemental.js.html.JsSelection;
+import elemental.dom.DocumentFragment;
+import elemental.html.Selection;
+import elemental.dom.NodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsShadowRoot extends JsDocumentFragment  implements ShadowRoot {
+  protected JsShadowRoot() {}
+
+  public final native JsElement getActiveElement() /*-{
+    return this.activeElement;
+  }-*/;
+
+  public final native boolean isApplyAuthorStyles() /*-{
+    return this.applyAuthorStyles;
+  }-*/;
+
+  public final native void setApplyAuthorStyles(boolean param_applyAuthorStyles) /*-{
+    this.applyAuthorStyles = param_applyAuthorStyles;
+  }-*/;
+
+  public final native JsElement getHost() /*-{
+    return this.host;
+  }-*/;
+
+  public final native String getInnerHTML() /*-{
+    return this.innerHTML;
+  }-*/;
+
+  public final native void setInnerHTML(String param_innerHTML) /*-{
+    this.innerHTML = param_innerHTML;
+  }-*/;
+
+  public final native JsElement getElementById(String elementId) /*-{
+    return this.getElementById(elementId);
+  }-*/;
+
+  public final native JsNodeList getElementsByClassName(String className) /*-{
+    return this.getElementsByClassName(className);
+  }-*/;
+
+  public final native JsNodeList getElementsByTagName(String tagName) /*-{
+    return this.getElementsByTagName(tagName);
+  }-*/;
+
+  public final native JsNodeList getElementsByTagNameNS(String namespaceURI, String localName) /*-{
+    return this.getElementsByTagNameNS(namespaceURI, localName);
+  }-*/;
+
+  public final native JsSelection getSelection() /*-{
+    return this.getSelection();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechGrammar.java b/elemental/src/elemental/js/dom/JsSpeechGrammar.java
new file mode 100644
index 0000000..ee651ff
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechGrammar.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechGrammar;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechGrammar extends JsElementalMixinBase  implements SpeechGrammar {
+  protected JsSpeechGrammar() {}
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native float getWeight() /*-{
+    return this.weight;
+  }-*/;
+
+  public final native void setWeight(float param_weight) /*-{
+    this.weight = param_weight;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechGrammarList.java b/elemental/src/elemental/js/dom/JsSpeechGrammarList.java
new file mode 100644
index 0000000..296f11d
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechGrammarList.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechGrammarList;
+import elemental.dom.SpeechGrammar;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechGrammarList extends JsElementalMixinBase  implements SpeechGrammarList {
+  protected JsSpeechGrammarList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void addFromString(String string) /*-{
+    this.addFromString(string);
+  }-*/;
+
+  public final native void addFromString(String string, float weight) /*-{
+    this.addFromString(string, weight);
+  }-*/;
+
+  public final native void addFromUri(String src) /*-{
+    this.addFromUri(src);
+  }-*/;
+
+  public final native void addFromUri(String src, float weight) /*-{
+    this.addFromUri(src, weight);
+  }-*/;
+
+  public final native JsSpeechGrammar item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechInputEvent.java b/elemental/src/elemental/js/dom/JsSpeechInputEvent.java
new file mode 100644
index 0000000..4a2e8ab
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechInputEvent.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechInputResultList;
+import elemental.js.events.JsEvent;
+import elemental.dom.SpeechInputEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechInputEvent extends JsEvent  implements SpeechInputEvent {
+  protected JsSpeechInputEvent() {}
+
+  public final native JsSpeechInputResultList getResults() /*-{
+    return this.results;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechInputResult.java b/elemental/src/elemental/js/dom/JsSpeechInputResult.java
new file mode 100644
index 0000000..59223f0
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechInputResult.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechInputResult;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechInputResult extends JsElementalMixinBase  implements SpeechInputResult {
+  protected JsSpeechInputResult() {}
+
+  public final native float getConfidence() /*-{
+    return this.confidence;
+  }-*/;
+
+  public final native String getUtterance() /*-{
+    return this.utterance;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechInputResultList.java b/elemental/src/elemental/js/dom/JsSpeechInputResultList.java
new file mode 100644
index 0000000..c22d0ba
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechInputResultList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechInputResultList;
+import elemental.dom.SpeechInputResult;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechInputResultList extends JsElementalMixinBase  implements SpeechInputResultList {
+  protected JsSpeechInputResultList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsSpeechInputResult item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechRecognition.java b/elemental/src/elemental/js/dom/JsSpeechRecognition.java
new file mode 100644
index 0000000..b69b8c2
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechRecognition.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechGrammarList;
+import elemental.js.events.JsEvent;
+import elemental.events.EventListener;
+import elemental.dom.SpeechRecognition;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechRecognition extends JsElementalMixinBase  implements SpeechRecognition {
+  protected JsSpeechRecognition() {}
+
+  public final native boolean isContinuous() /*-{
+    return this.continuous;
+  }-*/;
+
+  public final native void setContinuous(boolean param_continuous) /*-{
+    this.continuous = param_continuous;
+  }-*/;
+
+  public final native JsSpeechGrammarList getGrammars() /*-{
+    return this.grammars;
+  }-*/;
+
+  public final native void setGrammars(SpeechGrammarList param_grammars) /*-{
+    this.grammars = param_grammars;
+  }-*/;
+
+  public final native String getLang() /*-{
+    return this.lang;
+  }-*/;
+
+  public final native void setLang(String param_lang) /*-{
+    this.lang = param_lang;
+  }-*/;
+
+  public final native EventListener getOnaudioend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onaudioend);
+  }-*/;
+
+  public final native void setOnaudioend(EventListener listener) /*-{
+    this.onaudioend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnaudiostart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onaudiostart);
+  }-*/;
+
+  public final native void setOnaudiostart(EventListener listener) /*-{
+    this.onaudiostart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onend);
+  }-*/;
+
+  public final native void setOnend(EventListener listener) /*-{
+    this.onend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnnomatch() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onnomatch);
+  }-*/;
+
+  public final native void setOnnomatch(EventListener listener) /*-{
+    this.onnomatch = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnresult() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onresult);
+  }-*/;
+
+  public final native void setOnresult(EventListener listener) /*-{
+    this.onresult = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnresultdeleted() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onresultdeleted);
+  }-*/;
+
+  public final native void setOnresultdeleted(EventListener listener) /*-{
+    this.onresultdeleted = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsoundend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsoundend);
+  }-*/;
+
+  public final native void setOnsoundend(EventListener listener) /*-{
+    this.onsoundend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsoundstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsoundstart);
+  }-*/;
+
+  public final native void setOnsoundstart(EventListener listener) /*-{
+    this.onsoundstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnspeechend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onspeechend);
+  }-*/;
+
+  public final native void setOnspeechend(EventListener listener) /*-{
+    this.onspeechend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnspeechstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onspeechstart);
+  }-*/;
+
+  public final native void setOnspeechstart(EventListener listener) /*-{
+    this.onspeechstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onstart);
+  }-*/;
+
+  public final native void setOnstart(EventListener listener) /*-{
+    this.onstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native void abort() /*-{
+    this.abort();
+  }-*/;
+
+  public final native void start() /*-{
+    this.start();
+  }-*/;
+
+  public final native void stop() /*-{
+    this.stop();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechRecognitionAlternative.java b/elemental/src/elemental/js/dom/JsSpeechRecognitionAlternative.java
new file mode 100644
index 0000000..302ab71
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechRecognitionAlternative.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechRecognitionAlternative;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechRecognitionAlternative extends JsElementalMixinBase  implements SpeechRecognitionAlternative {
+  protected JsSpeechRecognitionAlternative() {}
+
+  public final native float getConfidence() /*-{
+    return this.confidence;
+  }-*/;
+
+  public final native String getTranscript() /*-{
+    return this.transcript;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechRecognitionError.java b/elemental/src/elemental/js/dom/JsSpeechRecognitionError.java
new file mode 100644
index 0000000..3753d48
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechRecognitionError.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechRecognitionError;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechRecognitionError extends JsElementalMixinBase  implements SpeechRecognitionError {
+  protected JsSpeechRecognitionError() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechRecognitionResult.java b/elemental/src/elemental/js/dom/JsSpeechRecognitionResult.java
new file mode 100644
index 0000000..073517b
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechRecognitionResult.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechRecognitionAlternative;
+import elemental.dom.SpeechRecognitionResult;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechRecognitionResult extends JsElementalMixinBase  implements SpeechRecognitionResult {
+  protected JsSpeechRecognitionResult() {}
+
+  public final native boolean isFinalValue() /*-{
+    return this['final'];
+  }-*/;
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsSpeechRecognitionAlternative item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsSpeechRecognitionResultList.java b/elemental/src/elemental/js/dom/JsSpeechRecognitionResultList.java
new file mode 100644
index 0000000..be9f8fe
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsSpeechRecognitionResultList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.SpeechRecognitionResultList;
+import elemental.dom.SpeechRecognitionResult;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechRecognitionResultList extends JsElementalMixinBase  implements SpeechRecognitionResultList {
+  protected JsSpeechRecognitionResultList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsSpeechRecognitionResult item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsText.java b/elemental/src/elemental/js/dom/JsText.java
new file mode 100644
index 0000000..5081fde
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsText.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Text;
+import elemental.dom.CharacterData;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsText extends JsCharacterData  implements Text {
+  protected JsText() {}
+
+  public final native String getWholeText() /*-{
+    return this.wholeText;
+  }-*/;
+
+  public final native JsText replaceWholeText(String content) /*-{
+    return this.replaceWholeText(content);
+  }-*/;
+
+  public final native JsText splitText(int offset) /*-{
+    return this.splitText(offset);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsWebKitMutationObserver.java b/elemental/src/elemental/js/dom/JsWebKitMutationObserver.java
new file mode 100644
index 0000000..d0a39bf
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsWebKitMutationObserver.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.WebKitMutationObserver;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebKitMutationObserver extends JsElementalMixinBase  implements WebKitMutationObserver {
+  protected JsWebKitMutationObserver() {}
+
+  public final native void disconnect() /*-{
+    this.disconnect();
+  }-*/;
+
+  public final native JsIndexable takeRecords() /*-{
+    return this.takeRecords();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/dom/JsWebKitNamedFlow.java b/elemental/src/elemental/js/dom/JsWebKitNamedFlow.java
new file mode 100644
index 0000000..8e37f91
--- /dev/null
+++ b/elemental/src/elemental/js/dom/JsWebKitNamedFlow.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.dom;
+import elemental.dom.Node;
+import elemental.dom.WebKitNamedFlow;
+import elemental.dom.NodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebKitNamedFlow extends JsElementalMixinBase  implements WebKitNamedFlow {
+  protected JsWebKitNamedFlow() {}
+
+  public final native JsNodeList getContentNodes() /*-{
+    return this.contentNodes;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native boolean isOverset() /*-{
+    return this.overset;
+  }-*/;
+
+  public final native JsNodeList getRegionsByContentNode(Node contentNode) /*-{
+    return this.getRegionsByContentNode(contentNode);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsAnimationEvent.java b/elemental/src/elemental/js/events/JsAnimationEvent.java
new file mode 100644
index 0000000..96aa483
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsAnimationEvent.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.AnimationEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAnimationEvent extends JsEvent  implements AnimationEvent {
+  protected JsAnimationEvent() {}
+
+  public final native String getAnimationName() /*-{
+    return this.animationName;
+  }-*/;
+
+  public final native double getElapsedTime() /*-{
+    return this.elapsedTime;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsBeforeLoadEvent.java b/elemental/src/elemental/js/events/JsBeforeLoadEvent.java
new file mode 100644
index 0000000..57ead1b
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsBeforeLoadEvent.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.BeforeLoadEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBeforeLoadEvent extends JsEvent  implements BeforeLoadEvent {
+  protected JsBeforeLoadEvent() {}
+
+  public final native String getUrl() /*-{
+    return this.url;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsCloseEvent.java b/elemental/src/elemental/js/events/JsCloseEvent.java
new file mode 100644
index 0000000..988d0f3
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsCloseEvent.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.CloseEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCloseEvent extends JsEvent  implements CloseEvent {
+  protected JsCloseEvent() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getReason() /*-{
+    return this.reason;
+  }-*/;
+
+  public final native boolean isWasClean() /*-{
+    return this.wasClean;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsCompositionEvent.java b/elemental/src/elemental/js/events/JsCompositionEvent.java
new file mode 100644
index 0000000..36549fb
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsCompositionEvent.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.html.Window;
+import elemental.events.CompositionEvent;
+import elemental.js.html.JsWindow;
+import elemental.events.UIEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCompositionEvent extends JsUIEvent  implements CompositionEvent {
+  protected JsCompositionEvent() {}
+
+  public final native String getData() /*-{
+    return this.data;
+  }-*/;
+
+  public final native void initCompositionEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Window viewArg, String dataArg) /*-{
+    this.initCompositionEvent(typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsCustomEvent.java b/elemental/src/elemental/js/events/JsCustomEvent.java
new file mode 100644
index 0000000..1d744e5
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsCustomEvent.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.CustomEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCustomEvent extends JsEvent  implements CustomEvent {
+  protected JsCustomEvent() {}
+
+  public final native Object getDetail() /*-{
+    return this.detail;
+  }-*/;
+
+  public final native void initCustomEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Object detailArg) /*-{
+    this.initCustomEvent(typeArg, canBubbleArg, cancelableArg, detailArg);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsErrorEvent.java b/elemental/src/elemental/js/events/JsErrorEvent.java
new file mode 100644
index 0000000..99183bb
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsErrorEvent.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.ErrorEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsErrorEvent extends JsEvent  implements ErrorEvent {
+  protected JsErrorEvent() {}
+
+  public final native String getFilename() /*-{
+    return this.filename;
+  }-*/;
+
+  public final native int getLineno() /*-{
+    return this.lineno;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsEvent.java b/elemental/src/elemental/js/events/JsEvent.java
new file mode 100644
index 0000000..087ab52
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsEvent.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.js.dom.JsClipboard;
+import elemental.dom.Clipboard;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEvent extends JsElementalMixinBase  implements Event {
+  protected JsEvent() {}
+
+  public final native boolean isBubbles() /*-{
+    return this.bubbles;
+  }-*/;
+
+  public final native boolean isCancelBubble() /*-{
+    return this.cancelBubble;
+  }-*/;
+
+  public final native void setCancelBubble(boolean param_cancelBubble) /*-{
+    this.cancelBubble = param_cancelBubble;
+  }-*/;
+
+  public final native boolean isCancelable() /*-{
+    return this.cancelable;
+  }-*/;
+
+  public final native JsClipboard getClipboardData() /*-{
+    return this.clipboardData;
+  }-*/;
+
+  public final native EventTarget getCurrentTarget() /*-{
+    return this.currentTarget;
+  }-*/;
+
+  public final native boolean isDefaultPrevented() /*-{
+    return this.defaultPrevented;
+  }-*/;
+
+  public final native int getEventPhase() /*-{
+    return this.eventPhase;
+  }-*/;
+
+  public final native boolean isReturnValue() /*-{
+    return this.returnValue;
+  }-*/;
+
+  public final native void setReturnValue(boolean param_returnValue) /*-{
+    this.returnValue = param_returnValue;
+  }-*/;
+
+  public final native EventTarget getSrcElement() /*-{
+    return this.srcElement;
+  }-*/;
+
+  public final native EventTarget getTarget() /*-{
+    return this.target;
+  }-*/;
+
+  public final native double getTimeStamp() /*-{
+    return this.timeStamp;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void initEvent(String eventTypeArg, boolean canBubbleArg, boolean cancelableArg) /*-{
+    this.initEvent(eventTypeArg, canBubbleArg, cancelableArg);
+  }-*/;
+
+  public final native void preventDefault() /*-{
+    this.preventDefault();
+  }-*/;
+
+  public final native void stopImmediatePropagation() /*-{
+    this.stopImmediatePropagation();
+  }-*/;
+
+  public final native void stopPropagation() /*-{
+    this.stopPropagation();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsEventException.java b/elemental/src/elemental/js/events/JsEventException.java
new file mode 100644
index 0000000..b58dda8
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsEventException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.EventException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEventException extends JsElementalMixinBase  implements EventException {
+  protected JsEventException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsEventListener.java b/elemental/src/elemental/js/events/JsEventListener.java
new file mode 100644
index 0000000..b7a5884
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsEventListener.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.EventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEventListener extends JsElementalMixinBase  implements EventListener {
+  protected JsEventListener() {}
+
+  public final native void handleEvent(Event evt) /*-{
+    this.handleEvent(evt);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsHashChangeEvent.java b/elemental/src/elemental/js/events/JsHashChangeEvent.java
new file mode 100644
index 0000000..b6d3ca8
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsHashChangeEvent.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.HashChangeEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsHashChangeEvent extends JsEvent  implements HashChangeEvent {
+  protected JsHashChangeEvent() {}
+
+  public final native String getNewURL() /*-{
+    return this.newURL;
+  }-*/;
+
+  public final native String getOldURL() /*-{
+    return this.oldURL;
+  }-*/;
+
+  public final native void initHashChangeEvent(String type, boolean canBubble, boolean cancelable, String oldURL, String newURL) /*-{
+    this.initHashChangeEvent(type, canBubble, cancelable, oldURL, newURL);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsKeyboardEvent.java b/elemental/src/elemental/js/events/JsKeyboardEvent.java
new file mode 100644
index 0000000..e5e0a48
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsKeyboardEvent.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.html.Window;
+import elemental.js.html.JsWindow;
+import elemental.events.KeyboardEvent;
+import elemental.events.UIEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsKeyboardEvent extends JsUIEvent  implements KeyboardEvent {
+  protected JsKeyboardEvent() {}
+
+  public final native boolean isAltGraphKey() /*-{
+    return this.altGraphKey;
+  }-*/;
+
+  public final native boolean isAltKey() /*-{
+    return this.altKey;
+  }-*/;
+
+  public final native boolean isCtrlKey() /*-{
+    return this.ctrlKey;
+  }-*/;
+
+  public final native String getKeyIdentifier() /*-{
+    return this.keyIdentifier;
+  }-*/;
+
+  public final native int getKeyLocation() /*-{
+    return this.keyLocation;
+  }-*/;
+
+  public final native boolean isMetaKey() /*-{
+    return this.metaKey;
+  }-*/;
+
+  public final native boolean isShiftKey() /*-{
+    return this.shiftKey;
+  }-*/;
+
+  public final native void initKeyboardEvent(String type, boolean canBubble, boolean cancelable, Window view, String keyIdentifier, int keyLocation, boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey, boolean altGraphKey) /*-{
+    this.initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsMediaStreamEvent.java b/elemental/src/elemental/js/events/JsMediaStreamEvent.java
new file mode 100644
index 0000000..cd2c2bd
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsMediaStreamEvent.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.js.dom.JsMediaStream;
+import elemental.dom.MediaStream;
+import elemental.events.MediaStreamEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaStreamEvent extends JsEvent  implements MediaStreamEvent {
+  protected JsMediaStreamEvent() {}
+
+  public final native JsMediaStream getStream() /*-{
+    return this.stream;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsMessageChannel.java b/elemental/src/elemental/js/events/JsMessageChannel.java
new file mode 100644
index 0000000..9862339
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsMessageChannel.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.MessagePort;
+import elemental.events.MessageChannel;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMessageChannel extends JsElementalMixinBase  implements MessageChannel {
+  protected JsMessageChannel() {}
+
+  public final native JsMessagePort getPort1() /*-{
+    return this.port1;
+  }-*/;
+
+  public final native JsMessagePort getPort2() /*-{
+    return this.port2;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsMessageEvent.java b/elemental/src/elemental/js/events/JsMessageEvent.java
new file mode 100644
index 0000000..fe38a65
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsMessageEvent.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.util.Indexable;
+import elemental.js.html.JsWindow;
+import elemental.events.MessageEvent;
+import elemental.js.util.JsIndexable;
+import elemental.html.Window;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMessageEvent extends JsEvent  implements MessageEvent {
+  protected JsMessageEvent() {}
+
+  public final native Object getData() /*-{
+    return this.data;
+  }-*/;
+
+  public final native String getLastEventId() /*-{
+    return this.lastEventId;
+  }-*/;
+
+  public final native String getOrigin() /*-{
+    return this.origin;
+  }-*/;
+
+  public final native JsIndexable getPorts() /*-{
+    return this.ports;
+  }-*/;
+
+  public final native JsWindow getSource() /*-{
+    return this.source;
+  }-*/;
+
+  public final native void initMessageEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, Indexable messagePorts) /*-{
+    this.initMessageEvent(typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts);
+  }-*/;
+
+  public final native void webkitInitMessageEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, Indexable transferables) /*-{
+    this.webkitInitMessageEvent(typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, transferables);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsMessagePort.java b/elemental/src/elemental/js/events/JsMessagePort.java
new file mode 100644
index 0000000..6e62f89
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsMessagePort.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.MessagePort;
+import elemental.util.Indexable;
+import elemental.events.EventListener;
+import elemental.js.util.JsIndexable;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMessagePort extends JsElementalMixinBase  implements MessagePort {
+  protected JsMessagePort() {}
+
+  public final native EventListener getOnmessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmessage);
+  }-*/;
+
+  public final native void setOnmessage(EventListener listener) /*-{
+    this.onmessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+
+  public final native void postMessage(String message) /*-{
+    this.postMessage(message);
+  }-*/;
+
+  public final native void postMessage(String message, Indexable messagePorts) /*-{
+    this.postMessage(message, messagePorts);
+  }-*/;
+
+  public final native void start() /*-{
+    this.start();
+  }-*/;
+
+  public final native void webkitPostMessage(String message) /*-{
+    this.webkitPostMessage(message);
+  }-*/;
+
+  public final native void webkitPostMessage(String message, Indexable transfer) /*-{
+    this.webkitPostMessage(message, transfer);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsMouseEvent.java b/elemental/src/elemental/js/events/JsMouseEvent.java
new file mode 100644
index 0000000..3aacd7b
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsMouseEvent.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.dom.Node;
+import elemental.js.html.JsWindow;
+import elemental.events.EventTarget;
+import elemental.events.MouseEvent;
+import elemental.js.dom.JsNode;
+import elemental.js.dom.JsClipboard;
+import elemental.dom.Clipboard;
+import elemental.html.Window;
+import elemental.events.UIEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMouseEvent extends JsUIEvent  implements MouseEvent {
+  protected JsMouseEvent() {}
+
+  public final native boolean isAltKey() /*-{
+    return this.altKey;
+  }-*/;
+
+  public final native int getButton() /*-{
+    return this.button;
+  }-*/;
+
+  public final native int getClientX() /*-{
+    return this.clientX;
+  }-*/;
+
+  public final native int getClientY() /*-{
+    return this.clientY;
+  }-*/;
+
+  public final native boolean isCtrlKey() /*-{
+    return this.ctrlKey;
+  }-*/;
+
+  public final native JsClipboard getDataTransfer() /*-{
+    return this.dataTransfer;
+  }-*/;
+
+  public final native JsNode getFromElement() /*-{
+    return this.fromElement;
+  }-*/;
+
+  public final native boolean isMetaKey() /*-{
+    return this.metaKey;
+  }-*/;
+
+  public final native int getOffsetX() /*-{
+    return this.offsetX;
+  }-*/;
+
+  public final native int getOffsetY() /*-{
+    return this.offsetY;
+  }-*/;
+
+  public final native EventTarget getRelatedTarget() /*-{
+    return this.relatedTarget;
+  }-*/;
+
+  public final native int getScreenX() /*-{
+    return this.screenX;
+  }-*/;
+
+  public final native int getScreenY() /*-{
+    return this.screenY;
+  }-*/;
+
+  public final native boolean isShiftKey() /*-{
+    return this.shiftKey;
+  }-*/;
+
+  public final native JsNode getToElement() /*-{
+    return this.toElement;
+  }-*/;
+
+  public final native int getWebkitMovementX() /*-{
+    return this.webkitMovementX;
+  }-*/;
+
+  public final native int getWebkitMovementY() /*-{
+    return this.webkitMovementY;
+  }-*/;
+
+  public final native int getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native int getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void initMouseEvent(String type, boolean canBubble, boolean cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey, int button, EventTarget relatedTarget) /*-{
+    this.initMouseEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsMutationEvent.java b/elemental/src/elemental/js/events/JsMutationEvent.java
new file mode 100644
index 0000000..0902609
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsMutationEvent.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.dom.Node;
+import elemental.events.MutationEvent;
+import elemental.events.Event;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMutationEvent extends JsEvent  implements MutationEvent {
+  protected JsMutationEvent() {}
+
+  public final native int getAttrChange() /*-{
+    return this.attrChange;
+  }-*/;
+
+  public final native String getAttrName() /*-{
+    return this.attrName;
+  }-*/;
+
+  public final native String getNewValue() /*-{
+    return this.newValue;
+  }-*/;
+
+  public final native String getPrevValue() /*-{
+    return this.prevValue;
+  }-*/;
+
+  public final native JsNode getRelatedNode() /*-{
+    return this.relatedNode;
+  }-*/;
+
+  public final native void initMutationEvent(String type, boolean canBubble, boolean cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange) /*-{
+    this.initMutationEvent(type, canBubble, cancelable, relatedNode, prevValue, newValue, attrName, attrChange);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsOverflowEvent.java b/elemental/src/elemental/js/events/JsOverflowEvent.java
new file mode 100644
index 0000000..e76faaf
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsOverflowEvent.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.OverflowEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOverflowEvent extends JsEvent  implements OverflowEvent {
+  protected JsOverflowEvent() {}
+
+  public final native boolean isHorizontalOverflow() /*-{
+    return this.horizontalOverflow;
+  }-*/;
+
+  public final native int getOrient() /*-{
+    return this.orient;
+  }-*/;
+
+  public final native boolean isVerticalOverflow() /*-{
+    return this.verticalOverflow;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsPageTransitionEvent.java b/elemental/src/elemental/js/events/JsPageTransitionEvent.java
new file mode 100644
index 0000000..438f4c2
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsPageTransitionEvent.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.PageTransitionEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPageTransitionEvent extends JsEvent  implements PageTransitionEvent {
+  protected JsPageTransitionEvent() {}
+
+  public final native boolean isPersisted() /*-{
+    return this.persisted;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsPopStateEvent.java b/elemental/src/elemental/js/events/JsPopStateEvent.java
new file mode 100644
index 0000000..1847ca4
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsPopStateEvent.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.Event;
+import elemental.events.PopStateEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPopStateEvent extends JsEvent  implements PopStateEvent {
+  protected JsPopStateEvent() {}
+
+  public final native Object getState() /*-{
+    return this.state;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsProgressEvent.java b/elemental/src/elemental/js/events/JsProgressEvent.java
new file mode 100644
index 0000000..d62348b
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsProgressEvent.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.ProgressEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsProgressEvent extends JsEvent  implements ProgressEvent {
+  protected JsProgressEvent() {}
+
+  public final native boolean isLengthComputable() /*-{
+    return this.lengthComputable;
+  }-*/;
+
+  public final native double getLoaded() /*-{
+    return this.loaded;
+  }-*/;
+
+  public final native double getTotal() /*-{
+    return this.total;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsSpeechRecognitionEvent.java b/elemental/src/elemental/js/events/JsSpeechRecognitionEvent.java
new file mode 100644
index 0000000..91244ba
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsSpeechRecognitionEvent.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.SpeechRecognitionEvent;
+import elemental.js.dom.JsSpeechRecognitionResult;
+import elemental.dom.SpeechRecognitionError;
+import elemental.js.dom.JsSpeechRecognitionResultList;
+import elemental.dom.SpeechRecognitionResultList;
+import elemental.dom.SpeechRecognitionResult;
+import elemental.js.dom.JsSpeechRecognitionError;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpeechRecognitionEvent extends JsEvent  implements SpeechRecognitionEvent {
+  protected JsSpeechRecognitionEvent() {}
+
+  public final native JsSpeechRecognitionError getError() /*-{
+    return this.error;
+  }-*/;
+
+  public final native JsSpeechRecognitionResult getResult() /*-{
+    return this.result;
+  }-*/;
+
+  public final native JsSpeechRecognitionResultList getResultHistory() /*-{
+    return this.resultHistory;
+  }-*/;
+
+  public final native short getResultIndex() /*-{
+    return this.resultIndex;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsTextEvent.java b/elemental/src/elemental/js/events/JsTextEvent.java
new file mode 100644
index 0000000..c421a62
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsTextEvent.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.html.Window;
+import elemental.events.TextEvent;
+import elemental.js.html.JsWindow;
+import elemental.events.UIEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTextEvent extends JsUIEvent  implements TextEvent {
+  protected JsTextEvent() {}
+
+  public final native String getData() /*-{
+    return this.data;
+  }-*/;
+
+  public final native void initTextEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, Window viewArg, String dataArg) /*-{
+    this.initTextEvent(typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsTouch.java b/elemental/src/elemental/js/events/JsTouch.java
new file mode 100644
index 0000000..8cabd3b
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsTouch.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.Touch;
+import elemental.events.EventTarget;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTouch extends JsElementalMixinBase  implements Touch {
+  protected JsTouch() {}
+
+  public final native int getClientX() /*-{
+    return this.clientX;
+  }-*/;
+
+  public final native int getClientY() /*-{
+    return this.clientY;
+  }-*/;
+
+  public final native int getIdentifier() /*-{
+    return this.identifier;
+  }-*/;
+
+  public final native int getPageX() /*-{
+    return this.pageX;
+  }-*/;
+
+  public final native int getPageY() /*-{
+    return this.pageY;
+  }-*/;
+
+  public final native int getScreenX() /*-{
+    return this.screenX;
+  }-*/;
+
+  public final native int getScreenY() /*-{
+    return this.screenY;
+  }-*/;
+
+  public final native EventTarget getTarget() /*-{
+    return this.target;
+  }-*/;
+
+  public final native float getWebkitForce() /*-{
+    return this.webkitForce;
+  }-*/;
+
+  public final native int getWebkitRadiusX() /*-{
+    return this.webkitRadiusX;
+  }-*/;
+
+  public final native int getWebkitRadiusY() /*-{
+    return this.webkitRadiusY;
+  }-*/;
+
+  public final native float getWebkitRotationAngle() /*-{
+    return this.webkitRotationAngle;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsTouchEvent.java b/elemental/src/elemental/js/events/JsTouchEvent.java
new file mode 100644
index 0000000..3437e42
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsTouchEvent.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.html.Window;
+import elemental.events.TouchList;
+import elemental.js.html.JsWindow;
+import elemental.events.TouchEvent;
+import elemental.events.UIEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTouchEvent extends JsUIEvent  implements TouchEvent {
+  protected JsTouchEvent() {}
+
+  public final native boolean isAltKey() /*-{
+    return this.altKey;
+  }-*/;
+
+  public final native JsTouchList getChangedTouches() /*-{
+    return this.changedTouches;
+  }-*/;
+
+  public final native boolean isCtrlKey() /*-{
+    return this.ctrlKey;
+  }-*/;
+
+  public final native boolean isMetaKey() /*-{
+    return this.metaKey;
+  }-*/;
+
+  public final native boolean isShiftKey() /*-{
+    return this.shiftKey;
+  }-*/;
+
+  public final native JsTouchList getTargetTouches() /*-{
+    return this.targetTouches;
+  }-*/;
+
+  public final native JsTouchList getTouches() /*-{
+    return this.touches;
+  }-*/;
+
+  public final native void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey) /*-{
+    this.initTouchEvent(touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsTouchList.java b/elemental/src/elemental/js/events/JsTouchList.java
new file mode 100644
index 0000000..232236e
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsTouchList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.Touch;
+import elemental.events.TouchList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTouchList extends JsIndexable  implements TouchList, Indexable {
+  protected JsTouchList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsTouch item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsTransitionEvent.java b/elemental/src/elemental/js/events/JsTransitionEvent.java
new file mode 100644
index 0000000..fbdc016
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsTransitionEvent.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.TransitionEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTransitionEvent extends JsEvent  implements TransitionEvent {
+  protected JsTransitionEvent() {}
+
+  public final native double getElapsedTime() /*-{
+    return this.elapsedTime;
+  }-*/;
+
+  public final native String getPropertyName() /*-{
+    return this.propertyName;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsUIEvent.java b/elemental/src/elemental/js/events/JsUIEvent.java
new file mode 100644
index 0000000..37a3474
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsUIEvent.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.html.Window;
+import elemental.events.Event;
+import elemental.js.html.JsWindow;
+import elemental.events.UIEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsUIEvent extends JsEvent  implements UIEvent {
+  protected JsUIEvent() {}
+
+  public final native int getCharCode() /*-{
+    return this.charCode;
+  }-*/;
+
+  public final native int getDetail() /*-{
+    return this.detail;
+  }-*/;
+
+  public final native int getKeyCode() /*-{
+    return this.keyCode;
+  }-*/;
+
+  public final native int getLayerX() /*-{
+    return this.layerX;
+  }-*/;
+
+  public final native int getLayerY() /*-{
+    return this.layerY;
+  }-*/;
+
+  public final native int getPageX() /*-{
+    return this.pageX;
+  }-*/;
+
+  public final native int getPageY() /*-{
+    return this.pageY;
+  }-*/;
+
+  public final native JsWindow getView() /*-{
+    return this.view;
+  }-*/;
+
+  public final native int getWhich() /*-{
+    return this.which;
+  }-*/;
+
+  public final native void initUIEvent(String type, boolean canBubble, boolean cancelable, Window view, int detail) /*-{
+    this.initUIEvent(type, canBubble, cancelable, view, detail);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsWheelEvent.java b/elemental/src/elemental/js/events/JsWheelEvent.java
new file mode 100644
index 0000000..fc5cc6b
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsWheelEvent.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.html.Window;
+import elemental.js.html.JsWindow;
+import elemental.events.WheelEvent;
+import elemental.events.UIEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWheelEvent extends JsUIEvent  implements WheelEvent {
+  protected JsWheelEvent() {}
+
+  public final native boolean isAltKey() /*-{
+    return this.altKey;
+  }-*/;
+
+  public final native int getClientX() /*-{
+    return this.clientX;
+  }-*/;
+
+  public final native int getClientY() /*-{
+    return this.clientY;
+  }-*/;
+
+  public final native boolean isCtrlKey() /*-{
+    return this.ctrlKey;
+  }-*/;
+
+  public final native boolean isMetaKey() /*-{
+    return this.metaKey;
+  }-*/;
+
+  public final native int getOffsetX() /*-{
+    return this.offsetX;
+  }-*/;
+
+  public final native int getOffsetY() /*-{
+    return this.offsetY;
+  }-*/;
+
+  public final native int getScreenX() /*-{
+    return this.screenX;
+  }-*/;
+
+  public final native int getScreenY() /*-{
+    return this.screenY;
+  }-*/;
+
+  public final native boolean isShiftKey() /*-{
+    return this.shiftKey;
+  }-*/;
+
+  public final native boolean isWebkitDirectionInvertedFromDevice() /*-{
+    return this.webkitDirectionInvertedFromDevice;
+  }-*/;
+
+  public final native int getWheelDelta() /*-{
+    return this.wheelDelta;
+  }-*/;
+
+  public final native int getWheelDeltaX() /*-{
+    return this.wheelDeltaX;
+  }-*/;
+
+  public final native int getWheelDeltaY() /*-{
+    return this.wheelDeltaY;
+  }-*/;
+
+  public final native int getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native int getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey) /*-{
+    this.initWebKitWheelEvent(wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/events/JsXMLHttpRequestProgressEvent.java b/elemental/src/elemental/js/events/JsXMLHttpRequestProgressEvent.java
new file mode 100644
index 0000000..ec3c723
--- /dev/null
+++ b/elemental/src/elemental/js/events/JsXMLHttpRequestProgressEvent.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.events;
+import elemental.events.ProgressEvent;
+import elemental.events.XMLHttpRequestProgressEvent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXMLHttpRequestProgressEvent extends JsProgressEvent  implements XMLHttpRequestProgressEvent {
+  protected JsXMLHttpRequestProgressEvent() {}
+
+  public final native double getPosition() /*-{
+    return this.position;
+  }-*/;
+
+  public final native double getTotalSize() /*-{
+    return this.totalSize;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAbstractWorker.java b/elemental/src/elemental/js/html/JsAbstractWorker.java
new file mode 100644
index 0000000..bd9081a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAbstractWorker.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AbstractWorker;
+import elemental.events.EventListener;
+import elemental.js.events.JsEvent;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAbstractWorker extends JsElementalMixinBase  implements AbstractWorker {
+  protected JsAbstractWorker() {}
+
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;}
diff --git a/elemental/src/elemental/js/html/JsAnchorElement.java b/elemental/src/elemental/js/html/JsAnchorElement.java
new file mode 100644
index 0000000..3c2aa67
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAnchorElement.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AnchorElement;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAnchorElement extends JsElement  implements AnchorElement {
+  protected JsAnchorElement() {}
+
+  public final native String getCharset() /*-{
+    return this.charset;
+  }-*/;
+
+  public final native void setCharset(String param_charset) /*-{
+    this.charset = param_charset;
+  }-*/;
+
+  public final native String getCoords() /*-{
+    return this.coords;
+  }-*/;
+
+  public final native void setCoords(String param_coords) /*-{
+    this.coords = param_coords;
+  }-*/;
+
+  public final native String getDownload() /*-{
+    return this.download;
+  }-*/;
+
+  public final native void setDownload(String param_download) /*-{
+    this.download = param_download;
+  }-*/;
+
+  public final native String getHash() /*-{
+    return this.hash;
+  }-*/;
+
+  public final native void setHash(String param_hash) /*-{
+    this.hash = param_hash;
+  }-*/;
+
+  public final native String getHost() /*-{
+    return this.host;
+  }-*/;
+
+  public final native void setHost(String param_host) /*-{
+    this.host = param_host;
+  }-*/;
+
+  public final native String getHostname() /*-{
+    return this.hostname;
+  }-*/;
+
+  public final native void setHostname(String param_hostname) /*-{
+    this.hostname = param_hostname;
+  }-*/;
+
+  public final native String getHref() /*-{
+    return this.href;
+  }-*/;
+
+  public final native void setHref(String param_href) /*-{
+    this.href = param_href;
+  }-*/;
+
+  public final native String getHreflang() /*-{
+    return this.hreflang;
+  }-*/;
+
+  public final native void setHreflang(String param_hreflang) /*-{
+    this.hreflang = param_hreflang;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getOrigin() /*-{
+    return this.origin;
+  }-*/;
+
+  public final native String getPathname() /*-{
+    return this.pathname;
+  }-*/;
+
+  public final native void setPathname(String param_pathname) /*-{
+    this.pathname = param_pathname;
+  }-*/;
+
+  public final native String getPing() /*-{
+    return this.ping;
+  }-*/;
+
+  public final native void setPing(String param_ping) /*-{
+    this.ping = param_ping;
+  }-*/;
+
+  public final native String getPort() /*-{
+    return this.port;
+  }-*/;
+
+  public final native void setPort(String param_port) /*-{
+    this.port = param_port;
+  }-*/;
+
+  public final native String getProtocol() /*-{
+    return this.protocol;
+  }-*/;
+
+  public final native void setProtocol(String param_protocol) /*-{
+    this.protocol = param_protocol;
+  }-*/;
+
+  public final native String getRel() /*-{
+    return this.rel;
+  }-*/;
+
+  public final native void setRel(String param_rel) /*-{
+    this.rel = param_rel;
+  }-*/;
+
+  public final native String getRev() /*-{
+    return this.rev;
+  }-*/;
+
+  public final native void setRev(String param_rev) /*-{
+    this.rev = param_rev;
+  }-*/;
+
+  public final native String getSearch() /*-{
+    return this.search;
+  }-*/;
+
+  public final native void setSearch(String param_search) /*-{
+    this.search = param_search;
+  }-*/;
+
+  public final native String getShape() /*-{
+    return this.shape;
+  }-*/;
+
+  public final native void setShape(String param_shape) /*-{
+    this.shape = param_shape;
+  }-*/;
+
+  public final native String getTarget() /*-{
+    return this.target;
+  }-*/;
+
+  public final native void setTarget(String param_target) /*-{
+    this.target = param_target;
+  }-*/;
+
+  public final native String getText() /*-{
+    return this.text;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAnimation.java b/elemental/src/elemental/js/html/JsAnimation.java
new file mode 100644
index 0000000..d38b5fa
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAnimation.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Animation;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAnimation extends JsElementalMixinBase  implements Animation {
+  protected JsAnimation() {}
+
+  public final native double getDelay() /*-{
+    return this.delay;
+  }-*/;
+
+  public final native int getDirection() /*-{
+    return this.direction;
+  }-*/;
+
+  public final native double getDuration() /*-{
+    return this.duration;
+  }-*/;
+
+  public final native double getElapsedTime() /*-{
+    return this.elapsedTime;
+  }-*/;
+
+  public final native void setElapsedTime(double param_elapsedTime) /*-{
+    this.elapsedTime = param_elapsedTime;
+  }-*/;
+
+  public final native boolean isEnded() /*-{
+    return this.ended;
+  }-*/;
+
+  public final native int getFillMode() /*-{
+    return this.fillMode;
+  }-*/;
+
+  public final native int getIterationCount() /*-{
+    return this.iterationCount;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native boolean isPaused() /*-{
+    return this.paused;
+  }-*/;
+
+  public final native void pause() /*-{
+    this.pause();
+  }-*/;
+
+  public final native void play() /*-{
+    this.play();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAnimationList.java b/elemental/src/elemental/js/html/JsAnimationList.java
new file mode 100644
index 0000000..1a6e93f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAnimationList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AnimationList;
+import elemental.html.Animation;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAnimationList extends JsElementalMixinBase  implements AnimationList {
+  protected JsAnimationList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsAnimation item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAppletElement.java b/elemental/src/elemental/js/html/JsAppletElement.java
new file mode 100644
index 0000000..276c24d
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAppletElement.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.AppletElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAppletElement extends JsElement  implements AppletElement {
+  protected JsAppletElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getAlt() /*-{
+    return this.alt;
+  }-*/;
+
+  public final native void setAlt(String param_alt) /*-{
+    this.alt = param_alt;
+  }-*/;
+
+  public final native String getArchive() /*-{
+    return this.archive;
+  }-*/;
+
+  public final native void setArchive(String param_archive) /*-{
+    this.archive = param_archive;
+  }-*/;
+
+  public final native String getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native void setCode(String param_code) /*-{
+    this.code = param_code;
+  }-*/;
+
+  public final native String getCodeBase() /*-{
+    return this.codeBase;
+  }-*/;
+
+  public final native void setCodeBase(String param_codeBase) /*-{
+    this.codeBase = param_codeBase;
+  }-*/;
+
+  public final native String getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(String param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native String getHspace() /*-{
+    return this.hspace;
+  }-*/;
+
+  public final native void setHspace(String param_hspace) /*-{
+    this.hspace = param_hspace;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getObject() /*-{
+    return this.object;
+  }-*/;
+
+  public final native void setObject(String param_object) /*-{
+    this.object = param_object;
+  }-*/;
+
+  public final native String getVspace() /*-{
+    return this.vspace;
+  }-*/;
+
+  public final native void setVspace(String param_vspace) /*-{
+    this.vspace = param_vspace;
+  }-*/;
+
+  public final native String getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(String param_width) /*-{
+    this.width = param_width;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsApplicationCache.java b/elemental/src/elemental/js/html/JsApplicationCache.java
new file mode 100644
index 0000000..d08103f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsApplicationCache.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ApplicationCache;
+import elemental.events.EventListener;
+import elemental.js.events.JsEvent;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsApplicationCache extends JsElementalMixinBase  implements ApplicationCache {
+  protected JsApplicationCache() {}
+
+  public final native EventListener getOncached() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncached);
+  }-*/;
+
+  public final native void setOncached(EventListener listener) /*-{
+    this.oncached = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnchecking() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onchecking);
+  }-*/;
+
+  public final native void setOnchecking(EventListener listener) /*-{
+    this.onchecking = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndownloading() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondownloading);
+  }-*/;
+
+  public final native void setOndownloading(EventListener listener) /*-{
+    this.ondownloading = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnnoupdate() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onnoupdate);
+  }-*/;
+
+  public final native void setOnnoupdate(EventListener listener) /*-{
+    this.onnoupdate = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnobsolete() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onobsolete);
+  }-*/;
+
+  public final native void setOnobsolete(EventListener listener) /*-{
+    this.onobsolete = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnprogress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onprogress);
+  }-*/;
+
+  public final native void setOnprogress(EventListener listener) /*-{
+    this.onprogress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnupdateready() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onupdateready);
+  }-*/;
+
+  public final native void setOnupdateready(EventListener listener) /*-{
+    this.onupdateready = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native int getStatus() /*-{
+    return this.status;
+  }-*/;
+
+  public final native void abort() /*-{
+    this.abort();
+  }-*/;
+
+  public final native void swapCache() /*-{
+    this.swapCache();
+  }-*/;
+
+  public final native void update() /*-{
+    this.update();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAreaElement.java b/elemental/src/elemental/js/html/JsAreaElement.java
new file mode 100644
index 0000000..82a8efe
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAreaElement.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.AreaElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAreaElement extends JsElement  implements AreaElement {
+  protected JsAreaElement() {}
+
+  public final native String getAlt() /*-{
+    return this.alt;
+  }-*/;
+
+  public final native void setAlt(String param_alt) /*-{
+    this.alt = param_alt;
+  }-*/;
+
+  public final native String getCoords() /*-{
+    return this.coords;
+  }-*/;
+
+  public final native void setCoords(String param_coords) /*-{
+    this.coords = param_coords;
+  }-*/;
+
+  public final native String getHash() /*-{
+    return this.hash;
+  }-*/;
+
+  public final native String getHost() /*-{
+    return this.host;
+  }-*/;
+
+  public final native String getHostname() /*-{
+    return this.hostname;
+  }-*/;
+
+  public final native String getHref() /*-{
+    return this.href;
+  }-*/;
+
+  public final native void setHref(String param_href) /*-{
+    this.href = param_href;
+  }-*/;
+
+  public final native boolean isNoHref() /*-{
+    return this.noHref;
+  }-*/;
+
+  public final native void setNoHref(boolean param_noHref) /*-{
+    this.noHref = param_noHref;
+  }-*/;
+
+  public final native String getPathname() /*-{
+    return this.pathname;
+  }-*/;
+
+  public final native String getPing() /*-{
+    return this.ping;
+  }-*/;
+
+  public final native void setPing(String param_ping) /*-{
+    this.ping = param_ping;
+  }-*/;
+
+  public final native String getPort() /*-{
+    return this.port;
+  }-*/;
+
+  public final native String getProtocol() /*-{
+    return this.protocol;
+  }-*/;
+
+  public final native String getSearch() /*-{
+    return this.search;
+  }-*/;
+
+  public final native String getShape() /*-{
+    return this.shape;
+  }-*/;
+
+  public final native void setShape(String param_shape) /*-{
+    this.shape = param_shape;
+  }-*/;
+
+  public final native String getTarget() /*-{
+    return this.target;
+  }-*/;
+
+  public final native void setTarget(String param_target) /*-{
+    this.target = param_target;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsArrayBuffer.java b/elemental/src/elemental/js/html/JsArrayBuffer.java
new file mode 100644
index 0000000..b22c245
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsArrayBuffer.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ArrayBuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsArrayBuffer extends JsElementalMixinBase  implements ArrayBuffer {
+  protected JsArrayBuffer() {}
+
+  public final native int getByteLength() /*-{
+    return this.byteLength;
+  }-*/;
+
+  public final native JsArrayBuffer slice(int begin) /*-{
+    return this.slice(begin);
+  }-*/;
+
+  public final native JsArrayBuffer slice(int begin, int end) /*-{
+    return this.slice(begin, end);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsArrayBufferView.java b/elemental/src/elemental/js/html/JsArrayBufferView.java
new file mode 100644
index 0000000..ca9829b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsArrayBufferView.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ArrayBufferView;
+import elemental.html.ArrayBuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsArrayBufferView extends JsElementalMixinBase  implements ArrayBufferView {
+  protected JsArrayBufferView() {}
+
+  public final native JsArrayBuffer getBuffer() /*-{
+    return this.buffer;
+  }-*/;
+
+  public final native int getByteLength() /*-{
+    return this.byteLength;
+  }-*/;
+
+  public final native int getByteOffset() /*-{
+    return this.byteOffset;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioBuffer.java b/elemental/src/elemental/js/html/JsAudioBuffer.java
new file mode 100644
index 0000000..8ba1362
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioBuffer.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Float32Array;
+import elemental.html.AudioBuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioBuffer extends JsElementalMixinBase  implements AudioBuffer {
+  protected JsAudioBuffer() {}
+
+  public final native float getDuration() /*-{
+    return this.duration;
+  }-*/;
+
+  public final native float getGain() /*-{
+    return this.gain;
+  }-*/;
+
+  public final native void setGain(float param_gain) /*-{
+    this.gain = param_gain;
+  }-*/;
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native int getNumberOfChannels() /*-{
+    return this.numberOfChannels;
+  }-*/;
+
+  public final native float getSampleRate() /*-{
+    return this.sampleRate;
+  }-*/;
+
+  public final native JsFloat32Array getChannelData(int channelIndex) /*-{
+    return this.getChannelData(channelIndex);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioBufferSourceNode.java b/elemental/src/elemental/js/html/JsAudioBufferSourceNode.java
new file mode 100644
index 0000000..eaa4e10
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioBufferSourceNode.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioParam;
+import elemental.html.AudioSourceNode;
+import elemental.html.AudioBufferSourceNode;
+import elemental.html.AudioGain;
+import elemental.html.AudioBuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioBufferSourceNode extends JsAudioSourceNode  implements AudioBufferSourceNode {
+  protected JsAudioBufferSourceNode() {}
+
+  public final native JsAudioBuffer getBuffer() /*-{
+    return this.buffer;
+  }-*/;
+
+  public final native void setBuffer(AudioBuffer param_buffer) /*-{
+    this.buffer = param_buffer;
+  }-*/;
+
+  public final native JsAudioGain getGain() /*-{
+    return this.gain;
+  }-*/;
+
+  public final native boolean isLoop() /*-{
+    return this.loop;
+  }-*/;
+
+  public final native void setLoop(boolean param_loop) /*-{
+    this.loop = param_loop;
+  }-*/;
+
+  public final native boolean isLooping() /*-{
+    return this.looping;
+  }-*/;
+
+  public final native void setLooping(boolean param_looping) /*-{
+    this.looping = param_looping;
+  }-*/;
+
+  public final native JsAudioParam getPlaybackRate() /*-{
+    return this.playbackRate;
+  }-*/;
+
+  public final native int getPlaybackState() /*-{
+    return this.playbackState;
+  }-*/;
+
+  public final native void noteGrainOn(double when, double grainOffset, double grainDuration) /*-{
+    this.noteGrainOn(when, grainOffset, grainDuration);
+  }-*/;
+
+  public final native void noteOff(double when) /*-{
+    this.noteOff(when);
+  }-*/;
+
+  public final native void noteOn(double when) /*-{
+    this.noteOn(when);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioChannelMerger.java b/elemental/src/elemental/js/html/JsAudioChannelMerger.java
new file mode 100644
index 0000000..86315ce
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioChannelMerger.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioChannelMerger;
+import elemental.html.AudioNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioChannelMerger extends JsAudioNode  implements AudioChannelMerger {
+  protected JsAudioChannelMerger() {}
+}
diff --git a/elemental/src/elemental/js/html/JsAudioChannelSplitter.java b/elemental/src/elemental/js/html/JsAudioChannelSplitter.java
new file mode 100644
index 0000000..e047710
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioChannelSplitter.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioNode;
+import elemental.html.AudioChannelSplitter;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioChannelSplitter extends JsAudioNode  implements AudioChannelSplitter {
+  protected JsAudioChannelSplitter() {}
+}
diff --git a/elemental/src/elemental/js/html/JsAudioContext.java b/elemental/src/elemental/js/html/JsAudioContext.java
new file mode 100644
index 0000000..e33e4c9
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioContext.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WaveShaperNode;
+import elemental.html.AudioListener;
+import elemental.html.WaveTable;
+import elemental.html.AudioPannerNode;
+import elemental.html.ArrayBuffer;
+import elemental.html.MediaElement;
+import elemental.html.RealtimeAnalyserNode;
+import elemental.html.DynamicsCompressorNode;
+import elemental.html.AudioBufferSourceNode;
+import elemental.html.Oscillator;
+import elemental.html.Float32Array;
+import elemental.html.AudioGainNode;
+import elemental.js.events.JsEventListener;
+import elemental.html.AudioBuffer;
+import elemental.html.DelayNode;
+import elemental.html.ConvolverNode;
+import elemental.html.AudioDestinationNode;
+import elemental.html.AudioContext;
+import elemental.html.AudioChannelMerger;
+import elemental.html.AudioBufferCallback;
+import elemental.html.BiquadFilterNode;
+import elemental.html.JavaScriptAudioNode;
+import elemental.html.AudioChannelSplitter;
+import elemental.html.MediaElementAudioSourceNode;
+import elemental.events.EventListener;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioContext extends JsElementalMixinBase  implements AudioContext {
+  protected JsAudioContext() {}
+
+  public final native int getActiveSourceCount() /*-{
+    return this.activeSourceCount;
+  }-*/;
+
+  public final native float getCurrentTime() /*-{
+    return this.currentTime;
+  }-*/;
+
+  public final native JsAudioDestinationNode getDestination() /*-{
+    return this.destination;
+  }-*/;
+
+  public final native JsAudioListener getListener() /*-{
+    return this.listener;
+  }-*/;
+
+  public final native EventListener getOncomplete() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncomplete);
+  }-*/;
+
+  public final native void setOncomplete(EventListener listener) /*-{
+    this.oncomplete = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native float getSampleRate() /*-{
+    return this.sampleRate;
+  }-*/;
+
+  public final native JsRealtimeAnalyserNode createAnalyser() /*-{
+    return this.createAnalyser();
+  }-*/;
+
+  public final native JsBiquadFilterNode createBiquadFilter() /*-{
+    return this.createBiquadFilter();
+  }-*/;
+
+  public final native JsAudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, float sampleRate) /*-{
+    return this.createBuffer(numberOfChannels, numberOfFrames, sampleRate);
+  }-*/;
+
+  public final native JsAudioBuffer createBuffer(ArrayBuffer buffer, boolean mixToMono) /*-{
+    return this.createBuffer(buffer, mixToMono);
+  }-*/;
+
+  public final native JsAudioBufferSourceNode createBufferSource() /*-{
+    return this.createBufferSource();
+  }-*/;
+
+  public final native JsAudioChannelMerger createChannelMerger() /*-{
+    return this.createChannelMerger();
+  }-*/;
+
+  public final native JsAudioChannelMerger createChannelMerger(int numberOfInputs) /*-{
+    return this.createChannelMerger(numberOfInputs);
+  }-*/;
+
+  public final native JsAudioChannelSplitter createChannelSplitter() /*-{
+    return this.createChannelSplitter();
+  }-*/;
+
+  public final native JsAudioChannelSplitter createChannelSplitter(int numberOfOutputs) /*-{
+    return this.createChannelSplitter(numberOfOutputs);
+  }-*/;
+
+  public final native JsConvolverNode createConvolver() /*-{
+    return this.createConvolver();
+  }-*/;
+
+  public final native JsDelayNode createDelayNode() /*-{
+    return this.createDelayNode();
+  }-*/;
+
+  public final native JsDelayNode createDelayNode(double maxDelayTime) /*-{
+    return this.createDelayNode(maxDelayTime);
+  }-*/;
+
+  public final native JsDynamicsCompressorNode createDynamicsCompressor() /*-{
+    return this.createDynamicsCompressor();
+  }-*/;
+
+  public final native JsAudioGainNode createGainNode() /*-{
+    return this.createGainNode();
+  }-*/;
+
+  public final native JsJavaScriptAudioNode createJavaScriptNode(int bufferSize) /*-{
+    return this.createJavaScriptNode(bufferSize);
+  }-*/;
+
+  public final native JsJavaScriptAudioNode createJavaScriptNode(int bufferSize, int numberOfInputChannels) /*-{
+    return this.createJavaScriptNode(bufferSize, numberOfInputChannels);
+  }-*/;
+
+  public final native JsJavaScriptAudioNode createJavaScriptNode(int bufferSize, int numberOfInputChannels, int numberOfOutputChannels) /*-{
+    return this.createJavaScriptNode(bufferSize, numberOfInputChannels, numberOfOutputChannels);
+  }-*/;
+
+  public final native JsMediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) /*-{
+    return this.createMediaElementSource(mediaElement);
+  }-*/;
+
+  public final native JsOscillator createOscillator() /*-{
+    return this.createOscillator();
+  }-*/;
+
+  public final native JsAudioPannerNode createPanner() /*-{
+    return this.createPanner();
+  }-*/;
+
+  public final native JsWaveShaperNode createWaveShaper() /*-{
+    return this.createWaveShaper();
+  }-*/;
+
+  public final native JsWaveTable createWaveTable(Float32Array real, Float32Array imag) /*-{
+    return this.createWaveTable(real, imag);
+  }-*/;
+
+  public final native void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback) /*-{
+    this.decodeAudioData(audioData, $entry(successCallback.@elemental.html.AudioBufferCallback::onAudioBufferCallback(Lelemental/html/AudioBuffer;)).bind(successCallback));
+  }-*/;
+
+  public final native void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, AudioBufferCallback errorCallback) /*-{
+    this.decodeAudioData(audioData, $entry(successCallback.@elemental.html.AudioBufferCallback::onAudioBufferCallback(Lelemental/html/AudioBuffer;)).bind(successCallback), $entry(errorCallback.@elemental.html.AudioBufferCallback::onAudioBufferCallback(Lelemental/html/AudioBuffer;)).bind(errorCallback));
+  }-*/;
+
+  public final native void startRendering() /*-{
+    this.startRendering();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioDestinationNode.java b/elemental/src/elemental/js/html/JsAudioDestinationNode.java
new file mode 100644
index 0000000..4a27c66
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioDestinationNode.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioDestinationNode;
+import elemental.html.AudioNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioDestinationNode extends JsAudioNode  implements AudioDestinationNode {
+  protected JsAudioDestinationNode() {}
+
+  public final native int getNumberOfChannels() /*-{
+    return this.numberOfChannels;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioElement.java b/elemental/src/elemental/js/html/JsAudioElement.java
new file mode 100644
index 0000000..1cd8f83
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioElement;
+import elemental.html.MediaElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioElement extends JsMediaElement  implements AudioElement {
+  protected JsAudioElement() {}
+}
diff --git a/elemental/src/elemental/js/html/JsAudioGain.java b/elemental/src/elemental/js/html/JsAudioGain.java
new file mode 100644
index 0000000..12a8d6b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioGain.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioParam;
+import elemental.html.AudioGain;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioGain extends JsAudioParam  implements AudioGain {
+  protected JsAudioGain() {}
+}
diff --git a/elemental/src/elemental/js/html/JsAudioGainNode.java b/elemental/src/elemental/js/html/JsAudioGainNode.java
new file mode 100644
index 0000000..64c43b7
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioGainNode.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioNode;
+import elemental.html.AudioGainNode;
+import elemental.html.AudioGain;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioGainNode extends JsAudioNode  implements AudioGainNode {
+  protected JsAudioGainNode() {}
+
+  public final native JsAudioGain getGain() /*-{
+    return this.gain;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioListener.java b/elemental/src/elemental/js/html/JsAudioListener.java
new file mode 100644
index 0000000..2db7aa2
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioListener.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioListener;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioListener extends JsElementalMixinBase  implements AudioListener {
+  protected JsAudioListener() {}
+
+  public final native float getDopplerFactor() /*-{
+    return this.dopplerFactor;
+  }-*/;
+
+  public final native void setDopplerFactor(float param_dopplerFactor) /*-{
+    this.dopplerFactor = param_dopplerFactor;
+  }-*/;
+
+  public final native float getSpeedOfSound() /*-{
+    return this.speedOfSound;
+  }-*/;
+
+  public final native void setSpeedOfSound(float param_speedOfSound) /*-{
+    this.speedOfSound = param_speedOfSound;
+  }-*/;
+
+  public final native void setOrientation(float x, float y, float z, float xUp, float yUp, float zUp) /*-{
+    this.setOrientation(x, y, z, xUp, yUp, zUp);
+  }-*/;
+
+  public final native void setPosition(float x, float y, float z) /*-{
+    this.setPosition(x, y, z);
+  }-*/;
+
+  public final native void setVelocity(float x, float y, float z) /*-{
+    this.setVelocity(x, y, z);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioNode.java b/elemental/src/elemental/js/html/JsAudioNode.java
new file mode 100644
index 0000000..90b5b13
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioNode.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioParam;
+import elemental.html.AudioNode;
+import elemental.html.AudioContext;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioNode extends JsElementalMixinBase  implements AudioNode {
+  protected JsAudioNode() {}
+
+  public final native JsAudioContext getContext() /*-{
+    return this.context;
+  }-*/;
+
+  public final native int getNumberOfInputs() /*-{
+    return this.numberOfInputs;
+  }-*/;
+
+  public final native int getNumberOfOutputs() /*-{
+    return this.numberOfOutputs;
+  }-*/;
+
+  public final native void connect(AudioNode destination, int output, int input) /*-{
+    this.connect(destination, output, input);
+  }-*/;
+
+  public final native void connect(AudioParam destination, int output) /*-{
+    this.connect(destination, output);
+  }-*/;
+
+  public final native void disconnect(int output) /*-{
+    this.disconnect(output);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioPannerNode.java b/elemental/src/elemental/js/html/JsAudioPannerNode.java
new file mode 100644
index 0000000..3ec77bb
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioPannerNode.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioNode;
+import elemental.html.AudioPannerNode;
+import elemental.html.AudioGain;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioPannerNode extends JsAudioNode  implements AudioPannerNode {
+  protected JsAudioPannerNode() {}
+
+  public final native JsAudioGain getConeGain() /*-{
+    return this.coneGain;
+  }-*/;
+
+  public final native float getConeInnerAngle() /*-{
+    return this.coneInnerAngle;
+  }-*/;
+
+  public final native void setConeInnerAngle(float param_coneInnerAngle) /*-{
+    this.coneInnerAngle = param_coneInnerAngle;
+  }-*/;
+
+  public final native float getConeOuterAngle() /*-{
+    return this.coneOuterAngle;
+  }-*/;
+
+  public final native void setConeOuterAngle(float param_coneOuterAngle) /*-{
+    this.coneOuterAngle = param_coneOuterAngle;
+  }-*/;
+
+  public final native float getConeOuterGain() /*-{
+    return this.coneOuterGain;
+  }-*/;
+
+  public final native void setConeOuterGain(float param_coneOuterGain) /*-{
+    this.coneOuterGain = param_coneOuterGain;
+  }-*/;
+
+  public final native JsAudioGain getDistanceGain() /*-{
+    return this.distanceGain;
+  }-*/;
+
+  public final native int getDistanceModel() /*-{
+    return this.distanceModel;
+  }-*/;
+
+  public final native void setDistanceModel(int param_distanceModel) /*-{
+    this.distanceModel = param_distanceModel;
+  }-*/;
+
+  public final native float getMaxDistance() /*-{
+    return this.maxDistance;
+  }-*/;
+
+  public final native void setMaxDistance(float param_maxDistance) /*-{
+    this.maxDistance = param_maxDistance;
+  }-*/;
+
+  public final native int getPanningModel() /*-{
+    return this.panningModel;
+  }-*/;
+
+  public final native void setPanningModel(int param_panningModel) /*-{
+    this.panningModel = param_panningModel;
+  }-*/;
+
+  public final native float getRefDistance() /*-{
+    return this.refDistance;
+  }-*/;
+
+  public final native void setRefDistance(float param_refDistance) /*-{
+    this.refDistance = param_refDistance;
+  }-*/;
+
+  public final native float getRolloffFactor() /*-{
+    return this.rolloffFactor;
+  }-*/;
+
+  public final native void setRolloffFactor(float param_rolloffFactor) /*-{
+    this.rolloffFactor = param_rolloffFactor;
+  }-*/;
+
+  public final native void setOrientation(float x, float y, float z) /*-{
+    this.setOrientation(x, y, z);
+  }-*/;
+
+  public final native void setPosition(float x, float y, float z) /*-{
+    this.setPosition(x, y, z);
+  }-*/;
+
+  public final native void setVelocity(float x, float y, float z) /*-{
+    this.setVelocity(x, y, z);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioParam.java b/elemental/src/elemental/js/html/JsAudioParam.java
new file mode 100644
index 0000000..b67a926
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioParam.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioParam;
+import elemental.html.Float32Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioParam extends JsElementalMixinBase  implements AudioParam {
+  protected JsAudioParam() {}
+
+  public final native float getDefaultValue() /*-{
+    return this.defaultValue;
+  }-*/;
+
+  public final native float getMaxValue() /*-{
+    return this.maxValue;
+  }-*/;
+
+  public final native float getMinValue() /*-{
+    return this.minValue;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native int getUnits() /*-{
+    return this.units;
+  }-*/;
+
+  public final native float getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(float param_value) /*-{
+    this.value = param_value;
+  }-*/;
+
+  public final native void cancelScheduledValues(float startTime) /*-{
+    this.cancelScheduledValues(startTime);
+  }-*/;
+
+  public final native void exponentialRampToValueAtTime(float value, float time) /*-{
+    this.exponentialRampToValueAtTime(value, time);
+  }-*/;
+
+  public final native void linearRampToValueAtTime(float value, float time) /*-{
+    this.linearRampToValueAtTime(value, time);
+  }-*/;
+
+  public final native void setTargetValueAtTime(float targetValue, float time, float timeConstant) /*-{
+    this.setTargetValueAtTime(targetValue, time, timeConstant);
+  }-*/;
+
+  public final native void setValueAtTime(float value, float time) /*-{
+    this.setValueAtTime(value, time);
+  }-*/;
+
+  public final native void setValueCurveAtTime(Float32Array values, float time, float duration) /*-{
+    this.setValueCurveAtTime(values, time, duration);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioProcessingEvent.java b/elemental/src/elemental/js/html/JsAudioProcessingEvent.java
new file mode 100644
index 0000000..1f469d7
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioProcessingEvent.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.events.Event;
+import elemental.html.AudioProcessingEvent;
+import elemental.js.events.JsEvent;
+import elemental.html.AudioBuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioProcessingEvent extends JsEvent  implements AudioProcessingEvent {
+  protected JsAudioProcessingEvent() {}
+
+  public final native JsAudioBuffer getInputBuffer() /*-{
+    return this.inputBuffer;
+  }-*/;
+
+  public final native JsAudioBuffer getOutputBuffer() /*-{
+    return this.outputBuffer;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsAudioSourceNode.java b/elemental/src/elemental/js/html/JsAudioSourceNode.java
new file mode 100644
index 0000000..58df201
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsAudioSourceNode.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioNode;
+import elemental.html.AudioSourceNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsAudioSourceNode extends JsAudioNode  implements AudioSourceNode {
+  protected JsAudioSourceNode() {}
+}
diff --git a/elemental/src/elemental/js/html/JsBRElement.java b/elemental/src/elemental/js/html/JsBRElement.java
new file mode 100644
index 0000000..c6dc7ba
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsBRElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.BRElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBRElement extends JsElement  implements BRElement {
+  protected JsBRElement() {}
+
+  public final native String getClear() /*-{
+    return this.clear;
+  }-*/;
+
+  public final native void setClear(String param_clear) /*-{
+    this.clear = param_clear;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsBarProp.java b/elemental/src/elemental/js/html/JsBarProp.java
new file mode 100644
index 0000000..32b086f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsBarProp.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.BarProp;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBarProp extends JsElementalMixinBase  implements BarProp {
+  protected JsBarProp() {}
+
+  public final native boolean isVisible() /*-{
+    return this.visible;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsBaseElement.java b/elemental/src/elemental/js/html/JsBaseElement.java
new file mode 100644
index 0000000..9de8d97
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsBaseElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.BaseElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBaseElement extends JsElement  implements BaseElement {
+  protected JsBaseElement() {}
+
+  public final native String getHref() /*-{
+    return this.href;
+  }-*/;
+
+  public final native void setHref(String param_href) /*-{
+    this.href = param_href;
+  }-*/;
+
+  public final native String getTarget() /*-{
+    return this.target;
+  }-*/;
+
+  public final native void setTarget(String param_target) /*-{
+    this.target = param_target;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsBaseFontElement.java b/elemental/src/elemental/js/html/JsBaseFontElement.java
new file mode 100644
index 0000000..b28b193
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsBaseFontElement.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.BaseFontElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBaseFontElement extends JsElement  implements BaseFontElement {
+  protected JsBaseFontElement() {}
+
+  public final native String getColor() /*-{
+    return this.color;
+  }-*/;
+
+  public final native void setColor(String param_color) /*-{
+    this.color = param_color;
+  }-*/;
+
+  public final native String getFace() /*-{
+    return this.face;
+  }-*/;
+
+  public final native void setFace(String param_face) /*-{
+    this.face = param_face;
+  }-*/;
+
+  public final native int getSize() /*-{
+    return this.size;
+  }-*/;
+
+  public final native void setSize(int param_size) /*-{
+    this.size = param_size;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsBatteryManager.java b/elemental/src/elemental/js/html/JsBatteryManager.java
new file mode 100644
index 0000000..85248dd
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsBatteryManager.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.events.EventListener;
+import elemental.html.BatteryManager;
+import elemental.js.events.JsEvent;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBatteryManager extends JsElementalMixinBase  implements BatteryManager {
+  protected JsBatteryManager() {}
+
+  public final native boolean isCharging() /*-{
+    return this.charging;
+  }-*/;
+
+  public final native double getChargingTime() /*-{
+    return this.chargingTime;
+  }-*/;
+
+  public final native double getDischargingTime() /*-{
+    return this.dischargingTime;
+  }-*/;
+
+  public final native double getLevel() /*-{
+    return this.level;
+  }-*/;
+
+  public final native EventListener getOnchargingchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onchargingchange);
+  }-*/;
+
+  public final native void setOnchargingchange(EventListener listener) /*-{
+    this.onchargingchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnchargingtimechange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onchargingtimechange);
+  }-*/;
+
+  public final native void setOnchargingtimechange(EventListener listener) /*-{
+    this.onchargingtimechange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndischargingtimechange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondischargingtimechange);
+  }-*/;
+
+  public final native void setOndischargingtimechange(EventListener listener) /*-{
+    this.ondischargingtimechange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnlevelchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onlevelchange);
+  }-*/;
+
+  public final native void setOnlevelchange(EventListener listener) /*-{
+    this.onlevelchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;}
diff --git a/elemental/src/elemental/js/html/JsBiquadFilterNode.java b/elemental/src/elemental/js/html/JsBiquadFilterNode.java
new file mode 100644
index 0000000..cf8dea0
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsBiquadFilterNode.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioParam;
+import elemental.html.Float32Array;
+import elemental.html.AudioNode;
+import elemental.html.BiquadFilterNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBiquadFilterNode extends JsAudioNode  implements BiquadFilterNode {
+  protected JsBiquadFilterNode() {}
+
+  public final native JsAudioParam getQ() /*-{
+    return this.Q;
+  }-*/;
+
+  public final native JsAudioParam getFrequency() /*-{
+    return this.frequency;
+  }-*/;
+
+  public final native JsAudioParam getGain() /*-{
+    return this.gain;
+  }-*/;
+
+  public final native int getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(int param_type) /*-{
+    this.type = param_type;
+  }-*/;
+
+  public final native void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) /*-{
+    this.getFrequencyResponse(frequencyHz, magResponse, phaseResponse);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsBlob.java b/elemental/src/elemental/js/html/JsBlob.java
new file mode 100644
index 0000000..8016860
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsBlob.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Blob;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBlob extends JsElementalMixinBase  implements Blob {
+  protected JsBlob() {}
+
+  public final native double getSize() /*-{
+    return this.size;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native JsBlob webkitSlice() /*-{
+    return this.webkitSlice();
+  }-*/;
+
+  public final native JsBlob webkitSlice(double start) /*-{
+    return this.webkitSlice(start);
+  }-*/;
+
+  public final native JsBlob webkitSlice(double start, double end) /*-{
+    return this.webkitSlice(start, end);
+  }-*/;
+
+  public final native JsBlob webkitSlice(double start, double end, String contentType) /*-{
+    return this.webkitSlice(start, end, contentType);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsBlobBuilder.java b/elemental/src/elemental/js/html/JsBlobBuilder.java
new file mode 100644
index 0000000..577f6df
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsBlobBuilder.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.BlobBuilder;
+import elemental.html.ArrayBuffer;
+import elemental.html.Blob;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBlobBuilder extends JsElementalMixinBase  implements BlobBuilder {
+  protected JsBlobBuilder() {}
+
+  public final native void append(Blob blob) /*-{
+    this.append(blob);
+  }-*/;
+
+  public final native void append(ArrayBuffer arrayBuffer) /*-{
+    this.append(arrayBuffer);
+  }-*/;
+
+  public final native void append(String value) /*-{
+    this.append(value);
+  }-*/;
+
+  public final native void append(String value, String endings) /*-{
+    this.append(value, endings);
+  }-*/;
+
+  public final native JsBlob getBlob() /*-{
+    return this.getBlob();
+  }-*/;
+
+  public final native JsBlob getBlob(String contentType) /*-{
+    return this.getBlob(contentType);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsBodyElement.java b/elemental/src/elemental/js/html/JsBodyElement.java
new file mode 100644
index 0000000..2defa4f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsBodyElement.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+import elemental.html.BodyElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsBodyElement extends JsElement  implements BodyElement {
+  protected JsBodyElement() {}
+
+  public final native String getALink() /*-{
+    return this.aLink;
+  }-*/;
+
+  public final native void setALink(String param_aLink) /*-{
+    this.aLink = param_aLink;
+  }-*/;
+
+  public final native String getBackground() /*-{
+    return this.background;
+  }-*/;
+
+  public final native void setBackground(String param_background) /*-{
+    this.background = param_background;
+  }-*/;
+
+  public final native String getBgColor() /*-{
+    return this.bgColor;
+  }-*/;
+
+  public final native void setBgColor(String param_bgColor) /*-{
+    this.bgColor = param_bgColor;
+  }-*/;
+
+  public final native String getLink() /*-{
+    return this.link;
+  }-*/;
+
+  public final native void setLink(String param_link) /*-{
+    this.link = param_link;
+  }-*/;
+
+  public final native EventListener getOnbeforeunload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforeunload);
+  }-*/;
+
+  public final native void setOnbeforeunload(EventListener listener) /*-{
+    this.onbeforeunload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnhashchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onhashchange);
+  }-*/;
+
+  public final native void setOnhashchange(EventListener listener) /*-{
+    this.onhashchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmessage);
+  }-*/;
+
+  public final native void setOnmessage(EventListener listener) /*-{
+    this.onmessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnoffline() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onoffline);
+  }-*/;
+
+  public final native void setOnoffline(EventListener listener) /*-{
+    this.onoffline = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnonline() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ononline);
+  }-*/;
+
+  public final native void setOnonline(EventListener listener) /*-{
+    this.ononline = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnpopstate() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onpopstate);
+  }-*/;
+
+  public final native void setOnpopstate(EventListener listener) /*-{
+    this.onpopstate = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnresize() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onresize);
+  }-*/;
+
+  public final native void setOnresize(EventListener listener) /*-{
+    this.onresize = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnstorage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onstorage);
+  }-*/;
+
+  public final native void setOnstorage(EventListener listener) /*-{
+    this.onstorage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnunload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onunload);
+  }-*/;
+
+  public final native void setOnunload(EventListener listener) /*-{
+    this.onunload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native String getText() /*-{
+    return this.text;
+  }-*/;
+
+  public final native void setText(String param_text) /*-{
+    this.text = param_text;
+  }-*/;
+
+  public final native String getVLink() /*-{
+    return this.vLink;
+  }-*/;
+
+  public final native void setVLink(String param_vLink) /*-{
+    this.vLink = param_vLink;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsButtonElement.java b/elemental/src/elemental/js/html/JsButtonElement.java
new file mode 100644
index 0000000..7bef4a8
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsButtonElement.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ValidityState;
+import elemental.html.ButtonElement;
+import elemental.dom.Element;
+import elemental.js.dom.JsElement;
+import elemental.html.FormElement;
+import elemental.js.dom.JsNodeList;
+import elemental.dom.NodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsButtonElement extends JsElement  implements ButtonElement {
+  protected JsButtonElement() {}
+
+  public final native boolean isAutofocus() /*-{
+    return this.autofocus;
+  }-*/;
+
+  public final native void setAutofocus(boolean param_autofocus) /*-{
+    this.autofocus = param_autofocus;
+  }-*/;
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native String getFormAction() /*-{
+    return this.formAction;
+  }-*/;
+
+  public final native void setFormAction(String param_formAction) /*-{
+    this.formAction = param_formAction;
+  }-*/;
+
+  public final native String getFormEnctype() /*-{
+    return this.formEnctype;
+  }-*/;
+
+  public final native void setFormEnctype(String param_formEnctype) /*-{
+    this.formEnctype = param_formEnctype;
+  }-*/;
+
+  public final native String getFormMethod() /*-{
+    return this.formMethod;
+  }-*/;
+
+  public final native void setFormMethod(String param_formMethod) /*-{
+    this.formMethod = param_formMethod;
+  }-*/;
+
+  public final native boolean isFormNoValidate() /*-{
+    return this.formNoValidate;
+  }-*/;
+
+  public final native void setFormNoValidate(boolean param_formNoValidate) /*-{
+    this.formNoValidate = param_formNoValidate;
+  }-*/;
+
+  public final native String getFormTarget() /*-{
+    return this.formTarget;
+  }-*/;
+
+  public final native void setFormTarget(String param_formTarget) /*-{
+    this.formTarget = param_formTarget;
+  }-*/;
+
+  public final native JsNodeList getLabels() /*-{
+    return this.labels;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native String getValidationMessage() /*-{
+    return this.validationMessage;
+  }-*/;
+
+  public final native JsValidityState getValidity() /*-{
+    return this.validity;
+  }-*/;
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+
+  public final native boolean isWillValidate() /*-{
+    return this.willValidate;
+  }-*/;
+
+  public final native boolean checkValidity() /*-{
+    return this.checkValidity();
+  }-*/;
+
+  public final native void setCustomValidity(String error) /*-{
+    this.setCustomValidity(error);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsCanvasElement.java b/elemental/src/elemental/js/html/JsCanvasElement.java
new file mode 100644
index 0000000..60d5bbe
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsCanvasElement.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.CanvasRenderingContext;
+import elemental.html.CanvasElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCanvasElement extends JsElement  implements CanvasElement {
+  protected JsCanvasElement() {}
+
+  public final native int getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(int param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native int getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(int param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native JsCanvasRenderingContext getContext(String contextId) /*-{
+    return this.getContext(contextId);
+  }-*/;
+
+  public final native String toDataURL(String type) /*-{
+    return this.toDataURL(type);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsCanvasGradient.java b/elemental/src/elemental/js/html/JsCanvasGradient.java
new file mode 100644
index 0000000..c4c09d7
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsCanvasGradient.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.CanvasGradient;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCanvasGradient extends JsElementalMixinBase  implements CanvasGradient {
+  protected JsCanvasGradient() {}
+
+  public final native void addColorStop(float offset, String color) /*-{
+    this.addColorStop(offset, color);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsCanvasPattern.java b/elemental/src/elemental/js/html/JsCanvasPattern.java
new file mode 100644
index 0000000..e72dc9b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsCanvasPattern.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.CanvasPattern;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCanvasPattern extends JsElementalMixinBase  implements CanvasPattern {
+  protected JsCanvasPattern() {}
+}
diff --git a/elemental/src/elemental/js/html/JsCanvasRenderingContext.java b/elemental/src/elemental/js/html/JsCanvasRenderingContext.java
new file mode 100644
index 0000000..f34e630
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsCanvasRenderingContext.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.CanvasElement;
+import elemental.html.CanvasRenderingContext;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCanvasRenderingContext extends JsElementalMixinBase  implements CanvasRenderingContext {
+  protected JsCanvasRenderingContext() {}
+
+  public final native JsCanvasElement getCanvas() /*-{
+    return this.canvas;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsCanvasRenderingContext2D.java b/elemental/src/elemental/js/html/JsCanvasRenderingContext2D.java
new file mode 100644
index 0000000..d6a8735
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsCanvasRenderingContext2D.java
@@ -0,0 +1,525 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.util.Indexable;
+import elemental.html.TextMetrics;
+import elemental.html.CanvasRenderingContext;
+import elemental.html.CanvasGradient;
+import elemental.js.util.JsIndexable;
+import elemental.html.CanvasRenderingContext2D;
+import elemental.html.ImageData;
+import elemental.html.VideoElement;
+import elemental.html.CanvasPattern;
+import elemental.html.ImageElement;
+import elemental.html.CanvasElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCanvasRenderingContext2D extends JsCanvasRenderingContext  implements CanvasRenderingContext2D {
+  protected JsCanvasRenderingContext2D() {}
+
+  public final native Object getFillStyle() /*-{
+    return this.fillStyle;
+  }-*/;
+
+  public final native void setFillStyle(Object param_fillStyle) /*-{
+    this.fillStyle = param_fillStyle;
+  }-*/;
+
+  public final native String getFont() /*-{
+    return this.font;
+  }-*/;
+
+  public final native void setFont(String param_font) /*-{
+    this.font = param_font;
+  }-*/;
+
+  public final native float getGlobalAlpha() /*-{
+    return this.globalAlpha;
+  }-*/;
+
+  public final native void setGlobalAlpha(float param_globalAlpha) /*-{
+    this.globalAlpha = param_globalAlpha;
+  }-*/;
+
+  public final native String getGlobalCompositeOperation() /*-{
+    return this.globalCompositeOperation;
+  }-*/;
+
+  public final native void setGlobalCompositeOperation(String param_globalCompositeOperation) /*-{
+    this.globalCompositeOperation = param_globalCompositeOperation;
+  }-*/;
+
+  public final native String getLineCap() /*-{
+    return this.lineCap;
+  }-*/;
+
+  public final native void setLineCap(String param_lineCap) /*-{
+    this.lineCap = param_lineCap;
+  }-*/;
+
+  public final native String getLineJoin() /*-{
+    return this.lineJoin;
+  }-*/;
+
+  public final native void setLineJoin(String param_lineJoin) /*-{
+    this.lineJoin = param_lineJoin;
+  }-*/;
+
+  public final native float getLineWidth() /*-{
+    return this.lineWidth;
+  }-*/;
+
+  public final native void setLineWidth(float param_lineWidth) /*-{
+    this.lineWidth = param_lineWidth;
+  }-*/;
+
+  public final native float getMiterLimit() /*-{
+    return this.miterLimit;
+  }-*/;
+
+  public final native void setMiterLimit(float param_miterLimit) /*-{
+    this.miterLimit = param_miterLimit;
+  }-*/;
+
+  public final native float getShadowBlur() /*-{
+    return this.shadowBlur;
+  }-*/;
+
+  public final native void setShadowBlur(float param_shadowBlur) /*-{
+    this.shadowBlur = param_shadowBlur;
+  }-*/;
+
+  public final native String getShadowColor() /*-{
+    return this.shadowColor;
+  }-*/;
+
+  public final native void setShadowColor(String param_shadowColor) /*-{
+    this.shadowColor = param_shadowColor;
+  }-*/;
+
+  public final native float getShadowOffsetX() /*-{
+    return this.shadowOffsetX;
+  }-*/;
+
+  public final native void setShadowOffsetX(float param_shadowOffsetX) /*-{
+    this.shadowOffsetX = param_shadowOffsetX;
+  }-*/;
+
+  public final native float getShadowOffsetY() /*-{
+    return this.shadowOffsetY;
+  }-*/;
+
+  public final native void setShadowOffsetY(float param_shadowOffsetY) /*-{
+    this.shadowOffsetY = param_shadowOffsetY;
+  }-*/;
+
+  public final native Object getStrokeStyle() /*-{
+    return this.strokeStyle;
+  }-*/;
+
+  public final native void setStrokeStyle(Object param_strokeStyle) /*-{
+    this.strokeStyle = param_strokeStyle;
+  }-*/;
+
+  public final native String getTextAlign() /*-{
+    return this.textAlign;
+  }-*/;
+
+  public final native void setTextAlign(String param_textAlign) /*-{
+    this.textAlign = param_textAlign;
+  }-*/;
+
+  public final native String getTextBaseline() /*-{
+    return this.textBaseline;
+  }-*/;
+
+  public final native void setTextBaseline(String param_textBaseline) /*-{
+    this.textBaseline = param_textBaseline;
+  }-*/;
+
+  public final native float getWebkitBackingStorePixelRatio() /*-{
+    return this.webkitBackingStorePixelRatio;
+  }-*/;
+
+  public final native boolean isWebkitImageSmoothingEnabled() /*-{
+    return this.webkitImageSmoothingEnabled;
+  }-*/;
+
+  public final native void setWebkitImageSmoothingEnabled(boolean param_webkitImageSmoothingEnabled) /*-{
+    this.webkitImageSmoothingEnabled = param_webkitImageSmoothingEnabled;
+  }-*/;
+
+  public final native JsIndexable getWebkitLineDash() /*-{
+    return this.webkitLineDash;
+  }-*/;
+
+  public final native void setWebkitLineDash(Indexable param_webkitLineDash) /*-{
+    this.webkitLineDash = param_webkitLineDash;
+  }-*/;
+
+  public final native float getWebkitLineDashOffset() /*-{
+    return this.webkitLineDashOffset;
+  }-*/;
+
+  public final native void setWebkitLineDashOffset(float param_webkitLineDashOffset) /*-{
+    this.webkitLineDashOffset = param_webkitLineDashOffset;
+  }-*/;
+
+  public final native void arc(float x, float y, float radius, float startAngle, float endAngle, boolean anticlockwise) /*-{
+    this.arc(x, y, radius, startAngle, endAngle, anticlockwise);
+  }-*/;
+
+  public final native void arcTo(float x1, float y1, float x2, float y2, float radius) /*-{
+    this.arcTo(x1, y1, x2, y2, radius);
+  }-*/;
+
+  public final native void beginPath() /*-{
+    this.beginPath();
+  }-*/;
+
+  public final native void bezierCurveTo(float cp1x, float cp1y, float cp2x, float cp2y, float x, float y) /*-{
+    this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
+  }-*/;
+
+  public final native void clearRect(float x, float y, float width, float height) /*-{
+    this.clearRect(x, y, width, height);
+  }-*/;
+
+  public final native void clearShadow() /*-{
+    this.clearShadow();
+  }-*/;
+
+  public final native void clip() /*-{
+    this.clip();
+  }-*/;
+
+  public final native void closePath() /*-{
+    this.closePath();
+  }-*/;
+
+  public final native JsImageData createImageData(ImageData imagedata) /*-{
+    return this.createImageData(imagedata);
+  }-*/;
+
+  public final native JsImageData createImageData(float sw, float sh) /*-{
+    return this.createImageData(sw, sh);
+  }-*/;
+
+  public final native JsCanvasGradient createLinearGradient(float x0, float y0, float x1, float y1) /*-{
+    return this.createLinearGradient(x0, y0, x1, y1);
+  }-*/;
+
+  public final native JsCanvasPattern createPattern(CanvasElement canvas, String repetitionType) /*-{
+    return this.createPattern(canvas, repetitionType);
+  }-*/;
+
+  public final native JsCanvasPattern createPattern(ImageElement image, String repetitionType) /*-{
+    return this.createPattern(image, repetitionType);
+  }-*/;
+
+  public final native JsCanvasGradient createRadialGradient(float x0, float y0, float r0, float x1, float y1, float r1) /*-{
+    return this.createRadialGradient(x0, y0, r0, x1, y1, r1);
+  }-*/;
+
+  public final native void drawImage(ImageElement image, float x, float y) /*-{
+    this.drawImage(image, x, y);
+  }-*/;
+
+  public final native void drawImage(ImageElement image, float x, float y, float width, float height) /*-{
+    this.drawImage(image, x, y, width, height);
+  }-*/;
+
+  public final native void drawImage(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh) /*-{
+    this.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);
+  }-*/;
+
+  public final native void drawImage(CanvasElement canvas, float x, float y) /*-{
+    this.drawImage(canvas, x, y);
+  }-*/;
+
+  public final native void drawImage(CanvasElement canvas, float x, float y, float width, float height) /*-{
+    this.drawImage(canvas, x, y, width, height);
+  }-*/;
+
+  public final native void drawImage(CanvasElement canvas, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh) /*-{
+    this.drawImage(canvas, sx, sy, sw, sh, dx, dy, dw, dh);
+  }-*/;
+
+  public final native void drawImage(VideoElement video, float x, float y) /*-{
+    this.drawImage(video, x, y);
+  }-*/;
+
+  public final native void drawImage(VideoElement video, float x, float y, float width, float height) /*-{
+    this.drawImage(video, x, y, width, height);
+  }-*/;
+
+  public final native void drawImage(VideoElement video, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh) /*-{
+    this.drawImage(video, sx, sy, sw, sh, dx, dy, dw, dh);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image) /*-{
+    this.drawImageFromRect(image);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image, float sx) /*-{
+    this.drawImageFromRect(image, sx);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image, float sx, float sy) /*-{
+    this.drawImageFromRect(image, sx, sy);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image, float sx, float sy, float sw) /*-{
+    this.drawImageFromRect(image, sx, sy, sw);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh) /*-{
+    this.drawImageFromRect(image, sx, sy, sw, sh);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx) /*-{
+    this.drawImageFromRect(image, sx, sy, sw, sh, dx);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy) /*-{
+    this.drawImageFromRect(image, sx, sy, sw, sh, dx, dy);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy, float dw) /*-{
+    this.drawImageFromRect(image, sx, sy, sw, sh, dx, dy, dw);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh) /*-{
+    this.drawImageFromRect(image, sx, sy, sw, sh, dx, dy, dw, dh);
+  }-*/;
+
+  public final native void drawImageFromRect(ImageElement image, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, String compositeOperation) /*-{
+    this.drawImageFromRect(image, sx, sy, sw, sh, dx, dy, dw, dh, compositeOperation);
+  }-*/;
+
+  public final native void fill() /*-{
+    this.fill();
+  }-*/;
+
+  public final native void fillRect(float x, float y, float width, float height) /*-{
+    this.fillRect(x, y, width, height);
+  }-*/;
+
+  public final native void fillText(String text, float x, float y) /*-{
+    this.fillText(text, x, y);
+  }-*/;
+
+  public final native void fillText(String text, float x, float y, float maxWidth) /*-{
+    this.fillText(text, x, y, maxWidth);
+  }-*/;
+
+  public final native JsImageData getImageData(float sx, float sy, float sw, float sh) /*-{
+    return this.getImageData(sx, sy, sw, sh);
+  }-*/;
+
+  public final native boolean isPointInPath(float x, float y) /*-{
+    return this.isPointInPath(x, y);
+  }-*/;
+
+  public final native void lineTo(float x, float y) /*-{
+    this.lineTo(x, y);
+  }-*/;
+
+  public final native JsTextMetrics measureText(String text) /*-{
+    return this.measureText(text);
+  }-*/;
+
+  public final native void moveTo(float x, float y) /*-{
+    this.moveTo(x, y);
+  }-*/;
+
+  public final native void putImageData(ImageData imagedata, float dx, float dy) /*-{
+    this.putImageData(imagedata, dx, dy);
+  }-*/;
+
+  public final native void putImageData(ImageData imagedata, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight) /*-{
+    this.putImageData(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+  }-*/;
+
+  public final native void quadraticCurveTo(float cpx, float cpy, float x, float y) /*-{
+    this.quadraticCurveTo(cpx, cpy, x, y);
+  }-*/;
+
+  public final native void rect(float x, float y, float width, float height) /*-{
+    this.rect(x, y, width, height);
+  }-*/;
+
+  public final native void restore() /*-{
+    this.restore();
+  }-*/;
+
+  public final native void rotate(float angle) /*-{
+    this.rotate(angle);
+  }-*/;
+
+  public final native void save() /*-{
+    this.save();
+  }-*/;
+
+  public final native void scale(float sx, float sy) /*-{
+    this.scale(sx, sy);
+  }-*/;
+
+  public final native void setAlpha(float alpha) /*-{
+    this.setAlpha(alpha);
+  }-*/;
+
+  public final native void setCompositeOperation(String compositeOperation) /*-{
+    this.setCompositeOperation(compositeOperation);
+  }-*/;
+
+  public final native void setFillColor(String color) /*-{
+    this.setFillColor(color);
+  }-*/;
+
+  public final native void setFillColor(String color, float alpha) /*-{
+    this.setFillColor(color, alpha);
+  }-*/;
+
+  public final native void setFillColor(float grayLevel) /*-{
+    this.setFillColor(grayLevel);
+  }-*/;
+
+  public final native void setFillColor(float grayLevel, float alpha) /*-{
+    this.setFillColor(grayLevel, alpha);
+  }-*/;
+
+  public final native void setFillColor(float r, float g, float b, float a) /*-{
+    this.setFillColor(r, g, b, a);
+  }-*/;
+
+  public final native void setFillColor(float c, float m, float y, float k, float a) /*-{
+    this.setFillColor(c, m, y, k, a);
+  }-*/;
+
+  public final native void setShadow(float width, float height, float blur) /*-{
+    this.setShadow(width, height, blur);
+  }-*/;
+
+  public final native void setShadow(float width, float height, float blur, String color) /*-{
+    this.setShadow(width, height, blur, color);
+  }-*/;
+
+  public final native void setShadow(float width, float height, float blur, String color, float alpha) /*-{
+    this.setShadow(width, height, blur, color, alpha);
+  }-*/;
+
+  public final native void setShadow(float width, float height, float blur, float grayLevel) /*-{
+    this.setShadow(width, height, blur, grayLevel);
+  }-*/;
+
+  public final native void setShadow(float width, float height, float blur, float grayLevel, float alpha) /*-{
+    this.setShadow(width, height, blur, grayLevel, alpha);
+  }-*/;
+
+  public final native void setShadow(float width, float height, float blur, float r, float g, float b, float a) /*-{
+    this.setShadow(width, height, blur, r, g, b, a);
+  }-*/;
+
+  public final native void setShadow(float width, float height, float blur, float c, float m, float y, float k, float a) /*-{
+    this.setShadow(width, height, blur, c, m, y, k, a);
+  }-*/;
+
+  public final native void setStrokeColor(String color) /*-{
+    this.setStrokeColor(color);
+  }-*/;
+
+  public final native void setStrokeColor(String color, float alpha) /*-{
+    this.setStrokeColor(color, alpha);
+  }-*/;
+
+  public final native void setStrokeColor(float grayLevel) /*-{
+    this.setStrokeColor(grayLevel);
+  }-*/;
+
+  public final native void setStrokeColor(float grayLevel, float alpha) /*-{
+    this.setStrokeColor(grayLevel, alpha);
+  }-*/;
+
+  public final native void setStrokeColor(float r, float g, float b, float a) /*-{
+    this.setStrokeColor(r, g, b, a);
+  }-*/;
+
+  public final native void setStrokeColor(float c, float m, float y, float k, float a) /*-{
+    this.setStrokeColor(c, m, y, k, a);
+  }-*/;
+
+  public final native void setTransform(float m11, float m12, float m21, float m22, float dx, float dy) /*-{
+    this.setTransform(m11, m12, m21, m22, dx, dy);
+  }-*/;
+
+  public final native void stroke() /*-{
+    this.stroke();
+  }-*/;
+
+  public final native void strokeRect(float x, float y, float width, float height) /*-{
+    this.strokeRect(x, y, width, height);
+  }-*/;
+
+  public final native void strokeRect(float x, float y, float width, float height, float lineWidth) /*-{
+    this.strokeRect(x, y, width, height, lineWidth);
+  }-*/;
+
+  public final native void strokeText(String text, float x, float y) /*-{
+    this.strokeText(text, x, y);
+  }-*/;
+
+  public final native void strokeText(String text, float x, float y, float maxWidth) /*-{
+    this.strokeText(text, x, y, maxWidth);
+  }-*/;
+
+  public final native void transform(float m11, float m12, float m21, float m22, float dx, float dy) /*-{
+    this.transform(m11, m12, m21, m22, dx, dy);
+  }-*/;
+
+  public final native void translate(float tx, float ty) /*-{
+    this.translate(tx, ty);
+  }-*/;
+
+  public final native JsImageData webkitGetImageDataHD(float sx, float sy, float sw, float sh) /*-{
+    return this.webkitGetImageDataHD(sx, sy, sw, sh);
+  }-*/;
+
+  public final native void webkitPutImageDataHD(ImageData imagedata, float dx, float dy) /*-{
+    this.webkitPutImageDataHD(imagedata, dx, dy);
+  }-*/;
+
+  public final native void webkitPutImageDataHD(ImageData imagedata, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight) /*-{
+    this.webkitPutImageDataHD(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsClientRect.java b/elemental/src/elemental/js/html/JsClientRect.java
new file mode 100644
index 0000000..e5e328b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsClientRect.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ClientRect;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsClientRect extends JsElementalMixinBase  implements ClientRect {
+  protected JsClientRect() {}
+
+  public final native float getBottom() /*-{
+    return this.bottom;
+  }-*/;
+
+  public final native float getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native float getLeft() /*-{
+    return this.left;
+  }-*/;
+
+  public final native float getRight() /*-{
+    return this.right;
+  }-*/;
+
+  public final native float getTop() /*-{
+    return this.top;
+  }-*/;
+
+  public final native float getWidth() /*-{
+    return this.width;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsClientRectList.java b/elemental/src/elemental/js/html/JsClientRectList.java
new file mode 100644
index 0000000..f15f1ea
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsClientRectList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ClientRectList;
+import elemental.html.ClientRect;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsClientRectList extends JsElementalMixinBase  implements ClientRectList {
+  protected JsClientRectList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsClientRect item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsConsole.java b/elemental/src/elemental/js/html/JsConsole.java
new file mode 100644
index 0000000..4d5b0ea
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsConsole.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Console;
+import elemental.html.MemoryInfo;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsConsole extends JsElementalMixinBase  implements Console {
+  protected JsConsole() {}
+
+  public final native JsMemoryInfo getMemory() /*-{
+    return this.memory;
+  }-*/;
+
+  public final native JsIndexable getProfiles() /*-{
+    return this.profiles;
+  }-*/;
+
+  public final native void assertCondition(boolean condition, Object arg) /*-{
+    this.assertCondition(condition, arg);
+  }-*/;
+
+  public final native void count() /*-{
+    this.count();
+  }-*/;
+
+  public final native void debug(Object arg) /*-{
+    this.debug(arg);
+  }-*/;
+
+  public final native void dir() /*-{
+    this.dir();
+  }-*/;
+
+  public final native void dirxml() /*-{
+    this.dirxml();
+  }-*/;
+
+  public final native void error(Object arg) /*-{
+    this.error(arg);
+  }-*/;
+
+  public final native void group(Object arg) /*-{
+    this.group(arg);
+  }-*/;
+
+  public final native void groupCollapsed(Object arg) /*-{
+    this.groupCollapsed(arg);
+  }-*/;
+
+  public final native void groupEnd() /*-{
+    this.groupEnd();
+  }-*/;
+
+  public final native void info(Object arg) /*-{
+    this.info(arg);
+  }-*/;
+
+  public final native void log(Object arg) /*-{
+    this.log(arg);
+  }-*/;
+
+  public final native void markTimeline() /*-{
+    this.markTimeline();
+  }-*/;
+
+  public final native void profile(String title) /*-{
+    this.profile(title);
+  }-*/;
+
+  public final native void profileEnd(String title) /*-{
+    this.profileEnd(title);
+  }-*/;
+
+  public final native void time(String title) /*-{
+    this.time(title);
+  }-*/;
+
+  public final native void timeEnd(String title, Object arg) /*-{
+    this.timeEnd(title, arg);
+  }-*/;
+
+  public final native void timeStamp(Object arg) /*-{
+    this.timeStamp(arg);
+  }-*/;
+
+  public final native void trace(Object arg) /*-{
+    this.trace(arg);
+  }-*/;
+
+  public final native void warn(Object arg) /*-{
+    this.warn(arg);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsContentElement.java b/elemental/src/elemental/js/html/JsContentElement.java
new file mode 100644
index 0000000..9ea41db
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsContentElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.ContentElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsContentElement extends JsElement  implements ContentElement {
+  protected JsContentElement() {}
+
+  public final native String getSelect() /*-{
+    return this.select;
+  }-*/;
+
+  public final native void setSelect(String param_select) /*-{
+    this.select = param_select;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsConvolverNode.java b/elemental/src/elemental/js/html/JsConvolverNode.java
new file mode 100644
index 0000000..35ee355
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsConvolverNode.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ConvolverNode;
+import elemental.html.AudioNode;
+import elemental.html.AudioBuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsConvolverNode extends JsAudioNode  implements ConvolverNode {
+  protected JsConvolverNode() {}
+
+  public final native JsAudioBuffer getBuffer() /*-{
+    return this.buffer;
+  }-*/;
+
+  public final native void setBuffer(AudioBuffer param_buffer) /*-{
+    this.buffer = param_buffer;
+  }-*/;
+
+  public final native boolean isNormalize() /*-{
+    return this.normalize;
+  }-*/;
+
+  public final native void setNormalize(boolean param_normalize) /*-{
+    this.normalize = param_normalize;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsCrypto.java b/elemental/src/elemental/js/html/JsCrypto.java
new file mode 100644
index 0000000..e069ca2
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsCrypto.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ArrayBufferView;
+import elemental.html.Crypto;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsCrypto extends JsElementalMixinBase  implements Crypto {
+  protected JsCrypto() {}
+
+  public final native void getRandomValues(ArrayBufferView array) /*-{
+    this.getRandomValues(array);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDListElement.java b/elemental/src/elemental/js/html/JsDListElement.java
new file mode 100644
index 0000000..354f117
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDListElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.DListElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDListElement extends JsElement  implements DListElement {
+  protected JsDListElement() {}
+
+  public final native boolean isCompact() /*-{
+    return this.compact;
+  }-*/;
+
+  public final native void setCompact(boolean param_compact) /*-{
+    this.compact = param_compact;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDOMFileSystem.java b/elemental/src/elemental/js/html/JsDOMFileSystem.java
new file mode 100644
index 0000000..aeda6dd
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDOMFileSystem.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DirectoryEntry;
+import elemental.html.DOMFileSystem;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMFileSystem extends JsElementalMixinBase  implements DOMFileSystem {
+  protected JsDOMFileSystem() {}
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native JsDirectoryEntry getRoot() /*-{
+    return this.root;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDOMFileSystemSync.java b/elemental/src/elemental/js/html/JsDOMFileSystemSync.java
new file mode 100644
index 0000000..1843123
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDOMFileSystemSync.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DirectoryEntrySync;
+import elemental.html.DOMFileSystemSync;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMFileSystemSync extends JsElementalMixinBase  implements DOMFileSystemSync {
+  protected JsDOMFileSystemSync() {}
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native JsDirectoryEntrySync getRoot() /*-{
+    return this.root;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDOMMimeType.java b/elemental/src/elemental/js/html/JsDOMMimeType.java
new file mode 100644
index 0000000..1dd4fcc
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDOMMimeType.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DOMPlugin;
+import elemental.html.DOMMimeType;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMMimeType extends JsElementalMixinBase  implements DOMMimeType {
+  protected JsDOMMimeType() {}
+
+  public final native String getDescription() /*-{
+    return this.description;
+  }-*/;
+
+  public final native JsDOMPlugin getEnabledPlugin() /*-{
+    return this.enabledPlugin;
+  }-*/;
+
+  public final native String getSuffixes() /*-{
+    return this.suffixes;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDOMMimeTypeArray.java b/elemental/src/elemental/js/html/JsDOMMimeTypeArray.java
new file mode 100644
index 0000000..d96dd23
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDOMMimeTypeArray.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DOMMimeType;
+import elemental.html.DOMMimeTypeArray;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMMimeTypeArray extends JsElementalMixinBase  implements DOMMimeTypeArray {
+  protected JsDOMMimeTypeArray() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsDOMMimeType item(int index) /*-{
+    return this.item(index);
+  }-*/;
+
+  public final native JsDOMMimeType namedItem(String name) /*-{
+    return this.namedItem(name);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDOMPlugin.java b/elemental/src/elemental/js/html/JsDOMPlugin.java
new file mode 100644
index 0000000..2ff0229
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDOMPlugin.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DOMPlugin;
+import elemental.html.DOMMimeType;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMPlugin extends JsElementalMixinBase  implements DOMPlugin {
+  protected JsDOMPlugin() {}
+
+  public final native String getDescription() /*-{
+    return this.description;
+  }-*/;
+
+  public final native String getFilename() /*-{
+    return this.filename;
+  }-*/;
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native JsDOMMimeType item(int index) /*-{
+    return this.item(index);
+  }-*/;
+
+  public final native JsDOMMimeType namedItem(String name) /*-{
+    return this.namedItem(name);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDOMPluginArray.java b/elemental/src/elemental/js/html/JsDOMPluginArray.java
new file mode 100644
index 0000000..5e7735b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDOMPluginArray.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DOMPlugin;
+import elemental.html.DOMPluginArray;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMPluginArray extends JsElementalMixinBase  implements DOMPluginArray {
+  protected JsDOMPluginArray() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsDOMPlugin item(int index) /*-{
+    return this.item(index);
+  }-*/;
+
+  public final native JsDOMPlugin namedItem(String name) /*-{
+    return this.namedItem(name);
+  }-*/;
+
+  public final native void refresh(boolean reload) /*-{
+    this.refresh(reload);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDOMURL.java b/elemental/src/elemental/js/html/JsDOMURL.java
new file mode 100644
index 0000000..c6e1998
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDOMURL.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsMediaStream;
+import elemental.dom.MediaStream;
+import elemental.html.DOMURL;
+import elemental.html.Blob;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMURL extends JsElementalMixinBase  implements DOMURL {
+  protected JsDOMURL() {}
+}
diff --git a/elemental/src/elemental/js/html/JsDataView.java b/elemental/src/elemental/js/html/JsDataView.java
new file mode 100644
index 0000000..0401fca
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDataView.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DataView;
+import elemental.html.ArrayBufferView;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDataView extends JsArrayBufferView  implements DataView {
+  protected JsDataView() {}
+
+  public final native float getFloat32(int byteOffset) /*-{
+    return this.getFloat32(byteOffset);
+  }-*/;
+
+  public final native float getFloat32(int byteOffset, boolean littleEndian) /*-{
+    return this.getFloat32(byteOffset, littleEndian);
+  }-*/;
+
+  public final native double getFloat64(int byteOffset) /*-{
+    return this.getFloat64(byteOffset);
+  }-*/;
+
+  public final native double getFloat64(int byteOffset, boolean littleEndian) /*-{
+    return this.getFloat64(byteOffset, littleEndian);
+  }-*/;
+
+  public final native short getInt16(int byteOffset) /*-{
+    return this.getInt16(byteOffset);
+  }-*/;
+
+  public final native short getInt16(int byteOffset, boolean littleEndian) /*-{
+    return this.getInt16(byteOffset, littleEndian);
+  }-*/;
+
+  public final native int getInt32(int byteOffset) /*-{
+    return this.getInt32(byteOffset);
+  }-*/;
+
+  public final native int getInt32(int byteOffset, boolean littleEndian) /*-{
+    return this.getInt32(byteOffset, littleEndian);
+  }-*/;
+
+  public final native Object getInt8() /*-{
+    return this.getInt8();
+  }-*/;
+
+  public final native int getUint16(int byteOffset) /*-{
+    return this.getUint16(byteOffset);
+  }-*/;
+
+  public final native int getUint16(int byteOffset, boolean littleEndian) /*-{
+    return this.getUint16(byteOffset, littleEndian);
+  }-*/;
+
+  public final native int getUint32(int byteOffset) /*-{
+    return this.getUint32(byteOffset);
+  }-*/;
+
+  public final native int getUint32(int byteOffset, boolean littleEndian) /*-{
+    return this.getUint32(byteOffset, littleEndian);
+  }-*/;
+
+  public final native Object getUint8() /*-{
+    return this.getUint8();
+  }-*/;
+
+  public final native void setFloat32(int byteOffset, float value) /*-{
+    this.setFloat32(byteOffset, value);
+  }-*/;
+
+  public final native void setFloat32(int byteOffset, float value, boolean littleEndian) /*-{
+    this.setFloat32(byteOffset, value, littleEndian);
+  }-*/;
+
+  public final native void setFloat64(int byteOffset, double value) /*-{
+    this.setFloat64(byteOffset, value);
+  }-*/;
+
+  public final native void setFloat64(int byteOffset, double value, boolean littleEndian) /*-{
+    this.setFloat64(byteOffset, value, littleEndian);
+  }-*/;
+
+  public final native void setInt16(int byteOffset, short value) /*-{
+    this.setInt16(byteOffset, value);
+  }-*/;
+
+  public final native void setInt16(int byteOffset, short value, boolean littleEndian) /*-{
+    this.setInt16(byteOffset, value, littleEndian);
+  }-*/;
+
+  public final native void setInt32(int byteOffset, int value) /*-{
+    this.setInt32(byteOffset, value);
+  }-*/;
+
+  public final native void setInt32(int byteOffset, int value, boolean littleEndian) /*-{
+    this.setInt32(byteOffset, value, littleEndian);
+  }-*/;
+
+  public final native void setInt8() /*-{
+    this.setInt8();
+  }-*/;
+
+  public final native void setUint16(int byteOffset, int value) /*-{
+    this.setUint16(byteOffset, value);
+  }-*/;
+
+  public final native void setUint16(int byteOffset, int value, boolean littleEndian) /*-{
+    this.setUint16(byteOffset, value, littleEndian);
+  }-*/;
+
+  public final native void setUint32(int byteOffset, int value) /*-{
+    this.setUint32(byteOffset, value);
+  }-*/;
+
+  public final native void setUint32(int byteOffset, int value, boolean littleEndian) /*-{
+    this.setUint32(byteOffset, value, littleEndian);
+  }-*/;
+
+  public final native void setUint8() /*-{
+    this.setUint8();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDatabase.java b/elemental/src/elemental/js/html/JsDatabase.java
new file mode 100644
index 0000000..80f8743
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDatabase.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.SQLTransactionErrorCallback;
+import elemental.html.Database;
+import elemental.html.SQLTransactionCallback;
+import elemental.html.VoidCallback;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDatabase extends JsElementalMixinBase  implements Database {
+  protected JsDatabase() {}
+
+  public final native String getVersion() /*-{
+    return this.version;
+  }-*/;
+
+  public final native void changeVersion(String oldVersion, String newVersion) /*-{
+    this.changeVersion(oldVersion, newVersion);
+  }-*/;
+
+  public final native void changeVersion(String oldVersion, String newVersion, SQLTransactionCallback callback) /*-{
+    this.changeVersion(oldVersion, newVersion, $entry(callback.@elemental.html.SQLTransactionCallback::onSQLTransactionCallback(Lelemental/html/SQLTransaction;)).bind(callback));
+  }-*/;
+
+  public final native void changeVersion(String oldVersion, String newVersion, SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback) /*-{
+    this.changeVersion(oldVersion, newVersion, $entry(callback.@elemental.html.SQLTransactionCallback::onSQLTransactionCallback(Lelemental/html/SQLTransaction;)).bind(callback), $entry(errorCallback.@elemental.html.SQLTransactionErrorCallback::onSQLTransactionErrorCallback(Lelemental/html/SQLError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void changeVersion(String oldVersion, String newVersion, SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback) /*-{
+    this.changeVersion(oldVersion, newVersion, $entry(callback.@elemental.html.SQLTransactionCallback::onSQLTransactionCallback(Lelemental/html/SQLTransaction;)).bind(callback), $entry(errorCallback.@elemental.html.SQLTransactionErrorCallback::onSQLTransactionErrorCallback(Lelemental/html/SQLError;)).bind(errorCallback), $entry(successCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(successCallback));
+  }-*/;
+
+  public final native void readTransaction(SQLTransactionCallback callback) /*-{
+    this.readTransaction($entry(callback.@elemental.html.SQLTransactionCallback::onSQLTransactionCallback(Lelemental/html/SQLTransaction;)).bind(callback));
+  }-*/;
+
+  public final native void readTransaction(SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback) /*-{
+    this.readTransaction($entry(callback.@elemental.html.SQLTransactionCallback::onSQLTransactionCallback(Lelemental/html/SQLTransaction;)).bind(callback), $entry(errorCallback.@elemental.html.SQLTransactionErrorCallback::onSQLTransactionErrorCallback(Lelemental/html/SQLError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void readTransaction(SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback) /*-{
+    this.readTransaction($entry(callback.@elemental.html.SQLTransactionCallback::onSQLTransactionCallback(Lelemental/html/SQLTransaction;)).bind(callback), $entry(errorCallback.@elemental.html.SQLTransactionErrorCallback::onSQLTransactionErrorCallback(Lelemental/html/SQLError;)).bind(errorCallback), $entry(successCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(successCallback));
+  }-*/;
+
+  public final native void transaction(SQLTransactionCallback callback) /*-{
+    this.transaction($entry(callback.@elemental.html.SQLTransactionCallback::onSQLTransactionCallback(Lelemental/html/SQLTransaction;)).bind(callback));
+  }-*/;
+
+  public final native void transaction(SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback) /*-{
+    this.transaction($entry(callback.@elemental.html.SQLTransactionCallback::onSQLTransactionCallback(Lelemental/html/SQLTransaction;)).bind(callback), $entry(errorCallback.@elemental.html.SQLTransactionErrorCallback::onSQLTransactionErrorCallback(Lelemental/html/SQLError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void transaction(SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback) /*-{
+    this.transaction($entry(callback.@elemental.html.SQLTransactionCallback::onSQLTransactionCallback(Lelemental/html/SQLTransaction;)).bind(callback), $entry(errorCallback.@elemental.html.SQLTransactionErrorCallback::onSQLTransactionErrorCallback(Lelemental/html/SQLError;)).bind(errorCallback), $entry(successCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(successCallback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDatabaseSync.java b/elemental/src/elemental/js/html/JsDatabaseSync.java
new file mode 100644
index 0000000..2182701
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDatabaseSync.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.SQLTransactionSyncCallback;
+import elemental.html.DatabaseSync;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDatabaseSync extends JsElementalMixinBase  implements DatabaseSync {
+  protected JsDatabaseSync() {}
+
+  public final native String getLastErrorMessage() /*-{
+    return this.lastErrorMessage;
+  }-*/;
+
+  public final native String getVersion() /*-{
+    return this.version;
+  }-*/;
+
+  public final native void changeVersion(String oldVersion, String newVersion) /*-{
+    this.changeVersion(oldVersion, newVersion);
+  }-*/;
+
+  public final native void changeVersion(String oldVersion, String newVersion, SQLTransactionSyncCallback callback) /*-{
+    this.changeVersion(oldVersion, newVersion, $entry(callback.@elemental.html.SQLTransactionSyncCallback::onSQLTransactionSyncCallback(Lelemental/html/SQLTransactionSync;)).bind(callback));
+  }-*/;
+
+  public final native void readTransaction(SQLTransactionSyncCallback callback) /*-{
+    this.readTransaction($entry(callback.@elemental.html.SQLTransactionSyncCallback::onSQLTransactionSyncCallback(Lelemental/html/SQLTransactionSync;)).bind(callback));
+  }-*/;
+
+  public final native void transaction(SQLTransactionSyncCallback callback) /*-{
+    this.transaction($entry(callback.@elemental.html.SQLTransactionSyncCallback::onSQLTransactionSyncCallback(Lelemental/html/SQLTransactionSync;)).bind(callback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDedicatedWorkerGlobalScope.java b/elemental/src/elemental/js/html/JsDedicatedWorkerGlobalScope.java
new file mode 100644
index 0000000..beb3e0a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDedicatedWorkerGlobalScope.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DedicatedWorkerGlobalScope;
+import elemental.util.Indexable;
+import elemental.html.WorkerGlobalScope;
+import elemental.js.util.JsIndexable;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDedicatedWorkerGlobalScope extends JsWorkerGlobalScope  implements DedicatedWorkerGlobalScope {
+  protected JsDedicatedWorkerGlobalScope() {}
+
+  public final native EventListener getOnmessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmessage);
+  }-*/;
+
+  public final native void setOnmessage(EventListener listener) /*-{
+    this.onmessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native void postMessage(Object message) /*-{
+    this.postMessage(message);
+  }-*/;
+
+  public final native void postMessage(Object message, Indexable messagePorts) /*-{
+    this.postMessage(message, messagePorts);
+  }-*/;
+
+  public final native void webkitPostMessage(Object message) /*-{
+    this.webkitPostMessage(message);
+  }-*/;
+
+  public final native void webkitPostMessage(Object message, Indexable transferList) /*-{
+    this.webkitPostMessage(message, transferList);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDelayNode.java b/elemental/src/elemental/js/html/JsDelayNode.java
new file mode 100644
index 0000000..45af4e0
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDelayNode.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DelayNode;
+import elemental.html.AudioParam;
+import elemental.html.AudioNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDelayNode extends JsAudioNode  implements DelayNode {
+  protected JsDelayNode() {}
+
+  public final native JsAudioParam getDelayTime() /*-{
+    return this.delayTime;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDeprecatedPeerConnection.java b/elemental/src/elemental/js/html/JsDeprecatedPeerConnection.java
new file mode 100644
index 0000000..40f62bf
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDeprecatedPeerConnection.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.dom.MediaStream;
+import elemental.js.dom.JsMediaStreamList;
+import elemental.dom.MediaStreamList;
+import elemental.js.events.JsEvent;
+import elemental.html.DeprecatedPeerConnection;
+import elemental.events.EventListener;
+import elemental.js.dom.JsMediaStream;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDeprecatedPeerConnection extends JsElementalMixinBase  implements DeprecatedPeerConnection {
+  protected JsDeprecatedPeerConnection() {}
+
+  public final native JsMediaStreamList getLocalStreams() /*-{
+    return this.localStreams;
+  }-*/;
+
+  public final native EventListener getOnaddstream() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onaddstream);
+  }-*/;
+
+  public final native void setOnaddstream(EventListener listener) /*-{
+    this.onaddstream = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnconnecting() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onconnecting);
+  }-*/;
+
+  public final native void setOnconnecting(EventListener listener) /*-{
+    this.onconnecting = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmessage);
+  }-*/;
+
+  public final native void setOnmessage(EventListener listener) /*-{
+    this.onmessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnopen() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onopen);
+  }-*/;
+
+  public final native void setOnopen(EventListener listener) /*-{
+    this.onopen = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnremovestream() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onremovestream);
+  }-*/;
+
+  public final native void setOnremovestream(EventListener listener) /*-{
+    this.onremovestream = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnstatechange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onstatechange);
+  }-*/;
+
+  public final native void setOnstatechange(EventListener listener) /*-{
+    this.onstatechange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native JsMediaStreamList getRemoteStreams() /*-{
+    return this.remoteStreams;
+  }-*/;
+
+  public final native void addStream(MediaStream stream) /*-{
+    this.addStream(stream);
+  }-*/;
+
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+
+  public final native void processSignalingMessage(String message) /*-{
+    this.processSignalingMessage(message);
+  }-*/;
+
+  public final native void removeStream(MediaStream stream) /*-{
+    this.removeStream(stream);
+  }-*/;
+
+  public final native void send(String text) /*-{
+    this.send(text);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDetailsElement.java b/elemental/src/elemental/js/html/JsDetailsElement.java
new file mode 100644
index 0000000..98f5807
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDetailsElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.DetailsElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDetailsElement extends JsElement  implements DetailsElement {
+  protected JsDetailsElement() {}
+
+  public final native boolean isOpen() /*-{
+    return this.open;
+  }-*/;
+
+  public final native void setOpen(boolean param_open) /*-{
+    this.open = param_open;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDirectoryElement.java b/elemental/src/elemental/js/html/JsDirectoryElement.java
new file mode 100644
index 0000000..46e78aa
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDirectoryElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.DirectoryElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDirectoryElement extends JsElement  implements DirectoryElement {
+  protected JsDirectoryElement() {}
+
+  public final native boolean isCompact() /*-{
+    return this.compact;
+  }-*/;
+
+  public final native void setCompact(boolean param_compact) /*-{
+    this.compact = param_compact;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDirectoryEntry.java b/elemental/src/elemental/js/html/JsDirectoryEntry.java
new file mode 100644
index 0000000..b5a89fa
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDirectoryEntry.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.VoidCallback;
+import elemental.html.EntryCallback;
+import elemental.html.Entry;
+import elemental.html.DirectoryEntry;
+import elemental.html.ErrorCallback;
+import elemental.html.DirectoryReader;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDirectoryEntry extends JsEntry  implements DirectoryEntry {
+  protected JsDirectoryEntry() {}
+
+  public final native JsDirectoryReader createReader() /*-{
+    return this.createReader();
+  }-*/;
+
+  public final native void getDirectory(String path) /*-{
+    this.getDirectory(path);
+  }-*/;
+
+  public final native void getDirectory(String path, Object flags) /*-{
+    this.getDirectory(path, flags);
+  }-*/;
+
+  public final native void getDirectory(String path, Object flags, EntryCallback successCallback) /*-{
+    this.getDirectory(path, flags, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback));
+  }-*/;
+
+  public final native void getDirectory(String path, Object flags, EntryCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.getDirectory(path, flags, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void getFile(String path) /*-{
+    this.getFile(path);
+  }-*/;
+
+  public final native void getFile(String path, Object flags) /*-{
+    this.getFile(path, flags);
+  }-*/;
+
+  public final native void getFile(String path, Object flags, EntryCallback successCallback) /*-{
+    this.getFile(path, flags, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback));
+  }-*/;
+
+  public final native void getFile(String path, Object flags, EntryCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.getFile(path, flags, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void removeRecursively(VoidCallback successCallback) /*-{
+    this.removeRecursively($entry(successCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(successCallback));
+  }-*/;
+
+  public final native void removeRecursively(VoidCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.removeRecursively($entry(successCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDirectoryEntrySync.java b/elemental/src/elemental/js/html/JsDirectoryEntrySync.java
new file mode 100644
index 0000000..6dfa534
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDirectoryEntrySync.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DirectoryEntrySync;
+import elemental.html.EntrySync;
+import elemental.html.FileEntrySync;
+import elemental.html.DirectoryReaderSync;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDirectoryEntrySync extends JsEntrySync  implements DirectoryEntrySync {
+  protected JsDirectoryEntrySync() {}
+
+  public final native JsDirectoryReaderSync createReader() /*-{
+    return this.createReader();
+  }-*/;
+
+  public final native JsDirectoryEntrySync getDirectory(String path, Object flags) /*-{
+    return this.getDirectory(path, flags);
+  }-*/;
+
+  public final native JsFileEntrySync getFile(String path, Object flags) /*-{
+    return this.getFile(path, flags);
+  }-*/;
+
+  public final native void removeRecursively() /*-{
+    this.removeRecursively();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDirectoryReader.java b/elemental/src/elemental/js/html/JsDirectoryReader.java
new file mode 100644
index 0000000..ed1d213
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDirectoryReader.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.EntriesCallback;
+import elemental.html.DirectoryReader;
+import elemental.html.ErrorCallback;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDirectoryReader extends JsElementalMixinBase  implements DirectoryReader {
+  protected JsDirectoryReader() {}
+
+  public final native void readEntries(EntriesCallback successCallback) /*-{
+    this.readEntries($entry(successCallback.@elemental.html.EntriesCallback::onEntriesCallback(Lelemental/html/EntryArray;)).bind(successCallback));
+  }-*/;
+
+  public final native void readEntries(EntriesCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.readEntries($entry(successCallback.@elemental.html.EntriesCallback::onEntriesCallback(Lelemental/html/EntryArray;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDirectoryReaderSync.java b/elemental/src/elemental/js/html/JsDirectoryReaderSync.java
new file mode 100644
index 0000000..32252fe
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDirectoryReaderSync.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.EntryArraySync;
+import elemental.html.DirectoryReaderSync;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDirectoryReaderSync extends JsElementalMixinBase  implements DirectoryReaderSync {
+  protected JsDirectoryReaderSync() {}
+
+  public final native JsEntryArraySync readEntries() /*-{
+    return this.readEntries();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDivElement.java b/elemental/src/elemental/js/html/JsDivElement.java
new file mode 100644
index 0000000..f0ac184
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDivElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.DivElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDivElement extends JsElement  implements DivElement {
+  protected JsDivElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsDynamicsCompressorNode.java b/elemental/src/elemental/js/html/JsDynamicsCompressorNode.java
new file mode 100644
index 0000000..89762e5
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsDynamicsCompressorNode.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioParam;
+import elemental.html.AudioNode;
+import elemental.html.DynamicsCompressorNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDynamicsCompressorNode extends JsAudioNode  implements DynamicsCompressorNode {
+  protected JsDynamicsCompressorNode() {}
+
+  public final native JsAudioParam getAttack() /*-{
+    return this.attack;
+  }-*/;
+
+  public final native JsAudioParam getKnee() /*-{
+    return this.knee;
+  }-*/;
+
+  public final native JsAudioParam getRatio() /*-{
+    return this.ratio;
+  }-*/;
+
+  public final native JsAudioParam getReduction() /*-{
+    return this.reduction;
+  }-*/;
+
+  public final native JsAudioParam getRelease() /*-{
+    return this.release;
+  }-*/;
+
+  public final native JsAudioParam getThreshold() /*-{
+    return this.threshold;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsEXTTextureFilterAnisotropic.java b/elemental/src/elemental/js/html/JsEXTTextureFilterAnisotropic.java
new file mode 100644
index 0000000..c6789d0
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsEXTTextureFilterAnisotropic.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.EXTTextureFilterAnisotropic;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEXTTextureFilterAnisotropic extends JsElementalMixinBase  implements EXTTextureFilterAnisotropic {
+  protected JsEXTTextureFilterAnisotropic() {}
+}
diff --git a/elemental/src/elemental/js/html/JsEmbedElement.java b/elemental/src/elemental/js/html/JsEmbedElement.java
new file mode 100644
index 0000000..ed198bf
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsEmbedElement.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.svg.SVGDocument;
+import elemental.html.EmbedElement;
+import elemental.js.svg.JsSVGDocument;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEmbedElement extends JsElement  implements EmbedElement {
+  protected JsEmbedElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(String param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+
+  public final native String getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(String param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native JsSVGDocument getSVGDocument() /*-{
+    return this.getSVGDocument();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsEntry.java b/elemental/src/elemental/js/html/JsEntry.java
new file mode 100644
index 0000000..f15b836
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsEntry.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.VoidCallback;
+import elemental.html.EntryCallback;
+import elemental.html.Entry;
+import elemental.html.DirectoryEntry;
+import elemental.html.ErrorCallback;
+import elemental.html.MetadataCallback;
+import elemental.html.DOMFileSystem;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEntry extends JsElementalMixinBase  implements Entry {
+  protected JsEntry() {}
+
+  public final native JsDOMFileSystem getFilesystem() /*-{
+    return this.filesystem;
+  }-*/;
+
+  public final native String getFullPath() /*-{
+    return this.fullPath;
+  }-*/;
+
+  public final native boolean isDirectory() /*-{
+    return this.isDirectory;
+  }-*/;
+
+  public final native boolean isFile() /*-{
+    return this.isFile;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void copyTo(DirectoryEntry parent) /*-{
+    this.copyTo(parent);
+  }-*/;
+
+  public final native void copyTo(DirectoryEntry parent, String name) /*-{
+    this.copyTo(parent, name);
+  }-*/;
+
+  public final native void copyTo(DirectoryEntry parent, String name, EntryCallback successCallback) /*-{
+    this.copyTo(parent, name, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback));
+  }-*/;
+
+  public final native void copyTo(DirectoryEntry parent, String name, EntryCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.copyTo(parent, name, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void getMetadata(MetadataCallback successCallback) /*-{
+    this.getMetadata($entry(successCallback.@elemental.html.MetadataCallback::onMetadataCallback(Lelemental/html/Metadata;)).bind(successCallback));
+  }-*/;
+
+  public final native void getMetadata(MetadataCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.getMetadata($entry(successCallback.@elemental.html.MetadataCallback::onMetadataCallback(Lelemental/html/Metadata;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void getParent() /*-{
+    this.getParent();
+  }-*/;
+
+  public final native void getParent(EntryCallback successCallback) /*-{
+    this.getParent($entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback));
+  }-*/;
+
+  public final native void getParent(EntryCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.getParent($entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void moveTo(DirectoryEntry parent) /*-{
+    this.moveTo(parent);
+  }-*/;
+
+  public final native void moveTo(DirectoryEntry parent, String name) /*-{
+    this.moveTo(parent, name);
+  }-*/;
+
+  public final native void moveTo(DirectoryEntry parent, String name, EntryCallback successCallback) /*-{
+    this.moveTo(parent, name, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback));
+  }-*/;
+
+  public final native void moveTo(DirectoryEntry parent, String name, EntryCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.moveTo(parent, name, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void remove(VoidCallback successCallback) /*-{
+    this.remove($entry(successCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(successCallback));
+  }-*/;
+
+  public final native void remove(VoidCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.remove($entry(successCallback.@elemental.html.VoidCallback::onVoidCallback()).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native String toURL() /*-{
+    return this.toURL();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsEntryArray.java b/elemental/src/elemental/js/html/JsEntryArray.java
new file mode 100644
index 0000000..7b562d6
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsEntryArray.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Entry;
+import elemental.html.EntryArray;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEntryArray extends JsElementalMixinBase  implements EntryArray {
+  protected JsEntryArray() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsEntry item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsEntryArraySync.java b/elemental/src/elemental/js/html/JsEntryArraySync.java
new file mode 100644
index 0000000..6999e88
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsEntryArraySync.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.EntryArraySync;
+import elemental.html.EntrySync;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEntryArraySync extends JsElementalMixinBase  implements EntryArraySync {
+  protected JsEntryArraySync() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsEntrySync item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsEntrySync.java b/elemental/src/elemental/js/html/JsEntrySync.java
new file mode 100644
index 0000000..362947f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsEntrySync.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Metadata;
+import elemental.html.DirectoryEntrySync;
+import elemental.html.EntrySync;
+import elemental.html.DOMFileSystemSync;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEntrySync extends JsElementalMixinBase  implements EntrySync {
+  protected JsEntrySync() {}
+
+  public final native JsDOMFileSystemSync getFilesystem() /*-{
+    return this.filesystem;
+  }-*/;
+
+  public final native String getFullPath() /*-{
+    return this.fullPath;
+  }-*/;
+
+  public final native boolean isDirectory() /*-{
+    return this.isDirectory;
+  }-*/;
+
+  public final native boolean isFile() /*-{
+    return this.isFile;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native JsEntrySync copyTo(DirectoryEntrySync parent, String name) /*-{
+    return this.copyTo(parent, name);
+  }-*/;
+
+  public final native JsMetadata getMetadata() /*-{
+    return this.getMetadata();
+  }-*/;
+
+  public final native JsEntrySync getParent() /*-{
+    return this.getParent();
+  }-*/;
+
+  public final native JsEntrySync moveTo(DirectoryEntrySync parent, String name) /*-{
+    return this.moveTo(parent, name);
+  }-*/;
+
+  public final native void remove() /*-{
+    this.remove();
+  }-*/;
+
+  public final native String toURL() /*-{
+    return this.toURL();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsEventSource.java b/elemental/src/elemental/js/html/JsEventSource.java
new file mode 100644
index 0000000..8e2eb88
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsEventSource.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.EventSource;
+import elemental.events.EventListener;
+import elemental.js.events.JsEvent;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsEventSource extends JsElementalMixinBase  implements EventSource {
+  protected JsEventSource() {}
+
+  public final native String getURL() /*-{
+    return this.URL;
+  }-*/;
+
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmessage);
+  }-*/;
+
+  public final native void setOnmessage(EventListener listener) /*-{
+    this.onmessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnopen() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onopen);
+  }-*/;
+
+  public final native void setOnopen(EventListener listener) /*-{
+    this.onopen = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native String getUrl() /*-{
+    return this.url;
+  }-*/;
+
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFieldSetElement.java b/elemental/src/elemental/js/html/JsFieldSetElement.java
new file mode 100644
index 0000000..f28fe9b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFieldSetElement.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ValidityState;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.HTMLCollection;
+import elemental.html.FormElement;
+import elemental.html.FieldSetElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFieldSetElement extends JsElement  implements FieldSetElement {
+  protected JsFieldSetElement() {}
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native JsHTMLCollection getElements() /*-{
+    return this.elements;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native String getValidationMessage() /*-{
+    return this.validationMessage;
+  }-*/;
+
+  public final native JsValidityState getValidity() /*-{
+    return this.validity;
+  }-*/;
+
+  public final native boolean isWillValidate() /*-{
+    return this.willValidate;
+  }-*/;
+
+  public final native boolean checkValidity() /*-{
+    return this.checkValidity();
+  }-*/;
+
+  public final native void setCustomValidity(String error) /*-{
+    this.setCustomValidity(error);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFile.java b/elemental/src/elemental/js/html/JsFile.java
new file mode 100644
index 0000000..26c8a25
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFile.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.File;
+import elemental.html.Blob;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFile extends JsBlob  implements File {
+  protected JsFile() {}
+
+  public final native Date getLastModifiedDate() /*-{
+    return this.lastModifiedDate;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native String getWebkitRelativePath() /*-{
+    return this.webkitRelativePath;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFileEntry.java b/elemental/src/elemental/js/html/JsFileEntry.java
new file mode 100644
index 0000000..c9813ee
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFileEntry.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Entry;
+import elemental.html.FileEntry;
+import elemental.html.ErrorCallback;
+import elemental.html.FileWriterCallback;
+import elemental.html.FileCallback;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFileEntry extends JsEntry  implements FileEntry {
+  protected JsFileEntry() {}
+
+  public final native void createWriter(FileWriterCallback successCallback) /*-{
+    this.createWriter($entry(successCallback.@elemental.html.FileWriterCallback::onFileWriterCallback(Lelemental/html/FileWriter;)).bind(successCallback));
+  }-*/;
+
+  public final native void createWriter(FileWriterCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.createWriter($entry(successCallback.@elemental.html.FileWriterCallback::onFileWriterCallback(Lelemental/html/FileWriter;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void file(FileCallback successCallback) /*-{
+    this.file($entry(successCallback.@elemental.html.FileCallback::onFileCallback(Lelemental/html/File;)).bind(successCallback));
+  }-*/;
+
+  public final native void file(FileCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.file($entry(successCallback.@elemental.html.FileCallback::onFileCallback(Lelemental/html/File;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFileEntrySync.java b/elemental/src/elemental/js/html/JsFileEntrySync.java
new file mode 100644
index 0000000..3e6b4e3
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFileEntrySync.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.File;
+import elemental.html.EntrySync;
+import elemental.html.FileEntrySync;
+import elemental.html.FileWriterSync;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFileEntrySync extends JsEntrySync  implements FileEntrySync {
+  protected JsFileEntrySync() {}
+
+  public final native JsFileWriterSync createWriter() /*-{
+    return this.createWriter();
+  }-*/;
+
+  public final native JsFile file() /*-{
+    return this.file();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFileError.java b/elemental/src/elemental/js/html/JsFileError.java
new file mode 100644
index 0000000..9a1df80
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFileError.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.FileError;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFileError extends JsElementalMixinBase  implements FileError {
+  protected JsFileError() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFileException.java b/elemental/src/elemental/js/html/JsFileException.java
new file mode 100644
index 0000000..d49cbb7
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFileException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.FileException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFileException extends JsElementalMixinBase  implements FileException {
+  protected JsFileException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFileList.java b/elemental/src/elemental/js/html/JsFileList.java
new file mode 100644
index 0000000..a505bbc
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFileList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.File;
+import elemental.html.FileList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFileList extends JsIndexable  implements FileList, Indexable {
+  protected JsFileList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsFile item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFileReader.java b/elemental/src/elemental/js/html/JsFileReader.java
new file mode 100644
index 0000000..9b151ee
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFileReader.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.FileError;
+import elemental.html.FileReader;
+import elemental.js.events.JsEvent;
+import elemental.html.Blob;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFileReader extends JsElementalMixinBase  implements FileReader {
+  protected JsFileReader() {}
+
+  public final native JsFileError getError() /*-{
+    return this.error;
+  }-*/;
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onload);
+  }-*/;
+
+  public final native void setOnload(EventListener listener) /*-{
+    this.onload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnloadend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onloadend);
+  }-*/;
+
+  public final native void setOnloadend(EventListener listener) /*-{
+    this.onloadend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnloadstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onloadstart);
+  }-*/;
+
+  public final native void setOnloadstart(EventListener listener) /*-{
+    this.onloadstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnprogress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onprogress);
+  }-*/;
+
+  public final native void setOnprogress(EventListener listener) /*-{
+    this.onprogress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native Object getResult() /*-{
+    return this.result;
+  }-*/;
+
+  public final native void abort() /*-{
+    this.abort();
+  }-*/;
+
+  public final native void readAsArrayBuffer(Blob blob) /*-{
+    this.readAsArrayBuffer(blob);
+  }-*/;
+
+  public final native void readAsBinaryString(Blob blob) /*-{
+    this.readAsBinaryString(blob);
+  }-*/;
+
+  public final native void readAsDataURL(Blob blob) /*-{
+    this.readAsDataURL(blob);
+  }-*/;
+
+  public final native void readAsText(Blob blob) /*-{
+    this.readAsText(blob);
+  }-*/;
+
+  public final native void readAsText(Blob blob, String encoding) /*-{
+    this.readAsText(blob, encoding);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFileReaderSync.java b/elemental/src/elemental/js/html/JsFileReaderSync.java
new file mode 100644
index 0000000..8362856
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFileReaderSync.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.FileReaderSync;
+import elemental.html.ArrayBuffer;
+import elemental.html.Blob;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFileReaderSync extends JsElementalMixinBase  implements FileReaderSync {
+  protected JsFileReaderSync() {}
+
+  public final native JsArrayBuffer readAsArrayBuffer(Blob blob) /*-{
+    return this.readAsArrayBuffer(blob);
+  }-*/;
+
+  public final native String readAsBinaryString(Blob blob) /*-{
+    return this.readAsBinaryString(blob);
+  }-*/;
+
+  public final native String readAsDataURL(Blob blob) /*-{
+    return this.readAsDataURL(blob);
+  }-*/;
+
+  public final native String readAsText(Blob blob) /*-{
+    return this.readAsText(blob);
+  }-*/;
+
+  public final native String readAsText(Blob blob, String encoding) /*-{
+    return this.readAsText(blob, encoding);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFileWriter.java b/elemental/src/elemental/js/html/JsFileWriter.java
new file mode 100644
index 0000000..ffd84da
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFileWriter.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.FileError;
+import elemental.html.FileWriter;
+import elemental.js.events.JsEvent;
+import elemental.html.Blob;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFileWriter extends JsElementalMixinBase  implements FileWriter {
+  protected JsFileWriter() {}
+
+  public final native JsFileError getError() /*-{
+    return this.error;
+  }-*/;
+
+  public final native double getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnprogress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onprogress);
+  }-*/;
+
+  public final native void setOnprogress(EventListener listener) /*-{
+    this.onprogress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwrite() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwrite);
+  }-*/;
+
+  public final native void setOnwrite(EventListener listener) /*-{
+    this.onwrite = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwriteend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwriteend);
+  }-*/;
+
+  public final native void setOnwriteend(EventListener listener) /*-{
+    this.onwriteend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwritestart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwritestart);
+  }-*/;
+
+  public final native void setOnwritestart(EventListener listener) /*-{
+    this.onwritestart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native double getPosition() /*-{
+    return this.position;
+  }-*/;
+
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native void abort() /*-{
+    this.abort();
+  }-*/;
+
+  public final native void seek(double position) /*-{
+    this.seek(position);
+  }-*/;
+
+  public final native void truncate(double size) /*-{
+    this.truncate(size);
+  }-*/;
+
+  public final native void write(Blob data) /*-{
+    this.write(data);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFileWriterSync.java b/elemental/src/elemental/js/html/JsFileWriterSync.java
new file mode 100644
index 0000000..f83cdbd
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFileWriterSync.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.FileWriterSync;
+import elemental.html.Blob;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFileWriterSync extends JsElementalMixinBase  implements FileWriterSync {
+  protected JsFileWriterSync() {}
+
+  public final native double getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native double getPosition() /*-{
+    return this.position;
+  }-*/;
+
+  public final native void seek(double position) /*-{
+    this.seek(position);
+  }-*/;
+
+  public final native void truncate(double size) /*-{
+    this.truncate(size);
+  }-*/;
+
+  public final native void write(Blob data) /*-{
+    this.write(data);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFloat32Array.java b/elemental/src/elemental/js/html/JsFloat32Array.java
new file mode 100644
index 0000000..88a3442
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFloat32Array.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ArrayBufferView;
+import elemental.html.Float32Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFloat32Array extends JsArrayBufferView  implements Float32Array, IndexableNumber {
+  protected JsFloat32Array() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setElements(Object array) /*-{
+    this.setElements(array);
+  }-*/;
+
+  public final native void setElements(Object array, int offset) /*-{
+    this.setElements(array, offset);
+  }-*/;
+
+  public final native JsFloat32Array subarray(int start) /*-{
+    return this.subarray(start);
+  }-*/;
+
+  public final native JsFloat32Array subarray(int start, int end) /*-{
+    return this.subarray(start, end);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFloat64Array.java b/elemental/src/elemental/js/html/JsFloat64Array.java
new file mode 100644
index 0000000..55a1110
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFloat64Array.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ArrayBufferView;
+import elemental.html.Float64Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFloat64Array extends JsArrayBufferView  implements Float64Array, IndexableNumber {
+  protected JsFloat64Array() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setElements(Object array) /*-{
+    this.setElements(array);
+  }-*/;
+
+  public final native void setElements(Object array, int offset) /*-{
+    this.setElements(array, offset);
+  }-*/;
+
+  public final native JsFloat64Array subarray(int start) /*-{
+    return this.subarray(start);
+  }-*/;
+
+  public final native JsFloat64Array subarray(int start, int end) /*-{
+    return this.subarray(start, end);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFontElement.java b/elemental/src/elemental/js/html/JsFontElement.java
new file mode 100644
index 0000000..36bb80d
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFontElement.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.FontElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFontElement extends JsElement  implements FontElement {
+  protected JsFontElement() {}
+
+  public final native String getColor() /*-{
+    return this.color;
+  }-*/;
+
+  public final native void setColor(String param_color) /*-{
+    this.color = param_color;
+  }-*/;
+
+  public final native String getFace() /*-{
+    return this.face;
+  }-*/;
+
+  public final native void setFace(String param_face) /*-{
+    this.face = param_face;
+  }-*/;
+
+  public final native String getSize() /*-{
+    return this.size;
+  }-*/;
+
+  public final native void setSize(String param_size) /*-{
+    this.size = param_size;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFormData.java b/elemental/src/elemental/js/html/JsFormData.java
new file mode 100644
index 0000000..db22ef6
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFormData.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.FormData;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFormData extends JsElementalMixinBase  implements FormData {
+  protected JsFormData() {}
+
+  public final native void append(String name, String value, String filename) /*-{
+    this.append(name, value, filename);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFormElement.java b/elemental/src/elemental/js/html/JsFormElement.java
new file mode 100644
index 0000000..839fefe
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFormElement.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.FormElement;
+import elemental.html.HTMLCollection;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFormElement extends JsElement  implements FormElement {
+  protected JsFormElement() {}
+
+  public final native String getAcceptCharset() /*-{
+    return this.acceptCharset;
+  }-*/;
+
+  public final native void setAcceptCharset(String param_acceptCharset) /*-{
+    this.acceptCharset = param_acceptCharset;
+  }-*/;
+
+  public final native String getAction() /*-{
+    return this.action;
+  }-*/;
+
+  public final native void setAction(String param_action) /*-{
+    this.action = param_action;
+  }-*/;
+
+  public final native String getAutocomplete() /*-{
+    return this.autocomplete;
+  }-*/;
+
+  public final native void setAutocomplete(String param_autocomplete) /*-{
+    this.autocomplete = param_autocomplete;
+  }-*/;
+
+  public final native JsHTMLCollection getElements() /*-{
+    return this.elements;
+  }-*/;
+
+  public final native String getEncoding() /*-{
+    return this.encoding;
+  }-*/;
+
+  public final native void setEncoding(String param_encoding) /*-{
+    this.encoding = param_encoding;
+  }-*/;
+
+  public final native String getEnctype() /*-{
+    return this.enctype;
+  }-*/;
+
+  public final native void setEnctype(String param_enctype) /*-{
+    this.enctype = param_enctype;
+  }-*/;
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native String getMethod() /*-{
+    return this.method;
+  }-*/;
+
+  public final native void setMethod(String param_method) /*-{
+    this.method = param_method;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native boolean isNoValidate() /*-{
+    return this.noValidate;
+  }-*/;
+
+  public final native void setNoValidate(boolean param_noValidate) /*-{
+    this.noValidate = param_noValidate;
+  }-*/;
+
+  public final native String getTarget() /*-{
+    return this.target;
+  }-*/;
+
+  public final native void setTarget(String param_target) /*-{
+    this.target = param_target;
+  }-*/;
+
+  public final native boolean checkValidity() /*-{
+    return this.checkValidity();
+  }-*/;
+
+  public final native void reset() /*-{
+    this.reset();
+  }-*/;
+
+  public final native void submit() /*-{
+    this.submit();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFrameElement.java b/elemental/src/elemental/js/html/JsFrameElement.java
new file mode 100644
index 0000000..9a7fa3a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFrameElement.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.js.dom.JsDocument;
+import elemental.svg.SVGDocument;
+import elemental.html.FrameElement;
+import elemental.js.svg.JsSVGDocument;
+import elemental.html.Window;
+import elemental.dom.Document;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFrameElement extends JsElement  implements FrameElement {
+  protected JsFrameElement() {}
+
+  public final native JsDocument getContentDocument() /*-{
+    return this.contentDocument;
+  }-*/;
+
+  public final native JsWindow getContentWindow() /*-{
+    return this.contentWindow;
+  }-*/;
+
+  public final native String getFrameBorder() /*-{
+    return this.frameBorder;
+  }-*/;
+
+  public final native void setFrameBorder(String param_frameBorder) /*-{
+    this.frameBorder = param_frameBorder;
+  }-*/;
+
+  public final native int getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native String getLocation() /*-{
+    return this.location;
+  }-*/;
+
+  public final native void setLocation(String param_location) /*-{
+    this.location = param_location;
+  }-*/;
+
+  public final native String getLongDesc() /*-{
+    return this.longDesc;
+  }-*/;
+
+  public final native void setLongDesc(String param_longDesc) /*-{
+    this.longDesc = param_longDesc;
+  }-*/;
+
+  public final native String getMarginHeight() /*-{
+    return this.marginHeight;
+  }-*/;
+
+  public final native void setMarginHeight(String param_marginHeight) /*-{
+    this.marginHeight = param_marginHeight;
+  }-*/;
+
+  public final native String getMarginWidth() /*-{
+    return this.marginWidth;
+  }-*/;
+
+  public final native void setMarginWidth(String param_marginWidth) /*-{
+    this.marginWidth = param_marginWidth;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native boolean isNoResize() /*-{
+    return this.noResize;
+  }-*/;
+
+  public final native void setNoResize(boolean param_noResize) /*-{
+    this.noResize = param_noResize;
+  }-*/;
+
+  public final native String getScrolling() /*-{
+    return this.scrolling;
+  }-*/;
+
+  public final native void setScrolling(String param_scrolling) /*-{
+    this.scrolling = param_scrolling;
+  }-*/;
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native int getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native JsSVGDocument getSVGDocument() /*-{
+    return this.getSVGDocument();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsFrameSetElement.java b/elemental/src/elemental/js/html/JsFrameSetElement.java
new file mode 100644
index 0000000..222a044
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsFrameSetElement.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.FrameSetElement;
+import elemental.js.dom.JsElement;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsFrameSetElement extends JsElement  implements FrameSetElement {
+  protected JsFrameSetElement() {}
+
+  public final native String getCols() /*-{
+    return this.cols;
+  }-*/;
+
+  public final native void setCols(String param_cols) /*-{
+    this.cols = param_cols;
+  }-*/;
+
+  public final native EventListener getOnbeforeunload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforeunload);
+  }-*/;
+
+  public final native void setOnbeforeunload(EventListener listener) /*-{
+    this.onbeforeunload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnhashchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onhashchange);
+  }-*/;
+
+  public final native void setOnhashchange(EventListener listener) /*-{
+    this.onhashchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmessage);
+  }-*/;
+
+  public final native void setOnmessage(EventListener listener) /*-{
+    this.onmessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnoffline() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onoffline);
+  }-*/;
+
+  public final native void setOnoffline(EventListener listener) /*-{
+    this.onoffline = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnonline() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ononline);
+  }-*/;
+
+  public final native void setOnonline(EventListener listener) /*-{
+    this.ononline = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnpopstate() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onpopstate);
+  }-*/;
+
+  public final native void setOnpopstate(EventListener listener) /*-{
+    this.onpopstate = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnresize() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onresize);
+  }-*/;
+
+  public final native void setOnresize(EventListener listener) /*-{
+    this.onresize = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnstorage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onstorage);
+  }-*/;
+
+  public final native void setOnstorage(EventListener listener) /*-{
+    this.onstorage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnunload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onunload);
+  }-*/;
+
+  public final native void setOnunload(EventListener listener) /*-{
+    this.onunload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native String getRows() /*-{
+    return this.rows;
+  }-*/;
+
+  public final native void setRows(String param_rows) /*-{
+    this.rows = param_rows;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsHRElement.java b/elemental/src/elemental/js/html/JsHRElement.java
new file mode 100644
index 0000000..546efb3
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsHRElement.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.HRElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsHRElement extends JsElement  implements HRElement {
+  protected JsHRElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native boolean isNoShade() /*-{
+    return this.noShade;
+  }-*/;
+
+  public final native void setNoShade(boolean param_noShade) /*-{
+    this.noShade = param_noShade;
+  }-*/;
+
+  public final native String getSize() /*-{
+    return this.size;
+  }-*/;
+
+  public final native void setSize(String param_size) /*-{
+    this.size = param_size;
+  }-*/;
+
+  public final native String getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(String param_width) /*-{
+    this.width = param_width;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsHTMLAllCollection.java b/elemental/src/elemental/js/html/JsHTMLAllCollection.java
new file mode 100644
index 0000000..3ba5080
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsHTMLAllCollection.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.dom.Node;
+import elemental.html.HTMLAllCollection;
+import elemental.js.dom.JsNodeList;
+import elemental.dom.NodeList;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsHTMLAllCollection extends JsElementalMixinBase  implements HTMLAllCollection {
+  protected JsHTMLAllCollection() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsNode item(int index) /*-{
+    return this.item(index);
+  }-*/;
+
+  public final native JsNode namedItem(String name) /*-{
+    return this.namedItem(name);
+  }-*/;
+
+  public final native JsNodeList tags(String name) /*-{
+    return this.tags(name);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsHTMLCollection.java b/elemental/src/elemental/js/html/JsHTMLCollection.java
new file mode 100644
index 0000000..3a499cc
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsHTMLCollection.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.dom.Node;
+import elemental.html.HTMLCollection;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsHTMLCollection extends JsIndexable  implements HTMLCollection, Indexable {
+  protected JsHTMLCollection() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsNode item(int index) /*-{
+    return this.item(index);
+  }-*/;
+
+  public final native JsNode namedItem(String name) /*-{
+    return this.namedItem(name);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsHTMLOptionsCollection.java b/elemental/src/elemental/js/html/JsHTMLOptionsCollection.java
new file mode 100644
index 0000000..91dcabb
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsHTMLOptionsCollection.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.HTMLOptionsCollection;
+import elemental.html.HTMLCollection;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsHTMLOptionsCollection extends JsHTMLCollection  implements HTMLOptionsCollection {
+  protected JsHTMLOptionsCollection() {}
+
+  public final native void setLength(int param_length) /*-{
+    this.length = param_length;
+  }-*/;
+
+  public final native int getSelectedIndex() /*-{
+    return this.selectedIndex;
+  }-*/;
+
+  public final native void setSelectedIndex(int param_selectedIndex) /*-{
+    this.selectedIndex = param_selectedIndex;
+  }-*/;
+
+  public final native void remove(int index) /*-{
+    this.remove(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsHeadElement.java b/elemental/src/elemental/js/html/JsHeadElement.java
new file mode 100644
index 0000000..a357342
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsHeadElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.HeadElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsHeadElement extends JsElement  implements HeadElement {
+  protected JsHeadElement() {}
+
+  public final native String getProfile() /*-{
+    return this.profile;
+  }-*/;
+
+  public final native void setProfile(String param_profile) /*-{
+    this.profile = param_profile;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsHeadingElement.java b/elemental/src/elemental/js/html/JsHeadingElement.java
new file mode 100644
index 0000000..5bb5a2e
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsHeadingElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.HeadingElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsHeadingElement extends JsElement  implements HeadingElement {
+  protected JsHeadingElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsHistory.java b/elemental/src/elemental/js/html/JsHistory.java
new file mode 100644
index 0000000..92fd3ba
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsHistory.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.History;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsHistory extends JsElementalMixinBase  implements History {
+  protected JsHistory() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native Object getState() /*-{
+    return this.state;
+  }-*/;
+
+  public final native void back() /*-{
+    this.back();
+  }-*/;
+
+  public final native void forward() /*-{
+    this.forward();
+  }-*/;
+
+  public final native void go(int distance) /*-{
+    this.go(distance);
+  }-*/;
+
+  public final native void pushState(Object data, String title) /*-{
+    this.pushState(data, title);
+  }-*/;
+
+  public final native void pushState(Object data, String title, String url) /*-{
+    this.pushState(data, title, url);
+  }-*/;
+
+  public final native void replaceState(Object data, String title) /*-{
+    this.replaceState(data, title);
+  }-*/;
+
+  public final native void replaceState(Object data, String title, String url) /*-{
+    this.replaceState(data, title, url);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsHtmlElement.java b/elemental/src/elemental/js/html/JsHtmlElement.java
new file mode 100644
index 0000000..dd13a93
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsHtmlElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.HtmlElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsHtmlElement extends JsElement  implements HtmlElement {
+  protected JsHtmlElement() {}
+
+  public final native String getManifest() /*-{
+    return this.manifest;
+  }-*/;
+
+  public final native void setManifest(String param_manifest) /*-{
+    this.manifest = param_manifest;
+  }-*/;
+
+  public final native String getVersion() /*-{
+    return this.version;
+  }-*/;
+
+  public final native void setVersion(String param_version) /*-{
+    this.version = param_version;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBAny.java b/elemental/src/elemental/js/html/JsIDBAny.java
new file mode 100644
index 0000000..0aabade
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBAny.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBAny extends JsElementalMixinBase  {
+  protected JsIDBAny() {}
+}
diff --git a/elemental/src/elemental/js/html/JsIDBCursor.java b/elemental/src/elemental/js/html/JsIDBCursor.java
new file mode 100644
index 0000000..019520b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBCursor.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.IDBCursor;
+import elemental.html.IDBRequest;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBCursor extends JsElementalMixinBase  implements IDBCursor {
+  protected JsIDBCursor() {}
+
+  public final native String getDirection() /*-{
+    return this.direction;
+  }-*/;
+
+  public final native Object getKey() /*-{
+    return this.key;
+  }-*/;
+
+  public final native Object getPrimaryKey() /*-{
+    return this.primaryKey;
+  }-*/;
+
+  public final native Object getSource() /*-{
+    return this.source;
+  }-*/;
+
+  public final native void advance(int count) /*-{
+    this.advance(count);
+  }-*/;
+
+  public final native void continueFunction() /*-{
+    this.continueFunction();
+  }-*/;
+
+  public final native void continueFunction(Object key) /*-{
+    this.continueFunction(key);
+  }-*/;
+
+  public final native JsIDBRequest _delete() /*-{
+    return this['delete']();
+  }-*/;
+
+  public final native JsIDBRequest update(Object value) /*-{
+    return this.update(value);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBCursorWithValue.java b/elemental/src/elemental/js/html/JsIDBCursorWithValue.java
new file mode 100644
index 0000000..2abff6b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBCursorWithValue.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.IDBCursor;
+import elemental.html.IDBCursorWithValue;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBCursorWithValue extends JsIDBCursor  implements IDBCursorWithValue {
+  protected JsIDBCursorWithValue() {}
+
+  public final native Object getValue() /*-{
+    return this.value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBDatabase.java b/elemental/src/elemental/js/html/JsIDBDatabase.java
new file mode 100644
index 0000000..a3f1f05
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBDatabase.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.util.Indexable;
+import elemental.js.util.JsIndexable;
+import elemental.html.IDBObjectStore;
+import elemental.js.util.JsMappable;
+import elemental.html.IDBVersionChangeRequest;
+import elemental.html.IDBTransaction;
+import elemental.util.Mappable;
+import elemental.events.EventListener;
+import elemental.js.events.JsEvent;
+import elemental.html.IDBDatabase;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBDatabase extends JsElementalMixinBase  implements IDBDatabase {
+  protected JsIDBDatabase() {}
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native JsIndexable getObjectStoreNames() /*-{
+    return this.objectStoreNames;
+  }-*/;
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnversionchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onversionchange);
+  }-*/;
+
+  public final native void setOnversionchange(EventListener listener) /*-{
+    this.onversionchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native String getVersion() /*-{
+    return this.version;
+  }-*/;
+
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+
+  public final native JsIDBObjectStore createObjectStore(String name) /*-{
+    return this.createObjectStore(name);
+  }-*/;
+
+  public final native JsIDBObjectStore createObjectStore(String name, Mappable options) /*-{
+    return this.createObjectStore(name, options);
+  }-*/;
+
+  public final native void deleteObjectStore(String name) /*-{
+    this.deleteObjectStore(name);
+  }-*/;
+
+  public final native JsIDBTransaction transaction(Indexable storeNames) /*-{
+    return this.transaction(storeNames);
+  }-*/;
+
+  public final native JsIDBTransaction transaction(Indexable storeNames, String mode) /*-{
+    return this.transaction(storeNames, mode);
+  }-*/;
+
+  public final native JsIDBTransaction transaction(String storeName) /*-{
+    return this.transaction(storeName);
+  }-*/;
+
+  public final native JsIDBTransaction transaction(String storeName, String mode) /*-{
+    return this.transaction(storeName, mode);
+  }-*/;
+
+  public final native JsIDBTransaction transaction(Indexable storeNames, int mode) /*-{
+    return this.transaction(storeNames, mode);
+  }-*/;
+
+  public final native JsIDBTransaction transaction(String storeName, int mode) /*-{
+    return this.transaction(storeName, mode);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBDatabaseException.java b/elemental/src/elemental/js/html/JsIDBDatabaseException.java
new file mode 100644
index 0000000..f20cb06
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBDatabaseException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.IDBDatabaseException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBDatabaseException extends JsElementalMixinBase  implements IDBDatabaseException {
+  protected JsIDBDatabaseException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBFactory.java b/elemental/src/elemental/js/html/JsIDBFactory.java
new file mode 100644
index 0000000..35a9995
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBFactory.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.IDBFactory;
+import elemental.html.IDBRequest;
+import elemental.html.IDBVersionChangeRequest;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBFactory extends JsElementalMixinBase  implements IDBFactory {
+  protected JsIDBFactory() {}
+
+  public final native short cmp(Object first, Object second) /*-{
+    return this.cmp(first, second);
+  }-*/;
+
+  public final native JsIDBVersionChangeRequest deleteDatabase(String name) /*-{
+    return this.deleteDatabase(name);
+  }-*/;
+
+  public final native JsIDBRequest getDatabaseNames() /*-{
+    return this.getDatabaseNames();
+  }-*/;
+
+  public final native JsIDBRequest open(String name) /*-{
+    return this.open(name);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBIndex.java b/elemental/src/elemental/js/html/JsIDBIndex.java
new file mode 100644
index 0000000..0fd892a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBIndex.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.IDBKeyRange;
+import elemental.html.IDBObjectStore;
+import elemental.html.IDBRequest;
+import elemental.html.IDBIndex;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBIndex extends JsElementalMixinBase  implements IDBIndex {
+  protected JsIDBIndex() {}
+
+  public final native Object getKeyPath() /*-{
+    return this.keyPath;
+  }-*/;
+
+  public final native boolean isMultiEntry() /*-{
+    return this.multiEntry;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native JsIDBObjectStore getObjectStore() /*-{
+    return this.objectStore;
+  }-*/;
+
+  public final native boolean isUnique() /*-{
+    return this.unique;
+  }-*/;
+
+  public final native JsIDBRequest count() /*-{
+    return this.count();
+  }-*/;
+
+  public final native JsIDBRequest count(IDBKeyRange range) /*-{
+    return this.count(range);
+  }-*/;
+
+  public final native JsIDBRequest count(Object key) /*-{
+    return this.count(key);
+  }-*/;
+
+  public final native JsIDBRequest get(IDBKeyRange key) /*-{
+    return this.get(key);
+  }-*/;
+
+  public final native JsIDBRequest getObject(Object key) /*-{
+    return this.getObject(key);
+  }-*/;
+
+  public final native JsIDBRequest getKey(IDBKeyRange key) /*-{
+    return this.getKey(key);
+  }-*/;
+
+  public final native JsIDBRequest getKey(Object key) /*-{
+    return this.getKey(key);
+  }-*/;
+
+  public final native JsIDBRequest openCursor() /*-{
+    return this.openCursor();
+  }-*/;
+
+  public final native JsIDBRequest openCursor(IDBKeyRange range) /*-{
+    return this.openCursor(range);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(IDBKeyRange range, String direction) /*-{
+    return this.openCursor(range, direction);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(Object key) /*-{
+    return this.openCursor(key);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(Object key, String direction) /*-{
+    return this.openCursor(key, direction);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(IDBKeyRange range, int direction) /*-{
+    return this.openCursor(range, direction);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(Object key, int direction) /*-{
+    return this.openCursor(key, direction);
+  }-*/;
+
+  public final native JsIDBRequest openKeyCursor() /*-{
+    return this.openKeyCursor();
+  }-*/;
+
+  public final native JsIDBRequest openKeyCursor(IDBKeyRange range) /*-{
+    return this.openKeyCursor(range);
+  }-*/;
+
+  public final native JsIDBRequest openKeyCursor(IDBKeyRange range, String direction) /*-{
+    return this.openKeyCursor(range, direction);
+  }-*/;
+
+  public final native JsIDBRequest openKeyCursor(Object key) /*-{
+    return this.openKeyCursor(key);
+  }-*/;
+
+  public final native JsIDBRequest openKeyCursor(Object key, String direction) /*-{
+    return this.openKeyCursor(key, direction);
+  }-*/;
+
+  public final native JsIDBRequest openKeyCursor(IDBKeyRange range, int direction) /*-{
+    return this.openKeyCursor(range, direction);
+  }-*/;
+
+  public final native JsIDBRequest openKeyCursor(Object key, int direction) /*-{
+    return this.openKeyCursor(key, direction);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBKey.java b/elemental/src/elemental/js/html/JsIDBKey.java
new file mode 100644
index 0000000..5dffeda
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBKey.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBKey extends JsElementalMixinBase  {
+  protected JsIDBKey() {}
+}
diff --git a/elemental/src/elemental/js/html/JsIDBKeyRange.java b/elemental/src/elemental/js/html/JsIDBKeyRange.java
new file mode 100644
index 0000000..ab183e4
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBKeyRange.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.IDBKeyRange;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBKeyRange extends JsElementalMixinBase  implements IDBKeyRange {
+  protected JsIDBKeyRange() {}
+
+  public final native Object getLower() /*-{
+    return this.lower;
+  }-*/;
+
+  public final native boolean isLowerOpen() /*-{
+    return this.lowerOpen;
+  }-*/;
+
+  public final native Object getUpper() /*-{
+    return this.upper;
+  }-*/;
+
+  public final native boolean isUpperOpen() /*-{
+    return this.upperOpen;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBObjectStore.java b/elemental/src/elemental/js/html/JsIDBObjectStore.java
new file mode 100644
index 0000000..48b22c8
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBObjectStore.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.util.Indexable;
+import elemental.js.util.JsIndexable;
+import elemental.html.IDBObjectStore;
+import elemental.js.util.JsMappable;
+import elemental.util.Mappable;
+import elemental.html.IDBKeyRange;
+import elemental.html.IDBTransaction;
+import elemental.html.IDBRequest;
+import elemental.html.IDBIndex;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBObjectStore extends JsElementalMixinBase  implements IDBObjectStore {
+  protected JsIDBObjectStore() {}
+
+  public final native boolean isAutoIncrement() /*-{
+    return this.autoIncrement;
+  }-*/;
+
+  public final native JsIndexable getIndexNames() /*-{
+    return this.indexNames;
+  }-*/;
+
+  public final native Object getKeyPath() /*-{
+    return this.keyPath;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native JsIDBTransaction getTransaction() /*-{
+    return this.transaction;
+  }-*/;
+
+  public final native JsIDBRequest add(Object value) /*-{
+    return this.add(value);
+  }-*/;
+
+  public final native JsIDBRequest add(Object value, Object key) /*-{
+    return this.add(value, key);
+  }-*/;
+
+  public final native JsIDBRequest clear() /*-{
+    return this.clear();
+  }-*/;
+
+  public final native JsIDBRequest count() /*-{
+    return this.count();
+  }-*/;
+
+  public final native JsIDBRequest count(IDBKeyRange range) /*-{
+    return this.count(range);
+  }-*/;
+
+  public final native JsIDBRequest count(Object key) /*-{
+    return this.count(key);
+  }-*/;
+
+  public final native JsIDBIndex createIndex(String name, String keyPath) /*-{
+    return this.createIndex(name, keyPath);
+  }-*/;
+
+  public final native JsIDBIndex createIndex(String name, String keyPath, Mappable options) /*-{
+    return this.createIndex(name, keyPath, options);
+  }-*/;
+
+  public final native JsIDBRequest _delete(IDBKeyRange keyRange) /*-{
+    return this['delete'](keyRange);
+  }-*/;
+
+  public final native JsIDBRequest _delete(Object key) /*-{
+    return this['delete'](key);
+  }-*/;
+
+  public final native void deleteIndex(String name) /*-{
+    this.deleteIndex(name);
+  }-*/;
+
+  public final native JsIDBRequest getObject(IDBKeyRange key) /*-{
+    return this.getObject(key);
+  }-*/;
+
+  public final native JsIDBRequest getObject(Object key) /*-{
+    return this.getObject(key);
+  }-*/;
+
+  public final native JsIDBIndex index(String name) /*-{
+    return this.index(name);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(IDBKeyRange range) /*-{
+    return this.openCursor(range);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(IDBKeyRange range, String direction) /*-{
+    return this.openCursor(range, direction);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(Object key) /*-{
+    return this.openCursor(key);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(Object key, String direction) /*-{
+    return this.openCursor(key, direction);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(IDBKeyRange range, int direction) /*-{
+    return this.openCursor(range, direction);
+  }-*/;
+
+  public final native JsIDBRequest openCursor(Object key, int direction) /*-{
+    return this.openCursor(key, direction);
+  }-*/;
+
+  public final native JsIDBRequest put(Object value) /*-{
+    return this.put(value);
+  }-*/;
+
+  public final native JsIDBRequest put(Object value, Object key) /*-{
+    return this.put(value, key);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBRequest.java b/elemental/src/elemental/js/html/JsIDBRequest.java
new file mode 100644
index 0000000..0ef45d8
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBRequest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.events.JsEvent;
+import elemental.dom.DOMError;
+import elemental.events.EventListener;
+import elemental.html.IDBTransaction;
+import elemental.html.IDBRequest;
+import elemental.js.dom.JsDOMError;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBRequest extends JsElementalMixinBase  implements IDBRequest {
+  protected JsIDBRequest() {}
+
+  public final native JsDOMError getError() /*-{
+    return this.error;
+  }-*/;
+
+  public final native int getErrorCode() /*-{
+    return this.errorCode;
+  }-*/;
+
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsuccess() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsuccess);
+  }-*/;
+
+  public final native void setOnsuccess(EventListener listener) /*-{
+    this.onsuccess = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native String getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native Object getResult() /*-{
+    return this.result;
+  }-*/;
+
+  public final native Object getSource() /*-{
+    return this.source;
+  }-*/;
+
+  public final native JsIDBTransaction getTransaction() /*-{
+    return this.transaction;
+  }-*/;
+
+  public final native String getWebkitErrorMessage() /*-{
+    return this.webkitErrorMessage;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBTransaction.java b/elemental/src/elemental/js/html/JsIDBTransaction.java
new file mode 100644
index 0000000..83cf52f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBTransaction.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.IDBObjectStore;
+import elemental.js.events.JsEvent;
+import elemental.dom.DOMError;
+import elemental.events.EventListener;
+import elemental.html.IDBTransaction;
+import elemental.html.IDBDatabase;
+import elemental.js.dom.JsDOMError;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBTransaction extends JsElementalMixinBase  implements IDBTransaction {
+  protected JsIDBTransaction() {}
+
+  public final native JsIDBDatabase getDb() /*-{
+    return this.db;
+  }-*/;
+
+  public final native JsDOMError getError() /*-{
+    return this.error;
+  }-*/;
+
+  public final native String getMode() /*-{
+    return this.mode;
+  }-*/;
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncomplete() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncomplete);
+  }-*/;
+
+  public final native void setOncomplete(EventListener listener) /*-{
+    this.oncomplete = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native void abort() /*-{
+    this.abort();
+  }-*/;
+
+  public final native JsIDBObjectStore objectStore(String name) /*-{
+    return this.objectStore(name);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBVersionChangeEvent.java b/elemental/src/elemental/js/html/JsIDBVersionChangeEvent.java
new file mode 100644
index 0000000..4af7439
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBVersionChangeEvent.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.IDBVersionChangeEvent;
+import elemental.js.events.JsEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBVersionChangeEvent extends JsEvent  implements IDBVersionChangeEvent {
+  protected JsIDBVersionChangeEvent() {}
+
+  public final native String getVersion() /*-{
+    return this.version;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIDBVersionChangeRequest.java b/elemental/src/elemental/js/html/JsIDBVersionChangeRequest.java
new file mode 100644
index 0000000..599e42f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIDBVersionChangeRequest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.events.EventListener;
+import elemental.html.IDBRequest;
+import elemental.js.events.JsEventListener;
+import elemental.html.IDBVersionChangeRequest;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIDBVersionChangeRequest extends JsIDBRequest  implements IDBVersionChangeRequest {
+  protected JsIDBVersionChangeRequest() {}
+
+  public final native EventListener getOnblocked() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onblocked);
+  }-*/;
+
+  public final native void setOnblocked(EventListener listener) /*-{
+    this.onblocked = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;}
diff --git a/elemental/src/elemental/js/html/JsIFrameElement.java b/elemental/src/elemental/js/html/JsIFrameElement.java
new file mode 100644
index 0000000..849eb9d
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIFrameElement.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.js.dom.JsDocument;
+import elemental.svg.SVGDocument;
+import elemental.html.IFrameElement;
+import elemental.js.svg.JsSVGDocument;
+import elemental.html.Window;
+import elemental.dom.Document;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIFrameElement extends JsElement  implements IFrameElement {
+  protected JsIFrameElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native JsDocument getContentDocument() /*-{
+    return this.contentDocument;
+  }-*/;
+
+  public final native JsWindow getContentWindow() /*-{
+    return this.contentWindow;
+  }-*/;
+
+  public final native String getFrameBorder() /*-{
+    return this.frameBorder;
+  }-*/;
+
+  public final native void setFrameBorder(String param_frameBorder) /*-{
+    this.frameBorder = param_frameBorder;
+  }-*/;
+
+  public final native String getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(String param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native String getLongDesc() /*-{
+    return this.longDesc;
+  }-*/;
+
+  public final native void setLongDesc(String param_longDesc) /*-{
+    this.longDesc = param_longDesc;
+  }-*/;
+
+  public final native String getMarginHeight() /*-{
+    return this.marginHeight;
+  }-*/;
+
+  public final native void setMarginHeight(String param_marginHeight) /*-{
+    this.marginHeight = param_marginHeight;
+  }-*/;
+
+  public final native String getMarginWidth() /*-{
+    return this.marginWidth;
+  }-*/;
+
+  public final native void setMarginWidth(String param_marginWidth) /*-{
+    this.marginWidth = param_marginWidth;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getSandbox() /*-{
+    return this.sandbox;
+  }-*/;
+
+  public final native void setSandbox(String param_sandbox) /*-{
+    this.sandbox = param_sandbox;
+  }-*/;
+
+  public final native String getScrolling() /*-{
+    return this.scrolling;
+  }-*/;
+
+  public final native void setScrolling(String param_scrolling) /*-{
+    this.scrolling = param_scrolling;
+  }-*/;
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native String getSrcdoc() /*-{
+    return this.srcdoc;
+  }-*/;
+
+  public final native void setSrcdoc(String param_srcdoc) /*-{
+    this.srcdoc = param_srcdoc;
+  }-*/;
+
+  public final native String getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(String param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native JsSVGDocument getSVGDocument() /*-{
+    return this.getSVGDocument();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsIceCandidate.java b/elemental/src/elemental/js/html/JsIceCandidate.java
new file mode 100644
index 0000000..916d714
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsIceCandidate.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.IceCandidate;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsIceCandidate extends JsElementalMixinBase  implements IceCandidate {
+  protected JsIceCandidate() {}
+
+  public final native String getLabel() /*-{
+    return this.label;
+  }-*/;
+
+  public final native String toSdp() /*-{
+    return this.toSdp();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsImageData.java b/elemental/src/elemental/js/html/JsImageData.java
new file mode 100644
index 0000000..e86fac6
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsImageData.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Uint8ClampedArray;
+import elemental.html.ImageData;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsImageData extends JsElementalMixinBase  implements ImageData {
+  protected JsImageData() {}
+
+  public final native JsUint8ClampedArray getData() /*-{
+    return this.data;
+  }-*/;
+
+  public final native int getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native int getWidth() /*-{
+    return this.width;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsImageElement.java b/elemental/src/elemental/js/html/JsImageElement.java
new file mode 100644
index 0000000..c9bf69a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsImageElement.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.ImageElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsImageElement extends JsElement  implements ImageElement {
+  protected JsImageElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getAlt() /*-{
+    return this.alt;
+  }-*/;
+
+  public final native void setAlt(String param_alt) /*-{
+    this.alt = param_alt;
+  }-*/;
+
+  public final native String getBorder() /*-{
+    return this.border;
+  }-*/;
+
+  public final native void setBorder(String param_border) /*-{
+    this.border = param_border;
+  }-*/;
+
+  public final native boolean isComplete() /*-{
+    return this.complete;
+  }-*/;
+
+  public final native String getCrossOrigin() /*-{
+    return this.crossOrigin;
+  }-*/;
+
+  public final native void setCrossOrigin(String param_crossOrigin) /*-{
+    this.crossOrigin = param_crossOrigin;
+  }-*/;
+
+  public final native int getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(int param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native int getHspace() /*-{
+    return this.hspace;
+  }-*/;
+
+  public final native void setHspace(int param_hspace) /*-{
+    this.hspace = param_hspace;
+  }-*/;
+
+  public final native boolean isMap() /*-{
+    return this.isMap;
+  }-*/;
+
+  public final native void setIsMap(boolean param_isMap) /*-{
+    this.isMap = param_isMap;
+  }-*/;
+
+  public final native String getLongDesc() /*-{
+    return this.longDesc;
+  }-*/;
+
+  public final native void setLongDesc(String param_longDesc) /*-{
+    this.longDesc = param_longDesc;
+  }-*/;
+
+  public final native String getLowsrc() /*-{
+    return this.lowsrc;
+  }-*/;
+
+  public final native void setLowsrc(String param_lowsrc) /*-{
+    this.lowsrc = param_lowsrc;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native int getNaturalHeight() /*-{
+    return this.naturalHeight;
+  }-*/;
+
+  public final native int getNaturalWidth() /*-{
+    return this.naturalWidth;
+  }-*/;
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native String getUseMap() /*-{
+    return this.useMap;
+  }-*/;
+
+  public final native void setUseMap(String param_useMap) /*-{
+    this.useMap = param_useMap;
+  }-*/;
+
+  public final native int getVspace() /*-{
+    return this.vspace;
+  }-*/;
+
+  public final native void setVspace(int param_vspace) /*-{
+    this.vspace = param_vspace;
+  }-*/;
+
+  public final native int getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(int param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native int getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native int getY() /*-{
+    return this.y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsInputElement.java b/elemental/src/elemental/js/html/JsInputElement.java
new file mode 100644
index 0000000..b0a8d6d
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsInputElement.java
@@ -0,0 +1,455 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ValidityState;
+import elemental.js.dom.JsElement;
+import elemental.html.InputElement;
+import elemental.dom.Element;
+import elemental.html.FileList;
+import elemental.html.FormElement;
+import elemental.js.dom.JsNodeList;
+import elemental.dom.NodeList;
+import elemental.js.events.JsEventListener;
+import elemental.events.EventListener;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsInputElement extends JsElement  implements InputElement {
+  protected JsInputElement() {}
+
+  public final native String getAccept() /*-{
+    return this.accept;
+  }-*/;
+
+  public final native void setAccept(String param_accept) /*-{
+    this.accept = param_accept;
+  }-*/;
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getAlt() /*-{
+    return this.alt;
+  }-*/;
+
+  public final native void setAlt(String param_alt) /*-{
+    this.alt = param_alt;
+  }-*/;
+
+  public final native String getAutocomplete() /*-{
+    return this.autocomplete;
+  }-*/;
+
+  public final native void setAutocomplete(String param_autocomplete) /*-{
+    this.autocomplete = param_autocomplete;
+  }-*/;
+
+  public final native boolean isAutofocus() /*-{
+    return this.autofocus;
+  }-*/;
+
+  public final native void setAutofocus(boolean param_autofocus) /*-{
+    this.autofocus = param_autofocus;
+  }-*/;
+
+  public final native boolean isChecked() /*-{
+    return this.checked;
+  }-*/;
+
+  public final native void setChecked(boolean param_checked) /*-{
+    this.checked = param_checked;
+  }-*/;
+
+  public final native boolean isDefaultChecked() /*-{
+    return this.defaultChecked;
+  }-*/;
+
+  public final native void setDefaultChecked(boolean param_defaultChecked) /*-{
+    this.defaultChecked = param_defaultChecked;
+  }-*/;
+
+  public final native String getDefaultValue() /*-{
+    return this.defaultValue;
+  }-*/;
+
+  public final native void setDefaultValue(String param_defaultValue) /*-{
+    this.defaultValue = param_defaultValue;
+  }-*/;
+
+  public final native String getDirName() /*-{
+    return this.dirName;
+  }-*/;
+
+  public final native void setDirName(String param_dirName) /*-{
+    this.dirName = param_dirName;
+  }-*/;
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native JsFileList getFiles() /*-{
+    return this.files;
+  }-*/;
+
+  public final native void setFiles(FileList param_files) /*-{
+    this.files = param_files;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native String getFormAction() /*-{
+    return this.formAction;
+  }-*/;
+
+  public final native void setFormAction(String param_formAction) /*-{
+    this.formAction = param_formAction;
+  }-*/;
+
+  public final native String getFormEnctype() /*-{
+    return this.formEnctype;
+  }-*/;
+
+  public final native void setFormEnctype(String param_formEnctype) /*-{
+    this.formEnctype = param_formEnctype;
+  }-*/;
+
+  public final native String getFormMethod() /*-{
+    return this.formMethod;
+  }-*/;
+
+  public final native void setFormMethod(String param_formMethod) /*-{
+    this.formMethod = param_formMethod;
+  }-*/;
+
+  public final native boolean isFormNoValidate() /*-{
+    return this.formNoValidate;
+  }-*/;
+
+  public final native void setFormNoValidate(boolean param_formNoValidate) /*-{
+    this.formNoValidate = param_formNoValidate;
+  }-*/;
+
+  public final native String getFormTarget() /*-{
+    return this.formTarget;
+  }-*/;
+
+  public final native void setFormTarget(String param_formTarget) /*-{
+    this.formTarget = param_formTarget;
+  }-*/;
+
+  public final native int getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(int param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native boolean isIncremental() /*-{
+    return this.incremental;
+  }-*/;
+
+  public final native void setIncremental(boolean param_incremental) /*-{
+    this.incremental = param_incremental;
+  }-*/;
+
+  public final native boolean isIndeterminate() /*-{
+    return this.indeterminate;
+  }-*/;
+
+  public final native void setIndeterminate(boolean param_indeterminate) /*-{
+    this.indeterminate = param_indeterminate;
+  }-*/;
+
+  public final native JsNodeList getLabels() /*-{
+    return this.labels;
+  }-*/;
+
+  public final native String getMax() /*-{
+    return this.max;
+  }-*/;
+
+  public final native void setMax(String param_max) /*-{
+    this.max = param_max;
+  }-*/;
+
+  public final native int getMaxLength() /*-{
+    return this.maxLength;
+  }-*/;
+
+  public final native void setMaxLength(int param_maxLength) /*-{
+    this.maxLength = param_maxLength;
+  }-*/;
+
+  public final native String getMin() /*-{
+    return this.min;
+  }-*/;
+
+  public final native void setMin(String param_min) /*-{
+    this.min = param_min;
+  }-*/;
+
+  public final native boolean isMultiple() /*-{
+    return this.multiple;
+  }-*/;
+
+  public final native void setMultiple(boolean param_multiple) /*-{
+    this.multiple = param_multiple;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native EventListener getOnwebkitspeechchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitspeechchange);
+  }-*/;
+
+  public final native void setOnwebkitspeechchange(EventListener listener) /*-{
+    this.onwebkitspeechchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native String getPattern() /*-{
+    return this.pattern;
+  }-*/;
+
+  public final native void setPattern(String param_pattern) /*-{
+    this.pattern = param_pattern;
+  }-*/;
+
+  public final native String getPlaceholder() /*-{
+    return this.placeholder;
+  }-*/;
+
+  public final native void setPlaceholder(String param_placeholder) /*-{
+    this.placeholder = param_placeholder;
+  }-*/;
+
+  public final native boolean isReadOnly() /*-{
+    return this.readOnly;
+  }-*/;
+
+  public final native void setReadOnly(boolean param_readOnly) /*-{
+    this.readOnly = param_readOnly;
+  }-*/;
+
+  public final native boolean isRequired() /*-{
+    return this.required;
+  }-*/;
+
+  public final native void setRequired(boolean param_required) /*-{
+    this.required = param_required;
+  }-*/;
+
+  public final native String getSelectionDirection() /*-{
+    return this.selectionDirection;
+  }-*/;
+
+  public final native void setSelectionDirection(String param_selectionDirection) /*-{
+    this.selectionDirection = param_selectionDirection;
+  }-*/;
+
+  public final native int getSelectionEnd() /*-{
+    return this.selectionEnd;
+  }-*/;
+
+  public final native void setSelectionEnd(int param_selectionEnd) /*-{
+    this.selectionEnd = param_selectionEnd;
+  }-*/;
+
+  public final native int getSelectionStart() /*-{
+    return this.selectionStart;
+  }-*/;
+
+  public final native void setSelectionStart(int param_selectionStart) /*-{
+    this.selectionStart = param_selectionStart;
+  }-*/;
+
+  public final native int getSize() /*-{
+    return this.size;
+  }-*/;
+
+  public final native void setSize(int param_size) /*-{
+    this.size = param_size;
+  }-*/;
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native String getStep() /*-{
+    return this.step;
+  }-*/;
+
+  public final native void setStep(String param_step) /*-{
+    this.step = param_step;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+
+  public final native String getUseMap() /*-{
+    return this.useMap;
+  }-*/;
+
+  public final native void setUseMap(String param_useMap) /*-{
+    this.useMap = param_useMap;
+  }-*/;
+
+  public final native String getValidationMessage() /*-{
+    return this.validationMessage;
+  }-*/;
+
+  public final native JsValidityState getValidity() /*-{
+    return this.validity;
+  }-*/;
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+
+  public final native Date getValueAsDate() /*-{
+    return this.valueAsDate;
+  }-*/;
+
+  public final native void setValueAsDate(Date param_valueAsDate) /*-{
+    this.valueAsDate = param_valueAsDate;
+  }-*/;
+
+  public final native double getValueAsNumber() /*-{
+    return this.valueAsNumber;
+  }-*/;
+
+  public final native void setValueAsNumber(double param_valueAsNumber) /*-{
+    this.valueAsNumber = param_valueAsNumber;
+  }-*/;
+
+  public final native boolean isWebkitGrammar() /*-{
+    return this.webkitGrammar;
+  }-*/;
+
+  public final native void setWebkitGrammar(boolean param_webkitGrammar) /*-{
+    this.webkitGrammar = param_webkitGrammar;
+  }-*/;
+
+  public final native boolean isWebkitSpeech() /*-{
+    return this.webkitSpeech;
+  }-*/;
+
+  public final native void setWebkitSpeech(boolean param_webkitSpeech) /*-{
+    this.webkitSpeech = param_webkitSpeech;
+  }-*/;
+
+  public final native boolean isWebkitdirectory() /*-{
+    return this.webkitdirectory;
+  }-*/;
+
+  public final native void setWebkitdirectory(boolean param_webkitdirectory) /*-{
+    this.webkitdirectory = param_webkitdirectory;
+  }-*/;
+
+  public final native int getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(int param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native boolean isWillValidate() /*-{
+    return this.willValidate;
+  }-*/;
+
+  public final native boolean checkValidity() /*-{
+    return this.checkValidity();
+  }-*/;
+
+  public final native void select() /*-{
+    this.select();
+  }-*/;
+
+  public final native void setCustomValidity(String error) /*-{
+    this.setCustomValidity(error);
+  }-*/;
+
+  public final native void setSelectionRange(int start, int end) /*-{
+    this.setSelectionRange(start, end);
+  }-*/;
+
+  public final native void setSelectionRange(int start, int end, String direction) /*-{
+    this.setSelectionRange(start, end, direction);
+  }-*/;
+
+  public final native void stepDown() /*-{
+    this.stepDown();
+  }-*/;
+
+  public final native void stepDown(int n) /*-{
+    this.stepDown(n);
+  }-*/;
+
+  public final native void stepUp() /*-{
+    this.stepUp();
+  }-*/;
+
+  public final native void stepUp(int n) /*-{
+    this.stepUp(n);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsInt16Array.java b/elemental/src/elemental/js/html/JsInt16Array.java
new file mode 100644
index 0000000..210cda6
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsInt16Array.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ArrayBufferView;
+import elemental.html.Int16Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsInt16Array extends JsArrayBufferView  implements Int16Array, IndexableInt {
+  protected JsInt16Array() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setElements(Object array) /*-{
+    this.setElements(array);
+  }-*/;
+
+  public final native void setElements(Object array, int offset) /*-{
+    this.setElements(array, offset);
+  }-*/;
+
+  public final native JsInt16Array subarray(int start) /*-{
+    return this.subarray(start);
+  }-*/;
+
+  public final native JsInt16Array subarray(int start, int end) /*-{
+    return this.subarray(start, end);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsInt32Array.java b/elemental/src/elemental/js/html/JsInt32Array.java
new file mode 100644
index 0000000..5cb8681
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsInt32Array.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ArrayBufferView;
+import elemental.html.Int32Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsInt32Array extends JsArrayBufferView  implements Int32Array, IndexableInt {
+  protected JsInt32Array() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setElements(Object array) /*-{
+    this.setElements(array);
+  }-*/;
+
+  public final native void setElements(Object array, int offset) /*-{
+    this.setElements(array, offset);
+  }-*/;
+
+  public final native JsInt32Array subarray(int start) /*-{
+    return this.subarray(start);
+  }-*/;
+
+  public final native JsInt32Array subarray(int start, int end) /*-{
+    return this.subarray(start, end);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsInt8Array.java b/elemental/src/elemental/js/html/JsInt8Array.java
new file mode 100644
index 0000000..d6544a3
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsInt8Array.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Int8Array;
+import elemental.html.ArrayBufferView;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsInt8Array extends JsArrayBufferView  implements Int8Array, IndexableInt {
+  protected JsInt8Array() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setElements(Object array) /*-{
+    this.setElements(array);
+  }-*/;
+
+  public final native void setElements(Object array, int offset) /*-{
+    this.setElements(array, offset);
+  }-*/;
+
+  public final native JsInt8Array subarray(int start) /*-{
+    return this.subarray(start);
+  }-*/;
+
+  public final native JsInt8Array subarray(int start, int end) /*-{
+    return this.subarray(start, end);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsJavaScriptAudioNode.java b/elemental/src/elemental/js/html/JsJavaScriptAudioNode.java
new file mode 100644
index 0000000..11b0b1a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsJavaScriptAudioNode.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioNode;
+import elemental.events.EventListener;
+import elemental.html.JavaScriptAudioNode;
+import elemental.js.events.JsEventListener;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsJavaScriptAudioNode extends JsAudioNode  implements JavaScriptAudioNode {
+  protected JsJavaScriptAudioNode() {}
+
+  public final native int getBufferSize() /*-{
+    return this.bufferSize;
+  }-*/;
+
+  public final native EventListener getOnaudioprocess() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onaudioprocess);
+  }-*/;
+
+  public final native void setOnaudioprocess(EventListener listener) /*-{
+    this.onaudioprocess = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;}
diff --git a/elemental/src/elemental/js/html/JsJavaScriptCallFrame.java b/elemental/src/elemental/js/html/JsJavaScriptCallFrame.java
new file mode 100644
index 0000000..631c9d1
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsJavaScriptCallFrame.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.util.Indexable;
+import elemental.html.JavaScriptCallFrame;
+import elemental.js.util.JsIndexable;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsJavaScriptCallFrame extends JsElementalMixinBase  implements JavaScriptCallFrame {
+  protected JsJavaScriptCallFrame() {}
+
+  public final native JsJavaScriptCallFrame getCaller() /*-{
+    return this.caller;
+  }-*/;
+
+  public final native int getColumn() /*-{
+    return this.column;
+  }-*/;
+
+  public final native String getFunctionName() /*-{
+    return this.functionName;
+  }-*/;
+
+  public final native int getLine() /*-{
+    return this.line;
+  }-*/;
+
+  public final native JsIndexable getScopeChain() /*-{
+    return this.scopeChain;
+  }-*/;
+
+  public final native int getSourceID() /*-{
+    return this.sourceID;
+  }-*/;
+
+  public final native Object getThisObject() /*-{
+    return this.thisObject;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void evaluate(String script) /*-{
+    this.evaluate(script);
+  }-*/;
+
+  public final native int scopeType(int scopeIndex) /*-{
+    return this.scopeType(scopeIndex);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsKeygenElement.java b/elemental/src/elemental/js/html/JsKeygenElement.java
new file mode 100644
index 0000000..609ad85
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsKeygenElement.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ValidityState;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.FormElement;
+import elemental.js.dom.JsNodeList;
+import elemental.html.KeygenElement;
+import elemental.dom.NodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsKeygenElement extends JsElement  implements KeygenElement {
+  protected JsKeygenElement() {}
+
+  public final native boolean isAutofocus() /*-{
+    return this.autofocus;
+  }-*/;
+
+  public final native void setAutofocus(boolean param_autofocus) /*-{
+    this.autofocus = param_autofocus;
+  }-*/;
+
+  public final native String getChallenge() /*-{
+    return this.challenge;
+  }-*/;
+
+  public final native void setChallenge(String param_challenge) /*-{
+    this.challenge = param_challenge;
+  }-*/;
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native String getKeytype() /*-{
+    return this.keytype;
+  }-*/;
+
+  public final native void setKeytype(String param_keytype) /*-{
+    this.keytype = param_keytype;
+  }-*/;
+
+  public final native JsNodeList getLabels() /*-{
+    return this.labels;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native String getValidationMessage() /*-{
+    return this.validationMessage;
+  }-*/;
+
+  public final native JsValidityState getValidity() /*-{
+    return this.validity;
+  }-*/;
+
+  public final native boolean isWillValidate() /*-{
+    return this.willValidate;
+  }-*/;
+
+  public final native boolean checkValidity() /*-{
+    return this.checkValidity();
+  }-*/;
+
+  public final native void setCustomValidity(String error) /*-{
+    this.setCustomValidity(error);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsLIElement.java b/elemental/src/elemental/js/html/JsLIElement.java
new file mode 100644
index 0000000..71e6a7a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsLIElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.LIElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsLIElement extends JsElement  implements LIElement {
+  protected JsLIElement() {}
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+
+  public final native int getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(int param_value) /*-{
+    this.value = param_value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsLabelElement.java b/elemental/src/elemental/js/html/JsLabelElement.java
new file mode 100644
index 0000000..8804cc5
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsLabelElement.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.FormElement;
+import elemental.html.LabelElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsLabelElement extends JsElement  implements LabelElement {
+  protected JsLabelElement() {}
+
+  public final native JsElement getControl() /*-{
+    return this.control;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native String getHtmlFor() /*-{
+    return this.htmlFor;
+  }-*/;
+
+  public final native void setHtmlFor(String param_htmlFor) /*-{
+    this.htmlFor = param_htmlFor;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsLegendElement.java b/elemental/src/elemental/js/html/JsLegendElement.java
new file mode 100644
index 0000000..f08334a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsLegendElement.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.LegendElement;
+import elemental.js.dom.JsElement;
+import elemental.html.FormElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsLegendElement extends JsElement  implements LegendElement {
+  protected JsLegendElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsLinkElement.java b/elemental/src/elemental/js/html/JsLinkElement.java
new file mode 100644
index 0000000..7ce78e8
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsLinkElement.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.dom.DOMSettableTokenList;
+import elemental.js.dom.JsDOMSettableTokenList;
+import elemental.stylesheets.StyleSheet;
+import elemental.js.stylesheets.JsStyleSheet;
+import elemental.html.LinkElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsLinkElement extends JsElement  implements LinkElement {
+  protected JsLinkElement() {}
+
+  public final native String getCharset() /*-{
+    return this.charset;
+  }-*/;
+
+  public final native void setCharset(String param_charset) /*-{
+    this.charset = param_charset;
+  }-*/;
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native String getHref() /*-{
+    return this.href;
+  }-*/;
+
+  public final native void setHref(String param_href) /*-{
+    this.href = param_href;
+  }-*/;
+
+  public final native String getHreflang() /*-{
+    return this.hreflang;
+  }-*/;
+
+  public final native void setHreflang(String param_hreflang) /*-{
+    this.hreflang = param_hreflang;
+  }-*/;
+
+  public final native String getMedia() /*-{
+    return this.media;
+  }-*/;
+
+  public final native void setMedia(String param_media) /*-{
+    this.media = param_media;
+  }-*/;
+
+  public final native String getRel() /*-{
+    return this.rel;
+  }-*/;
+
+  public final native void setRel(String param_rel) /*-{
+    this.rel = param_rel;
+  }-*/;
+
+  public final native String getRev() /*-{
+    return this.rev;
+  }-*/;
+
+  public final native void setRev(String param_rev) /*-{
+    this.rev = param_rev;
+  }-*/;
+
+  public final native JsStyleSheet getSheet() /*-{
+    return this.sheet;
+  }-*/;
+
+  public final native JsDOMSettableTokenList getSizes() /*-{
+    return this.sizes;
+  }-*/;
+
+  public final native void setSizes(DOMSettableTokenList param_sizes) /*-{
+    this.sizes = param_sizes;
+  }-*/;
+
+  public final native String getTarget() /*-{
+    return this.target;
+  }-*/;
+
+  public final native void setTarget(String param_target) /*-{
+    this.target = param_target;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsLocation.java b/elemental/src/elemental/js/html/JsLocation.java
new file mode 100644
index 0000000..1d7771a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsLocation.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.util.Indexable;
+import elemental.js.util.JsIndexable;
+import elemental.html.Location;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsLocation extends JsElementalMixinBase  implements Location {
+  protected JsLocation() {}
+
+  public final native JsIndexable getAncestorOrigins() /*-{
+    return this.ancestorOrigins;
+  }-*/;
+
+  public final native String getHash() /*-{
+    return this.hash;
+  }-*/;
+
+  public final native void setHash(String param_hash) /*-{
+    this.hash = param_hash;
+  }-*/;
+
+  public final native String getHost() /*-{
+    return this.host;
+  }-*/;
+
+  public final native void setHost(String param_host) /*-{
+    this.host = param_host;
+  }-*/;
+
+  public final native String getHostname() /*-{
+    return this.hostname;
+  }-*/;
+
+  public final native void setHostname(String param_hostname) /*-{
+    this.hostname = param_hostname;
+  }-*/;
+
+  public final native String getHref() /*-{
+    return this.href;
+  }-*/;
+
+  public final native void setHref(String param_href) /*-{
+    this.href = param_href;
+  }-*/;
+
+  public final native String getOrigin() /*-{
+    return this.origin;
+  }-*/;
+
+  public final native String getPathname() /*-{
+    return this.pathname;
+  }-*/;
+
+  public final native void setPathname(String param_pathname) /*-{
+    this.pathname = param_pathname;
+  }-*/;
+
+  public final native String getPort() /*-{
+    return this.port;
+  }-*/;
+
+  public final native void setPort(String param_port) /*-{
+    this.port = param_port;
+  }-*/;
+
+  public final native String getProtocol() /*-{
+    return this.protocol;
+  }-*/;
+
+  public final native void setProtocol(String param_protocol) /*-{
+    this.protocol = param_protocol;
+  }-*/;
+
+  public final native String getSearch() /*-{
+    return this.search;
+  }-*/;
+
+  public final native void setSearch(String param_search) /*-{
+    this.search = param_search;
+  }-*/;
+
+  public final native void assign(String url) /*-{
+    this.assign(url);
+  }-*/;
+
+  public final native void reload() /*-{
+    this.reload();
+  }-*/;
+
+  public final native void replace(String url) /*-{
+    this.replace(url);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMapElement.java b/elemental/src/elemental/js/html/JsMapElement.java
new file mode 100644
index 0000000..9a5313d
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMapElement.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.MapElement;
+import elemental.html.HTMLCollection;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMapElement extends JsElement  implements MapElement {
+  protected JsMapElement() {}
+
+  public final native JsHTMLCollection getAreas() /*-{
+    return this.areas;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMarqueeElement.java b/elemental/src/elemental/js/html/JsMarqueeElement.java
new file mode 100644
index 0000000..4b09fd7
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMarqueeElement.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.MarqueeElement;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMarqueeElement extends JsElement  implements MarqueeElement {
+  protected JsMarqueeElement() {}
+
+  public final native String getBehavior() /*-{
+    return this.behavior;
+  }-*/;
+
+  public final native void setBehavior(String param_behavior) /*-{
+    this.behavior = param_behavior;
+  }-*/;
+
+  public final native String getBgColor() /*-{
+    return this.bgColor;
+  }-*/;
+
+  public final native void setBgColor(String param_bgColor) /*-{
+    this.bgColor = param_bgColor;
+  }-*/;
+
+  public final native String getDirection() /*-{
+    return this.direction;
+  }-*/;
+
+  public final native void setDirection(String param_direction) /*-{
+    this.direction = param_direction;
+  }-*/;
+
+  public final native String getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(String param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native int getHspace() /*-{
+    return this.hspace;
+  }-*/;
+
+  public final native void setHspace(int param_hspace) /*-{
+    this.hspace = param_hspace;
+  }-*/;
+
+  public final native int getLoop() /*-{
+    return this.loop;
+  }-*/;
+
+  public final native void setLoop(int param_loop) /*-{
+    this.loop = param_loop;
+  }-*/;
+
+  public final native int getScrollAmount() /*-{
+    return this.scrollAmount;
+  }-*/;
+
+  public final native void setScrollAmount(int param_scrollAmount) /*-{
+    this.scrollAmount = param_scrollAmount;
+  }-*/;
+
+  public final native int getScrollDelay() /*-{
+    return this.scrollDelay;
+  }-*/;
+
+  public final native void setScrollDelay(int param_scrollDelay) /*-{
+    this.scrollDelay = param_scrollDelay;
+  }-*/;
+
+  public final native boolean isTrueSpeed() /*-{
+    return this.trueSpeed;
+  }-*/;
+
+  public final native void setTrueSpeed(boolean param_trueSpeed) /*-{
+    this.trueSpeed = param_trueSpeed;
+  }-*/;
+
+  public final native int getVspace() /*-{
+    return this.vspace;
+  }-*/;
+
+  public final native void setVspace(int param_vspace) /*-{
+    this.vspace = param_vspace;
+  }-*/;
+
+  public final native String getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(String param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native void start() /*-{
+    this.start();
+  }-*/;
+
+  public final native void stop() /*-{
+    this.stop();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMediaController.java b/elemental/src/elemental/js/html/JsMediaController.java
new file mode 100644
index 0000000..92a344f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMediaController.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.MediaController;
+import elemental.js.events.JsEvent;
+import elemental.html.TimeRanges;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaController extends JsElementalMixinBase  implements MediaController {
+  protected JsMediaController() {}
+
+  public final native JsTimeRanges getBuffered() /*-{
+    return this.buffered;
+  }-*/;
+
+  public final native double getCurrentTime() /*-{
+    return this.currentTime;
+  }-*/;
+
+  public final native void setCurrentTime(double param_currentTime) /*-{
+    this.currentTime = param_currentTime;
+  }-*/;
+
+  public final native double getDefaultPlaybackRate() /*-{
+    return this.defaultPlaybackRate;
+  }-*/;
+
+  public final native void setDefaultPlaybackRate(double param_defaultPlaybackRate) /*-{
+    this.defaultPlaybackRate = param_defaultPlaybackRate;
+  }-*/;
+
+  public final native double getDuration() /*-{
+    return this.duration;
+  }-*/;
+
+  public final native boolean isMuted() /*-{
+    return this.muted;
+  }-*/;
+
+  public final native void setMuted(boolean param_muted) /*-{
+    this.muted = param_muted;
+  }-*/;
+
+  public final native boolean isPaused() /*-{
+    return this.paused;
+  }-*/;
+
+  public final native double getPlaybackRate() /*-{
+    return this.playbackRate;
+  }-*/;
+
+  public final native void setPlaybackRate(double param_playbackRate) /*-{
+    this.playbackRate = param_playbackRate;
+  }-*/;
+
+  public final native JsTimeRanges getPlayed() /*-{
+    return this.played;
+  }-*/;
+
+  public final native JsTimeRanges getSeekable() /*-{
+    return this.seekable;
+  }-*/;
+
+  public final native double getVolume() /*-{
+    return this.volume;
+  }-*/;
+
+  public final native void setVolume(double param_volume) /*-{
+    this.volume = param_volume;
+  }-*/;
+
+  public final native void pause() /*-{
+    this.pause();
+  }-*/;
+
+  public final native void play() /*-{
+    this.play();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMediaElement.java b/elemental/src/elemental/js/html/JsMediaElement.java
new file mode 100644
index 0000000..aa9a3e2
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMediaElement.java
@@ -0,0 +1,366 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.MediaError;
+import elemental.html.TextTrack;
+import elemental.html.MediaController;
+import elemental.html.TextTrackList;
+import elemental.html.TimeRanges;
+import elemental.events.EventListener;
+import elemental.html.MediaElement;
+import elemental.js.events.JsEventListener;
+import elemental.html.Uint8Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaElement extends JsElement  implements MediaElement {
+  protected JsMediaElement() {}
+
+  public final native boolean isAutoplay() /*-{
+    return this.autoplay;
+  }-*/;
+
+  public final native void setAutoplay(boolean param_autoplay) /*-{
+    this.autoplay = param_autoplay;
+  }-*/;
+
+  public final native JsTimeRanges getBuffered() /*-{
+    return this.buffered;
+  }-*/;
+
+  public final native JsMediaController getController() /*-{
+    return this.controller;
+  }-*/;
+
+  public final native void setController(MediaController param_controller) /*-{
+    this.controller = param_controller;
+  }-*/;
+
+  public final native boolean isControls() /*-{
+    return this.controls;
+  }-*/;
+
+  public final native void setControls(boolean param_controls) /*-{
+    this.controls = param_controls;
+  }-*/;
+
+  public final native String getCurrentSrc() /*-{
+    return this.currentSrc;
+  }-*/;
+
+  public final native float getCurrentTime() /*-{
+    return this.currentTime;
+  }-*/;
+
+  public final native void setCurrentTime(float param_currentTime) /*-{
+    this.currentTime = param_currentTime;
+  }-*/;
+
+  public final native boolean isDefaultMuted() /*-{
+    return this.defaultMuted;
+  }-*/;
+
+  public final native void setDefaultMuted(boolean param_defaultMuted) /*-{
+    this.defaultMuted = param_defaultMuted;
+  }-*/;
+
+  public final native float getDefaultPlaybackRate() /*-{
+    return this.defaultPlaybackRate;
+  }-*/;
+
+  public final native void setDefaultPlaybackRate(float param_defaultPlaybackRate) /*-{
+    this.defaultPlaybackRate = param_defaultPlaybackRate;
+  }-*/;
+
+  public final native float getDuration() /*-{
+    return this.duration;
+  }-*/;
+
+  public final native boolean isEnded() /*-{
+    return this.ended;
+  }-*/;
+
+  public final native JsMediaError getError() /*-{
+    return this.error;
+  }-*/;
+
+  public final native double getInitialTime() /*-{
+    return this.initialTime;
+  }-*/;
+
+  public final native boolean isLoop() /*-{
+    return this.loop;
+  }-*/;
+
+  public final native void setLoop(boolean param_loop) /*-{
+    this.loop = param_loop;
+  }-*/;
+
+  public final native String getMediaGroup() /*-{
+    return this.mediaGroup;
+  }-*/;
+
+  public final native void setMediaGroup(String param_mediaGroup) /*-{
+    this.mediaGroup = param_mediaGroup;
+  }-*/;
+
+  public final native boolean isMuted() /*-{
+    return this.muted;
+  }-*/;
+
+  public final native void setMuted(boolean param_muted) /*-{
+    this.muted = param_muted;
+  }-*/;
+
+  public final native int getNetworkState() /*-{
+    return this.networkState;
+  }-*/;
+
+  public final native EventListener getOnwebkitkeyadded() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitkeyadded);
+  }-*/;
+
+  public final native void setOnwebkitkeyadded(EventListener listener) /*-{
+    this.onwebkitkeyadded = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitkeyerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitkeyerror);
+  }-*/;
+
+  public final native void setOnwebkitkeyerror(EventListener listener) /*-{
+    this.onwebkitkeyerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitkeymessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitkeymessage);
+  }-*/;
+
+  public final native void setOnwebkitkeymessage(EventListener listener) /*-{
+    this.onwebkitkeymessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitneedkey() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitneedkey);
+  }-*/;
+
+  public final native void setOnwebkitneedkey(EventListener listener) /*-{
+    this.onwebkitneedkey = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitsourceclose() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitsourceclose);
+  }-*/;
+
+  public final native void setOnwebkitsourceclose(EventListener listener) /*-{
+    this.onwebkitsourceclose = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitsourceended() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitsourceended);
+  }-*/;
+
+  public final native void setOnwebkitsourceended(EventListener listener) /*-{
+    this.onwebkitsourceended = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitsourceopen() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitsourceopen);
+  }-*/;
+
+  public final native void setOnwebkitsourceopen(EventListener listener) /*-{
+    this.onwebkitsourceopen = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native boolean isPaused() /*-{
+    return this.paused;
+  }-*/;
+
+  public final native float getPlaybackRate() /*-{
+    return this.playbackRate;
+  }-*/;
+
+  public final native void setPlaybackRate(float param_playbackRate) /*-{
+    this.playbackRate = param_playbackRate;
+  }-*/;
+
+  public final native JsTimeRanges getPlayed() /*-{
+    return this.played;
+  }-*/;
+
+  public final native String getPreload() /*-{
+    return this.preload;
+  }-*/;
+
+  public final native void setPreload(String param_preload) /*-{
+    this.preload = param_preload;
+  }-*/;
+
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native JsTimeRanges getSeekable() /*-{
+    return this.seekable;
+  }-*/;
+
+  public final native boolean isSeeking() /*-{
+    return this.seeking;
+  }-*/;
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native float getStartTime() /*-{
+    return this.startTime;
+  }-*/;
+
+  public final native JsTextTrackList getTextTracks() /*-{
+    return this.textTracks;
+  }-*/;
+
+  public final native float getVolume() /*-{
+    return this.volume;
+  }-*/;
+
+  public final native void setVolume(float param_volume) /*-{
+    this.volume = param_volume;
+  }-*/;
+
+  public final native int getWebkitAudioDecodedByteCount() /*-{
+    return this.webkitAudioDecodedByteCount;
+  }-*/;
+
+  public final native boolean isWebkitClosedCaptionsVisible() /*-{
+    return this.webkitClosedCaptionsVisible;
+  }-*/;
+
+  public final native void setWebkitClosedCaptionsVisible(boolean param_webkitClosedCaptionsVisible) /*-{
+    this.webkitClosedCaptionsVisible = param_webkitClosedCaptionsVisible;
+  }-*/;
+
+  public final native boolean isWebkitHasClosedCaptions() /*-{
+    return this.webkitHasClosedCaptions;
+  }-*/;
+
+  public final native String getWebkitMediaSourceURL() /*-{
+    return this.webkitMediaSourceURL;
+  }-*/;
+
+  public final native boolean isWebkitPreservesPitch() /*-{
+    return this.webkitPreservesPitch;
+  }-*/;
+
+  public final native void setWebkitPreservesPitch(boolean param_webkitPreservesPitch) /*-{
+    this.webkitPreservesPitch = param_webkitPreservesPitch;
+  }-*/;
+
+  public final native int getWebkitSourceState() /*-{
+    return this.webkitSourceState;
+  }-*/;
+
+  public final native int getWebkitVideoDecodedByteCount() /*-{
+    return this.webkitVideoDecodedByteCount;
+  }-*/;
+
+  public final native JsTextTrack addTextTrack(String kind) /*-{
+    return this.addTextTrack(kind);
+  }-*/;
+
+  public final native JsTextTrack addTextTrack(String kind, String label) /*-{
+    return this.addTextTrack(kind, label);
+  }-*/;
+
+  public final native JsTextTrack addTextTrack(String kind, String label, String language) /*-{
+    return this.addTextTrack(kind, label, language);
+  }-*/;
+
+  public final native String canPlayType(String type, String keySystem) /*-{
+    return this.canPlayType(type, keySystem);
+  }-*/;
+
+  public final native void load() /*-{
+    this.load();
+  }-*/;
+
+  public final native void pause() /*-{
+    this.pause();
+  }-*/;
+
+  public final native void play() /*-{
+    this.play();
+  }-*/;
+
+  public final native void webkitAddKey(String keySystem, Uint8Array key) /*-{
+    this.webkitAddKey(keySystem, key);
+  }-*/;
+
+  public final native void webkitAddKey(String keySystem, Uint8Array key, Uint8Array initData, String sessionId) /*-{
+    this.webkitAddKey(keySystem, key, initData, sessionId);
+  }-*/;
+
+  public final native void webkitCancelKeyRequest(String keySystem, String sessionId) /*-{
+    this.webkitCancelKeyRequest(keySystem, sessionId);
+  }-*/;
+
+  public final native void webkitGenerateKeyRequest(String keySystem) /*-{
+    this.webkitGenerateKeyRequest(keySystem);
+  }-*/;
+
+  public final native void webkitGenerateKeyRequest(String keySystem, Uint8Array initData) /*-{
+    this.webkitGenerateKeyRequest(keySystem, initData);
+  }-*/;
+
+  public final native void webkitSourceAbort(String id) /*-{
+    this.webkitSourceAbort(id);
+  }-*/;
+
+  public final native void webkitSourceAddId(String id, String type) /*-{
+    this.webkitSourceAddId(id, type);
+  }-*/;
+
+  public final native void webkitSourceAppend(String id, Uint8Array data) /*-{
+    this.webkitSourceAppend(id, data);
+  }-*/;
+
+  public final native JsTimeRanges webkitSourceBuffered(String id) /*-{
+    return this.webkitSourceBuffered(id);
+  }-*/;
+
+  public final native void webkitSourceEndOfStream(int status) /*-{
+    this.webkitSourceEndOfStream(status);
+  }-*/;
+
+  public final native void webkitSourceRemoveId(String id) /*-{
+    this.webkitSourceRemoveId(id);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMediaElementAudioSourceNode.java b/elemental/src/elemental/js/html/JsMediaElementAudioSourceNode.java
new file mode 100644
index 0000000..3c7ba09
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMediaElementAudioSourceNode.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.AudioSourceNode;
+import elemental.html.MediaElementAudioSourceNode;
+import elemental.html.MediaElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaElementAudioSourceNode extends JsAudioSourceNode  implements MediaElementAudioSourceNode {
+  protected JsMediaElementAudioSourceNode() {}
+
+  public final native JsMediaElement getMediaElement() /*-{
+    return this.mediaElement;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMediaError.java b/elemental/src/elemental/js/html/JsMediaError.java
new file mode 100644
index 0000000..b3c2a2f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMediaError.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.MediaError;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaError extends JsElementalMixinBase  implements MediaError {
+  protected JsMediaError() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMediaKeyError.java b/elemental/src/elemental/js/html/JsMediaKeyError.java
new file mode 100644
index 0000000..c830bb6
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMediaKeyError.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.MediaKeyError;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaKeyError extends JsElementalMixinBase  implements MediaKeyError {
+  protected JsMediaKeyError() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMediaKeyEvent.java b/elemental/src/elemental/js/html/JsMediaKeyEvent.java
new file mode 100644
index 0000000..64082eb
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMediaKeyEvent.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.MediaKeyError;
+import elemental.events.Event;
+import elemental.js.events.JsEvent;
+import elemental.html.MediaKeyEvent;
+import elemental.html.Uint8Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaKeyEvent extends JsEvent  implements MediaKeyEvent {
+  protected JsMediaKeyEvent() {}
+
+  public final native String getDefaultURL() /*-{
+    return this.defaultURL;
+  }-*/;
+
+  public final native JsMediaKeyError getErrorCode() /*-{
+    return this.errorCode;
+  }-*/;
+
+  public final native JsUint8Array getInitData() /*-{
+    return this.initData;
+  }-*/;
+
+  public final native String getKeySystem() /*-{
+    return this.keySystem;
+  }-*/;
+
+  public final native JsUint8Array getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getSessionId() /*-{
+    return this.sessionId;
+  }-*/;
+
+  public final native int getSystemCode() /*-{
+    return this.systemCode;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMediaQueryList.java b/elemental/src/elemental/js/html/JsMediaQueryList.java
new file mode 100644
index 0000000..cbc7bbd
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMediaQueryList.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.MediaQueryListListener;
+import elemental.html.MediaQueryList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaQueryList extends JsElementalMixinBase  implements MediaQueryList {
+  protected JsMediaQueryList() {}
+
+  public final native boolean isMatches() /*-{
+    return this.matches;
+  }-*/;
+
+  public final native String getMedia() /*-{
+    return this.media;
+  }-*/;
+
+  public final native void addListener(MediaQueryListListener listener) /*-{
+    this.addListener(listener);
+  }-*/;
+
+  public final native void removeListener(MediaQueryListListener listener) /*-{
+    this.removeListener(listener);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMediaQueryListListener.java b/elemental/src/elemental/js/html/JsMediaQueryListListener.java
new file mode 100644
index 0000000..c379fd8
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMediaQueryListListener.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.MediaQueryList;
+import elemental.html.MediaQueryListListener;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaQueryListListener extends JsElementalMixinBase  implements MediaQueryListListener {
+  protected JsMediaQueryListListener() {}
+
+  public final native void queryChanged(MediaQueryList list) /*-{
+    this.queryChanged(list);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMemoryInfo.java b/elemental/src/elemental/js/html/JsMemoryInfo.java
new file mode 100644
index 0000000..2e0c0c4
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMemoryInfo.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.MemoryInfo;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMemoryInfo extends JsElementalMixinBase  implements MemoryInfo {
+  protected JsMemoryInfo() {}
+
+  public final native int getJsHeapSizeLimit() /*-{
+    return this.jsHeapSizeLimit;
+  }-*/;
+
+  public final native int getTotalJSHeapSize() /*-{
+    return this.totalJSHeapSize;
+  }-*/;
+
+  public final native int getUsedJSHeapSize() /*-{
+    return this.usedJSHeapSize;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMenuElement.java b/elemental/src/elemental/js/html/JsMenuElement.java
new file mode 100644
index 0000000..d2a6557
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMenuElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.MenuElement;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMenuElement extends JsElement  implements MenuElement {
+  protected JsMenuElement() {}
+
+  public final native boolean isCompact() /*-{
+    return this.compact;
+  }-*/;
+
+  public final native void setCompact(boolean param_compact) /*-{
+    this.compact = param_compact;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMetaElement.java b/elemental/src/elemental/js/html/JsMetaElement.java
new file mode 100644
index 0000000..eee7d5e
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMetaElement.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.MetaElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMetaElement extends JsElement  implements MetaElement {
+  protected JsMetaElement() {}
+
+  public final native String getContent() /*-{
+    return this.content;
+  }-*/;
+
+  public final native void setContent(String param_content) /*-{
+    this.content = param_content;
+  }-*/;
+
+  public final native String getHttpEquiv() /*-{
+    return this.httpEquiv;
+  }-*/;
+
+  public final native void setHttpEquiv(String param_httpEquiv) /*-{
+    this.httpEquiv = param_httpEquiv;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getScheme() /*-{
+    return this.scheme;
+  }-*/;
+
+  public final native void setScheme(String param_scheme) /*-{
+    this.scheme = param_scheme;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMetadata.java b/elemental/src/elemental/js/html/JsMetadata.java
new file mode 100644
index 0000000..ec76614
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMetadata.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Metadata;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMetadata extends JsElementalMixinBase  implements Metadata {
+  protected JsMetadata() {}
+
+  public final native Date getModificationTime() /*-{
+    return this.modificationTime;
+  }-*/;
+
+  public final native double getSize() /*-{
+    return this.size;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsMeterElement.java b/elemental/src/elemental/js/html/JsMeterElement.java
new file mode 100644
index 0000000..e525b38
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsMeterElement.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.js.dom.JsNodeList;
+import elemental.dom.NodeList;
+import elemental.html.MeterElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMeterElement extends JsElement  implements MeterElement {
+  protected JsMeterElement() {}
+
+  public final native double getHigh() /*-{
+    return this.high;
+  }-*/;
+
+  public final native void setHigh(double param_high) /*-{
+    this.high = param_high;
+  }-*/;
+
+  public final native JsNodeList getLabels() /*-{
+    return this.labels;
+  }-*/;
+
+  public final native double getLow() /*-{
+    return this.low;
+  }-*/;
+
+  public final native void setLow(double param_low) /*-{
+    this.low = param_low;
+  }-*/;
+
+  public final native double getMax() /*-{
+    return this.max;
+  }-*/;
+
+  public final native void setMax(double param_max) /*-{
+    this.max = param_max;
+  }-*/;
+
+  public final native double getMin() /*-{
+    return this.min;
+  }-*/;
+
+  public final native void setMin(double param_min) /*-{
+    this.min = param_min;
+  }-*/;
+
+  public final native double getOptimum() /*-{
+    return this.optimum;
+  }-*/;
+
+  public final native void setOptimum(double param_optimum) /*-{
+    this.optimum = param_optimum;
+  }-*/;
+
+  public final native double getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(double param_value) /*-{
+    this.value = param_value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsModElement.java b/elemental/src/elemental/js/html/JsModElement.java
new file mode 100644
index 0000000..ddea9ca
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsModElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.ModElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsModElement extends JsElement  implements ModElement {
+  protected JsModElement() {}
+
+  public final native String getCite() /*-{
+    return this.cite;
+  }-*/;
+
+  public final native void setCite(String param_cite) /*-{
+    this.cite = param_cite;
+  }-*/;
+
+  public final native String getDateTime() /*-{
+    return this.dateTime;
+  }-*/;
+
+  public final native void setDateTime(String param_dateTime) /*-{
+    this.dateTime = param_dateTime;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsNavigator.java b/elemental/src/elemental/js/html/JsNavigator.java
new file mode 100644
index 0000000..7afb956
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsNavigator.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsPointerLock;
+import elemental.dom.PointerLock;
+import elemental.html.NavigatorUserMediaSuccessCallback;
+import elemental.html.BatteryManager;
+import elemental.js.dom.JsGeolocation;
+import elemental.js.util.JsMappable;
+import elemental.util.Mappable;
+import elemental.html.Navigator;
+import elemental.html.DOMMimeTypeArray;
+import elemental.dom.Geolocation;
+import elemental.html.DOMPluginArray;
+import elemental.html.NavigatorUserMediaErrorCallback;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNavigator extends JsElementalMixinBase  implements Navigator {
+  protected JsNavigator() {}
+
+  public final native String getAppCodeName() /*-{
+    return this.appCodeName;
+  }-*/;
+
+  public final native String getAppName() /*-{
+    return this.appName;
+  }-*/;
+
+  public final native String getAppVersion() /*-{
+    return this.appVersion;
+  }-*/;
+
+  public final native boolean isCookieEnabled() /*-{
+    return this.cookieEnabled;
+  }-*/;
+
+  public final native JsGeolocation getGeolocation() /*-{
+    return this.geolocation;
+  }-*/;
+
+  public final native String getLanguage() /*-{
+    return this.language;
+  }-*/;
+
+  public final native JsDOMMimeTypeArray getMimeTypes() /*-{
+    return this.mimeTypes;
+  }-*/;
+
+  public final native boolean isOnLine() /*-{
+    return this.onLine;
+  }-*/;
+
+  public final native String getPlatform() /*-{
+    return this.platform;
+  }-*/;
+
+  public final native JsDOMPluginArray getPlugins() /*-{
+    return this.plugins;
+  }-*/;
+
+  public final native String getProduct() /*-{
+    return this.product;
+  }-*/;
+
+  public final native String getProductSub() /*-{
+    return this.productSub;
+  }-*/;
+
+  public final native String getUserAgent() /*-{
+    return this.userAgent;
+  }-*/;
+
+  public final native String getVendor() /*-{
+    return this.vendor;
+  }-*/;
+
+  public final native String getVendorSub() /*-{
+    return this.vendorSub;
+  }-*/;
+
+  public final native JsBatteryManager getWebkitBattery() /*-{
+    return this.webkitBattery;
+  }-*/;
+
+  public final native JsPointerLock getWebkitPointer() /*-{
+    return this.webkitPointer;
+  }-*/;
+
+  public final native void getStorageUpdates() /*-{
+    this.getStorageUpdates();
+  }-*/;
+
+  public final native boolean javaEnabled() /*-{
+    return this.javaEnabled();
+  }-*/;
+
+  public final native void registerProtocolHandler(String scheme, String url, String title) /*-{
+    this.registerProtocolHandler(scheme, url, title);
+  }-*/;
+
+  public final native void webkitGetUserMedia(Mappable options, NavigatorUserMediaSuccessCallback successCallback, NavigatorUserMediaErrorCallback errorCallback) /*-{
+    this.webkitGetUserMedia(options, $entry(successCallback.@elemental.html.NavigatorUserMediaSuccessCallback::onNavigatorUserMediaSuccessCallback(Lelemental/dom/LocalMediaStream;)).bind(successCallback), $entry(errorCallback.@elemental.html.NavigatorUserMediaErrorCallback::onNavigatorUserMediaErrorCallback(Lelemental/html/NavigatorUserMediaError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void webkitGetUserMedia(Mappable options, NavigatorUserMediaSuccessCallback successCallback) /*-{
+    this.webkitGetUserMedia(options, $entry(successCallback.@elemental.html.NavigatorUserMediaSuccessCallback::onNavigatorUserMediaSuccessCallback(Lelemental/dom/LocalMediaStream;)).bind(successCallback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsNavigatorUserMediaError.java b/elemental/src/elemental/js/html/JsNavigatorUserMediaError.java
new file mode 100644
index 0000000..dcc2d26
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsNavigatorUserMediaError.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.NavigatorUserMediaError;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNavigatorUserMediaError extends JsElementalMixinBase  implements NavigatorUserMediaError {
+  protected JsNavigatorUserMediaError() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsNotification.java b/elemental/src/elemental/js/html/JsNotification.java
new file mode 100644
index 0000000..5638d12
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsNotification.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.NotificationPermissionCallback;
+import elemental.js.events.JsEvent;
+import elemental.html.Notification;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNotification extends JsElementalMixinBase  implements Notification {
+  protected JsNotification() {}
+
+  public final native String getDir() /*-{
+    return this.dir;
+  }-*/;
+
+  public final native void setDir(String param_dir) /*-{
+    this.dir = param_dir;
+  }-*/;
+
+  public final native EventListener getOnclick() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onclick);
+  }-*/;
+
+  public final native void setOnclick(EventListener listener) /*-{
+    this.onclick = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnclose() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onclose);
+  }-*/;
+
+  public final native void setOnclose(EventListener listener) /*-{
+    this.onclose = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndisplay() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondisplay);
+  }-*/;
+
+  public final native void setOndisplay(EventListener listener) /*-{
+    this.ondisplay = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnshow() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onshow);
+  }-*/;
+
+  public final native void setOnshow(EventListener listener) /*-{
+    this.onshow = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native String getReplaceId() /*-{
+    return this.replaceId;
+  }-*/;
+
+  public final native void setReplaceId(String param_replaceId) /*-{
+    this.replaceId = param_replaceId;
+  }-*/;
+
+  public final native String getTag() /*-{
+    return this.tag;
+  }-*/;
+
+  public final native void setTag(String param_tag) /*-{
+    this.tag = param_tag;
+  }-*/;
+
+  public final native void cancel() /*-{
+    this.cancel();
+  }-*/;
+
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+
+  public final native void show() /*-{
+    this.show();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsNotificationCenter.java b/elemental/src/elemental/js/html/JsNotificationCenter.java
new file mode 100644
index 0000000..bc3aba3
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsNotificationCenter.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.VoidCallback;
+import elemental.html.NotificationCenter;
+import elemental.html.Notification;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNotificationCenter extends JsElementalMixinBase  implements NotificationCenter {
+  protected JsNotificationCenter() {}
+
+  public final native int checkPermission() /*-{
+    return this.checkPermission();
+  }-*/;
+
+  public final native JsNotification createHTMLNotification(String url) /*-{
+    return this.createHTMLNotification(url);
+  }-*/;
+
+  public final native JsNotification createNotification(String iconUrl, String title, String body) /*-{
+    return this.createNotification(iconUrl, title, body);
+  }-*/;
+
+  public final native void requestPermission(VoidCallback callback) /*-{
+    this.requestPermission($entry(callback.@elemental.html.VoidCallback::onVoidCallback()).bind(callback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsOESStandardDerivatives.java b/elemental/src/elemental/js/html/JsOESStandardDerivatives.java
new file mode 100644
index 0000000..d1e237c
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOESStandardDerivatives.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.OESStandardDerivatives;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOESStandardDerivatives extends JsElementalMixinBase  implements OESStandardDerivatives {
+  protected JsOESStandardDerivatives() {}
+}
diff --git a/elemental/src/elemental/js/html/JsOESTextureFloat.java b/elemental/src/elemental/js/html/JsOESTextureFloat.java
new file mode 100644
index 0000000..31765e3
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOESTextureFloat.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.OESTextureFloat;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOESTextureFloat extends JsElementalMixinBase  implements OESTextureFloat {
+  protected JsOESTextureFloat() {}
+}
diff --git a/elemental/src/elemental/js/html/JsOESVertexArrayObject.java b/elemental/src/elemental/js/html/JsOESVertexArrayObject.java
new file mode 100644
index 0000000..3335cd9
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOESVertexArrayObject.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLVertexArrayObjectOES;
+import elemental.html.OESVertexArrayObject;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOESVertexArrayObject extends JsElementalMixinBase  implements OESVertexArrayObject {
+  protected JsOESVertexArrayObject() {}
+
+  public final native void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) /*-{
+    this.bindVertexArrayOES(arrayObject);
+  }-*/;
+
+  public final native JsWebGLVertexArrayObjectOES createVertexArrayOES() /*-{
+    return this.createVertexArrayOES();
+  }-*/;
+
+  public final native void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) /*-{
+    this.deleteVertexArrayOES(arrayObject);
+  }-*/;
+
+  public final native boolean isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) /*-{
+    return this.isVertexArrayOES(arrayObject);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsOListElement.java b/elemental/src/elemental/js/html/JsOListElement.java
new file mode 100644
index 0000000..8390d52
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOListElement.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.OListElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOListElement extends JsElement  implements OListElement {
+  protected JsOListElement() {}
+
+  public final native boolean isCompact() /*-{
+    return this.compact;
+  }-*/;
+
+  public final native void setCompact(boolean param_compact) /*-{
+    this.compact = param_compact;
+  }-*/;
+
+  public final native boolean isReversed() /*-{
+    return this.reversed;
+  }-*/;
+
+  public final native void setReversed(boolean param_reversed) /*-{
+    this.reversed = param_reversed;
+  }-*/;
+
+  public final native int getStart() /*-{
+    return this.start;
+  }-*/;
+
+  public final native void setStart(int param_start) /*-{
+    this.start = param_start;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsObjectElement.java b/elemental/src/elemental/js/html/JsObjectElement.java
new file mode 100644
index 0000000..f18257e
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsObjectElement.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ValidityState;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.js.dom.JsDocument;
+import elemental.svg.SVGDocument;
+import elemental.html.FormElement;
+import elemental.html.ObjectElement;
+import elemental.js.svg.JsSVGDocument;
+import elemental.dom.Document;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsObjectElement extends JsElement  implements ObjectElement {
+  protected JsObjectElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getArchive() /*-{
+    return this.archive;
+  }-*/;
+
+  public final native void setArchive(String param_archive) /*-{
+    this.archive = param_archive;
+  }-*/;
+
+  public final native String getBorder() /*-{
+    return this.border;
+  }-*/;
+
+  public final native void setBorder(String param_border) /*-{
+    this.border = param_border;
+  }-*/;
+
+  public final native String getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native void setCode(String param_code) /*-{
+    this.code = param_code;
+  }-*/;
+
+  public final native String getCodeBase() /*-{
+    return this.codeBase;
+  }-*/;
+
+  public final native void setCodeBase(String param_codeBase) /*-{
+    this.codeBase = param_codeBase;
+  }-*/;
+
+  public final native String getCodeType() /*-{
+    return this.codeType;
+  }-*/;
+
+  public final native void setCodeType(String param_codeType) /*-{
+    this.codeType = param_codeType;
+  }-*/;
+
+  public final native JsDocument getContentDocument() /*-{
+    return this.contentDocument;
+  }-*/;
+
+  public final native String getData() /*-{
+    return this.data;
+  }-*/;
+
+  public final native void setData(String param_data) /*-{
+    this.data = param_data;
+  }-*/;
+
+  public final native boolean isDeclare() /*-{
+    return this.declare;
+  }-*/;
+
+  public final native void setDeclare(boolean param_declare) /*-{
+    this.declare = param_declare;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native String getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(String param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native int getHspace() /*-{
+    return this.hspace;
+  }-*/;
+
+  public final native void setHspace(int param_hspace) /*-{
+    this.hspace = param_hspace;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getStandby() /*-{
+    return this.standby;
+  }-*/;
+
+  public final native void setStandby(String param_standby) /*-{
+    this.standby = param_standby;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+
+  public final native String getUseMap() /*-{
+    return this.useMap;
+  }-*/;
+
+  public final native void setUseMap(String param_useMap) /*-{
+    this.useMap = param_useMap;
+  }-*/;
+
+  public final native String getValidationMessage() /*-{
+    return this.validationMessage;
+  }-*/;
+
+  public final native JsValidityState getValidity() /*-{
+    return this.validity;
+  }-*/;
+
+  public final native int getVspace() /*-{
+    return this.vspace;
+  }-*/;
+
+  public final native void setVspace(int param_vspace) /*-{
+    this.vspace = param_vspace;
+  }-*/;
+
+  public final native String getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(String param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native boolean isWillValidate() /*-{
+    return this.willValidate;
+  }-*/;
+
+  public final native boolean checkValidity() /*-{
+    return this.checkValidity();
+  }-*/;
+
+  public final native JsSVGDocument getSVGDocument() /*-{
+    return this.getSVGDocument();
+  }-*/;
+
+  public final native void setCustomValidity(String error) /*-{
+    this.setCustomValidity(error);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsOfflineAudioCompletionEvent.java b/elemental/src/elemental/js/html/JsOfflineAudioCompletionEvent.java
new file mode 100644
index 0000000..9f95a8e
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOfflineAudioCompletionEvent.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.OfflineAudioCompletionEvent;
+import elemental.events.Event;
+import elemental.js.events.JsEvent;
+import elemental.html.AudioBuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOfflineAudioCompletionEvent extends JsEvent  implements OfflineAudioCompletionEvent {
+  protected JsOfflineAudioCompletionEvent() {}
+
+  public final native JsAudioBuffer getRenderedBuffer() /*-{
+    return this.renderedBuffer;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsOperationNotAllowedException.java b/elemental/src/elemental/js/html/JsOperationNotAllowedException.java
new file mode 100644
index 0000000..cb098d8
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOperationNotAllowedException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.OperationNotAllowedException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOperationNotAllowedException extends JsElementalMixinBase  implements OperationNotAllowedException {
+  protected JsOperationNotAllowedException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsOptGroupElement.java b/elemental/src/elemental/js/html/JsOptGroupElement.java
new file mode 100644
index 0000000..db30e67
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOptGroupElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.OptGroupElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOptGroupElement extends JsElement  implements OptGroupElement {
+  protected JsOptGroupElement() {}
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native String getLabel() /*-{
+    return this.label;
+  }-*/;
+
+  public final native void setLabel(String param_label) /*-{
+    this.label = param_label;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsOptionElement.java b/elemental/src/elemental/js/html/JsOptionElement.java
new file mode 100644
index 0000000..7747c91
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOptionElement.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.OptionElement;
+import elemental.html.FormElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOptionElement extends JsElement  implements OptionElement {
+  protected JsOptionElement() {}
+
+  public final native boolean isDefaultSelected() /*-{
+    return this.defaultSelected;
+  }-*/;
+
+  public final native void setDefaultSelected(boolean param_defaultSelected) /*-{
+    this.defaultSelected = param_defaultSelected;
+  }-*/;
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native int getIndex() /*-{
+    return this.index;
+  }-*/;
+
+  public final native String getLabel() /*-{
+    return this.label;
+  }-*/;
+
+  public final native void setLabel(String param_label) /*-{
+    this.label = param_label;
+  }-*/;
+
+  public final native boolean isSelected() /*-{
+    return this.selected;
+  }-*/;
+
+  public final native void setSelected(boolean param_selected) /*-{
+    this.selected = param_selected;
+  }-*/;
+
+  public final native String getText() /*-{
+    return this.text;
+  }-*/;
+
+  public final native void setText(String param_text) /*-{
+    this.text = param_text;
+  }-*/;
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsOscillator.java b/elemental/src/elemental/js/html/JsOscillator.java
new file mode 100644
index 0000000..1c379c7
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOscillator.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WaveTable;
+import elemental.html.AudioParam;
+import elemental.html.Oscillator;
+import elemental.html.AudioSourceNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOscillator extends JsAudioSourceNode  implements Oscillator {
+  protected JsOscillator() {}
+
+  public final native JsAudioParam getDetune() /*-{
+    return this.detune;
+  }-*/;
+
+  public final native JsAudioParam getFrequency() /*-{
+    return this.frequency;
+  }-*/;
+
+  public final native int getPlaybackState() /*-{
+    return this.playbackState;
+  }-*/;
+
+  public final native int getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(int param_type) /*-{
+    this.type = param_type;
+  }-*/;
+
+  public final native void noteOff(double when) /*-{
+    this.noteOff(when);
+  }-*/;
+
+  public final native void noteOn(double when) /*-{
+    this.noteOn(when);
+  }-*/;
+
+  public final native void setWaveTable(WaveTable waveTable) /*-{
+    this.setWaveTable(waveTable);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsOutputElement.java b/elemental/src/elemental/js/html/JsOutputElement.java
new file mode 100644
index 0000000..1b1cd93
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsOutputElement.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ValidityState;
+import elemental.js.dom.JsElement;
+import elemental.js.dom.JsNodeList;
+import elemental.dom.Element;
+import elemental.html.OutputElement;
+import elemental.js.dom.JsDOMSettableTokenList;
+import elemental.html.FormElement;
+import elemental.dom.DOMSettableTokenList;
+import elemental.dom.NodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsOutputElement extends JsElement  implements OutputElement {
+  protected JsOutputElement() {}
+
+  public final native String getDefaultValue() /*-{
+    return this.defaultValue;
+  }-*/;
+
+  public final native void setDefaultValue(String param_defaultValue) /*-{
+    this.defaultValue = param_defaultValue;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native JsDOMSettableTokenList getHtmlFor() /*-{
+    return this.htmlFor;
+  }-*/;
+
+  public final native void setHtmlFor(DOMSettableTokenList param_htmlFor) /*-{
+    this.htmlFor = param_htmlFor;
+  }-*/;
+
+  public final native JsNodeList getLabels() /*-{
+    return this.labels;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native String getValidationMessage() /*-{
+    return this.validationMessage;
+  }-*/;
+
+  public final native JsValidityState getValidity() /*-{
+    return this.validity;
+  }-*/;
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+
+  public final native boolean isWillValidate() /*-{
+    return this.willValidate;
+  }-*/;
+
+  public final native boolean checkValidity() /*-{
+    return this.checkValidity();
+  }-*/;
+
+  public final native void setCustomValidity(String error) /*-{
+    this.setCustomValidity(error);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsPagePopupController.java b/elemental/src/elemental/js/html/JsPagePopupController.java
new file mode 100644
index 0000000..bde6421
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsPagePopupController.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.PagePopupController;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPagePopupController extends JsElementalMixinBase  implements PagePopupController {
+  protected JsPagePopupController() {}
+
+  public final native void setValueAndClosePopup(int numberValue, String stringValue) /*-{
+    this.setValueAndClosePopup(numberValue, stringValue);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsParagraphElement.java b/elemental/src/elemental/js/html/JsParagraphElement.java
new file mode 100644
index 0000000..f6b4fa7
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsParagraphElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ParagraphElement;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsParagraphElement extends JsElement  implements ParagraphElement {
+  protected JsParagraphElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsParamElement.java b/elemental/src/elemental/js/html/JsParamElement.java
new file mode 100644
index 0000000..d24e203
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsParamElement.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.ParamElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsParamElement extends JsElement  implements ParamElement {
+  protected JsParamElement() {}
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+
+  public final native String getValueType() /*-{
+    return this.valueType;
+  }-*/;
+
+  public final native void setValueType(String param_valueType) /*-{
+    this.valueType = param_valueType;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsPeerConnection00.java b/elemental/src/elemental/js/html/JsPeerConnection00.java
new file mode 100644
index 0000000..e808a0b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsPeerConnection00.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.dom.MediaStream;
+import elemental.html.SessionDescription;
+import elemental.html.PeerConnection00;
+import elemental.html.IceCandidate;
+import elemental.js.dom.JsMediaStreamList;
+import elemental.dom.MediaStreamList;
+import elemental.js.util.JsMappable;
+import elemental.util.Mappable;
+import elemental.events.EventListener;
+import elemental.js.events.JsEvent;
+import elemental.js.dom.JsMediaStream;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPeerConnection00 extends JsElementalMixinBase  implements PeerConnection00 {
+  protected JsPeerConnection00() {}
+
+  public final native int getIceState() /*-{
+    return this.iceState;
+  }-*/;
+
+  public final native JsSessionDescription getLocalDescription() /*-{
+    return this.localDescription;
+  }-*/;
+
+  public final native JsMediaStreamList getLocalStreams() /*-{
+    return this.localStreams;
+  }-*/;
+
+  public final native EventListener getOnaddstream() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onaddstream);
+  }-*/;
+
+  public final native void setOnaddstream(EventListener listener) /*-{
+    this.onaddstream = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnconnecting() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onconnecting);
+  }-*/;
+
+  public final native void setOnconnecting(EventListener listener) /*-{
+    this.onconnecting = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnopen() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onopen);
+  }-*/;
+
+  public final native void setOnopen(EventListener listener) /*-{
+    this.onopen = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnremovestream() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onremovestream);
+  }-*/;
+
+  public final native void setOnremovestream(EventListener listener) /*-{
+    this.onremovestream = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnstatechange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onstatechange);
+  }-*/;
+
+  public final native void setOnstatechange(EventListener listener) /*-{
+    this.onstatechange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native JsSessionDescription getRemoteDescription() /*-{
+    return this.remoteDescription;
+  }-*/;
+
+  public final native JsMediaStreamList getRemoteStreams() /*-{
+    return this.remoteStreams;
+  }-*/;
+
+  public final native void addStream(MediaStream stream) /*-{
+    this.addStream(stream);
+  }-*/;
+
+  public final native void addStream(MediaStream stream, Mappable mediaStreamHints) /*-{
+    this.addStream(stream, mediaStreamHints);
+  }-*/;
+
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+
+  public final native JsSessionDescription createAnswer(String offer) /*-{
+    return this.createAnswer(offer);
+  }-*/;
+
+  public final native JsSessionDescription createAnswer(String offer, Mappable mediaHints) /*-{
+    return this.createAnswer(offer, mediaHints);
+  }-*/;
+
+  public final native JsSessionDescription createOffer() /*-{
+    return this.createOffer();
+  }-*/;
+
+  public final native JsSessionDescription createOffer(Mappable mediaHints) /*-{
+    return this.createOffer(mediaHints);
+  }-*/;
+
+  public final native void processIceMessage(IceCandidate candidate) /*-{
+    this.processIceMessage(candidate);
+  }-*/;
+
+  public final native void removeStream(MediaStream stream) /*-{
+    this.removeStream(stream);
+  }-*/;
+
+  public final native void startIce() /*-{
+    this.startIce();
+  }-*/;
+
+  public final native void startIce(Mappable iceOptions) /*-{
+    this.startIce(iceOptions);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsPerformance.java b/elemental/src/elemental/js/html/JsPerformance.java
new file mode 100644
index 0000000..0e1e4c9
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsPerformance.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.PerformanceTiming;
+import elemental.html.Performance;
+import elemental.html.MemoryInfo;
+import elemental.html.PerformanceNavigation;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPerformance extends JsElementalMixinBase  implements Performance {
+  protected JsPerformance() {}
+
+  public final native JsMemoryInfo getMemory() /*-{
+    return this.memory;
+  }-*/;
+
+  public final native JsPerformanceNavigation getNavigation() /*-{
+    return this.navigation;
+  }-*/;
+
+  public final native JsPerformanceTiming getTiming() /*-{
+    return this.timing;
+  }-*/;
+
+  public final native double webkitNow() /*-{
+    return this.webkitNow();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsPerformanceNavigation.java b/elemental/src/elemental/js/html/JsPerformanceNavigation.java
new file mode 100644
index 0000000..346684b
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsPerformanceNavigation.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.PerformanceNavigation;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPerformanceNavigation extends JsElementalMixinBase  implements PerformanceNavigation {
+  protected JsPerformanceNavigation() {}
+
+  public final native int getRedirectCount() /*-{
+    return this.redirectCount;
+  }-*/;
+
+  public final native int getType() /*-{
+    return this.type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsPerformanceTiming.java b/elemental/src/elemental/js/html/JsPerformanceTiming.java
new file mode 100644
index 0000000..fa5f2a2
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsPerformanceTiming.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.PerformanceTiming;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPerformanceTiming extends JsElementalMixinBase  implements PerformanceTiming {
+  protected JsPerformanceTiming() {}
+
+  public final native double getConnectEnd() /*-{
+    return this.connectEnd;
+  }-*/;
+
+  public final native double getConnectStart() /*-{
+    return this.connectStart;
+  }-*/;
+
+  public final native double getDomComplete() /*-{
+    return this.domComplete;
+  }-*/;
+
+  public final native double getDomContentLoadedEventEnd() /*-{
+    return this.domContentLoadedEventEnd;
+  }-*/;
+
+  public final native double getDomContentLoadedEventStart() /*-{
+    return this.domContentLoadedEventStart;
+  }-*/;
+
+  public final native double getDomInteractive() /*-{
+    return this.domInteractive;
+  }-*/;
+
+  public final native double getDomLoading() /*-{
+    return this.domLoading;
+  }-*/;
+
+  public final native double getDomainLookupEnd() /*-{
+    return this.domainLookupEnd;
+  }-*/;
+
+  public final native double getDomainLookupStart() /*-{
+    return this.domainLookupStart;
+  }-*/;
+
+  public final native double getFetchStart() /*-{
+    return this.fetchStart;
+  }-*/;
+
+  public final native double getLoadEventEnd() /*-{
+    return this.loadEventEnd;
+  }-*/;
+
+  public final native double getLoadEventStart() /*-{
+    return this.loadEventStart;
+  }-*/;
+
+  public final native double getNavigationStart() /*-{
+    return this.navigationStart;
+  }-*/;
+
+  public final native double getRedirectEnd() /*-{
+    return this.redirectEnd;
+  }-*/;
+
+  public final native double getRedirectStart() /*-{
+    return this.redirectStart;
+  }-*/;
+
+  public final native double getRequestStart() /*-{
+    return this.requestStart;
+  }-*/;
+
+  public final native double getResponseEnd() /*-{
+    return this.responseEnd;
+  }-*/;
+
+  public final native double getResponseStart() /*-{
+    return this.responseStart;
+  }-*/;
+
+  public final native double getSecureConnectionStart() /*-{
+    return this.secureConnectionStart;
+  }-*/;
+
+  public final native double getUnloadEventEnd() /*-{
+    return this.unloadEventEnd;
+  }-*/;
+
+  public final native double getUnloadEventStart() /*-{
+    return this.unloadEventStart;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsPoint.java b/elemental/src/elemental/js/html/JsPoint.java
new file mode 100644
index 0000000..3988cd2
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsPoint.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Point;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPoint extends JsElementalMixinBase  implements Point {
+  protected JsPoint() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsPreElement.java b/elemental/src/elemental/js/html/JsPreElement.java
new file mode 100644
index 0000000..aa11b11
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsPreElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.html.PreElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsPreElement extends JsElement  implements PreElement {
+  protected JsPreElement() {}
+
+  public final native int getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(int param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native boolean isWrap() /*-{
+    return this.wrap;
+  }-*/;
+
+  public final native void setWrap(boolean param_wrap) /*-{
+    this.wrap = param_wrap;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsProgressElement.java b/elemental/src/elemental/js/html/JsProgressElement.java
new file mode 100644
index 0000000..ac8dff3
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsProgressElement.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.html.ProgressElement;
+import elemental.js.dom.JsNodeList;
+import elemental.dom.NodeList;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsProgressElement extends JsElement  implements ProgressElement {
+  protected JsProgressElement() {}
+
+  public final native JsNodeList getLabels() /*-{
+    return this.labels;
+  }-*/;
+
+  public final native double getMax() /*-{
+    return this.max;
+  }-*/;
+
+  public final native void setMax(double param_max) /*-{
+    this.max = param_max;
+  }-*/;
+
+  public final native double getPosition() /*-{
+    return this.position;
+  }-*/;
+
+  public final native double getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(double param_value) /*-{
+    this.value = param_value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsQuoteElement.java b/elemental/src/elemental/js/html/JsQuoteElement.java
new file mode 100644
index 0000000..d02aa9a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsQuoteElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.QuoteElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsQuoteElement extends JsElement  implements QuoteElement {
+  protected JsQuoteElement() {}
+
+  public final native String getCite() /*-{
+    return this.cite;
+  }-*/;
+
+  public final native void setCite(String param_cite) /*-{
+    this.cite = param_cite;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsRadioNodeList.java b/elemental/src/elemental/js/html/JsRadioNodeList.java
new file mode 100644
index 0000000..a74e549
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsRadioNodeList.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.dom.NodeList;
+import elemental.js.dom.JsNodeList;
+import elemental.html.RadioNodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsRadioNodeList extends JsNodeList  implements RadioNodeList {
+  protected JsRadioNodeList() {}
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsRealtimeAnalyserNode.java b/elemental/src/elemental/js/html/JsRealtimeAnalyserNode.java
new file mode 100644
index 0000000..e4a2fb0
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsRealtimeAnalyserNode.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Float32Array;
+import elemental.html.AudioNode;
+import elemental.html.RealtimeAnalyserNode;
+import elemental.html.Uint8Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsRealtimeAnalyserNode extends JsAudioNode  implements RealtimeAnalyserNode {
+  protected JsRealtimeAnalyserNode() {}
+
+  public final native int getFftSize() /*-{
+    return this.fftSize;
+  }-*/;
+
+  public final native void setFftSize(int param_fftSize) /*-{
+    this.fftSize = param_fftSize;
+  }-*/;
+
+  public final native int getFrequencyBinCount() /*-{
+    return this.frequencyBinCount;
+  }-*/;
+
+  public final native float getMaxDecibels() /*-{
+    return this.maxDecibels;
+  }-*/;
+
+  public final native void setMaxDecibels(float param_maxDecibels) /*-{
+    this.maxDecibels = param_maxDecibels;
+  }-*/;
+
+  public final native float getMinDecibels() /*-{
+    return this.minDecibels;
+  }-*/;
+
+  public final native void setMinDecibels(float param_minDecibels) /*-{
+    this.minDecibels = param_minDecibels;
+  }-*/;
+
+  public final native float getSmoothingTimeConstant() /*-{
+    return this.smoothingTimeConstant;
+  }-*/;
+
+  public final native void setSmoothingTimeConstant(float param_smoothingTimeConstant) /*-{
+    this.smoothingTimeConstant = param_smoothingTimeConstant;
+  }-*/;
+
+  public final native void getByteFrequencyData(Uint8Array array) /*-{
+    this.getByteFrequencyData(array);
+  }-*/;
+
+  public final native void getByteTimeDomainData(Uint8Array array) /*-{
+    this.getByteTimeDomainData(array);
+  }-*/;
+
+  public final native void getFloatFrequencyData(Float32Array array) /*-{
+    this.getFloatFrequencyData(array);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSQLError.java b/elemental/src/elemental/js/html/JsSQLError.java
new file mode 100644
index 0000000..18956f7
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSQLError.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.SQLError;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSQLError extends JsElementalMixinBase  implements SQLError {
+  protected JsSQLError() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSQLException.java b/elemental/src/elemental/js/html/JsSQLException.java
new file mode 100644
index 0000000..a09347c
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSQLException.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.SQLException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSQLException extends JsElementalMixinBase  implements SQLException {
+  protected JsSQLException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSQLResultSet.java b/elemental/src/elemental/js/html/JsSQLResultSet.java
new file mode 100644
index 0000000..8806af4
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSQLResultSet.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.SQLResultSetRowList;
+import elemental.html.SQLResultSet;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSQLResultSet extends JsElementalMixinBase  implements SQLResultSet {
+  protected JsSQLResultSet() {}
+
+  public final native int getInsertId() /*-{
+    return this.insertId;
+  }-*/;
+
+  public final native JsSQLResultSetRowList getRows() /*-{
+    return this.rows;
+  }-*/;
+
+  public final native int getRowsAffected() /*-{
+    return this.rowsAffected;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSQLResultSetRowList.java b/elemental/src/elemental/js/html/JsSQLResultSetRowList.java
new file mode 100644
index 0000000..2139793
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSQLResultSetRowList.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.SQLResultSetRowList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSQLResultSetRowList extends JsElementalMixinBase  implements SQLResultSetRowList {
+  protected JsSQLResultSetRowList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native Object item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSQLTransaction.java b/elemental/src/elemental/js/html/JsSQLTransaction.java
new file mode 100644
index 0000000..2d55f20
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSQLTransaction.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.SQLTransaction;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSQLTransaction extends JsElementalMixinBase  implements SQLTransaction {
+  protected JsSQLTransaction() {}
+}
diff --git a/elemental/src/elemental/js/html/JsSQLTransactionSync.java b/elemental/src/elemental/js/html/JsSQLTransactionSync.java
new file mode 100644
index 0000000..4d75872
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSQLTransactionSync.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.SQLTransactionSync;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSQLTransactionSync extends JsElementalMixinBase  implements SQLTransactionSync {
+  protected JsSQLTransactionSync() {}
+}
diff --git a/elemental/src/elemental/js/html/JsScreen.java b/elemental/src/elemental/js/html/JsScreen.java
new file mode 100644
index 0000000..ce4028f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsScreen.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Screen;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsScreen extends JsElementalMixinBase  implements Screen {
+  protected JsScreen() {}
+
+  public final native int getAvailHeight() /*-{
+    return this.availHeight;
+  }-*/;
+
+  public final native int getAvailLeft() /*-{
+    return this.availLeft;
+  }-*/;
+
+  public final native int getAvailTop() /*-{
+    return this.availTop;
+  }-*/;
+
+  public final native int getAvailWidth() /*-{
+    return this.availWidth;
+  }-*/;
+
+  public final native int getColorDepth() /*-{
+    return this.colorDepth;
+  }-*/;
+
+  public final native int getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native int getPixelDepth() /*-{
+    return this.pixelDepth;
+  }-*/;
+
+  public final native int getWidth() /*-{
+    return this.width;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsScriptElement.java b/elemental/src/elemental/js/html/JsScriptElement.java
new file mode 100644
index 0000000..574b826
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsScriptElement.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.ScriptElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsScriptElement extends JsElement  implements ScriptElement {
+  protected JsScriptElement() {}
+
+  public final native boolean isAsync() /*-{
+    return this.async;
+  }-*/;
+
+  public final native void setAsync(boolean param_async) /*-{
+    this.async = param_async;
+  }-*/;
+
+  public final native String getCharset() /*-{
+    return this.charset;
+  }-*/;
+
+  public final native void setCharset(String param_charset) /*-{
+    this.charset = param_charset;
+  }-*/;
+
+  public final native String getCrossOrigin() /*-{
+    return this.crossOrigin;
+  }-*/;
+
+  public final native void setCrossOrigin(String param_crossOrigin) /*-{
+    this.crossOrigin = param_crossOrigin;
+  }-*/;
+
+  public final native boolean isDefer() /*-{
+    return this.defer;
+  }-*/;
+
+  public final native void setDefer(boolean param_defer) /*-{
+    this.defer = param_defer;
+  }-*/;
+
+  public final native String getEvent() /*-{
+    return this.event;
+  }-*/;
+
+  public final native void setEvent(String param_event) /*-{
+    this.event = param_event;
+  }-*/;
+
+  public final native String getHtmlFor() /*-{
+    return this.htmlFor;
+  }-*/;
+
+  public final native void setHtmlFor(String param_htmlFor) /*-{
+    this.htmlFor = param_htmlFor;
+  }-*/;
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native String getText() /*-{
+    return this.text;
+  }-*/;
+
+  public final native void setText(String param_text) /*-{
+    this.text = param_text;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSelectElement.java b/elemental/src/elemental/js/html/JsSelectElement.java
new file mode 100644
index 0000000..22f8548
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSelectElement.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ValidityState;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.OptionElement;
+import elemental.html.HTMLOptionsCollection;
+import elemental.html.HTMLCollection;
+import elemental.html.FormElement;
+import elemental.js.dom.JsNode;
+import elemental.html.SelectElement;
+import elemental.js.dom.JsNodeList;
+import elemental.dom.NodeList;
+import elemental.dom.Node;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSelectElement extends JsElement  implements SelectElement {
+  protected JsSelectElement() {}
+
+  public final native boolean isAutofocus() /*-{
+    return this.autofocus;
+  }-*/;
+
+  public final native void setAutofocus(boolean param_autofocus) /*-{
+    this.autofocus = param_autofocus;
+  }-*/;
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native JsNodeList getLabels() /*-{
+    return this.labels;
+  }-*/;
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setLength(int param_length) /*-{
+    this.length = param_length;
+  }-*/;
+
+  public final native boolean isMultiple() /*-{
+    return this.multiple;
+  }-*/;
+
+  public final native void setMultiple(boolean param_multiple) /*-{
+    this.multiple = param_multiple;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native JsHTMLOptionsCollection getOptions() /*-{
+    return this.options;
+  }-*/;
+
+  public final native boolean isRequired() /*-{
+    return this.required;
+  }-*/;
+
+  public final native void setRequired(boolean param_required) /*-{
+    this.required = param_required;
+  }-*/;
+
+  public final native int getSelectedIndex() /*-{
+    return this.selectedIndex;
+  }-*/;
+
+  public final native void setSelectedIndex(int param_selectedIndex) /*-{
+    this.selectedIndex = param_selectedIndex;
+  }-*/;
+
+  public final native JsHTMLCollection getSelectedOptions() /*-{
+    return this.selectedOptions;
+  }-*/;
+
+  public final native int getSize() /*-{
+    return this.size;
+  }-*/;
+
+  public final native void setSize(int param_size) /*-{
+    this.size = param_size;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native String getValidationMessage() /*-{
+    return this.validationMessage;
+  }-*/;
+
+  public final native JsValidityState getValidity() /*-{
+    return this.validity;
+  }-*/;
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+
+  public final native boolean isWillValidate() /*-{
+    return this.willValidate;
+  }-*/;
+
+  public final native void add(Element element, Element before) /*-{
+    this.add(element, before);
+  }-*/;
+
+  public final native boolean checkValidity() /*-{
+    return this.checkValidity();
+  }-*/;
+
+  public final native JsNode item(int index) /*-{
+    return this.item(index);
+  }-*/;
+
+  public final native JsNode namedItem(String name) /*-{
+    return this.namedItem(name);
+  }-*/;
+
+  public final native void remove(int index) /*-{
+    this.remove(index);
+  }-*/;
+
+  public final native void remove(OptionElement option) /*-{
+    this.remove(option);
+  }-*/;
+
+  public final native void setCustomValidity(String error) /*-{
+    this.setCustomValidity(error);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSelection.java b/elemental/src/elemental/js/html/JsSelection.java
new file mode 100644
index 0000000..ae5c648
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSelection.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.dom.Node;
+import elemental.ranges.Range;
+import elemental.html.Selection;
+import elemental.js.ranges.JsRange;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSelection extends JsElementalMixinBase  implements Selection {
+  protected JsSelection() {}
+
+  public final native JsNode getAnchorNode() /*-{
+    return this.anchorNode;
+  }-*/;
+
+  public final native int getAnchorOffset() /*-{
+    return this.anchorOffset;
+  }-*/;
+
+  public final native JsNode getBaseNode() /*-{
+    return this.baseNode;
+  }-*/;
+
+  public final native int getBaseOffset() /*-{
+    return this.baseOffset;
+  }-*/;
+
+  public final native JsNode getExtentNode() /*-{
+    return this.extentNode;
+  }-*/;
+
+  public final native int getExtentOffset() /*-{
+    return this.extentOffset;
+  }-*/;
+
+  public final native JsNode getFocusNode() /*-{
+    return this.focusNode;
+  }-*/;
+
+  public final native int getFocusOffset() /*-{
+    return this.focusOffset;
+  }-*/;
+
+  public final native boolean isCollapsed() /*-{
+    return this.isCollapsed;
+  }-*/;
+
+  public final native int getRangeCount() /*-{
+    return this.rangeCount;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void addRange(Range range) /*-{
+    this.addRange(range);
+  }-*/;
+
+  public final native void collapse(Node node, int index) /*-{
+    this.collapse(node, index);
+  }-*/;
+
+  public final native void collapseToEnd() /*-{
+    this.collapseToEnd();
+  }-*/;
+
+  public final native void collapseToStart() /*-{
+    this.collapseToStart();
+  }-*/;
+
+  public final native boolean containsNode(Node node, boolean allowPartial) /*-{
+    return this.containsNode(node, allowPartial);
+  }-*/;
+
+  public final native void deleteFromDocument() /*-{
+    this.deleteFromDocument();
+  }-*/;
+
+  public final native void empty() /*-{
+    this.empty();
+  }-*/;
+
+  public final native void extend(Node node, int offset) /*-{
+    this.extend(node, offset);
+  }-*/;
+
+  public final native JsRange getRangeAt(int index) /*-{
+    return this.getRangeAt(index);
+  }-*/;
+
+  public final native void modify(String alter, String direction, String granularity) /*-{
+    this.modify(alter, direction, granularity);
+  }-*/;
+
+  public final native void removeAllRanges() /*-{
+    this.removeAllRanges();
+  }-*/;
+
+  public final native void selectAllChildren(Node node) /*-{
+    this.selectAllChildren(node);
+  }-*/;
+
+  public final native void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) /*-{
+    this.setBaseAndExtent(baseNode, baseOffset, extentNode, extentOffset);
+  }-*/;
+
+  public final native void setPosition(Node node, int offset) /*-{
+    this.setPosition(node, offset);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSessionDescription.java b/elemental/src/elemental/js/html/JsSessionDescription.java
new file mode 100644
index 0000000..c1807bf
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSessionDescription.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.SessionDescription;
+import elemental.html.IceCandidate;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSessionDescription extends JsElementalMixinBase  implements SessionDescription {
+  protected JsSessionDescription() {}
+
+  public final native void addCandidate(IceCandidate candidate) /*-{
+    this.addCandidate(candidate);
+  }-*/;
+
+  public final native String toSdp() /*-{
+    return this.toSdp();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsShadowElement.java b/elemental/src/elemental/js/html/JsShadowElement.java
new file mode 100644
index 0000000..30c8694
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsShadowElement.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.html.ShadowElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsShadowElement extends JsElement  implements ShadowElement {
+  protected JsShadowElement() {}
+}
diff --git a/elemental/src/elemental/js/html/JsSharedWorker.java b/elemental/src/elemental/js/html/JsSharedWorker.java
new file mode 100644
index 0000000..93e90f9
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSharedWorker.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.events.JsMessagePort;
+import elemental.events.MessagePort;
+import elemental.html.AbstractWorker;
+import elemental.html.SharedWorker;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSharedWorker extends JsAbstractWorker  implements SharedWorker {
+  protected JsSharedWorker() {}
+
+  public final native JsMessagePort getPort() /*-{
+    return this.port;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSharedWorkerGlobalScope.java b/elemental/src/elemental/js/html/JsSharedWorkerGlobalScope.java
new file mode 100644
index 0000000..3665a8d
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSharedWorkerGlobalScope.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WorkerGlobalScope;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+import elemental.html.SharedWorkerGlobalScope;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSharedWorkerGlobalScope extends JsWorkerGlobalScope  implements SharedWorkerGlobalScope {
+  protected JsSharedWorkerGlobalScope() {}
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native EventListener getOnconnect() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onconnect);
+  }-*/;
+
+  public final native void setOnconnect(EventListener listener) /*-{
+    this.onconnect = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;}
diff --git a/elemental/src/elemental/js/html/JsSourceElement.java b/elemental/src/elemental/js/html/JsSourceElement.java
new file mode 100644
index 0000000..42732dd
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSourceElement.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.SourceElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSourceElement extends JsElement  implements SourceElement {
+  protected JsSourceElement() {}
+
+  public final native String getMedia() /*-{
+    return this.media;
+  }-*/;
+
+  public final native void setMedia(String param_media) /*-{
+    this.media = param_media;
+  }-*/;
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsSpanElement.java b/elemental/src/elemental/js/html/JsSpanElement.java
new file mode 100644
index 0000000..53724ee
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsSpanElement.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.SpanElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSpanElement extends JsElement  implements SpanElement {
+  protected JsSpanElement() {}
+}
diff --git a/elemental/src/elemental/js/html/JsStorage.java b/elemental/src/elemental/js/html/JsStorage.java
new file mode 100644
index 0000000..39d2e71
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsStorage.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Storage;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsStorage extends JsElementalMixinBase  implements Storage {
+  protected JsStorage() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void clear() /*-{
+    this.clear();
+  }-*/;
+
+  public final native String getItem(String key) /*-{
+    return this.getItem(key);
+  }-*/;
+
+  public final native String key(int index) /*-{
+    return this.key(index);
+  }-*/;
+
+  public final native void removeItem(String key) /*-{
+    this.removeItem(key);
+  }-*/;
+
+  public final native void setItem(String key, String data) /*-{
+    this.setItem(key, data);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsStorageEvent.java b/elemental/src/elemental/js/html/JsStorageEvent.java
new file mode 100644
index 0000000..beeae23
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsStorageEvent.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Storage;
+import elemental.html.StorageEvent;
+import elemental.js.events.JsEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsStorageEvent extends JsEvent  implements StorageEvent {
+  protected JsStorageEvent() {}
+
+  public final native String getKey() /*-{
+    return this.key;
+  }-*/;
+
+  public final native String getNewValue() /*-{
+    return this.newValue;
+  }-*/;
+
+  public final native String getOldValue() /*-{
+    return this.oldValue;
+  }-*/;
+
+  public final native JsStorage getStorageArea() /*-{
+    return this.storageArea;
+  }-*/;
+
+  public final native String getUrl() /*-{
+    return this.url;
+  }-*/;
+
+  public final native void initStorageEvent(String typeArg, boolean canBubbleArg, boolean cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) /*-{
+    this.initStorageEvent(typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsStorageInfo.java b/elemental/src/elemental/js/html/JsStorageInfo.java
new file mode 100644
index 0000000..82de8c5
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsStorageInfo.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.StorageInfo;
+import elemental.html.StorageInfoQuotaCallback;
+import elemental.html.StorageInfoUsageCallback;
+import elemental.html.StorageInfoErrorCallback;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsStorageInfo extends JsElementalMixinBase  implements StorageInfo {
+  protected JsStorageInfo() {}
+
+  public final native void queryUsageAndQuota(int storageType) /*-{
+    this.queryUsageAndQuota(storageType);
+  }-*/;
+
+  public final native void queryUsageAndQuota(int storageType, StorageInfoUsageCallback usageCallback) /*-{
+    this.queryUsageAndQuota(storageType, $entry(usageCallback.@elemental.html.StorageInfoUsageCallback::onStorageInfoUsageCallback(DD)).bind(usageCallback));
+  }-*/;
+
+  public final native void queryUsageAndQuota(int storageType, StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback) /*-{
+    this.queryUsageAndQuota(storageType, $entry(usageCallback.@elemental.html.StorageInfoUsageCallback::onStorageInfoUsageCallback(DD)).bind(usageCallback), $entry(errorCallback.@elemental.html.StorageInfoErrorCallback::onStorageInfoErrorCallback(Lelemental/dom/DOMException;)).bind(errorCallback));
+  }-*/;
+
+  public final native void requestQuota(int storageType, double newQuotaInBytes) /*-{
+    this.requestQuota(storageType, newQuotaInBytes);
+  }-*/;
+
+  public final native void requestQuota(int storageType, double newQuotaInBytes, StorageInfoQuotaCallback quotaCallback) /*-{
+    this.requestQuota(storageType, newQuotaInBytes, $entry(quotaCallback.@elemental.html.StorageInfoQuotaCallback::onStorageInfoQuotaCallback(D)).bind(quotaCallback));
+  }-*/;
+
+  public final native void requestQuota(int storageType, double newQuotaInBytes, StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback) /*-{
+    this.requestQuota(storageType, newQuotaInBytes, $entry(quotaCallback.@elemental.html.StorageInfoQuotaCallback::onStorageInfoQuotaCallback(D)).bind(quotaCallback), $entry(errorCallback.@elemental.html.StorageInfoErrorCallback::onStorageInfoErrorCallback(Lelemental/dom/DOMException;)).bind(errorCallback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsStyleElement.java b/elemental/src/elemental/js/html/JsStyleElement.java
new file mode 100644
index 0000000..f12c913
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsStyleElement.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.stylesheets.JsStyleSheet;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.StyleElement;
+import elemental.stylesheets.StyleSheet;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsStyleElement extends JsElement  implements StyleElement {
+  protected JsStyleElement() {}
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native String getMedia() /*-{
+    return this.media;
+  }-*/;
+
+  public final native void setMedia(String param_media) /*-{
+    this.media = param_media;
+  }-*/;
+
+  public final native boolean isScoped() /*-{
+    return this.scoped;
+  }-*/;
+
+  public final native void setScoped(boolean param_scoped) /*-{
+    this.scoped = param_scoped;
+  }-*/;
+
+  public final native JsStyleSheet getSheet() /*-{
+    return this.sheet;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsStyleMedia.java b/elemental/src/elemental/js/html/JsStyleMedia.java
new file mode 100644
index 0000000..2498cc1
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsStyleMedia.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.StyleMedia;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsStyleMedia extends JsElementalMixinBase  implements StyleMedia {
+  protected JsStyleMedia() {}
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native boolean matchMedium(String mediaquery) /*-{
+    return this.matchMedium(mediaquery);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTableCaptionElement.java b/elemental/src/elemental/js/html/JsTableCaptionElement.java
new file mode 100644
index 0000000..236f586
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTableCaptionElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.html.TableCaptionElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTableCaptionElement extends JsElement  implements TableCaptionElement {
+  protected JsTableCaptionElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTableCellElement.java b/elemental/src/elemental/js/html/JsTableCellElement.java
new file mode 100644
index 0000000..a5a2a2f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTableCellElement.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.TableCellElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTableCellElement extends JsElement  implements TableCellElement {
+  protected JsTableCellElement() {}
+
+  public final native String getAbbr() /*-{
+    return this.abbr;
+  }-*/;
+
+  public final native void setAbbr(String param_abbr) /*-{
+    this.abbr = param_abbr;
+  }-*/;
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getAxis() /*-{
+    return this.axis;
+  }-*/;
+
+  public final native void setAxis(String param_axis) /*-{
+    this.axis = param_axis;
+  }-*/;
+
+  public final native String getBgColor() /*-{
+    return this.bgColor;
+  }-*/;
+
+  public final native void setBgColor(String param_bgColor) /*-{
+    this.bgColor = param_bgColor;
+  }-*/;
+
+  public final native int getCellIndex() /*-{
+    return this.cellIndex;
+  }-*/;
+
+  public final native String getCh() /*-{
+    return this.ch;
+  }-*/;
+
+  public final native void setCh(String param_ch) /*-{
+    this.ch = param_ch;
+  }-*/;
+
+  public final native String getChOff() /*-{
+    return this.chOff;
+  }-*/;
+
+  public final native void setChOff(String param_chOff) /*-{
+    this.chOff = param_chOff;
+  }-*/;
+
+  public final native int getColSpan() /*-{
+    return this.colSpan;
+  }-*/;
+
+  public final native void setColSpan(int param_colSpan) /*-{
+    this.colSpan = param_colSpan;
+  }-*/;
+
+  public final native String getHeaders() /*-{
+    return this.headers;
+  }-*/;
+
+  public final native void setHeaders(String param_headers) /*-{
+    this.headers = param_headers;
+  }-*/;
+
+  public final native String getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(String param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native boolean isNoWrap() /*-{
+    return this.noWrap;
+  }-*/;
+
+  public final native void setNoWrap(boolean param_noWrap) /*-{
+    this.noWrap = param_noWrap;
+  }-*/;
+
+  public final native int getRowSpan() /*-{
+    return this.rowSpan;
+  }-*/;
+
+  public final native void setRowSpan(int param_rowSpan) /*-{
+    this.rowSpan = param_rowSpan;
+  }-*/;
+
+  public final native String getScope() /*-{
+    return this.scope;
+  }-*/;
+
+  public final native void setScope(String param_scope) /*-{
+    this.scope = param_scope;
+  }-*/;
+
+  public final native String getVAlign() /*-{
+    return this.vAlign;
+  }-*/;
+
+  public final native void setVAlign(String param_vAlign) /*-{
+    this.vAlign = param_vAlign;
+  }-*/;
+
+  public final native String getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(String param_width) /*-{
+    this.width = param_width;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTableColElement.java b/elemental/src/elemental/js/html/JsTableColElement.java
new file mode 100644
index 0000000..ec46cae
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTableColElement.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.html.TableColElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTableColElement extends JsElement  implements TableColElement {
+  protected JsTableColElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getCh() /*-{
+    return this.ch;
+  }-*/;
+
+  public final native void setCh(String param_ch) /*-{
+    this.ch = param_ch;
+  }-*/;
+
+  public final native String getChOff() /*-{
+    return this.chOff;
+  }-*/;
+
+  public final native void setChOff(String param_chOff) /*-{
+    this.chOff = param_chOff;
+  }-*/;
+
+  public final native int getSpan() /*-{
+    return this.span;
+  }-*/;
+
+  public final native void setSpan(int param_span) /*-{
+    this.span = param_span;
+  }-*/;
+
+  public final native String getVAlign() /*-{
+    return this.vAlign;
+  }-*/;
+
+  public final native void setVAlign(String param_vAlign) /*-{
+    this.vAlign = param_vAlign;
+  }-*/;
+
+  public final native String getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(String param_width) /*-{
+    this.width = param_width;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTableElement.java b/elemental/src/elemental/js/html/JsTableElement.java
new file mode 100644
index 0000000..858fba8
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTableElement.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.HTMLCollection;
+import elemental.html.TableCaptionElement;
+import elemental.html.TableElement;
+import elemental.html.TableSectionElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTableElement extends JsElement  implements TableElement {
+  protected JsTableElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getBgColor() /*-{
+    return this.bgColor;
+  }-*/;
+
+  public final native void setBgColor(String param_bgColor) /*-{
+    this.bgColor = param_bgColor;
+  }-*/;
+
+  public final native String getBorder() /*-{
+    return this.border;
+  }-*/;
+
+  public final native void setBorder(String param_border) /*-{
+    this.border = param_border;
+  }-*/;
+
+  public final native JsTableCaptionElement getCaption() /*-{
+    return this.caption;
+  }-*/;
+
+  public final native void setCaption(TableCaptionElement param_caption) /*-{
+    this.caption = param_caption;
+  }-*/;
+
+  public final native String getCellPadding() /*-{
+    return this.cellPadding;
+  }-*/;
+
+  public final native void setCellPadding(String param_cellPadding) /*-{
+    this.cellPadding = param_cellPadding;
+  }-*/;
+
+  public final native String getCellSpacing() /*-{
+    return this.cellSpacing;
+  }-*/;
+
+  public final native void setCellSpacing(String param_cellSpacing) /*-{
+    this.cellSpacing = param_cellSpacing;
+  }-*/;
+
+  public final native String getFrame() /*-{
+    return this.frame;
+  }-*/;
+
+  public final native void setFrame(String param_frame) /*-{
+    this.frame = param_frame;
+  }-*/;
+
+  public final native JsHTMLCollection getRows() /*-{
+    return this.rows;
+  }-*/;
+
+  public final native String getRules() /*-{
+    return this.rules;
+  }-*/;
+
+  public final native void setRules(String param_rules) /*-{
+    this.rules = param_rules;
+  }-*/;
+
+  public final native String getSummary() /*-{
+    return this.summary;
+  }-*/;
+
+  public final native void setSummary(String param_summary) /*-{
+    this.summary = param_summary;
+  }-*/;
+
+  public final native JsHTMLCollection getTBodies() /*-{
+    return this.tBodies;
+  }-*/;
+
+  public final native JsTableSectionElement getTFoot() /*-{
+    return this.tFoot;
+  }-*/;
+
+  public final native void setTFoot(TableSectionElement param_tFoot) /*-{
+    this.tFoot = param_tFoot;
+  }-*/;
+
+  public final native JsTableSectionElement getTHead() /*-{
+    return this.tHead;
+  }-*/;
+
+  public final native void setTHead(TableSectionElement param_tHead) /*-{
+    this.tHead = param_tHead;
+  }-*/;
+
+  public final native String getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(String param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native JsElement createCaption() /*-{
+    return this.createCaption();
+  }-*/;
+
+  public final native JsElement createTBody() /*-{
+    return this.createTBody();
+  }-*/;
+
+  public final native JsElement createTFoot() /*-{
+    return this.createTFoot();
+  }-*/;
+
+  public final native JsElement createTHead() /*-{
+    return this.createTHead();
+  }-*/;
+
+  public final native void deleteCaption() /*-{
+    this.deleteCaption();
+  }-*/;
+
+  public final native void deleteRow(int index) /*-{
+    this.deleteRow(index);
+  }-*/;
+
+  public final native void deleteTFoot() /*-{
+    this.deleteTFoot();
+  }-*/;
+
+  public final native void deleteTHead() /*-{
+    this.deleteTHead();
+  }-*/;
+
+  public final native JsElement insertRow(int index) /*-{
+    return this.insertRow(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTableRowElement.java b/elemental/src/elemental/js/html/JsTableRowElement.java
new file mode 100644
index 0000000..c5c319a
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTableRowElement.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.TableRowElement;
+import elemental.html.HTMLCollection;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTableRowElement extends JsElement  implements TableRowElement {
+  protected JsTableRowElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getBgColor() /*-{
+    return this.bgColor;
+  }-*/;
+
+  public final native void setBgColor(String param_bgColor) /*-{
+    this.bgColor = param_bgColor;
+  }-*/;
+
+  public final native JsHTMLCollection getCells() /*-{
+    return this.cells;
+  }-*/;
+
+  public final native String getCh() /*-{
+    return this.ch;
+  }-*/;
+
+  public final native void setCh(String param_ch) /*-{
+    this.ch = param_ch;
+  }-*/;
+
+  public final native String getChOff() /*-{
+    return this.chOff;
+  }-*/;
+
+  public final native void setChOff(String param_chOff) /*-{
+    this.chOff = param_chOff;
+  }-*/;
+
+  public final native int getRowIndex() /*-{
+    return this.rowIndex;
+  }-*/;
+
+  public final native int getSectionRowIndex() /*-{
+    return this.sectionRowIndex;
+  }-*/;
+
+  public final native String getVAlign() /*-{
+    return this.vAlign;
+  }-*/;
+
+  public final native void setVAlign(String param_vAlign) /*-{
+    this.vAlign = param_vAlign;
+  }-*/;
+
+  public final native void deleteCell(int index) /*-{
+    this.deleteCell(index);
+  }-*/;
+
+  public final native JsElement insertCell(int index) /*-{
+    return this.insertCell(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTableSectionElement.java b/elemental/src/elemental/js/html/JsTableSectionElement.java
new file mode 100644
index 0000000..9fc7f49
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTableSectionElement.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.TableSectionElement;
+import elemental.html.HTMLCollection;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTableSectionElement extends JsElement  implements TableSectionElement {
+  protected JsTableSectionElement() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native String getCh() /*-{
+    return this.ch;
+  }-*/;
+
+  public final native void setCh(String param_ch) /*-{
+    this.ch = param_ch;
+  }-*/;
+
+  public final native String getChOff() /*-{
+    return this.chOff;
+  }-*/;
+
+  public final native void setChOff(String param_chOff) /*-{
+    this.chOff = param_chOff;
+  }-*/;
+
+  public final native JsHTMLCollection getRows() /*-{
+    return this.rows;
+  }-*/;
+
+  public final native String getVAlign() /*-{
+    return this.vAlign;
+  }-*/;
+
+  public final native void setVAlign(String param_vAlign) /*-{
+    this.vAlign = param_vAlign;
+  }-*/;
+
+  public final native void deleteRow(int index) /*-{
+    this.deleteRow(index);
+  }-*/;
+
+  public final native JsElement insertRow(int index) /*-{
+    return this.insertRow(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTextAreaElement.java b/elemental/src/elemental/js/html/JsTextAreaElement.java
new file mode 100644
index 0000000..b698a23
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTextAreaElement.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ValidityState;
+import elemental.js.dom.JsElement;
+import elemental.html.TextAreaElement;
+import elemental.dom.Element;
+import elemental.html.FormElement;
+import elemental.js.dom.JsNodeList;
+import elemental.dom.NodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTextAreaElement extends JsElement  implements TextAreaElement {
+  protected JsTextAreaElement() {}
+
+  public final native boolean isAutofocus() /*-{
+    return this.autofocus;
+  }-*/;
+
+  public final native void setAutofocus(boolean param_autofocus) /*-{
+    this.autofocus = param_autofocus;
+  }-*/;
+
+  public final native int getCols() /*-{
+    return this.cols;
+  }-*/;
+
+  public final native void setCols(int param_cols) /*-{
+    this.cols = param_cols;
+  }-*/;
+
+  public final native String getDefaultValue() /*-{
+    return this.defaultValue;
+  }-*/;
+
+  public final native void setDefaultValue(String param_defaultValue) /*-{
+    this.defaultValue = param_defaultValue;
+  }-*/;
+
+  public final native String getDirName() /*-{
+    return this.dirName;
+  }-*/;
+
+  public final native void setDirName(String param_dirName) /*-{
+    this.dirName = param_dirName;
+  }-*/;
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native JsFormElement getForm() /*-{
+    return this.form;
+  }-*/;
+
+  public final native JsNodeList getLabels() /*-{
+    return this.labels;
+  }-*/;
+
+  public final native int getMaxLength() /*-{
+    return this.maxLength;
+  }-*/;
+
+  public final native void setMaxLength(int param_maxLength) /*-{
+    this.maxLength = param_maxLength;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native String getPlaceholder() /*-{
+    return this.placeholder;
+  }-*/;
+
+  public final native void setPlaceholder(String param_placeholder) /*-{
+    this.placeholder = param_placeholder;
+  }-*/;
+
+  public final native boolean isReadOnly() /*-{
+    return this.readOnly;
+  }-*/;
+
+  public final native void setReadOnly(boolean param_readOnly) /*-{
+    this.readOnly = param_readOnly;
+  }-*/;
+
+  public final native boolean isRequired() /*-{
+    return this.required;
+  }-*/;
+
+  public final native void setRequired(boolean param_required) /*-{
+    this.required = param_required;
+  }-*/;
+
+  public final native int getRows() /*-{
+    return this.rows;
+  }-*/;
+
+  public final native void setRows(int param_rows) /*-{
+    this.rows = param_rows;
+  }-*/;
+
+  public final native String getSelectionDirection() /*-{
+    return this.selectionDirection;
+  }-*/;
+
+  public final native void setSelectionDirection(String param_selectionDirection) /*-{
+    this.selectionDirection = param_selectionDirection;
+  }-*/;
+
+  public final native int getSelectionEnd() /*-{
+    return this.selectionEnd;
+  }-*/;
+
+  public final native void setSelectionEnd(int param_selectionEnd) /*-{
+    this.selectionEnd = param_selectionEnd;
+  }-*/;
+
+  public final native int getSelectionStart() /*-{
+    return this.selectionStart;
+  }-*/;
+
+  public final native void setSelectionStart(int param_selectionStart) /*-{
+    this.selectionStart = param_selectionStart;
+  }-*/;
+
+  public final native int getTextLength() /*-{
+    return this.textLength;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native String getValidationMessage() /*-{
+    return this.validationMessage;
+  }-*/;
+
+  public final native JsValidityState getValidity() /*-{
+    return this.validity;
+  }-*/;
+
+  public final native String getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(String param_value) /*-{
+    this.value = param_value;
+  }-*/;
+
+  public final native boolean isWillValidate() /*-{
+    return this.willValidate;
+  }-*/;
+
+  public final native String getWrap() /*-{
+    return this.wrap;
+  }-*/;
+
+  public final native void setWrap(String param_wrap) /*-{
+    this.wrap = param_wrap;
+  }-*/;
+
+  public final native boolean checkValidity() /*-{
+    return this.checkValidity();
+  }-*/;
+
+  public final native void select() /*-{
+    this.select();
+  }-*/;
+
+  public final native void setCustomValidity(String error) /*-{
+    this.setCustomValidity(error);
+  }-*/;
+
+  public final native void setSelectionRange(int start, int end) /*-{
+    this.setSelectionRange(start, end);
+  }-*/;
+
+  public final native void setSelectionRange(int start, int end, String direction) /*-{
+    this.setSelectionRange(start, end, direction);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTextMetrics.java b/elemental/src/elemental/js/html/JsTextMetrics.java
new file mode 100644
index 0000000..8325139
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTextMetrics.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.TextMetrics;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTextMetrics extends JsElementalMixinBase  implements TextMetrics {
+  protected JsTextMetrics() {}
+
+  public final native float getWidth() /*-{
+    return this.width;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTextTrack.java b/elemental/src/elemental/js/html/JsTextTrack.java
new file mode 100644
index 0000000..a12c2f2
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTextTrack.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.TextTrack;
+import elemental.html.TextTrackCueList;
+import elemental.js.events.JsEvent;
+import elemental.events.EventListener;
+import elemental.html.TextTrackCue;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTextTrack extends JsElementalMixinBase  implements TextTrack {
+  protected JsTextTrack() {}
+
+  public final native JsTextTrackCueList getActiveCues() /*-{
+    return this.activeCues;
+  }-*/;
+
+  public final native JsTextTrackCueList getCues() /*-{
+    return this.cues;
+  }-*/;
+
+  public final native String getKind() /*-{
+    return this.kind;
+  }-*/;
+
+  public final native String getLabel() /*-{
+    return this.label;
+  }-*/;
+
+  public final native String getLanguage() /*-{
+    return this.language;
+  }-*/;
+
+  public final native int getMode() /*-{
+    return this.mode;
+  }-*/;
+
+  public final native void setMode(int param_mode) /*-{
+    this.mode = param_mode;
+  }-*/;
+
+  public final native EventListener getOncuechange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncuechange);
+  }-*/;
+
+  public final native void setOncuechange(EventListener listener) /*-{
+    this.oncuechange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native void addCue(TextTrackCue cue) /*-{
+    this.addCue(cue);
+  }-*/;
+
+  public final native void removeCue(TextTrackCue cue) /*-{
+    this.removeCue(cue);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTextTrackCue.java b/elemental/src/elemental/js/html/JsTextTrackCue.java
new file mode 100644
index 0000000..0d632c1
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTextTrackCue.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.TextTrack;
+import elemental.js.dom.JsDocumentFragment;
+import elemental.js.events.JsEvent;
+import elemental.dom.DocumentFragment;
+import elemental.events.EventListener;
+import elemental.html.TextTrackCue;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTextTrackCue extends JsElementalMixinBase  implements TextTrackCue {
+  protected JsTextTrackCue() {}
+
+  public final native String getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(String param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native double getEndTime() /*-{
+    return this.endTime;
+  }-*/;
+
+  public final native void setEndTime(double param_endTime) /*-{
+    this.endTime = param_endTime;
+  }-*/;
+
+  public final native String getId() /*-{
+    return this.id;
+  }-*/;
+
+  public final native void setId(String param_id) /*-{
+    this.id = param_id;
+  }-*/;
+
+  public final native int getLine() /*-{
+    return this.line;
+  }-*/;
+
+  public final native void setLine(int param_line) /*-{
+    this.line = param_line;
+  }-*/;
+
+  public final native EventListener getOnenter() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onenter);
+  }-*/;
+
+  public final native void setOnenter(EventListener listener) /*-{
+    this.onenter = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnexit() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onexit);
+  }-*/;
+
+  public final native void setOnexit(EventListener listener) /*-{
+    this.onexit = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native boolean isPauseOnExit() /*-{
+    return this.pauseOnExit;
+  }-*/;
+
+  public final native void setPauseOnExit(boolean param_pauseOnExit) /*-{
+    this.pauseOnExit = param_pauseOnExit;
+  }-*/;
+
+  public final native int getPosition() /*-{
+    return this.position;
+  }-*/;
+
+  public final native void setPosition(int param_position) /*-{
+    this.position = param_position;
+  }-*/;
+
+  public final native int getSize() /*-{
+    return this.size;
+  }-*/;
+
+  public final native void setSize(int param_size) /*-{
+    this.size = param_size;
+  }-*/;
+
+  public final native boolean isSnapToLines() /*-{
+    return this.snapToLines;
+  }-*/;
+
+  public final native void setSnapToLines(boolean param_snapToLines) /*-{
+    this.snapToLines = param_snapToLines;
+  }-*/;
+
+  public final native double getStartTime() /*-{
+    return this.startTime;
+  }-*/;
+
+  public final native void setStartTime(double param_startTime) /*-{
+    this.startTime = param_startTime;
+  }-*/;
+
+  public final native String getText() /*-{
+    return this.text;
+  }-*/;
+
+  public final native void setText(String param_text) /*-{
+    this.text = param_text;
+  }-*/;
+
+  public final native JsTextTrack getTrack() /*-{
+    return this.track;
+  }-*/;
+
+  public final native String getVertical() /*-{
+    return this.vertical;
+  }-*/;
+
+  public final native void setVertical(String param_vertical) /*-{
+    this.vertical = param_vertical;
+  }-*/;
+
+  public final native JsDocumentFragment getCueAsHTML() /*-{
+    return this.getCueAsHTML();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTextTrackCueList.java b/elemental/src/elemental/js/html/JsTextTrackCueList.java
new file mode 100644
index 0000000..6092006
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTextTrackCueList.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.TextTrackCue;
+import elemental.html.TextTrackCueList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTextTrackCueList extends JsElementalMixinBase  implements TextTrackCueList {
+  protected JsTextTrackCueList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsTextTrackCue getCueById(String id) /*-{
+    return this.getCueById(id);
+  }-*/;
+
+  public final native JsTextTrackCue item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTextTrackList.java b/elemental/src/elemental/js/html/JsTextTrackList.java
new file mode 100644
index 0000000..cc42aee
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTextTrackList.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.TextTrack;
+import elemental.html.TextTrackList;
+import elemental.js.events.JsEvent;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTextTrackList extends JsElementalMixinBase  implements TextTrackList {
+  protected JsTextTrackList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native EventListener getOnaddtrack() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onaddtrack);
+  }-*/;
+
+  public final native void setOnaddtrack(EventListener listener) /*-{
+    this.onaddtrack = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native JsTextTrack item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTimeRanges.java b/elemental/src/elemental/js/html/JsTimeRanges.java
new file mode 100644
index 0000000..e5acd27
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTimeRanges.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.TimeRanges;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTimeRanges extends JsElementalMixinBase  implements TimeRanges {
+  protected JsTimeRanges() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native float end(int index) /*-{
+    return this.end(index);
+  }-*/;
+
+  public final native float start(int index) /*-{
+    return this.start(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTitleElement.java b/elemental/src/elemental/js/html/JsTitleElement.java
new file mode 100644
index 0000000..3fc3cbb
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTitleElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.TitleElement;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTitleElement extends JsElement  implements TitleElement {
+  protected JsTitleElement() {}
+
+  public final native String getText() /*-{
+    return this.text;
+  }-*/;
+
+  public final native void setText(String param_text) /*-{
+    this.text = param_text;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTrackElement.java b/elemental/src/elemental/js/html/JsTrackElement.java
new file mode 100644
index 0000000..9f13224
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTrackElement.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.html.TrackElement;
+import elemental.dom.Element;
+import elemental.html.TextTrack;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTrackElement extends JsElement  implements TrackElement {
+  protected JsTrackElement() {}
+
+  public final native boolean isDefaultValue() /*-{
+    return this['default'];
+  }-*/;
+
+  public final native void setDefaultValue(boolean param_default) /*-{
+    this['default'] = param_default;
+  }-*/;
+
+  public final native String getKind() /*-{
+    return this.kind;
+  }-*/;
+
+  public final native void setKind(String param_kind) /*-{
+    this.kind = param_kind;
+  }-*/;
+
+  public final native String getLabel() /*-{
+    return this.label;
+  }-*/;
+
+  public final native void setLabel(String param_label) /*-{
+    this.label = param_label;
+  }-*/;
+
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native String getSrc() /*-{
+    return this.src;
+  }-*/;
+
+  public final native void setSrc(String param_src) /*-{
+    this.src = param_src;
+  }-*/;
+
+  public final native String getSrclang() /*-{
+    return this.srclang;
+  }-*/;
+
+  public final native void setSrclang(String param_srclang) /*-{
+    this.srclang = param_srclang;
+  }-*/;
+
+  public final native JsTextTrack getTrack() /*-{
+    return this.track;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsTrackEvent.java b/elemental/src/elemental/js/html/JsTrackEvent.java
new file mode 100644
index 0000000..fe5ada8
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsTrackEvent.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.TrackEvent;
+import elemental.js.events.JsEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTrackEvent extends JsEvent  implements TrackEvent {
+  protected JsTrackEvent() {}
+
+  public final native Object getTrack() /*-{
+    return this.track;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsUListElement.java b/elemental/src/elemental/js/html/JsUListElement.java
new file mode 100644
index 0000000..1dcf9bd
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsUListElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.UListElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsUListElement extends JsElement  implements UListElement {
+  protected JsUListElement() {}
+
+  public final native boolean isCompact() /*-{
+    return this.compact;
+  }-*/;
+
+  public final native void setCompact(boolean param_compact) /*-{
+    this.compact = param_compact;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsUint16Array.java b/elemental/src/elemental/js/html/JsUint16Array.java
new file mode 100644
index 0000000..6dd3c02
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsUint16Array.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ArrayBufferView;
+import elemental.html.Uint16Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsUint16Array extends JsArrayBufferView  implements Uint16Array, IndexableInt {
+  protected JsUint16Array() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setElements(Object array) /*-{
+    this.setElements(array);
+  }-*/;
+
+  public final native void setElements(Object array, int offset) /*-{
+    this.setElements(array, offset);
+  }-*/;
+
+  public final native JsUint16Array subarray(int start) /*-{
+    return this.subarray(start);
+  }-*/;
+
+  public final native JsUint16Array subarray(int start, int end) /*-{
+    return this.subarray(start, end);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsUint32Array.java b/elemental/src/elemental/js/html/JsUint32Array.java
new file mode 100644
index 0000000..c1176df
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsUint32Array.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Uint32Array;
+import elemental.html.ArrayBufferView;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsUint32Array extends JsArrayBufferView  implements Uint32Array, IndexableInt {
+  protected JsUint32Array() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setElements(Object array) /*-{
+    this.setElements(array);
+  }-*/;
+
+  public final native void setElements(Object array, int offset) /*-{
+    this.setElements(array, offset);
+  }-*/;
+
+  public final native JsUint32Array subarray(int start) /*-{
+    return this.subarray(start);
+  }-*/;
+
+  public final native JsUint32Array subarray(int start, int end) /*-{
+    return this.subarray(start, end);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsUint8Array.java b/elemental/src/elemental/js/html/JsUint8Array.java
new file mode 100644
index 0000000..f6ec4e8
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsUint8Array.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ArrayBufferView;
+import elemental.html.Uint8Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsUint8Array extends JsArrayBufferView  implements Uint8Array, IndexableInt {
+  protected JsUint8Array() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setElements(Object array) /*-{
+    this.setElements(array);
+  }-*/;
+
+  public final native void setElements(Object array, int offset) /*-{
+    this.setElements(array, offset);
+  }-*/;
+
+  public final native JsUint8Array subarray(int start) /*-{
+    return this.subarray(start);
+  }-*/;
+
+  public final native JsUint8Array subarray(int start, int end) /*-{
+    return this.subarray(start, end);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsUint8ClampedArray.java b/elemental/src/elemental/js/html/JsUint8ClampedArray.java
new file mode 100644
index 0000000..24d83d5
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsUint8ClampedArray.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Uint8ClampedArray;
+import elemental.html.Uint8Array;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsUint8ClampedArray extends JsUint8Array  implements Uint8ClampedArray, IndexableInt {
+  protected JsUint8ClampedArray() {}
+}
diff --git a/elemental/src/elemental/js/html/JsUnknownElement.java b/elemental/src/elemental/js/html/JsUnknownElement.java
new file mode 100644
index 0000000..72b9ff2
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsUnknownElement.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.html.UnknownElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsUnknownElement extends JsElement  implements UnknownElement {
+  protected JsUnknownElement() {}
+}
diff --git a/elemental/src/elemental/js/html/JsValidityState.java b/elemental/src/elemental/js/html/JsValidityState.java
new file mode 100644
index 0000000..be5b74e
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsValidityState.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.ValidityState;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsValidityState extends JsElementalMixinBase  implements ValidityState {
+  protected JsValidityState() {}
+
+  public final native boolean isCustomError() /*-{
+    return this.customError;
+  }-*/;
+
+  public final native boolean isPatternMismatch() /*-{
+    return this.patternMismatch;
+  }-*/;
+
+  public final native boolean isRangeOverflow() /*-{
+    return this.rangeOverflow;
+  }-*/;
+
+  public final native boolean isRangeUnderflow() /*-{
+    return this.rangeUnderflow;
+  }-*/;
+
+  public final native boolean isStepMismatch() /*-{
+    return this.stepMismatch;
+  }-*/;
+
+  public final native boolean isTooLong() /*-{
+    return this.tooLong;
+  }-*/;
+
+  public final native boolean isTypeMismatch() /*-{
+    return this.typeMismatch;
+  }-*/;
+
+  public final native boolean isValid() /*-{
+    return this.valid;
+  }-*/;
+
+  public final native boolean isValueMissing() /*-{
+    return this.valueMissing;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsVideoElement.java b/elemental/src/elemental/js/html/JsVideoElement.java
new file mode 100644
index 0000000..694da8e
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsVideoElement.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.VideoElement;
+import elemental.html.MediaElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsVideoElement extends JsMediaElement  implements VideoElement {
+  protected JsVideoElement() {}
+
+  public final native int getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(int param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native String getPoster() /*-{
+    return this.poster;
+  }-*/;
+
+  public final native void setPoster(String param_poster) /*-{
+    this.poster = param_poster;
+  }-*/;
+
+  public final native int getVideoHeight() /*-{
+    return this.videoHeight;
+  }-*/;
+
+  public final native int getVideoWidth() /*-{
+    return this.videoWidth;
+  }-*/;
+
+  public final native int getWebkitDecodedFrameCount() /*-{
+    return this.webkitDecodedFrameCount;
+  }-*/;
+
+  public final native boolean isWebkitDisplayingFullscreen() /*-{
+    return this.webkitDisplayingFullscreen;
+  }-*/;
+
+  public final native int getWebkitDroppedFrameCount() /*-{
+    return this.webkitDroppedFrameCount;
+  }-*/;
+
+  public final native boolean isWebkitSupportsFullscreen() /*-{
+    return this.webkitSupportsFullscreen;
+  }-*/;
+
+  public final native int getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(int param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native void webkitEnterFullScreen() /*-{
+    this.webkitEnterFullScreen();
+  }-*/;
+
+  public final native void webkitEnterFullscreen() /*-{
+    this.webkitEnterFullscreen();
+  }-*/;
+
+  public final native void webkitExitFullScreen() /*-{
+    this.webkitExitFullScreen();
+  }-*/;
+
+  public final native void webkitExitFullscreen() /*-{
+    this.webkitExitFullscreen();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWaveShaperNode.java b/elemental/src/elemental/js/html/JsWaveShaperNode.java
new file mode 100644
index 0000000..0ba2c75
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWaveShaperNode.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.Float32Array;
+import elemental.html.AudioNode;
+import elemental.html.WaveShaperNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWaveShaperNode extends JsAudioNode  implements WaveShaperNode {
+  protected JsWaveShaperNode() {}
+
+  public final native JsFloat32Array getCurve() /*-{
+    return this.curve;
+  }-*/;
+
+  public final native void setCurve(Float32Array param_curve) /*-{
+    this.curve = param_curve;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWaveTable.java b/elemental/src/elemental/js/html/JsWaveTable.java
new file mode 100644
index 0000000..e3afb65
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWaveTable.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WaveTable;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWaveTable extends JsElementalMixinBase  implements WaveTable {
+  protected JsWaveTable() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLActiveInfo.java b/elemental/src/elemental/js/html/JsWebGLActiveInfo.java
new file mode 100644
index 0000000..c5cd01f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLActiveInfo.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLActiveInfo;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLActiveInfo extends JsElementalMixinBase  implements WebGLActiveInfo {
+  protected JsWebGLActiveInfo() {}
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native int getSize() /*-{
+    return this.size;
+  }-*/;
+
+  public final native int getType() /*-{
+    return this.type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLBuffer.java b/elemental/src/elemental/js/html/JsWebGLBuffer.java
new file mode 100644
index 0000000..19f9d79
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLBuffer.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLBuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLBuffer extends JsElementalMixinBase  implements WebGLBuffer {
+  protected JsWebGLBuffer() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLCompressedTextureS3TC.java b/elemental/src/elemental/js/html/JsWebGLCompressedTextureS3TC.java
new file mode 100644
index 0000000..6d3ba17
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLCompressedTextureS3TC.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLCompressedTextureS3TC;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLCompressedTextureS3TC extends JsElementalMixinBase  implements WebGLCompressedTextureS3TC {
+  protected JsWebGLCompressedTextureS3TC() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLContextAttributes.java b/elemental/src/elemental/js/html/JsWebGLContextAttributes.java
new file mode 100644
index 0000000..a747d27
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLContextAttributes.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLContextAttributes;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLContextAttributes extends JsElementalMixinBase  implements WebGLContextAttributes {
+  protected JsWebGLContextAttributes() {}
+
+  public final native boolean isAlpha() /*-{
+    return this.alpha;
+  }-*/;
+
+  public final native void setAlpha(boolean param_alpha) /*-{
+    this.alpha = param_alpha;
+  }-*/;
+
+  public final native boolean isAntialias() /*-{
+    return this.antialias;
+  }-*/;
+
+  public final native void setAntialias(boolean param_antialias) /*-{
+    this.antialias = param_antialias;
+  }-*/;
+
+  public final native boolean isDepth() /*-{
+    return this.depth;
+  }-*/;
+
+  public final native void setDepth(boolean param_depth) /*-{
+    this.depth = param_depth;
+  }-*/;
+
+  public final native boolean isPremultipliedAlpha() /*-{
+    return this.premultipliedAlpha;
+  }-*/;
+
+  public final native void setPremultipliedAlpha(boolean param_premultipliedAlpha) /*-{
+    this.premultipliedAlpha = param_premultipliedAlpha;
+  }-*/;
+
+  public final native boolean isPreserveDrawingBuffer() /*-{
+    return this.preserveDrawingBuffer;
+  }-*/;
+
+  public final native void setPreserveDrawingBuffer(boolean param_preserveDrawingBuffer) /*-{
+    this.preserveDrawingBuffer = param_preserveDrawingBuffer;
+  }-*/;
+
+  public final native boolean isStencil() /*-{
+    return this.stencil;
+  }-*/;
+
+  public final native void setStencil(boolean param_stencil) /*-{
+    this.stencil = param_stencil;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLContextEvent.java b/elemental/src/elemental/js/html/JsWebGLContextEvent.java
new file mode 100644
index 0000000..2b486dc
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLContextEvent.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLContextEvent;
+import elemental.js.events.JsEvent;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLContextEvent extends JsEvent  implements WebGLContextEvent {
+  protected JsWebGLContextEvent() {}
+
+  public final native String getStatusMessage() /*-{
+    return this.statusMessage;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLDebugRendererInfo.java b/elemental/src/elemental/js/html/JsWebGLDebugRendererInfo.java
new file mode 100644
index 0000000..2d306ce
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLDebugRendererInfo.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLDebugRendererInfo;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLDebugRendererInfo extends JsElementalMixinBase  implements WebGLDebugRendererInfo {
+  protected JsWebGLDebugRendererInfo() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLDebugShaders.java b/elemental/src/elemental/js/html/JsWebGLDebugShaders.java
new file mode 100644
index 0000000..7de38ee
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLDebugShaders.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLShader;
+import elemental.html.WebGLDebugShaders;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLDebugShaders extends JsElementalMixinBase  implements WebGLDebugShaders {
+  protected JsWebGLDebugShaders() {}
+
+  public final native String getTranslatedShaderSource(WebGLShader shader) /*-{
+    return this.getTranslatedShaderSource(shader);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLFramebuffer.java b/elemental/src/elemental/js/html/JsWebGLFramebuffer.java
new file mode 100644
index 0000000..cfeaf13
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLFramebuffer.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLFramebuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLFramebuffer extends JsElementalMixinBase  implements WebGLFramebuffer {
+  protected JsWebGLFramebuffer() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLLoseContext.java b/elemental/src/elemental/js/html/JsWebGLLoseContext.java
new file mode 100644
index 0000000..8d43081
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLLoseContext.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLLoseContext;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLLoseContext extends JsElementalMixinBase  implements WebGLLoseContext {
+  protected JsWebGLLoseContext() {}
+
+  public final native void loseContext() /*-{
+    this.loseContext();
+  }-*/;
+
+  public final native void restoreContext() /*-{
+    this.restoreContext();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLProgram.java b/elemental/src/elemental/js/html/JsWebGLProgram.java
new file mode 100644
index 0000000..6f318f1
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLProgram.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLProgram;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLProgram extends JsElementalMixinBase  implements WebGLProgram {
+  protected JsWebGLProgram() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLRenderbuffer.java b/elemental/src/elemental/js/html/JsWebGLRenderbuffer.java
new file mode 100644
index 0000000..bf90f22
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLRenderbuffer.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLRenderbuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLRenderbuffer extends JsElementalMixinBase  implements WebGLRenderbuffer {
+  protected JsWebGLRenderbuffer() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLRenderingContext.java b/elemental/src/elemental/js/html/JsWebGLRenderingContext.java
new file mode 100644
index 0000000..be82151
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLRenderingContext.java
@@ -0,0 +1,656 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.js.util.JsIndexable;
+import elemental.html.ArrayBuffer;
+import elemental.html.Int32Array;
+import elemental.html.WebGLActiveInfo;
+import elemental.html.ImageElement;
+import elemental.html.WebGLRenderbuffer;
+import elemental.html.Float32Array;
+import elemental.html.WebGLBuffer;
+import elemental.html.CanvasElement;
+import elemental.html.WebGLShader;
+import elemental.html.ImageData;
+import elemental.html.WebGLTexture;
+import elemental.html.WebGLRenderingContext;
+import elemental.html.WebGLContextAttributes;
+import elemental.util.Indexable;
+import elemental.html.CanvasRenderingContext;
+import elemental.html.WebGLUniformLocation;
+import elemental.html.WebGLShaderPrecisionFormat;
+import elemental.html.WebGLProgram;
+import elemental.html.ArrayBufferView;
+import elemental.html.VideoElement;
+import elemental.html.WebGLFramebuffer;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLRenderingContext extends JsCanvasRenderingContext  implements WebGLRenderingContext {
+  protected JsWebGLRenderingContext() {}
+
+  public final native int getDrawingBufferHeight() /*-{
+    return this.drawingBufferHeight;
+  }-*/;
+
+  public final native int getDrawingBufferWidth() /*-{
+    return this.drawingBufferWidth;
+  }-*/;
+
+  public final native void activeTexture(int texture) /*-{
+    this.activeTexture(texture);
+  }-*/;
+
+  public final native void attachShader(WebGLProgram program, WebGLShader shader) /*-{
+    this.attachShader(program, shader);
+  }-*/;
+
+  public final native void bindAttribLocation(WebGLProgram program, int index, String name) /*-{
+    this.bindAttribLocation(program, index, name);
+  }-*/;
+
+  public final native void bindBuffer(int target, WebGLBuffer buffer) /*-{
+    this.bindBuffer(target, buffer);
+  }-*/;
+
+  public final native void bindFramebuffer(int target, WebGLFramebuffer framebuffer) /*-{
+    this.bindFramebuffer(target, framebuffer);
+  }-*/;
+
+  public final native void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer) /*-{
+    this.bindRenderbuffer(target, renderbuffer);
+  }-*/;
+
+  public final native void bindTexture(int target, WebGLTexture texture) /*-{
+    this.bindTexture(target, texture);
+  }-*/;
+
+  public final native void blendColor(float red, float green, float blue, float alpha) /*-{
+    this.blendColor(red, green, blue, alpha);
+  }-*/;
+
+  public final native void blendEquation(int mode) /*-{
+    this.blendEquation(mode);
+  }-*/;
+
+  public final native void blendEquationSeparate(int modeRGB, int modeAlpha) /*-{
+    this.blendEquationSeparate(modeRGB, modeAlpha);
+  }-*/;
+
+  public final native void blendFunc(int sfactor, int dfactor) /*-{
+    this.blendFunc(sfactor, dfactor);
+  }-*/;
+
+  public final native void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) /*-{
+    this.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
+  }-*/;
+
+  public final native void bufferData(int target, ArrayBuffer data, int usage) /*-{
+    this.bufferData(target, data, usage);
+  }-*/;
+
+  public final native void bufferData(int target, ArrayBufferView data, int usage) /*-{
+    this.bufferData(target, data, usage);
+  }-*/;
+
+  public final native void bufferData(int target, double size, int usage) /*-{
+    this.bufferData(target, size, usage);
+  }-*/;
+
+  public final native void bufferSubData(int target, double offset, ArrayBuffer data) /*-{
+    this.bufferSubData(target, offset, data);
+  }-*/;
+
+  public final native void bufferSubData(int target, double offset, ArrayBufferView data) /*-{
+    this.bufferSubData(target, offset, data);
+  }-*/;
+
+  public final native int checkFramebufferStatus(int target) /*-{
+    return this.checkFramebufferStatus(target);
+  }-*/;
+
+  public final native void clear(int mask) /*-{
+    this.clear(mask);
+  }-*/;
+
+  public final native void clearColor(float red, float green, float blue, float alpha) /*-{
+    this.clearColor(red, green, blue, alpha);
+  }-*/;
+
+  public final native void clearDepth(float depth) /*-{
+    this.clearDepth(depth);
+  }-*/;
+
+  public final native void clearStencil(int s) /*-{
+    this.clearStencil(s);
+  }-*/;
+
+  public final native void colorMask(boolean red, boolean green, boolean blue, boolean alpha) /*-{
+    this.colorMask(red, green, blue, alpha);
+  }-*/;
+
+  public final native void compileShader(WebGLShader shader) /*-{
+    this.compileShader(shader);
+  }-*/;
+
+  public final native void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data) /*-{
+    this.compressedTexImage2D(target, level, internalformat, width, height, border, data);
+  }-*/;
+
+  public final native void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data) /*-{
+    this.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data);
+  }-*/;
+
+  public final native void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) /*-{
+    this.copyTexImage2D(target, level, internalformat, x, y, width, height, border);
+  }-*/;
+
+  public final native void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) /*-{
+    this.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+  }-*/;
+
+  public final native JsWebGLBuffer createBuffer() /*-{
+    return this.createBuffer();
+  }-*/;
+
+  public final native JsWebGLFramebuffer createFramebuffer() /*-{
+    return this.createFramebuffer();
+  }-*/;
+
+  public final native JsWebGLProgram createProgram() /*-{
+    return this.createProgram();
+  }-*/;
+
+  public final native JsWebGLRenderbuffer createRenderbuffer() /*-{
+    return this.createRenderbuffer();
+  }-*/;
+
+  public final native JsWebGLShader createShader(int type) /*-{
+    return this.createShader(type);
+  }-*/;
+
+  public final native JsWebGLTexture createTexture() /*-{
+    return this.createTexture();
+  }-*/;
+
+  public final native void cullFace(int mode) /*-{
+    this.cullFace(mode);
+  }-*/;
+
+  public final native void deleteBuffer(WebGLBuffer buffer) /*-{
+    this.deleteBuffer(buffer);
+  }-*/;
+
+  public final native void deleteFramebuffer(WebGLFramebuffer framebuffer) /*-{
+    this.deleteFramebuffer(framebuffer);
+  }-*/;
+
+  public final native void deleteProgram(WebGLProgram program) /*-{
+    this.deleteProgram(program);
+  }-*/;
+
+  public final native void deleteRenderbuffer(WebGLRenderbuffer renderbuffer) /*-{
+    this.deleteRenderbuffer(renderbuffer);
+  }-*/;
+
+  public final native void deleteShader(WebGLShader shader) /*-{
+    this.deleteShader(shader);
+  }-*/;
+
+  public final native void deleteTexture(WebGLTexture texture) /*-{
+    this.deleteTexture(texture);
+  }-*/;
+
+  public final native void depthFunc(int func) /*-{
+    this.depthFunc(func);
+  }-*/;
+
+  public final native void depthMask(boolean flag) /*-{
+    this.depthMask(flag);
+  }-*/;
+
+  public final native void depthRange(float zNear, float zFar) /*-{
+    this.depthRange(zNear, zFar);
+  }-*/;
+
+  public final native void detachShader(WebGLProgram program, WebGLShader shader) /*-{
+    this.detachShader(program, shader);
+  }-*/;
+
+  public final native void disable(int cap) /*-{
+    this.disable(cap);
+  }-*/;
+
+  public final native void disableVertexAttribArray(int index) /*-{
+    this.disableVertexAttribArray(index);
+  }-*/;
+
+  public final native void drawArrays(int mode, int first, int count) /*-{
+    this.drawArrays(mode, first, count);
+  }-*/;
+
+  public final native void drawElements(int mode, int count, int type, double offset) /*-{
+    this.drawElements(mode, count, type, offset);
+  }-*/;
+
+  public final native void enable(int cap) /*-{
+    this.enable(cap);
+  }-*/;
+
+  public final native void enableVertexAttribArray(int index) /*-{
+    this.enableVertexAttribArray(index);
+  }-*/;
+
+  public final native void finish() /*-{
+    this.finish();
+  }-*/;
+
+  public final native void flush() /*-{
+    this.flush();
+  }-*/;
+
+  public final native void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer) /*-{
+    this.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+  }-*/;
+
+  public final native void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level) /*-{
+    this.framebufferTexture2D(target, attachment, textarget, texture, level);
+  }-*/;
+
+  public final native void frontFace(int mode) /*-{
+    this.frontFace(mode);
+  }-*/;
+
+  public final native void generateMipmap(int target) /*-{
+    this.generateMipmap(target);
+  }-*/;
+
+  public final native JsWebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) /*-{
+    return this.getActiveAttrib(program, index);
+  }-*/;
+
+  public final native JsWebGLActiveInfo getActiveUniform(WebGLProgram program, int index) /*-{
+    return this.getActiveUniform(program, index);
+  }-*/;
+
+  public final native JsIndexable getAttachedShaders(WebGLProgram program) /*-{
+    return this.getAttachedShaders(program);
+  }-*/;
+
+  public final native int getAttribLocation(WebGLProgram program, String name) /*-{
+    return this.getAttribLocation(program, name);
+  }-*/;
+
+  public final native Object getBufferParameter(int target, int pname) /*-{
+    return this.getBufferParameter(target, pname);
+  }-*/;
+
+  public final native JsWebGLContextAttributes getContextAttributes() /*-{
+    return this.getContextAttributes();
+  }-*/;
+
+  public final native int getError() /*-{
+    return this.getError();
+  }-*/;
+
+  public final native Object getExtension(String name) /*-{
+    return this.getExtension(name);
+  }-*/;
+
+  public final native Object getFramebufferAttachmentParameter(int target, int attachment, int pname) /*-{
+    return this.getFramebufferAttachmentParameter(target, attachment, pname);
+  }-*/;
+
+  public final native Object getParameter(int pname) /*-{
+    return this.getParameter(pname);
+  }-*/;
+
+  public final native String getProgramInfoLog(WebGLProgram program) /*-{
+    return this.getProgramInfoLog(program);
+  }-*/;
+
+  public final native Object getProgramParameter(WebGLProgram program, int pname) /*-{
+    return this.getProgramParameter(program, pname);
+  }-*/;
+
+  public final native Object getRenderbufferParameter(int target, int pname) /*-{
+    return this.getRenderbufferParameter(target, pname);
+  }-*/;
+
+  public final native String getShaderInfoLog(WebGLShader shader) /*-{
+    return this.getShaderInfoLog(shader);
+  }-*/;
+
+  public final native Object getShaderParameter(WebGLShader shader, int pname) /*-{
+    return this.getShaderParameter(shader, pname);
+  }-*/;
+
+  public final native JsWebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) /*-{
+    return this.getShaderPrecisionFormat(shadertype, precisiontype);
+  }-*/;
+
+  public final native String getShaderSource(WebGLShader shader) /*-{
+    return this.getShaderSource(shader);
+  }-*/;
+
+  public final native Object getTexParameter(int target, int pname) /*-{
+    return this.getTexParameter(target, pname);
+  }-*/;
+
+  public final native Object getUniform(WebGLProgram program, WebGLUniformLocation location) /*-{
+    return this.getUniform(program, location);
+  }-*/;
+
+  public final native JsWebGLUniformLocation getUniformLocation(WebGLProgram program, String name) /*-{
+    return this.getUniformLocation(program, name);
+  }-*/;
+
+  public final native Object getVertexAttrib(int index, int pname) /*-{
+    return this.getVertexAttrib(index, pname);
+  }-*/;
+
+  public final native double getVertexAttribOffset(int index, int pname) /*-{
+    return this.getVertexAttribOffset(index, pname);
+  }-*/;
+
+  public final native void hint(int target, int mode) /*-{
+    this.hint(target, mode);
+  }-*/;
+
+  public final native boolean isBuffer(WebGLBuffer buffer) /*-{
+    return this.isBuffer(buffer);
+  }-*/;
+
+  public final native boolean isContextLost() /*-{
+    return this.isContextLost();
+  }-*/;
+
+  public final native boolean isEnabled(int cap) /*-{
+    return this.isEnabled(cap);
+  }-*/;
+
+  public final native boolean isFramebuffer(WebGLFramebuffer framebuffer) /*-{
+    return this.isFramebuffer(framebuffer);
+  }-*/;
+
+  public final native boolean isProgram(WebGLProgram program) /*-{
+    return this.isProgram(program);
+  }-*/;
+
+  public final native boolean isRenderbuffer(WebGLRenderbuffer renderbuffer) /*-{
+    return this.isRenderbuffer(renderbuffer);
+  }-*/;
+
+  public final native boolean isShader(WebGLShader shader) /*-{
+    return this.isShader(shader);
+  }-*/;
+
+  public final native boolean isTexture(WebGLTexture texture) /*-{
+    return this.isTexture(texture);
+  }-*/;
+
+  public final native void lineWidth(float width) /*-{
+    this.lineWidth(width);
+  }-*/;
+
+  public final native void linkProgram(WebGLProgram program) /*-{
+    this.linkProgram(program);
+  }-*/;
+
+  public final native void pixelStorei(int pname, int param) /*-{
+    this.pixelStorei(pname, param);
+  }-*/;
+
+  public final native void polygonOffset(float factor, float units) /*-{
+    this.polygonOffset(factor, units);
+  }-*/;
+
+  public final native void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels) /*-{
+    this.readPixels(x, y, width, height, format, type, pixels);
+  }-*/;
+
+  public final native void releaseShaderCompiler() /*-{
+    this.releaseShaderCompiler();
+  }-*/;
+
+  public final native void renderbufferStorage(int target, int internalformat, int width, int height) /*-{
+    this.renderbufferStorage(target, internalformat, width, height);
+  }-*/;
+
+  public final native void sampleCoverage(float value, boolean invert) /*-{
+    this.sampleCoverage(value, invert);
+  }-*/;
+
+  public final native void scissor(int x, int y, int width, int height) /*-{
+    this.scissor(x, y, width, height);
+  }-*/;
+
+  public final native void shaderSource(WebGLShader shader, String string) /*-{
+    this.shaderSource(shader, string);
+  }-*/;
+
+  public final native void stencilFunc(int func, int ref, int mask) /*-{
+    this.stencilFunc(func, ref, mask);
+  }-*/;
+
+  public final native void stencilFuncSeparate(int face, int func, int ref, int mask) /*-{
+    this.stencilFuncSeparate(face, func, ref, mask);
+  }-*/;
+
+  public final native void stencilMask(int mask) /*-{
+    this.stencilMask(mask);
+  }-*/;
+
+  public final native void stencilMaskSeparate(int face, int mask) /*-{
+    this.stencilMaskSeparate(face, mask);
+  }-*/;
+
+  public final native void stencilOp(int fail, int zfail, int zpass) /*-{
+    this.stencilOp(fail, zfail, zpass);
+  }-*/;
+
+  public final native void stencilOpSeparate(int face, int fail, int zfail, int zpass) /*-{
+    this.stencilOpSeparate(face, fail, zfail, zpass);
+  }-*/;
+
+  public final native void texImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ArrayBufferView pixels) /*-{
+    this.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+  }-*/;
+
+  public final native void texImage2D(int target, int level, int internalformat, int format, int type, ImageData pixels) /*-{
+    this.texImage2D(target, level, internalformat, format, type, pixels);
+  }-*/;
+
+  public final native void texImage2D(int target, int level, int internalformat, int format, int type, ImageElement image) /*-{
+    this.texImage2D(target, level, internalformat, format, type, image);
+  }-*/;
+
+  public final native void texImage2D(int target, int level, int internalformat, int format, int type, CanvasElement canvas) /*-{
+    this.texImage2D(target, level, internalformat, format, type, canvas);
+  }-*/;
+
+  public final native void texImage2D(int target, int level, int internalformat, int format, int type, VideoElement video) /*-{
+    this.texImage2D(target, level, internalformat, format, type, video);
+  }-*/;
+
+  public final native void texParameterf(int target, int pname, float param) /*-{
+    this.texParameterf(target, pname, param);
+  }-*/;
+
+  public final native void texParameteri(int target, int pname, int param) /*-{
+    this.texParameteri(target, pname, param);
+  }-*/;
+
+  public final native void texSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ArrayBufferView pixels) /*-{
+    this.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+  }-*/;
+
+  public final native void texSubImage2D(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) /*-{
+    this.texSubImage2D(target, level, xoffset, yoffset, format, type, pixels);
+  }-*/;
+
+  public final native void texSubImage2D(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) /*-{
+    this.texSubImage2D(target, level, xoffset, yoffset, format, type, image);
+  }-*/;
+
+  public final native void texSubImage2D(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) /*-{
+    this.texSubImage2D(target, level, xoffset, yoffset, format, type, canvas);
+  }-*/;
+
+  public final native void texSubImage2D(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) /*-{
+    this.texSubImage2D(target, level, xoffset, yoffset, format, type, video);
+  }-*/;
+
+  public final native void uniform1f(WebGLUniformLocation location, float x) /*-{
+    this.uniform1f(location, x);
+  }-*/;
+
+  public final native void uniform1fv(WebGLUniformLocation location, Float32Array v) /*-{
+    this.uniform1fv(location, v);
+  }-*/;
+
+  public final native void uniform1i(WebGLUniformLocation location, int x) /*-{
+    this.uniform1i(location, x);
+  }-*/;
+
+  public final native void uniform1iv(WebGLUniformLocation location, Int32Array v) /*-{
+    this.uniform1iv(location, v);
+  }-*/;
+
+  public final native void uniform2f(WebGLUniformLocation location, float x, float y) /*-{
+    this.uniform2f(location, x, y);
+  }-*/;
+
+  public final native void uniform2fv(WebGLUniformLocation location, Float32Array v) /*-{
+    this.uniform2fv(location, v);
+  }-*/;
+
+  public final native void uniform2i(WebGLUniformLocation location, int x, int y) /*-{
+    this.uniform2i(location, x, y);
+  }-*/;
+
+  public final native void uniform2iv(WebGLUniformLocation location, Int32Array v) /*-{
+    this.uniform2iv(location, v);
+  }-*/;
+
+  public final native void uniform3f(WebGLUniformLocation location, float x, float y, float z) /*-{
+    this.uniform3f(location, x, y, z);
+  }-*/;
+
+  public final native void uniform3fv(WebGLUniformLocation location, Float32Array v) /*-{
+    this.uniform3fv(location, v);
+  }-*/;
+
+  public final native void uniform3i(WebGLUniformLocation location, int x, int y, int z) /*-{
+    this.uniform3i(location, x, y, z);
+  }-*/;
+
+  public final native void uniform3iv(WebGLUniformLocation location, Int32Array v) /*-{
+    this.uniform3iv(location, v);
+  }-*/;
+
+  public final native void uniform4f(WebGLUniformLocation location, float x, float y, float z, float w) /*-{
+    this.uniform4f(location, x, y, z, w);
+  }-*/;
+
+  public final native void uniform4fv(WebGLUniformLocation location, Float32Array v) /*-{
+    this.uniform4fv(location, v);
+  }-*/;
+
+  public final native void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) /*-{
+    this.uniform4i(location, x, y, z, w);
+  }-*/;
+
+  public final native void uniform4iv(WebGLUniformLocation location, Int32Array v) /*-{
+    this.uniform4iv(location, v);
+  }-*/;
+
+  public final native void uniformMatrix2fv(WebGLUniformLocation location, boolean transpose, Float32Array array) /*-{
+    this.uniformMatrix2fv(location, transpose, array);
+  }-*/;
+
+  public final native void uniformMatrix3fv(WebGLUniformLocation location, boolean transpose, Float32Array array) /*-{
+    this.uniformMatrix3fv(location, transpose, array);
+  }-*/;
+
+  public final native void uniformMatrix4fv(WebGLUniformLocation location, boolean transpose, Float32Array array) /*-{
+    this.uniformMatrix4fv(location, transpose, array);
+  }-*/;
+
+  public final native void useProgram(WebGLProgram program) /*-{
+    this.useProgram(program);
+  }-*/;
+
+  public final native void validateProgram(WebGLProgram program) /*-{
+    this.validateProgram(program);
+  }-*/;
+
+  public final native void vertexAttrib1f(int indx, float x) /*-{
+    this.vertexAttrib1f(indx, x);
+  }-*/;
+
+  public final native void vertexAttrib1fv(int indx, Float32Array values) /*-{
+    this.vertexAttrib1fv(indx, values);
+  }-*/;
+
+  public final native void vertexAttrib2f(int indx, float x, float y) /*-{
+    this.vertexAttrib2f(indx, x, y);
+  }-*/;
+
+  public final native void vertexAttrib2fv(int indx, Float32Array values) /*-{
+    this.vertexAttrib2fv(indx, values);
+  }-*/;
+
+  public final native void vertexAttrib3f(int indx, float x, float y, float z) /*-{
+    this.vertexAttrib3f(indx, x, y, z);
+  }-*/;
+
+  public final native void vertexAttrib3fv(int indx, Float32Array values) /*-{
+    this.vertexAttrib3fv(indx, values);
+  }-*/;
+
+  public final native void vertexAttrib4f(int indx, float x, float y, float z, float w) /*-{
+    this.vertexAttrib4f(indx, x, y, z, w);
+  }-*/;
+
+  public final native void vertexAttrib4fv(int indx, Float32Array values) /*-{
+    this.vertexAttrib4fv(indx, values);
+  }-*/;
+
+  public final native void vertexAttribPointer(int indx, int size, int type, boolean normalized, int stride, double offset) /*-{
+    this.vertexAttribPointer(indx, size, type, normalized, stride, offset);
+  }-*/;
+
+  public final native void viewport(int x, int y, int width, int height) /*-{
+    this.viewport(x, y, width, height);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLShader.java b/elemental/src/elemental/js/html/JsWebGLShader.java
new file mode 100644
index 0000000..38cf5eb
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLShader.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLShader;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLShader extends JsElementalMixinBase  implements WebGLShader {
+  protected JsWebGLShader() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLShaderPrecisionFormat.java b/elemental/src/elemental/js/html/JsWebGLShaderPrecisionFormat.java
new file mode 100644
index 0000000..84ceea5
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLShaderPrecisionFormat.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLShaderPrecisionFormat;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLShaderPrecisionFormat extends JsElementalMixinBase  implements WebGLShaderPrecisionFormat {
+  protected JsWebGLShaderPrecisionFormat() {}
+
+  public final native int getPrecision() /*-{
+    return this.precision;
+  }-*/;
+
+  public final native int getRangeMax() /*-{
+    return this.rangeMax;
+  }-*/;
+
+  public final native int getRangeMin() /*-{
+    return this.rangeMin;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLTexture.java b/elemental/src/elemental/js/html/JsWebGLTexture.java
new file mode 100644
index 0000000..998efab
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLTexture.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLTexture;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLTexture extends JsElementalMixinBase  implements WebGLTexture {
+  protected JsWebGLTexture() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLUniformLocation.java b/elemental/src/elemental/js/html/JsWebGLUniformLocation.java
new file mode 100644
index 0000000..486570ed
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLUniformLocation.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLUniformLocation;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLUniformLocation extends JsElementalMixinBase  implements WebGLUniformLocation {
+  protected JsWebGLUniformLocation() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebGLVertexArrayObjectOES.java b/elemental/src/elemental/js/html/JsWebGLVertexArrayObjectOES.java
new file mode 100644
index 0000000..f13445e
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebGLVertexArrayObjectOES.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WebGLVertexArrayObjectOES;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebGLVertexArrayObjectOES extends JsElementalMixinBase  implements WebGLVertexArrayObjectOES {
+  protected JsWebGLVertexArrayObjectOES() {}
+}
diff --git a/elemental/src/elemental/js/html/JsWebSocket.java b/elemental/src/elemental/js/html/JsWebSocket.java
new file mode 100644
index 0000000..4c42916
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWebSocket.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.events.EventListener;
+import elemental.html.WebSocket;
+import elemental.js.events.JsEvent;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWebSocket extends JsElementalMixinBase  implements WebSocket {
+  protected JsWebSocket() {}
+
+  public final native String getURL() /*-{
+    return this.URL;
+  }-*/;
+
+  public final native String getBinaryType() /*-{
+    return this.binaryType;
+  }-*/;
+
+  public final native void setBinaryType(String param_binaryType) /*-{
+    this.binaryType = param_binaryType;
+  }-*/;
+
+  public final native int getBufferedAmount() /*-{
+    return this.bufferedAmount;
+  }-*/;
+
+  public final native String getExtensions() /*-{
+    return this.extensions;
+  }-*/;
+
+  public final native EventListener getOnclose() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onclose);
+  }-*/;
+
+  public final native void setOnclose(EventListener listener) /*-{
+    this.onclose = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmessage);
+  }-*/;
+
+  public final native void setOnmessage(EventListener listener) /*-{
+    this.onmessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnopen() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onopen);
+  }-*/;
+
+  public final native void setOnopen(EventListener listener) /*-{
+    this.onopen = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native String getProtocol() /*-{
+    return this.protocol;
+  }-*/;
+
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native String getUrl() /*-{
+    return this.url;
+  }-*/;
+
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+
+  public final native void close(int code) /*-{
+    this.close(code);
+  }-*/;
+
+  public final native void close(int code, String reason) /*-{
+    this.close(code, reason);
+  }-*/;
+
+  public final native boolean send(String data) /*-{
+    return this.send(data);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWindow.java b/elemental/src/elemental/js/html/JsWindow.java
new file mode 100644
index 0000000..db96df1
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWindow.java
@@ -0,0 +1,1128 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.FileSystemCallback;
+import elemental.js.dom.JsDocument;
+import elemental.html.BarProp;
+import elemental.html.Screen;
+import elemental.js.dom.JsNode;
+import elemental.html.Point;
+import elemental.dom.TimeoutHandler;
+import elemental.html.Database;
+import elemental.html.History;
+import elemental.js.events.JsEventListener;
+import elemental.dom.Document;
+import elemental.dom.Node;
+import elemental.html.NotificationCenter;
+import elemental.html.Console;
+import elemental.css.CSSRuleList;
+import elemental.html.DatabaseCallback;
+import elemental.dom.RequestAnimationFrameCallback;
+import elemental.html.Location;
+import elemental.html.StyleMedia;
+import elemental.html.ErrorCallback;
+import elemental.html.Selection;
+import elemental.html.MediaQueryList;
+import elemental.dom.Element;
+import elemental.js.util.JsIndexable;
+import elemental.html.Storage;
+import elemental.html.EntryCallback;
+import elemental.util.Indexable;
+import elemental.html.StorageInfo;
+import elemental.html.Navigator;
+import elemental.html.PagePopupController;
+import elemental.events.Event;
+import elemental.js.dom.JsElement;
+import elemental.html.ApplicationCache;
+import elemental.js.css.JsCSSStyleDeclaration;
+import elemental.html.Crypto;
+import elemental.js.events.JsEvent;
+import elemental.html.Performance;
+import elemental.events.EventListener;
+import elemental.js.css.JsCSSRuleList;
+import elemental.html.IDBFactory;
+import elemental.html.Window;
+import elemental.css.CSSStyleDeclaration;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+import elemental.xpath.*;
+import elemental.xml.*;
+import elemental.js.xpath.*;
+import elemental.js.xml.*;
+
+import java.util.Date;
+
+public class JsWindow extends JsElementalMixinBase  implements Window {
+  protected JsWindow() {}
+
+  public final native void clearOpener() /*-{
+    this.opener = null;
+  }-*/;
+
+
+  public final native JsApplicationCache getApplicationCache() /*-{
+    return this.applicationCache;
+  }-*/;
+
+  public final native JsNavigator getClientInformation() /*-{
+    return this.clientInformation;
+  }-*/;
+
+  public final native boolean isClosed() /*-{
+    return this.closed;
+  }-*/;
+
+  public final native JsConsole getConsole() /*-{
+    return this.console;
+  }-*/;
+
+  public final native JsCrypto getCrypto() /*-{
+    return this.crypto;
+  }-*/;
+
+  public final native String getDefaultStatus() /*-{
+    return this.defaultStatus;
+  }-*/;
+
+  public final native void setDefaultStatus(String param_defaultStatus) /*-{
+    this.defaultStatus = param_defaultStatus;
+  }-*/;
+
+  public final native String getDefaultstatus() /*-{
+    return this.defaultstatus;
+  }-*/;
+
+  public final native void setDefaultstatus(String param_defaultstatus) /*-{
+    this.defaultstatus = param_defaultstatus;
+  }-*/;
+
+  public final native double getDevicePixelRatio() /*-{
+    return this.devicePixelRatio;
+  }-*/;
+
+  public final native JsDocument getDocument() /*-{
+    return this.document;
+  }-*/;
+
+  public final native JsEvent getEvent() /*-{
+    return this.event;
+  }-*/;
+
+  public final native JsElement getFrameElement() /*-{
+    return this.frameElement;
+  }-*/;
+
+  public final native JsWindow getFrames() /*-{
+    return this.frames;
+  }-*/;
+
+  public final native JsHistory getHistory() /*-{
+    return this.history;
+  }-*/;
+
+  public final native int getInnerHeight() /*-{
+    return this.innerHeight;
+  }-*/;
+
+  public final native int getInnerWidth() /*-{
+    return this.innerWidth;
+  }-*/;
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsStorage getLocalStorage() /*-{
+    return this.localStorage;
+  }-*/;
+
+  public final native JsLocation getLocation() /*-{
+    return this.location;
+  }-*/;
+
+  public final native void setLocation(Location param_location) /*-{
+    this.location = param_location;
+  }-*/;
+
+  public final native JsBarProp getLocationbar() /*-{
+    return this.locationbar;
+  }-*/;
+
+  public final native JsBarProp getMenubar() /*-{
+    return this.menubar;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+
+  public final native void setName(String param_name) /*-{
+    this.name = param_name;
+  }-*/;
+
+  public final native JsNavigator getNavigator() /*-{
+    return this.navigator;
+  }-*/;
+
+  public final native boolean isOffscreenBuffering() /*-{
+    return this.offscreenBuffering;
+  }-*/;
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforeunload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforeunload);
+  }-*/;
+
+  public final native void setOnbeforeunload(EventListener listener) /*-{
+    this.onbeforeunload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnblur() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onblur);
+  }-*/;
+
+  public final native void setOnblur(EventListener listener) /*-{
+    this.onblur = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncanplay() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncanplay);
+  }-*/;
+
+  public final native void setOncanplay(EventListener listener) /*-{
+    this.oncanplay = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncanplaythrough() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncanplaythrough);
+  }-*/;
+
+  public final native void setOncanplaythrough(EventListener listener) /*-{
+    this.oncanplaythrough = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onchange);
+  }-*/;
+
+  public final native void setOnchange(EventListener listener) /*-{
+    this.onchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnclick() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onclick);
+  }-*/;
+
+  public final native void setOnclick(EventListener listener) /*-{
+    this.onclick = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncontextmenu() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncontextmenu);
+  }-*/;
+
+  public final native void setOncontextmenu(EventListener listener) /*-{
+    this.oncontextmenu = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndblclick() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondblclick);
+  }-*/;
+
+  public final native void setOndblclick(EventListener listener) /*-{
+    this.ondblclick = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndevicemotion() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondevicemotion);
+  }-*/;
+
+  public final native void setOndevicemotion(EventListener listener) /*-{
+    this.ondevicemotion = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndeviceorientation() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondeviceorientation);
+  }-*/;
+
+  public final native void setOndeviceorientation(EventListener listener) /*-{
+    this.ondeviceorientation = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndrag() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondrag);
+  }-*/;
+
+  public final native void setOndrag(EventListener listener) /*-{
+    this.ondrag = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragend);
+  }-*/;
+
+  public final native void setOndragend(EventListener listener) /*-{
+    this.ondragend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragenter() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragenter);
+  }-*/;
+
+  public final native void setOndragenter(EventListener listener) /*-{
+    this.ondragenter = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragleave() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragleave);
+  }-*/;
+
+  public final native void setOndragleave(EventListener listener) /*-{
+    this.ondragleave = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragover() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragover);
+  }-*/;
+
+  public final native void setOndragover(EventListener listener) /*-{
+    this.ondragover = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragstart);
+  }-*/;
+
+  public final native void setOndragstart(EventListener listener) /*-{
+    this.ondragstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndrop() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondrop);
+  }-*/;
+
+  public final native void setOndrop(EventListener listener) /*-{
+    this.ondrop = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndurationchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondurationchange);
+  }-*/;
+
+  public final native void setOndurationchange(EventListener listener) /*-{
+    this.ondurationchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnemptied() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onemptied);
+  }-*/;
+
+  public final native void setOnemptied(EventListener listener) /*-{
+    this.onemptied = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnended() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onended);
+  }-*/;
+
+  public final native void setOnended(EventListener listener) /*-{
+    this.onended = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnfocus() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onfocus);
+  }-*/;
+
+  public final native void setOnfocus(EventListener listener) /*-{
+    this.onfocus = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnhashchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onhashchange);
+  }-*/;
+
+  public final native void setOnhashchange(EventListener listener) /*-{
+    this.onhashchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOninput() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oninput);
+  }-*/;
+
+  public final native void setOninput(EventListener listener) /*-{
+    this.oninput = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOninvalid() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oninvalid);
+  }-*/;
+
+  public final native void setOninvalid(EventListener listener) /*-{
+    this.oninvalid = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeydown() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeydown);
+  }-*/;
+
+  public final native void setOnkeydown(EventListener listener) /*-{
+    this.onkeydown = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeypress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeypress);
+  }-*/;
+
+  public final native void setOnkeypress(EventListener listener) /*-{
+    this.onkeypress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeyup() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeyup);
+  }-*/;
+
+  public final native void setOnkeyup(EventListener listener) /*-{
+    this.onkeyup = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onload);
+  }-*/;
+
+  public final native void setOnload(EventListener listener) /*-{
+    this.onload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnloadeddata() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onloadeddata);
+  }-*/;
+
+  public final native void setOnloadeddata(EventListener listener) /*-{
+    this.onloadeddata = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnloadedmetadata() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onloadedmetadata);
+  }-*/;
+
+  public final native void setOnloadedmetadata(EventListener listener) /*-{
+    this.onloadedmetadata = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnloadstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onloadstart);
+  }-*/;
+
+  public final native void setOnloadstart(EventListener listener) /*-{
+    this.onloadstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmessage);
+  }-*/;
+
+  public final native void setOnmessage(EventListener listener) /*-{
+    this.onmessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousedown() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousedown);
+  }-*/;
+
+  public final native void setOnmousedown(EventListener listener) /*-{
+    this.onmousedown = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousemove() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousemove);
+  }-*/;
+
+  public final native void setOnmousemove(EventListener listener) /*-{
+    this.onmousemove = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseout() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseout);
+  }-*/;
+
+  public final native void setOnmouseout(EventListener listener) /*-{
+    this.onmouseout = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseover() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseover);
+  }-*/;
+
+  public final native void setOnmouseover(EventListener listener) /*-{
+    this.onmouseover = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseup() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseup);
+  }-*/;
+
+  public final native void setOnmouseup(EventListener listener) /*-{
+    this.onmouseup = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousewheel() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousewheel);
+  }-*/;
+
+  public final native void setOnmousewheel(EventListener listener) /*-{
+    this.onmousewheel = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnoffline() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onoffline);
+  }-*/;
+
+  public final native void setOnoffline(EventListener listener) /*-{
+    this.onoffline = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnonline() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ononline);
+  }-*/;
+
+  public final native void setOnonline(EventListener listener) /*-{
+    this.ononline = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnpagehide() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onpagehide);
+  }-*/;
+
+  public final native void setOnpagehide(EventListener listener) /*-{
+    this.onpagehide = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnpageshow() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onpageshow);
+  }-*/;
+
+  public final native void setOnpageshow(EventListener listener) /*-{
+    this.onpageshow = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnpause() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onpause);
+  }-*/;
+
+  public final native void setOnpause(EventListener listener) /*-{
+    this.onpause = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnplay() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onplay);
+  }-*/;
+
+  public final native void setOnplay(EventListener listener) /*-{
+    this.onplay = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnplaying() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onplaying);
+  }-*/;
+
+  public final native void setOnplaying(EventListener listener) /*-{
+    this.onplaying = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnpopstate() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onpopstate);
+  }-*/;
+
+  public final native void setOnpopstate(EventListener listener) /*-{
+    this.onpopstate = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnprogress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onprogress);
+  }-*/;
+
+  public final native void setOnprogress(EventListener listener) /*-{
+    this.onprogress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnratechange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onratechange);
+  }-*/;
+
+  public final native void setOnratechange(EventListener listener) /*-{
+    this.onratechange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnreset() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onreset);
+  }-*/;
+
+  public final native void setOnreset(EventListener listener) /*-{
+    this.onreset = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnresize() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onresize);
+  }-*/;
+
+  public final native void setOnresize(EventListener listener) /*-{
+    this.onresize = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnscroll() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onscroll);
+  }-*/;
+
+  public final native void setOnscroll(EventListener listener) /*-{
+    this.onscroll = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsearch() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsearch);
+  }-*/;
+
+  public final native void setOnsearch(EventListener listener) /*-{
+    this.onsearch = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnseeked() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onseeked);
+  }-*/;
+
+  public final native void setOnseeked(EventListener listener) /*-{
+    this.onseeked = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnseeking() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onseeking);
+  }-*/;
+
+  public final native void setOnseeking(EventListener listener) /*-{
+    this.onseeking = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnselect() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onselect);
+  }-*/;
+
+  public final native void setOnselect(EventListener listener) /*-{
+    this.onselect = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnstalled() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onstalled);
+  }-*/;
+
+  public final native void setOnstalled(EventListener listener) /*-{
+    this.onstalled = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnstorage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onstorage);
+  }-*/;
+
+  public final native void setOnstorage(EventListener listener) /*-{
+    this.onstorage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsubmit() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsubmit);
+  }-*/;
+
+  public final native void setOnsubmit(EventListener listener) /*-{
+    this.onsubmit = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsuspend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsuspend);
+  }-*/;
+
+  public final native void setOnsuspend(EventListener listener) /*-{
+    this.onsuspend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntimeupdate() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontimeupdate);
+  }-*/;
+
+  public final native void setOntimeupdate(EventListener listener) /*-{
+    this.ontimeupdate = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchcancel() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchcancel);
+  }-*/;
+
+  public final native void setOntouchcancel(EventListener listener) /*-{
+    this.ontouchcancel = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchend);
+  }-*/;
+
+  public final native void setOntouchend(EventListener listener) /*-{
+    this.ontouchend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchmove() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchmove);
+  }-*/;
+
+  public final native void setOntouchmove(EventListener listener) /*-{
+    this.ontouchmove = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOntouchstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ontouchstart);
+  }-*/;
+
+  public final native void setOntouchstart(EventListener listener) /*-{
+    this.ontouchstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnunload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onunload);
+  }-*/;
+
+  public final native void setOnunload(EventListener listener) /*-{
+    this.onunload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnvolumechange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onvolumechange);
+  }-*/;
+
+  public final native void setOnvolumechange(EventListener listener) /*-{
+    this.onvolumechange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwaiting() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwaiting);
+  }-*/;
+
+  public final native void setOnwaiting(EventListener listener) /*-{
+    this.onwaiting = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitanimationend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitanimationend);
+  }-*/;
+
+  public final native void setOnwebkitanimationend(EventListener listener) /*-{
+    this.onwebkitanimationend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitanimationiteration() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitanimationiteration);
+  }-*/;
+
+  public final native void setOnwebkitanimationiteration(EventListener listener) /*-{
+    this.onwebkitanimationiteration = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkitanimationstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkitanimationstart);
+  }-*/;
+
+  public final native void setOnwebkitanimationstart(EventListener listener) /*-{
+    this.onwebkitanimationstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnwebkittransitionend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onwebkittransitionend);
+  }-*/;
+
+  public final native void setOnwebkittransitionend(EventListener listener) /*-{
+    this.onwebkittransitionend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native JsWindow getOpener() /*-{
+    return this.opener;
+  }-*/;
+
+  public final native int getOuterHeight() /*-{
+    return this.outerHeight;
+  }-*/;
+
+  public final native int getOuterWidth() /*-{
+    return this.outerWidth;
+  }-*/;
+
+  public final native JsPagePopupController getPagePopupController() /*-{
+    return this.pagePopupController;
+  }-*/;
+
+  public final native int getPageXOffset() /*-{
+    return this.pageXOffset;
+  }-*/;
+
+  public final native int getPageYOffset() /*-{
+    return this.pageYOffset;
+  }-*/;
+
+  public final native JsWindow getParent() /*-{
+    return this.parent;
+  }-*/;
+
+  public final native JsPerformance getPerformance() /*-{
+    return this.performance;
+  }-*/;
+
+  public final native JsBarProp getPersonalbar() /*-{
+    return this.personalbar;
+  }-*/;
+
+  public final native JsScreen getScreen() /*-{
+    return this.screen;
+  }-*/;
+
+  public final native int getScreenLeft() /*-{
+    return this.screenLeft;
+  }-*/;
+
+  public final native int getScreenTop() /*-{
+    return this.screenTop;
+  }-*/;
+
+  public final native int getScreenX() /*-{
+    return this.screenX;
+  }-*/;
+
+  public final native int getScreenY() /*-{
+    return this.screenY;
+  }-*/;
+
+  public final native int getScrollX() /*-{
+    return this.scrollX;
+  }-*/;
+
+  public final native int getScrollY() /*-{
+    return this.scrollY;
+  }-*/;
+
+  public final native JsBarProp getScrollbars() /*-{
+    return this.scrollbars;
+  }-*/;
+
+  public final native JsWindow getSelf() /*-{
+    return this.self;
+  }-*/;
+
+  public final native JsStorage getSessionStorage() /*-{
+    return this.sessionStorage;
+  }-*/;
+
+  public final native String getStatus() /*-{
+    return this.status;
+  }-*/;
+
+  public final native void setStatus(String param_status) /*-{
+    this.status = param_status;
+  }-*/;
+
+  public final native JsBarProp getStatusbar() /*-{
+    return this.statusbar;
+  }-*/;
+
+  public final native JsStyleMedia getStyleMedia() /*-{
+    return this.styleMedia;
+  }-*/;
+
+  public final native JsBarProp getToolbar() /*-{
+    return this.toolbar;
+  }-*/;
+
+  public final native JsWindow getTop() /*-{
+    return this.top;
+  }-*/;
+
+  public final native JsIDBFactory getWebkitIndexedDB() /*-{
+    return this.webkitIndexedDB;
+  }-*/;
+
+  public final native JsNotificationCenter getWebkitNotifications() /*-{
+    return this.webkitNotifications;
+  }-*/;
+
+  public final native JsStorageInfo getWebkitStorageInfo() /*-{
+    return this.webkitStorageInfo;
+  }-*/;
+
+  public final native JsWindow getWindow() /*-{
+    return this.window;
+  }-*/;
+
+  public final native void alert(String message) /*-{
+    this.alert(message);
+  }-*/;
+
+  public final native String atob(String string) /*-{
+    return this.atob(string);
+  }-*/;
+
+  public final native void blur() /*-{
+    this.blur();
+  }-*/;
+
+  public final native String btoa(String string) /*-{
+    return this.btoa(string);
+  }-*/;
+
+  public final native void captureEvents() /*-{
+    this.captureEvents();
+  }-*/;
+
+  public final native void clearInterval(int handle) /*-{
+    this.clearInterval(handle);
+  }-*/;
+
+  public final native void clearTimeout(int handle) /*-{
+    this.clearTimeout(handle);
+  }-*/;
+
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+
+  public final native boolean confirm(String message) /*-{
+    return this.confirm(message);
+  }-*/;
+
+  public final native boolean find(String string, boolean caseSensitive, boolean backwards, boolean wrap, boolean wholeWord, boolean searchInFrames, boolean showDialog) /*-{
+    return this.find(string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
+  }-*/;
+
+  public final native void focus() /*-{
+    this.focus();
+  }-*/;
+
+  public final native JsCSSStyleDeclaration getComputedStyle(Element element, String pseudoElement) /*-{
+    return this.getComputedStyle(element, pseudoElement);
+  }-*/;
+
+  public final native JsCSSRuleList getMatchedCSSRules(Element element, String pseudoElement) /*-{
+    return this.getMatchedCSSRules(element, pseudoElement);
+  }-*/;
+
+  public final native JsSelection getSelection() /*-{
+    return this.getSelection();
+  }-*/;
+
+  public final native JsMediaQueryList matchMedia(String query) /*-{
+    return this.matchMedia(query);
+  }-*/;
+
+  public final native void moveBy(float x, float y) /*-{
+    this.moveBy(x, y);
+  }-*/;
+
+  public final native void moveTo(float x, float y) /*-{
+    this.moveTo(x, y);
+  }-*/;
+
+  public final native JsWindow open(String url, String name) /*-{
+    return this.open(url, name);
+  }-*/;
+
+  public final native JsWindow open(String url, String name, String options) /*-{
+    return this.open(url, name, options);
+  }-*/;
+
+  public final native JsDatabase openDatabase(String name, String version, String displayName, int estimatedSize, DatabaseCallback creationCallback) /*-{
+    return this.openDatabase(name, version, displayName, estimatedSize, $entry(creationCallback.@elemental.html.DatabaseCallback::onDatabaseCallback(Ljava/lang/Object;)).bind(creationCallback));
+  }-*/;
+
+  public final native JsDatabase openDatabase(String name, String version, String displayName, int estimatedSize) /*-{
+    return this.openDatabase(name, version, displayName, estimatedSize);
+  }-*/;
+
+  public final native void postMessage(Object message, String targetOrigin) /*-{
+    this.postMessage(message, targetOrigin);
+  }-*/;
+
+  public final native void postMessage(Object message, String targetOrigin, Indexable messagePorts) /*-{
+    this.postMessage(message, targetOrigin, messagePorts);
+  }-*/;
+
+  public final native void print() /*-{
+    this.print();
+  }-*/;
+
+  public final native String prompt(String message, String defaultValue) /*-{
+    return this.prompt(message, defaultValue);
+  }-*/;
+
+  public final native void releaseEvents() /*-{
+    this.releaseEvents();
+  }-*/;
+
+  public final native void resizeBy(float x, float y) /*-{
+    this.resizeBy(x, y);
+  }-*/;
+
+  public final native void resizeTo(float width, float height) /*-{
+    this.resizeTo(width, height);
+  }-*/;
+
+  public final native void scroll(int x, int y) /*-{
+    this.scroll(x, y);
+  }-*/;
+
+  public final native void scrollBy(int x, int y) /*-{
+    this.scrollBy(x, y);
+  }-*/;
+
+  public final native void scrollTo(int x, int y) /*-{
+    this.scrollTo(x, y);
+  }-*/;
+
+  public final native int setInterval(TimeoutHandler handler, int timeout) /*-{
+    return this.setInterval($entry(handler.@elemental.dom.TimeoutHandler::onTimeoutHandler()).bind(handler), timeout);
+  }-*/;
+
+  public final native int setTimeout(TimeoutHandler handler, int timeout) /*-{
+    return this.setTimeout($entry(handler.@elemental.dom.TimeoutHandler::onTimeoutHandler()).bind(handler), timeout);
+  }-*/;
+
+  public final native Object showModalDialog(String url) /*-{
+    return this.showModalDialog(url);
+  }-*/;
+
+  public final native Object showModalDialog(String url, Object dialogArgs) /*-{
+    return this.showModalDialog(url, dialogArgs);
+  }-*/;
+
+  public final native Object showModalDialog(String url, Object dialogArgs, String featureArgs) /*-{
+    return this.showModalDialog(url, dialogArgs, featureArgs);
+  }-*/;
+
+  public final native void stop() /*-{
+    this.stop();
+  }-*/;
+
+  public final native void webkitCancelAnimationFrame(int id) /*-{
+    this.webkitCancelAnimationFrame(id);
+  }-*/;
+
+  public final native void webkitCancelRequestAnimationFrame(int id) /*-{
+    this.webkitCancelRequestAnimationFrame(id);
+  }-*/;
+
+  public final native JsPoint webkitConvertPointFromNodeToPage(Node node, Point p) /*-{
+    return this.webkitConvertPointFromNodeToPage(node, p);
+  }-*/;
+
+  public final native JsPoint webkitConvertPointFromPageToNode(Node node, Point p) /*-{
+    return this.webkitConvertPointFromPageToNode(node, p);
+  }-*/;
+
+  public final native void webkitPostMessage(Object message, String targetOrigin) /*-{
+    this.webkitPostMessage(message, targetOrigin);
+  }-*/;
+
+  public final native void webkitPostMessage(Object message, String targetOrigin, Indexable transferList) /*-{
+    this.webkitPostMessage(message, targetOrigin, transferList);
+  }-*/;
+
+  public final native int webkitRequestAnimationFrame(RequestAnimationFrameCallback callback) /*-{
+    return this.webkitRequestAnimationFrame($entry(callback.@elemental.dom.RequestAnimationFrameCallback::onRequestAnimationFrameCallback(D)).bind(callback));
+  }-*/;
+
+  public final native void webkitRequestFileSystem(int type, double size, FileSystemCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.webkitRequestFileSystem(type, size, $entry(successCallback.@elemental.html.FileSystemCallback::onFileSystemCallback(Lelemental/html/DOMFileSystem;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void webkitRequestFileSystem(int type, double size, FileSystemCallback successCallback) /*-{
+    this.webkitRequestFileSystem(type, size, $entry(successCallback.@elemental.html.FileSystemCallback::onFileSystemCallback(Lelemental/html/DOMFileSystem;)).bind(successCallback));
+  }-*/;
+
+  public final native void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback) /*-{
+    this.webkitResolveLocalFileSystemURL(url, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback));
+  }-*/;
+
+  public final native void webkitResolveLocalFileSystemURL(String url) /*-{
+    this.webkitResolveLocalFileSystemURL(url);
+  }-*/;
+
+  public final native void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.webkitResolveLocalFileSystemURL(url, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native JsAudioElement newAudioElement(String src) /*-{ return new AudioElement(src); }-*/;
+
+  public final native JsCSSMatrix newCSSMatrix(String cssValue) /*-{ return new CSSMatrix(cssValue); }-*/;
+
+  public final native JsDOMParser newDOMParser() /*-{ return new DOMParser(); }-*/;
+
+  public final native JsDOMURL newDOMURL() /*-{ return new DOMURL(); }-*/;
+
+  public final native JsDeprecatedPeerConnection newDeprecatedPeerConnection(String serverConfiguration, SignalingCallback signalingCallback) /*-{ return new DeprecatedPeerConnection(serverConfiguration, $entry(signalingCallback.@elemental.html.SignalingCallback::onSignalingCallback(Ljava/lang/String;Lelemental/html/DeprecatedPeerConnection;)).bind(signalingCallback)); }-*/;
+
+  public final native JsEventSource newEventSource(String scriptUrl) /*-{ return new EventSource(scriptUrl); }-*/;
+
+  public final native JsFileReader newFileReader() /*-{ return new FileReader(); }-*/;
+
+  public final native JsFileReaderSync newFileReaderSync() /*-{ return new FileReaderSync(); }-*/;
+
+  public final native JsFloat32Array newFloat32Array(int length) /*-{ return new Float32Array(length); }-*/;
+
+  public final native JsFloat32Array newFloat32Array(IndexableNumber list) /*-{ return new Float32Array(list); }-*/;
+
+  public final native JsFloat32Array newFloat32Array(ArrayBuffer buffer, int byteOffset, int length) /*-{ return new Float32Array(buffer, byteOffset, length); }-*/;
+
+  public final native JsFloat64Array newFloat64Array(int length) /*-{ return new Float64Array(length); }-*/;
+
+  public final native JsFloat64Array newFloat64Array(IndexableNumber list) /*-{ return new Float64Array(list); }-*/;
+
+  public final native JsFloat64Array newFloat64Array(ArrayBuffer buffer, int byteOffset, int length) /*-{ return new Float64Array(buffer, byteOffset, length); }-*/;
+
+  public final native JsIceCandidate newIceCandidate(String label, String candidateLine) /*-{ return new IceCandidate(label, candidateLine); }-*/;
+
+  public final native JsInt16Array newInt16Array(int length) /*-{ return new Int16Array(length); }-*/;
+
+  public final native JsInt16Array newInt16Array(IndexableNumber list) /*-{ return new Int16Array(list); }-*/;
+
+  public final native JsInt16Array newInt16Array(ArrayBuffer buffer, int byteOffset, int length) /*-{ return new Int16Array(buffer, byteOffset, length); }-*/;
+
+  public final native JsInt32Array newInt32Array(int length) /*-{ return new Int32Array(length); }-*/;
+
+  public final native JsInt32Array newInt32Array(IndexableNumber list) /*-{ return new Int32Array(list); }-*/;
+
+  public final native JsInt32Array newInt32Array(ArrayBuffer buffer, int byteOffset, int length) /*-{ return new Int32Array(buffer, byteOffset, length); }-*/;
+
+  public final native JsInt8Array newInt8Array(int length) /*-{ return new Int8Array(length); }-*/;
+
+  public final native JsInt8Array newInt8Array(IndexableNumber list) /*-{ return new Int8Array(list); }-*/;
+
+  public final native JsInt8Array newInt8Array(ArrayBuffer buffer, int byteOffset, int length) /*-{ return new Int8Array(buffer, byteOffset, length); }-*/;
+
+  public final native JsMediaController newMediaController() /*-{ return new MediaController(); }-*/;
+
+  public final native JsMediaStream newMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) /*-{ return new MediaStream(audioTracks, videoTracks); }-*/;
+
+  public final native JsMessageChannel newMessageChannel() /*-{ return new MessageChannel(); }-*/;
+
+  public final native JsNotification newNotification(String title, Mappable options) /*-{ return new Notification(title, options); }-*/;
+
+  public final native JsOptionElement newOptionElement(String data, String value, boolean defaultSelected, boolean selected) /*-{ return new OptionElement(data, value, defaultSelected, selected); }-*/;
+
+  public final native JsPeerConnection00 newPeerConnection00(String serverConfiguration, IceCallback iceCallback) /*-{ return new PeerConnection00(serverConfiguration, $entry(iceCallback.@elemental.html.IceCallback::onIceCallback(Lelemental/html/IceCandidate;ZLelemental/html/PeerConnection00;)).bind(iceCallback)); }-*/;
+
+  public final native JsSessionDescription newSessionDescription(String sdp) /*-{ return new SessionDescription(sdp); }-*/;
+
+  public final native JsShadowRoot newShadowRoot(Element host) /*-{ return new ShadowRoot(host); }-*/;
+
+  public final native JsSharedWorker newSharedWorker(String scriptURL, String name) /*-{ return new SharedWorker(scriptURL, name); }-*/;
+
+  public final native JsSpeechGrammar newSpeechGrammar() /*-{ return new SpeechGrammar(); }-*/;
+
+  public final native JsSpeechGrammarList newSpeechGrammarList() /*-{ return new SpeechGrammarList(); }-*/;
+
+  public final native JsSpeechRecognition newSpeechRecognition() /*-{ return new SpeechRecognition(); }-*/;
+
+  public final native JsTextTrackCue newTextTrackCue(String id, double startTime, double endTime, String text, String settings, boolean pauseOnExit) /*-{ return new TextTrackCue(id, startTime, endTime, text, settings, pauseOnExit); }-*/;
+
+  public final native JsUint16Array newUint16Array(int length) /*-{ return new Uint16Array(length); }-*/;
+
+  public final native JsUint16Array newUint16Array(IndexableNumber list) /*-{ return new Uint16Array(list); }-*/;
+
+  public final native JsUint16Array newUint16Array(ArrayBuffer buffer, int byteOffset, int length) /*-{ return new Uint16Array(buffer, byteOffset, length); }-*/;
+
+  public final native JsUint32Array newUint32Array(int length) /*-{ return new Uint32Array(length); }-*/;
+
+  public final native JsUint32Array newUint32Array(IndexableNumber list) /*-{ return new Uint32Array(list); }-*/;
+
+  public final native JsUint32Array newUint32Array(ArrayBuffer buffer, int byteOffset, int length) /*-{ return new Uint32Array(buffer, byteOffset, length); }-*/;
+
+  public final native JsUint8Array newUint8Array(int length) /*-{ return new Uint8Array(length); }-*/;
+
+  public final native JsUint8Array newUint8Array(IndexableNumber list) /*-{ return new Uint8Array(list); }-*/;
+
+  public final native JsUint8Array newUint8Array(ArrayBuffer buffer, int byteOffset, int length) /*-{ return new Uint8Array(buffer, byteOffset, length); }-*/;
+
+  public final native JsUint8ClampedArray newUint8ClampedArray(int length) /*-{ return new Uint8ClampedArray(length); }-*/;
+
+  public final native JsUint8ClampedArray newUint8ClampedArray(IndexableNumber list) /*-{ return new Uint8ClampedArray(list); }-*/;
+
+  public final native JsUint8ClampedArray newUint8ClampedArray(ArrayBuffer buffer, int byteOffset, int length) /*-{ return new Uint8ClampedArray(buffer, byteOffset, length); }-*/;
+
+  public final native JsWorker newWorker(String scriptUrl) /*-{ return new Worker(scriptUrl); }-*/;
+
+  public final native JsXMLHttpRequest newXMLHttpRequest() /*-{ return new XMLHttpRequest(); }-*/;
+
+  public final native JsXMLSerializer newXMLSerializer() /*-{ return new XMLSerializer(); }-*/;
+
+  public final native JsXPathEvaluator newXPathEvaluator() /*-{ return new XPathEvaluator(); }-*/;
+
+  public final native JsXSLTProcessor newXSLTProcessor() /*-{ return new XSLTProcessor(); }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWorker.java b/elemental/src/elemental/js/html/JsWorker.java
new file mode 100644
index 0000000..5f6b00f
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWorker.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.util.Indexable;
+import elemental.html.Worker;
+import elemental.html.AbstractWorker;
+import elemental.js.util.JsIndexable;
+import elemental.events.EventListener;
+import elemental.js.events.JsEventListener;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWorker extends JsAbstractWorker  implements Worker {
+  protected JsWorker() {}
+
+  public final native EventListener getOnmessage() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmessage);
+  }-*/;
+
+  public final native void setOnmessage(EventListener listener) /*-{
+    this.onmessage = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native void postMessage(Object message) /*-{
+    this.postMessage(message);
+  }-*/;
+
+  public final native void postMessage(Object message, Indexable messagePorts) /*-{
+    this.postMessage(message, messagePorts);
+  }-*/;
+
+  public final native void terminate() /*-{
+    this.terminate();
+  }-*/;
+
+  public final native void webkitPostMessage(Object message) /*-{
+    this.webkitPostMessage(message);
+  }-*/;
+
+  public final native void webkitPostMessage(Object message, Indexable messagePorts) /*-{
+    this.webkitPostMessage(message, messagePorts);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWorkerGlobalScope.java b/elemental/src/elemental/js/html/JsWorkerGlobalScope.java
new file mode 100644
index 0000000..02fd42e
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWorkerGlobalScope.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.DatabaseSync;
+import elemental.html.FileSystemCallback;
+import elemental.html.WorkerLocation;
+import elemental.dom.TimeoutHandler;
+import elemental.html.NotificationCenter;
+import elemental.html.WorkerGlobalScope;
+import elemental.html.EntryCallback;
+import elemental.html.WorkerNavigator;
+import elemental.html.EntrySync;
+import elemental.html.DOMFileSystemSync;
+import elemental.js.events.JsEvent;
+import elemental.html.DatabaseCallback;
+import elemental.events.EventListener;
+import elemental.html.ErrorCallback;
+import elemental.html.IDBFactory;
+import elemental.html.Database;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWorkerGlobalScope extends JsElementalMixinBase  implements WorkerGlobalScope {
+  protected JsWorkerGlobalScope() {}
+
+  public final native JsWorkerLocation getLocation() /*-{
+    return this.location;
+  }-*/;
+
+  public final native JsWorkerNavigator getNavigator() /*-{
+    return this.navigator;
+  }-*/;
+
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native JsWorkerGlobalScope getSelf() /*-{
+    return this.self;
+  }-*/;
+
+  public final native JsIDBFactory getWebkitIndexedDB() /*-{
+    return this.webkitIndexedDB;
+  }-*/;
+
+  public final native JsNotificationCenter getWebkitNotifications() /*-{
+    return this.webkitNotifications;
+  }-*/;
+
+  public final native void clearInterval(int handle) /*-{
+    this.clearInterval(handle);
+  }-*/;
+
+  public final native void clearTimeout(int handle) /*-{
+    this.clearTimeout(handle);
+  }-*/;
+
+  public final native void close() /*-{
+    this.close();
+  }-*/;
+
+  public final native void importScripts() /*-{
+    this.importScripts();
+  }-*/;
+
+  public final native JsDatabase openDatabase(String name, String version, String displayName, int estimatedSize, DatabaseCallback creationCallback) /*-{
+    return this.openDatabase(name, version, displayName, estimatedSize, $entry(creationCallback.@elemental.html.DatabaseCallback::onDatabaseCallback(Ljava/lang/Object;)).bind(creationCallback));
+  }-*/;
+
+  public final native JsDatabase openDatabase(String name, String version, String displayName, int estimatedSize) /*-{
+    return this.openDatabase(name, version, displayName, estimatedSize);
+  }-*/;
+
+  public final native JsDatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, DatabaseCallback creationCallback) /*-{
+    return this.openDatabaseSync(name, version, displayName, estimatedSize, $entry(creationCallback.@elemental.html.DatabaseCallback::onDatabaseCallback(Ljava/lang/Object;)).bind(creationCallback));
+  }-*/;
+
+  public final native JsDatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize) /*-{
+    return this.openDatabaseSync(name, version, displayName, estimatedSize);
+  }-*/;
+
+  public final native int setInterval(TimeoutHandler handler, int timeout) /*-{
+    return this.setInterval($entry(handler.@elemental.dom.TimeoutHandler::onTimeoutHandler()).bind(handler), timeout);
+  }-*/;
+
+  public final native int setTimeout(TimeoutHandler handler, int timeout) /*-{
+    return this.setTimeout($entry(handler.@elemental.dom.TimeoutHandler::onTimeoutHandler()).bind(handler), timeout);
+  }-*/;
+
+  public final native void webkitRequestFileSystem(int type, double size, FileSystemCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.webkitRequestFileSystem(type, size, $entry(successCallback.@elemental.html.FileSystemCallback::onFileSystemCallback(Lelemental/html/DOMFileSystem;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+
+  public final native void webkitRequestFileSystem(int type, double size, FileSystemCallback successCallback) /*-{
+    this.webkitRequestFileSystem(type, size, $entry(successCallback.@elemental.html.FileSystemCallback::onFileSystemCallback(Lelemental/html/DOMFileSystem;)).bind(successCallback));
+  }-*/;
+
+  public final native void webkitRequestFileSystem(int type, double size) /*-{
+    this.webkitRequestFileSystem(type, size);
+  }-*/;
+
+  public final native JsDOMFileSystemSync webkitRequestFileSystemSync(int type, double size) /*-{
+    return this.webkitRequestFileSystemSync(type, size);
+  }-*/;
+
+  public final native JsEntrySync webkitResolveLocalFileSystemSyncURL(String url) /*-{
+    return this.webkitResolveLocalFileSystemSyncURL(url);
+  }-*/;
+
+  public final native void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback) /*-{
+    this.webkitResolveLocalFileSystemURL(url, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback));
+  }-*/;
+
+  public final native void webkitResolveLocalFileSystemURL(String url) /*-{
+    this.webkitResolveLocalFileSystemURL(url);
+  }-*/;
+
+  public final native void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, ErrorCallback errorCallback) /*-{
+    this.webkitResolveLocalFileSystemURL(url, $entry(successCallback.@elemental.html.EntryCallback::onEntryCallback(Lelemental/html/Entry;)).bind(successCallback), $entry(errorCallback.@elemental.html.ErrorCallback::onErrorCallback(Lelemental/html/FileError;)).bind(errorCallback));
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWorkerLocation.java b/elemental/src/elemental/js/html/JsWorkerLocation.java
new file mode 100644
index 0000000..15f7af0
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWorkerLocation.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WorkerLocation;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWorkerLocation extends JsElementalMixinBase  implements WorkerLocation {
+  protected JsWorkerLocation() {}
+
+  public final native String getHash() /*-{
+    return this.hash;
+  }-*/;
+
+  public final native String getHost() /*-{
+    return this.host;
+  }-*/;
+
+  public final native String getHostname() /*-{
+    return this.hostname;
+  }-*/;
+
+  public final native String getHref() /*-{
+    return this.href;
+  }-*/;
+
+  public final native String getPathname() /*-{
+    return this.pathname;
+  }-*/;
+
+  public final native String getPort() /*-{
+    return this.port;
+  }-*/;
+
+  public final native String getProtocol() /*-{
+    return this.protocol;
+  }-*/;
+
+  public final native String getSearch() /*-{
+    return this.search;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/html/JsWorkerNavigator.java b/elemental/src/elemental/js/html/JsWorkerNavigator.java
new file mode 100644
index 0000000..cf50de6
--- /dev/null
+++ b/elemental/src/elemental/js/html/JsWorkerNavigator.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.html;
+import elemental.html.WorkerNavigator;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsWorkerNavigator extends JsElementalMixinBase  implements WorkerNavigator {
+  protected JsWorkerNavigator() {}
+
+  public final native String getAppName() /*-{
+    return this.appName;
+  }-*/;
+
+  public final native String getAppVersion() /*-{
+    return this.appVersion;
+  }-*/;
+
+  public final native boolean isOnLine() /*-{
+    return this.onLine;
+  }-*/;
+
+  public final native String getPlatform() /*-{
+    return this.platform;
+  }-*/;
+
+  public final native String getUserAgent() /*-{
+    return this.userAgent;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/ranges/JsRange.java b/elemental/src/elemental/js/ranges/JsRange.java
new file mode 100644
index 0000000..c647c65
--- /dev/null
+++ b/elemental/src/elemental/js/ranges/JsRange.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.ranges;
+import elemental.dom.Node;
+import elemental.js.dom.JsDocumentFragment;
+import elemental.dom.DocumentFragment;
+import elemental.js.html.JsClientRect;
+import elemental.ranges.Range;
+import elemental.js.html.JsClientRectList;
+import elemental.html.ClientRect;
+import elemental.js.dom.JsNode;
+import elemental.html.ClientRectList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsRange extends JsElementalMixinBase  implements Range {
+  protected JsRange() {}
+
+  public final native boolean isCollapsed() /*-{
+    return this.collapsed;
+  }-*/;
+
+  public final native JsNode getCommonAncestorContainer() /*-{
+    return this.commonAncestorContainer;
+  }-*/;
+
+  public final native JsNode getEndContainer() /*-{
+    return this.endContainer;
+  }-*/;
+
+  public final native int getEndOffset() /*-{
+    return this.endOffset;
+  }-*/;
+
+  public final native JsNode getStartContainer() /*-{
+    return this.startContainer;
+  }-*/;
+
+  public final native int getStartOffset() /*-{
+    return this.startOffset;
+  }-*/;
+
+  public final native JsDocumentFragment cloneContents() /*-{
+    return this.cloneContents();
+  }-*/;
+
+  public final native JsRange cloneRange() /*-{
+    return this.cloneRange();
+  }-*/;
+
+  public final native void collapse(boolean toStart) /*-{
+    this.collapse(toStart);
+  }-*/;
+
+  public final native short compareNode(Node refNode) /*-{
+    return this.compareNode(refNode);
+  }-*/;
+
+  public final native short comparePoint(Node refNode, int offset) /*-{
+    return this.comparePoint(refNode, offset);
+  }-*/;
+
+  public final native JsDocumentFragment createContextualFragment(String html) /*-{
+    return this.createContextualFragment(html);
+  }-*/;
+
+  public final native void deleteContents() /*-{
+    this.deleteContents();
+  }-*/;
+
+  public final native void detach() /*-{
+    this.detach();
+  }-*/;
+
+  public final native void expand(String unit) /*-{
+    this.expand(unit);
+  }-*/;
+
+  public final native JsDocumentFragment extractContents() /*-{
+    return this.extractContents();
+  }-*/;
+
+  public final native JsClientRect getBoundingClientRect() /*-{
+    return this.getBoundingClientRect();
+  }-*/;
+
+  public final native JsClientRectList getClientRects() /*-{
+    return this.getClientRects();
+  }-*/;
+
+  public final native void insertNode(Node newNode) /*-{
+    this.insertNode(newNode);
+  }-*/;
+
+  public final native boolean intersectsNode(Node refNode) /*-{
+    return this.intersectsNode(refNode);
+  }-*/;
+
+  public final native boolean isPointInRange(Node refNode, int offset) /*-{
+    return this.isPointInRange(refNode, offset);
+  }-*/;
+
+  public final native void selectNode(Node refNode) /*-{
+    this.selectNode(refNode);
+  }-*/;
+
+  public final native void selectNodeContents(Node refNode) /*-{
+    this.selectNodeContents(refNode);
+  }-*/;
+
+  public final native void setEnd(Node refNode, int offset) /*-{
+    this.setEnd(refNode, offset);
+  }-*/;
+
+  public final native void setEndAfter(Node refNode) /*-{
+    this.setEndAfter(refNode);
+  }-*/;
+
+  public final native void setEndBefore(Node refNode) /*-{
+    this.setEndBefore(refNode);
+  }-*/;
+
+  public final native void setStart(Node refNode, int offset) /*-{
+    this.setStart(refNode, offset);
+  }-*/;
+
+  public final native void setStartAfter(Node refNode) /*-{
+    this.setStartAfter(refNode);
+  }-*/;
+
+  public final native void setStartBefore(Node refNode) /*-{
+    this.setStartBefore(refNode);
+  }-*/;
+
+  public final native void surroundContents(Node newParent) /*-{
+    this.surroundContents(newParent);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/ranges/JsRangeException.java b/elemental/src/elemental/js/ranges/JsRangeException.java
new file mode 100644
index 0000000..c66ffd6
--- /dev/null
+++ b/elemental/src/elemental/js/ranges/JsRangeException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.ranges;
+import elemental.ranges.RangeException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsRangeException extends JsElementalMixinBase  implements RangeException {
+  protected JsRangeException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/stylesheets/JsMediaList.java b/elemental/src/elemental/js/stylesheets/JsMediaList.java
new file mode 100644
index 0000000..7ef05b2
--- /dev/null
+++ b/elemental/src/elemental/js/stylesheets/JsMediaList.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.stylesheets;
+import elemental.stylesheets.MediaList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsMediaList extends JsIndexable  implements MediaList, Indexable {
+  protected JsMediaList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native String getMediaText() /*-{
+    return this.mediaText;
+  }-*/;
+
+  public final native void setMediaText(String param_mediaText) /*-{
+    this.mediaText = param_mediaText;
+  }-*/;
+
+  public final native void appendMedium(String newMedium) /*-{
+    this.appendMedium(newMedium);
+  }-*/;
+
+  public final native void deleteMedium(String oldMedium) /*-{
+    this.deleteMedium(oldMedium);
+  }-*/;
+
+  public final native String item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/stylesheets/JsStyleSheet.java b/elemental/src/elemental/js/stylesheets/JsStyleSheet.java
new file mode 100644
index 0000000..d9f2f00
--- /dev/null
+++ b/elemental/src/elemental/js/stylesheets/JsStyleSheet.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.stylesheets;
+import elemental.dom.Node;
+import elemental.stylesheets.StyleSheet;
+import elemental.stylesheets.MediaList;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsStyleSheet extends JsElementalMixinBase  implements StyleSheet {
+  protected JsStyleSheet() {}
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native String getHref() /*-{
+    return this.href;
+  }-*/;
+
+  public final native JsMediaList getMedia() /*-{
+    return this.media;
+  }-*/;
+
+  public final native JsNode getOwnerNode() /*-{
+    return this.ownerNode;
+  }-*/;
+
+  public final native JsStyleSheet getParentStyleSheet() /*-{
+    return this.parentStyleSheet;
+  }-*/;
+
+  public final native String getTitle() /*-{
+    return this.title;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/stylesheets/JsStyleSheetList.java b/elemental/src/elemental/js/stylesheets/JsStyleSheetList.java
new file mode 100644
index 0000000..4ff6b95
--- /dev/null
+++ b/elemental/src/elemental/js/stylesheets/JsStyleSheetList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.stylesheets;
+import elemental.stylesheets.StyleSheetList;
+import elemental.stylesheets.StyleSheet;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsStyleSheetList extends JsIndexable  implements StyleSheetList, Indexable {
+  protected JsStyleSheetList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsStyleSheet item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAElement.java b/elemental/src/elemental/js/svg/JsSVGAElement.java
new file mode 100644
index 0000000..9189dec
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAElement.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAElement extends JsSVGElement  implements SVGAElement {
+  protected JsSVGAElement() {}
+
+  public final native JsSVGAnimatedString getTarget() /*-{
+    return this.target;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAltGlyphDefElement.java b/elemental/src/elemental/js/svg/JsSVGAltGlyphDefElement.java
new file mode 100644
index 0000000..5d421a7
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAltGlyphDefElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAltGlyphDefElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAltGlyphDefElement extends JsSVGElement  implements SVGAltGlyphDefElement {
+  protected JsSVGAltGlyphDefElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAltGlyphElement.java b/elemental/src/elemental/js/svg/JsSVGAltGlyphElement.java
new file mode 100644
index 0000000..caf1a57
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAltGlyphElement.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGTextPositioningElement;
+import elemental.svg.SVGAltGlyphElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAltGlyphElement extends JsSVGTextPositioningElement  implements SVGAltGlyphElement {
+  protected JsSVGAltGlyphElement() {}
+
+  public final native String getFormat() /*-{
+    return this.format;
+  }-*/;
+
+  public final native void setFormat(String param_format) /*-{
+    this.format = param_format;
+  }-*/;
+
+  public final native String getGlyphRef() /*-{
+    return this.glyphRef;
+  }-*/;
+
+  public final native void setGlyphRef(String param_glyphRef) /*-{
+    this.glyphRef = param_glyphRef;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAltGlyphItemElement.java b/elemental/src/elemental/js/svg/JsSVGAltGlyphItemElement.java
new file mode 100644
index 0000000..68dcc5f
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAltGlyphItemElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAltGlyphItemElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAltGlyphItemElement extends JsSVGElement  implements SVGAltGlyphItemElement {
+  protected JsSVGAltGlyphItemElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAngle.java b/elemental/src/elemental/js/svg/JsSVGAngle.java
new file mode 100644
index 0000000..10b2c35
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAngle.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAngle;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAngle extends JsElementalMixinBase  implements SVGAngle {
+  protected JsSVGAngle() {}
+
+  public final native int getUnitType() /*-{
+    return this.unitType;
+  }-*/;
+
+  public final native float getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(float param_value) /*-{
+    this.value = param_value;
+  }-*/;
+
+  public final native String getValueAsString() /*-{
+    return this.valueAsString;
+  }-*/;
+
+  public final native void setValueAsString(String param_valueAsString) /*-{
+    this.valueAsString = param_valueAsString;
+  }-*/;
+
+  public final native float getValueInSpecifiedUnits() /*-{
+    return this.valueInSpecifiedUnits;
+  }-*/;
+
+  public final native void setValueInSpecifiedUnits(float param_valueInSpecifiedUnits) /*-{
+    this.valueInSpecifiedUnits = param_valueInSpecifiedUnits;
+  }-*/;
+
+  public final native void convertToSpecifiedUnits(int unitType) /*-{
+    this.convertToSpecifiedUnits(unitType);
+  }-*/;
+
+  public final native void newValueSpecifiedUnits(int unitType, float valueInSpecifiedUnits) /*-{
+    this.newValueSpecifiedUnits(unitType, valueInSpecifiedUnits);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimateColorElement.java b/elemental/src/elemental/js/svg/JsSVGAnimateColorElement.java
new file mode 100644
index 0000000..5467528
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimateColorElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimationElement;
+import elemental.svg.SVGAnimateColorElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimateColorElement extends JsSVGAnimationElement  implements SVGAnimateColorElement {
+  protected JsSVGAnimateColorElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimateElement.java b/elemental/src/elemental/js/svg/JsSVGAnimateElement.java
new file mode 100644
index 0000000..1928774
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimateElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimateElement;
+import elemental.svg.SVGAnimationElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimateElement extends JsSVGAnimationElement  implements SVGAnimateElement {
+  protected JsSVGAnimateElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimateMotionElement.java b/elemental/src/elemental/js/svg/JsSVGAnimateMotionElement.java
new file mode 100644
index 0000000..aa043a1
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimateMotionElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimationElement;
+import elemental.svg.SVGAnimateMotionElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimateMotionElement extends JsSVGAnimationElement  implements SVGAnimateMotionElement {
+  protected JsSVGAnimateMotionElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimateTransformElement.java b/elemental/src/elemental/js/svg/JsSVGAnimateTransformElement.java
new file mode 100644
index 0000000..69080d2
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimateTransformElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimationElement;
+import elemental.svg.SVGAnimateTransformElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimateTransformElement extends JsSVGAnimationElement  implements SVGAnimateTransformElement {
+  protected JsSVGAnimateTransformElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedAngle.java b/elemental/src/elemental/js/svg/JsSVGAnimatedAngle.java
new file mode 100644
index 0000000..2fb86ff
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedAngle.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAngle;
+import elemental.svg.SVGAnimatedAngle;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedAngle extends JsElementalMixinBase  implements SVGAnimatedAngle {
+  protected JsSVGAnimatedAngle() {}
+
+  public final native JsSVGAngle getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native JsSVGAngle getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedBoolean.java b/elemental/src/elemental/js/svg/JsSVGAnimatedBoolean.java
new file mode 100644
index 0000000..f3ff8cd
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedBoolean.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedBoolean;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedBoolean extends JsElementalMixinBase  implements SVGAnimatedBoolean {
+  protected JsSVGAnimatedBoolean() {}
+
+  public final native boolean isAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native boolean isBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+
+  public final native void setBaseVal(boolean param_baseVal) /*-{
+    this.baseVal = param_baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedEnumeration.java b/elemental/src/elemental/js/svg/JsSVGAnimatedEnumeration.java
new file mode 100644
index 0000000..036e6e4
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedEnumeration.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedEnumeration;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedEnumeration extends JsElementalMixinBase  implements SVGAnimatedEnumeration {
+  protected JsSVGAnimatedEnumeration() {}
+
+  public final native int getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native int getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+
+  public final native void setBaseVal(int param_baseVal) /*-{
+    this.baseVal = param_baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedInteger.java b/elemental/src/elemental/js/svg/JsSVGAnimatedInteger.java
new file mode 100644
index 0000000..181e154
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedInteger.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedInteger;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedInteger extends JsElementalMixinBase  implements SVGAnimatedInteger {
+  protected JsSVGAnimatedInteger() {}
+
+  public final native int getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native int getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+
+  public final native void setBaseVal(int param_baseVal) /*-{
+    this.baseVal = param_baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedLength.java b/elemental/src/elemental/js/svg/JsSVGAnimatedLength.java
new file mode 100644
index 0000000..ccda4ac
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedLength.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGLength;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedLength extends JsElementalMixinBase  implements SVGAnimatedLength {
+  protected JsSVGAnimatedLength() {}
+
+  public final native JsSVGLength getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native JsSVGLength getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedLengthList.java b/elemental/src/elemental/js/svg/JsSVGAnimatedLengthList.java
new file mode 100644
index 0000000..d42f6c0
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedLengthList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLengthList;
+import elemental.svg.SVGLengthList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedLengthList extends JsElementalMixinBase  implements SVGAnimatedLengthList {
+  protected JsSVGAnimatedLengthList() {}
+
+  public final native JsSVGLengthList getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native JsSVGLengthList getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedNumber.java b/elemental/src/elemental/js/svg/JsSVGAnimatedNumber.java
new file mode 100644
index 0000000..951f443
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedNumber.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedNumber;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedNumber extends JsElementalMixinBase  implements SVGAnimatedNumber {
+  protected JsSVGAnimatedNumber() {}
+
+  public final native float getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native float getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+
+  public final native void setBaseVal(float param_baseVal) /*-{
+    this.baseVal = param_baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedNumberList.java b/elemental/src/elemental/js/svg/JsSVGAnimatedNumberList.java
new file mode 100644
index 0000000..a745bb0
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedNumberList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGNumberList;
+import elemental.svg.SVGAnimatedNumberList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedNumberList extends JsElementalMixinBase  implements SVGAnimatedNumberList {
+  protected JsSVGAnimatedNumberList() {}
+
+  public final native JsSVGNumberList getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native JsSVGNumberList getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedPreserveAspectRatio.java b/elemental/src/elemental/js/svg/JsSVGAnimatedPreserveAspectRatio.java
new file mode 100644
index 0000000..d55d32a
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedPreserveAspectRatio.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedPreserveAspectRatio;
+import elemental.svg.SVGPreserveAspectRatio;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedPreserveAspectRatio extends JsElementalMixinBase  implements SVGAnimatedPreserveAspectRatio {
+  protected JsSVGAnimatedPreserveAspectRatio() {}
+
+  public final native JsSVGPreserveAspectRatio getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native JsSVGPreserveAspectRatio getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedRect.java b/elemental/src/elemental/js/svg/JsSVGAnimatedRect.java
new file mode 100644
index 0000000..8a1ad93
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedRect.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedRect;
+import elemental.svg.SVGRect;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedRect extends JsElementalMixinBase  implements SVGAnimatedRect {
+  protected JsSVGAnimatedRect() {}
+
+  public final native JsSVGRect getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native JsSVGRect getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedString.java b/elemental/src/elemental/js/svg/JsSVGAnimatedString.java
new file mode 100644
index 0000000..600254c
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedString.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedString;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedString extends JsElementalMixinBase  implements SVGAnimatedString {
+  protected JsSVGAnimatedString() {}
+
+  public final native String getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native String getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+
+  public final native void setBaseVal(String param_baseVal) /*-{
+    this.baseVal = param_baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimatedTransformList.java b/elemental/src/elemental/js/svg/JsSVGAnimatedTransformList.java
new file mode 100644
index 0000000..d494b2d
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimatedTransformList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGTransformList;
+import elemental.svg.SVGAnimatedTransformList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimatedTransformList extends JsElementalMixinBase  implements SVGAnimatedTransformList {
+  protected JsSVGAnimatedTransformList() {}
+
+  public final native JsSVGTransformList getAnimVal() /*-{
+    return this.animVal;
+  }-*/;
+
+  public final native JsSVGTransformList getBaseVal() /*-{
+    return this.baseVal;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGAnimationElement.java b/elemental/src/elemental/js/svg/JsSVGAnimationElement.java
new file mode 100644
index 0000000..839078e
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGAnimationElement.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimationElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGAnimationElement extends JsSVGElement  implements SVGAnimationElement {
+  protected JsSVGAnimationElement() {}
+
+  public final native JsSVGElement getTargetElement() /*-{
+    return this.targetElement;
+  }-*/;
+
+  public final native float getCurrentTime() /*-{
+    return this.getCurrentTime();
+  }-*/;
+
+  public final native float getSimpleDuration() /*-{
+    return this.getSimpleDuration();
+  }-*/;
+
+  public final native float getStartTime() /*-{
+    return this.getStartTime();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGCircleElement.java b/elemental/src/elemental/js/svg/JsSVGCircleElement.java
new file mode 100644
index 0000000..9e791e2
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGCircleElement.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGCircleElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGCircleElement extends JsSVGElement  implements SVGCircleElement {
+  protected JsSVGCircleElement() {}
+
+  public final native JsSVGAnimatedLength getCx() /*-{
+    return this.cx;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getCy() /*-{
+    return this.cy;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getR() /*-{
+    return this.r;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGClipPathElement.java b/elemental/src/elemental/js/svg/JsSVGClipPathElement.java
new file mode 100644
index 0000000..2546970
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGClipPathElement.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGClipPathElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGClipPathElement extends JsSVGElement  implements SVGClipPathElement {
+  protected JsSVGClipPathElement() {}
+
+  public final native JsSVGAnimatedEnumeration getClipPathUnits() /*-{
+    return this.clipPathUnits;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGColor.java b/elemental/src/elemental/js/svg/JsSVGColor.java
new file mode 100644
index 0000000..c0ae137
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGColor.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.js.css.JsCSSValue;
+import elemental.css.RGBColor;
+import elemental.svg.SVGColor;
+import elemental.js.css.JsRGBColor;
+import elemental.css.CSSValue;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGColor extends JsCSSValue  implements SVGColor {
+  protected JsSVGColor() {}
+
+  public final native int getColorType() /*-{
+    return this.colorType;
+  }-*/;
+
+  public final native JsRGBColor getRgbColor() /*-{
+    return this.rgbColor;
+  }-*/;
+
+  public final native void setColor(int colorType, String rgbColor, String iccColor) /*-{
+    this.setColor(colorType, rgbColor, iccColor);
+  }-*/;
+
+  public final native void setRGBColor(String rgbColor) /*-{
+    this.setRGBColor(rgbColor);
+  }-*/;
+
+  public final native void setRGBColorICCColor(String rgbColor, String iccColor) /*-{
+    this.setRGBColorICCColor(rgbColor, iccColor);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGComponentTransferFunctionElement.java b/elemental/src/elemental/js/svg/JsSVGComponentTransferFunctionElement.java
new file mode 100644
index 0000000..211d9fc
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGComponentTransferFunctionElement.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGComponentTransferFunctionElement;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedNumberList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGComponentTransferFunctionElement extends JsSVGElement  implements SVGComponentTransferFunctionElement {
+  protected JsSVGComponentTransferFunctionElement() {}
+
+  public final native JsSVGAnimatedNumber getAmplitude() /*-{
+    return this.amplitude;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getExponent() /*-{
+    return this.exponent;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getIntercept() /*-{
+    return this.intercept;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getOffset() /*-{
+    return this.offset;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getSlope() /*-{
+    return this.slope;
+  }-*/;
+
+  public final native JsSVGAnimatedNumberList getTableValues() /*-{
+    return this.tableValues;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getType() /*-{
+    return this.type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGCursorElement.java b/elemental/src/elemental/js/svg/JsSVGCursorElement.java
new file mode 100644
index 0000000..1e0a9f2
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGCursorElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGCursorElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGCursorElement extends JsSVGElement  implements SVGCursorElement {
+  protected JsSVGCursorElement() {}
+
+  public final native JsSVGAnimatedLength getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY() /*-{
+    return this.y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGDefsElement.java b/elemental/src/elemental/js/svg/JsSVGDefsElement.java
new file mode 100644
index 0000000..128b55f
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGDefsElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGDefsElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGDefsElement extends JsSVGElement  implements SVGDefsElement {
+  protected JsSVGDefsElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGDescElement.java b/elemental/src/elemental/js/svg/JsSVGDescElement.java
new file mode 100644
index 0000000..2bbe0d9
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGDescElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGDescElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGDescElement extends JsSVGElement  implements SVGDescElement {
+  protected JsSVGDescElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGDocument.java b/elemental/src/elemental/js/svg/JsSVGDocument.java
new file mode 100644
index 0000000..88f29f3
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGDocument.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.js.dom.JsDocument;
+import elemental.svg.SVGDocument;
+import elemental.svg.SVGSVGElement;
+import elemental.js.events.JsEvent;
+import elemental.events.Event;
+import elemental.dom.Document;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGDocument extends JsDocument  implements SVGDocument {
+  protected JsSVGDocument() {}
+
+  public final native JsSVGSVGElement getRootElement() /*-{
+    return this.rootElement;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGElement.java b/elemental/src/elemental/js/svg/JsSVGElement.java
new file mode 100644
index 0000000..3f8d438
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGElement.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.js.dom.JsElement;
+import elemental.dom.Element;
+import elemental.svg.SVGSVGElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGElement extends JsElement  implements SVGElement {
+  protected JsSVGElement() {}
+
+  public final native JsSVGSVGElement getOwnerSVGElement() /*-{
+    return this.ownerSVGElement;
+  }-*/;
+
+  public final native JsSVGElement getViewportElement() /*-{
+    return this.viewportElement;
+  }-*/;
+
+  public final native String getXmlbase() /*-{
+    return this.xmlbase;
+  }-*/;
+
+  public final native void setXmlbase(String param_xmlbase) /*-{
+    this.xmlbase = param_xmlbase;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGElementInstance.java b/elemental/src/elemental/js/svg/JsSVGElementInstance.java
new file mode 100644
index 0000000..e43cfde
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGElementInstance.java
@@ -0,0 +1,358 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.events.Event;
+import elemental.js.events.JsEvent;
+import elemental.svg.SVGElementInstanceList;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGUseElement;
+import elemental.svg.SVGElementInstance;
+import elemental.js.events.JsEventListener;
+import elemental.events.EventListener;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGElementInstance extends JsElementalMixinBase  implements SVGElementInstance {
+  protected JsSVGElementInstance() {}
+
+  public final native JsSVGElementInstanceList getChildNodes() /*-{
+    return this.childNodes;
+  }-*/;
+
+  public final native JsSVGElement getCorrespondingElement() /*-{
+    return this.correspondingElement;
+  }-*/;
+
+  public final native JsSVGUseElement getCorrespondingUseElement() /*-{
+    return this.correspondingUseElement;
+  }-*/;
+
+  public final native JsSVGElementInstance getFirstChild() /*-{
+    return this.firstChild;
+  }-*/;
+
+  public final native JsSVGElementInstance getLastChild() /*-{
+    return this.lastChild;
+  }-*/;
+
+  public final native JsSVGElementInstance getNextSibling() /*-{
+    return this.nextSibling;
+  }-*/;
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforecopy() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforecopy);
+  }-*/;
+
+  public final native void setOnbeforecopy(EventListener listener) /*-{
+    this.onbeforecopy = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforecut() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforecut);
+  }-*/;
+
+  public final native void setOnbeforecut(EventListener listener) /*-{
+    this.onbeforecut = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnbeforepaste() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onbeforepaste);
+  }-*/;
+
+  public final native void setOnbeforepaste(EventListener listener) /*-{
+    this.onbeforepaste = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnblur() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onblur);
+  }-*/;
+
+  public final native void setOnblur(EventListener listener) /*-{
+    this.onblur = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnchange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onchange);
+  }-*/;
+
+  public final native void setOnchange(EventListener listener) /*-{
+    this.onchange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnclick() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onclick);
+  }-*/;
+
+  public final native void setOnclick(EventListener listener) /*-{
+    this.onclick = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncontextmenu() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncontextmenu);
+  }-*/;
+
+  public final native void setOncontextmenu(EventListener listener) /*-{
+    this.oncontextmenu = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncopy() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncopy);
+  }-*/;
+
+  public final native void setOncopy(EventListener listener) /*-{
+    this.oncopy = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOncut() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oncut);
+  }-*/;
+
+  public final native void setOncut(EventListener listener) /*-{
+    this.oncut = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndblclick() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondblclick);
+  }-*/;
+
+  public final native void setOndblclick(EventListener listener) /*-{
+    this.ondblclick = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndrag() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondrag);
+  }-*/;
+
+  public final native void setOndrag(EventListener listener) /*-{
+    this.ondrag = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragend);
+  }-*/;
+
+  public final native void setOndragend(EventListener listener) /*-{
+    this.ondragend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragenter() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragenter);
+  }-*/;
+
+  public final native void setOndragenter(EventListener listener) /*-{
+    this.ondragenter = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragleave() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragleave);
+  }-*/;
+
+  public final native void setOndragleave(EventListener listener) /*-{
+    this.ondragleave = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragover() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragover);
+  }-*/;
+
+  public final native void setOndragover(EventListener listener) /*-{
+    this.ondragover = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndragstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondragstart);
+  }-*/;
+
+  public final native void setOndragstart(EventListener listener) /*-{
+    this.ondragstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOndrop() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.ondrop);
+  }-*/;
+
+  public final native void setOndrop(EventListener listener) /*-{
+    this.ondrop = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnfocus() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onfocus);
+  }-*/;
+
+  public final native void setOnfocus(EventListener listener) /*-{
+    this.onfocus = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOninput() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.oninput);
+  }-*/;
+
+  public final native void setOninput(EventListener listener) /*-{
+    this.oninput = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeydown() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeydown);
+  }-*/;
+
+  public final native void setOnkeydown(EventListener listener) /*-{
+    this.onkeydown = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeypress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeypress);
+  }-*/;
+
+  public final native void setOnkeypress(EventListener listener) /*-{
+    this.onkeypress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnkeyup() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onkeyup);
+  }-*/;
+
+  public final native void setOnkeyup(EventListener listener) /*-{
+    this.onkeyup = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onload);
+  }-*/;
+
+  public final native void setOnload(EventListener listener) /*-{
+    this.onload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousedown() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousedown);
+  }-*/;
+
+  public final native void setOnmousedown(EventListener listener) /*-{
+    this.onmousedown = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousemove() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousemove);
+  }-*/;
+
+  public final native void setOnmousemove(EventListener listener) /*-{
+    this.onmousemove = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseout() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseout);
+  }-*/;
+
+  public final native void setOnmouseout(EventListener listener) /*-{
+    this.onmouseout = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseover() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseover);
+  }-*/;
+
+  public final native void setOnmouseover(EventListener listener) /*-{
+    this.onmouseover = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmouseup() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmouseup);
+  }-*/;
+
+  public final native void setOnmouseup(EventListener listener) /*-{
+    this.onmouseup = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnmousewheel() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onmousewheel);
+  }-*/;
+
+  public final native void setOnmousewheel(EventListener listener) /*-{
+    this.onmousewheel = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnpaste() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onpaste);
+  }-*/;
+
+  public final native void setOnpaste(EventListener listener) /*-{
+    this.onpaste = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnreset() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onreset);
+  }-*/;
+
+  public final native void setOnreset(EventListener listener) /*-{
+    this.onreset = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnresize() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onresize);
+  }-*/;
+
+  public final native void setOnresize(EventListener listener) /*-{
+    this.onresize = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnscroll() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onscroll);
+  }-*/;
+
+  public final native void setOnscroll(EventListener listener) /*-{
+    this.onscroll = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsearch() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsearch);
+  }-*/;
+
+  public final native void setOnsearch(EventListener listener) /*-{
+    this.onsearch = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnselect() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onselect);
+  }-*/;
+
+  public final native void setOnselect(EventListener listener) /*-{
+    this.onselect = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnselectstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onselectstart);
+  }-*/;
+
+  public final native void setOnselectstart(EventListener listener) /*-{
+    this.onselectstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnsubmit() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onsubmit);
+  }-*/;
+
+  public final native void setOnsubmit(EventListener listener) /*-{
+    this.onsubmit = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnunload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onunload);
+  }-*/;
+
+  public final native void setOnunload(EventListener listener) /*-{
+    this.onunload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native JsSVGElementInstance getParentNode() /*-{
+    return this.parentNode;
+  }-*/;
+
+  public final native JsSVGElementInstance getPreviousSibling() /*-{
+    return this.previousSibling;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGElementInstanceList.java b/elemental/src/elemental/js/svg/JsSVGElementInstanceList.java
new file mode 100644
index 0000000..9178ab5
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGElementInstanceList.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElementInstanceList;
+import elemental.svg.SVGElementInstance;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGElementInstanceList extends JsElementalMixinBase  implements SVGElementInstanceList {
+  protected JsSVGElementInstanceList() {}
+
+  public final native int getLength() /*-{
+    return this.length;
+  }-*/;
+
+  public final native JsSVGElementInstance item(int index) /*-{
+    return this.item(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGEllipseElement.java b/elemental/src/elemental/js/svg/JsSVGEllipseElement.java
new file mode 100644
index 0000000..7040ad2
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGEllipseElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGEllipseElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGEllipseElement extends JsSVGElement  implements SVGEllipseElement {
+  protected JsSVGEllipseElement() {}
+
+  public final native JsSVGAnimatedLength getCx() /*-{
+    return this.cx;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getCy() /*-{
+    return this.cy;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getRx() /*-{
+    return this.rx;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getRy() /*-{
+    return this.ry;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGException.java b/elemental/src/elemental/js/svg/JsSVGException.java
new file mode 100644
index 0000000..2f94897
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGException extends JsElementalMixinBase  implements SVGException {
+  protected JsSVGException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEBlendElement.java b/elemental/src/elemental/js/svg/JsSVGFEBlendElement.java
new file mode 100644
index 0000000..d791e42
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEBlendElement.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGFEBlendElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEBlendElement extends JsSVGElement  implements SVGFEBlendElement {
+  protected JsSVGFEBlendElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedString getIn2() /*-{
+    return this.in2;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getMode() /*-{
+    return this.mode;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEColorMatrixElement.java b/elemental/src/elemental/js/svg/JsSVGFEColorMatrixElement.java
new file mode 100644
index 0000000..8c534a6
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEColorMatrixElement.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFEColorMatrixElement;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedNumberList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEColorMatrixElement extends JsSVGElement  implements SVGFEColorMatrixElement {
+  protected JsSVGFEColorMatrixElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native JsSVGAnimatedNumberList getValues() /*-{
+    return this.values;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEComponentTransferElement.java b/elemental/src/elemental/js/svg/JsSVGFEComponentTransferElement.java
new file mode 100644
index 0000000..7829cf4
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEComponentTransferElement.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFEComponentTransferElement;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEComponentTransferElement extends JsSVGElement  implements SVGFEComponentTransferElement {
+  protected JsSVGFEComponentTransferElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFECompositeElement.java b/elemental/src/elemental/js/svg/JsSVGFECompositeElement.java
new file mode 100644
index 0000000..15b7028
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFECompositeElement.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGFECompositeElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFECompositeElement extends JsSVGElement  implements SVGFECompositeElement {
+  protected JsSVGFECompositeElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedString getIn2() /*-{
+    return this.in2;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getK1() /*-{
+    return this.k1;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getK2() /*-{
+    return this.k2;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getK3() /*-{
+    return this.k3;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getK4() /*-{
+    return this.k4;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getOperator() /*-{
+    return this.operator;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEConvolveMatrixElement.java b/elemental/src/elemental/js/svg/JsSVGFEConvolveMatrixElement.java
new file mode 100644
index 0000000..986f48e
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEConvolveMatrixElement.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGFEConvolveMatrixElement;
+import elemental.svg.SVGAnimatedBoolean;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedInteger;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedNumberList;
+import elemental.svg.SVGAnimatedNumber;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEConvolveMatrixElement extends JsSVGElement  implements SVGFEConvolveMatrixElement {
+  protected JsSVGFEConvolveMatrixElement() {}
+
+  public final native JsSVGAnimatedNumber getBias() /*-{
+    return this.bias;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getDivisor() /*-{
+    return this.divisor;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getEdgeMode() /*-{
+    return this.edgeMode;
+  }-*/;
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedNumberList getKernelMatrix() /*-{
+    return this.kernelMatrix;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getKernelUnitLengthX() /*-{
+    return this.kernelUnitLengthX;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getKernelUnitLengthY() /*-{
+    return this.kernelUnitLengthY;
+  }-*/;
+
+  public final native JsSVGAnimatedInteger getOrderX() /*-{
+    return this.orderX;
+  }-*/;
+
+  public final native JsSVGAnimatedInteger getOrderY() /*-{
+    return this.orderY;
+  }-*/;
+
+  public final native JsSVGAnimatedBoolean getPreserveAlpha() /*-{
+    return this.preserveAlpha;
+  }-*/;
+
+  public final native JsSVGAnimatedInteger getTargetX() /*-{
+    return this.targetX;
+  }-*/;
+
+  public final native JsSVGAnimatedInteger getTargetY() /*-{
+    return this.targetY;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEDiffuseLightingElement.java b/elemental/src/elemental/js/svg/JsSVGFEDiffuseLightingElement.java
new file mode 100644
index 0000000..aeff072
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEDiffuseLightingElement.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGFEDiffuseLightingElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEDiffuseLightingElement extends JsSVGElement  implements SVGFEDiffuseLightingElement {
+  protected JsSVGFEDiffuseLightingElement() {}
+
+  public final native JsSVGAnimatedNumber getDiffuseConstant() /*-{
+    return this.diffuseConstant;
+  }-*/;
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getKernelUnitLengthX() /*-{
+    return this.kernelUnitLengthX;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getKernelUnitLengthY() /*-{
+    return this.kernelUnitLengthY;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getSurfaceScale() /*-{
+    return this.surfaceScale;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEDisplacementMapElement.java b/elemental/src/elemental/js/svg/JsSVGFEDisplacementMapElement.java
new file mode 100644
index 0000000..4e29b33
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEDisplacementMapElement.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGFEDisplacementMapElement;
+import elemental.svg.SVGAnimatedNumber;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEDisplacementMapElement extends JsSVGElement  implements SVGFEDisplacementMapElement {
+  protected JsSVGFEDisplacementMapElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedString getIn2() /*-{
+    return this.in2;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getScale() /*-{
+    return this.scale;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getXChannelSelector() /*-{
+    return this.xChannelSelector;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getYChannelSelector() /*-{
+    return this.yChannelSelector;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEDistantLightElement.java b/elemental/src/elemental/js/svg/JsSVGFEDistantLightElement.java
new file mode 100644
index 0000000..2e9c669
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEDistantLightElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGFEDistantLightElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEDistantLightElement extends JsSVGElement  implements SVGFEDistantLightElement {
+  protected JsSVGFEDistantLightElement() {}
+
+  public final native JsSVGAnimatedNumber getAzimuth() /*-{
+    return this.azimuth;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getElevation() /*-{
+    return this.elevation;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEDropShadowElement.java b/elemental/src/elemental/js/svg/JsSVGFEDropShadowElement.java
new file mode 100644
index 0000000..0488085
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEDropShadowElement.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGFEDropShadowElement;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEDropShadowElement extends JsSVGElement  implements SVGFEDropShadowElement {
+  protected JsSVGFEDropShadowElement() {}
+
+  public final native JsSVGAnimatedNumber getDx() /*-{
+    return this.dx;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getDy() /*-{
+    return this.dy;
+  }-*/;
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getStdDeviationX() /*-{
+    return this.stdDeviationX;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getStdDeviationY() /*-{
+    return this.stdDeviationY;
+  }-*/;
+
+  public final native void setStdDeviation(float stdDeviationX, float stdDeviationY) /*-{
+    this.setStdDeviation(stdDeviationX, stdDeviationY);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEFloodElement.java b/elemental/src/elemental/js/svg/JsSVGFEFloodElement.java
new file mode 100644
index 0000000..5a75b71
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEFloodElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFEFloodElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEFloodElement extends JsSVGElement  implements SVGFEFloodElement {
+  protected JsSVGFEFloodElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEFuncAElement.java b/elemental/src/elemental/js/svg/JsSVGFEFuncAElement.java
new file mode 100644
index 0000000..dbef298
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEFuncAElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGComponentTransferFunctionElement;
+import elemental.svg.SVGFEFuncAElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEFuncAElement extends JsSVGComponentTransferFunctionElement  implements SVGFEFuncAElement {
+  protected JsSVGFEFuncAElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEFuncBElement.java b/elemental/src/elemental/js/svg/JsSVGFEFuncBElement.java
new file mode 100644
index 0000000..7a0e5e8
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEFuncBElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFEFuncBElement;
+import elemental.svg.SVGComponentTransferFunctionElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEFuncBElement extends JsSVGComponentTransferFunctionElement  implements SVGFEFuncBElement {
+  protected JsSVGFEFuncBElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEFuncGElement.java b/elemental/src/elemental/js/svg/JsSVGFEFuncGElement.java
new file mode 100644
index 0000000..11ff262
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEFuncGElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGComponentTransferFunctionElement;
+import elemental.svg.SVGFEFuncGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEFuncGElement extends JsSVGComponentTransferFunctionElement  implements SVGFEFuncGElement {
+  protected JsSVGFEFuncGElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEFuncRElement.java b/elemental/src/elemental/js/svg/JsSVGFEFuncRElement.java
new file mode 100644
index 0000000..b041f64
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEFuncRElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFEFuncRElement;
+import elemental.svg.SVGComponentTransferFunctionElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEFuncRElement extends JsSVGComponentTransferFunctionElement  implements SVGFEFuncRElement {
+  protected JsSVGFEFuncRElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEGaussianBlurElement.java b/elemental/src/elemental/js/svg/JsSVGFEGaussianBlurElement.java
new file mode 100644
index 0000000..a9861c9
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEGaussianBlurElement.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGFEGaussianBlurElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEGaussianBlurElement extends JsSVGElement  implements SVGFEGaussianBlurElement {
+  protected JsSVGFEGaussianBlurElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getStdDeviationX() /*-{
+    return this.stdDeviationX;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getStdDeviationY() /*-{
+    return this.stdDeviationY;
+  }-*/;
+
+  public final native void setStdDeviation(float stdDeviationX, float stdDeviationY) /*-{
+    this.setStdDeviation(stdDeviationX, stdDeviationY);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEImageElement.java b/elemental/src/elemental/js/svg/JsSVGFEImageElement.java
new file mode 100644
index 0000000..31030fb
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEImageElement.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedPreserveAspectRatio;
+import elemental.svg.SVGFEImageElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEImageElement extends JsSVGElement  implements SVGFEImageElement {
+  protected JsSVGFEImageElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEMergeElement.java b/elemental/src/elemental/js/svg/JsSVGFEMergeElement.java
new file mode 100644
index 0000000..fadb08b
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEMergeElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFEMergeElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEMergeElement extends JsSVGElement  implements SVGFEMergeElement {
+  protected JsSVGFEMergeElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEMergeNodeElement.java b/elemental/src/elemental/js/svg/JsSVGFEMergeNodeElement.java
new file mode 100644
index 0000000..dbeb402
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEMergeNodeElement.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGFEMergeNodeElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEMergeNodeElement extends JsSVGElement  implements SVGFEMergeNodeElement {
+  protected JsSVGFEMergeNodeElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEMorphologyElement.java b/elemental/src/elemental/js/svg/JsSVGFEMorphologyElement.java
new file mode 100644
index 0000000..32ba28f
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEMorphologyElement.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGFEMorphologyElement;
+import elemental.svg.SVGAnimatedNumber;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEMorphologyElement extends JsSVGElement  implements SVGFEMorphologyElement {
+  protected JsSVGFEMorphologyElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getOperator() /*-{
+    return this.operator;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getRadiusX() /*-{
+    return this.radiusX;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getRadiusY() /*-{
+    return this.radiusY;
+  }-*/;
+
+  public final native void setRadius(float radiusX, float radiusY) /*-{
+    this.setRadius(radiusX, radiusY);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEOffsetElement.java b/elemental/src/elemental/js/svg/JsSVGFEOffsetElement.java
new file mode 100644
index 0000000..31a18f6
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEOffsetElement.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGFEOffsetElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEOffsetElement extends JsSVGElement  implements SVGFEOffsetElement {
+  protected JsSVGFEOffsetElement() {}
+
+  public final native JsSVGAnimatedNumber getDx() /*-{
+    return this.dx;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getDy() /*-{
+    return this.dy;
+  }-*/;
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFEPointLightElement.java b/elemental/src/elemental/js/svg/JsSVGFEPointLightElement.java
new file mode 100644
index 0000000..2ca6793
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFEPointLightElement.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFEPointLightElement;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFEPointLightElement extends JsSVGElement  implements SVGFEPointLightElement {
+  protected JsSVGFEPointLightElement() {}
+
+  public final native JsSVGAnimatedNumber getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getZ() /*-{
+    return this.z;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFESpecularLightingElement.java b/elemental/src/elemental/js/svg/JsSVGFESpecularLightingElement.java
new file mode 100644
index 0000000..e2d51bc
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFESpecularLightingElement.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFESpecularLightingElement;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedNumber;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFESpecularLightingElement extends JsSVGElement  implements SVGFESpecularLightingElement {
+  protected JsSVGFESpecularLightingElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getSpecularConstant() /*-{
+    return this.specularConstant;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getSpecularExponent() /*-{
+    return this.specularExponent;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getSurfaceScale() /*-{
+    return this.surfaceScale;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFESpotLightElement.java b/elemental/src/elemental/js/svg/JsSVGFESpotLightElement.java
new file mode 100644
index 0000000..defb4a4
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFESpotLightElement.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGFESpotLightElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFESpotLightElement extends JsSVGElement  implements SVGFESpotLightElement {
+  protected JsSVGFESpotLightElement() {}
+
+  public final native JsSVGAnimatedNumber getLimitingConeAngle() /*-{
+    return this.limitingConeAngle;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getPointsAtX() /*-{
+    return this.pointsAtX;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getPointsAtY() /*-{
+    return this.pointsAtY;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getPointsAtZ() /*-{
+    return this.pointsAtZ;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getSpecularExponent() /*-{
+    return this.specularExponent;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getZ() /*-{
+    return this.z;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFETileElement.java b/elemental/src/elemental/js/svg/JsSVGFETileElement.java
new file mode 100644
index 0000000..392911a
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFETileElement.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFETileElement;
+import elemental.svg.SVGAnimatedString;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFETileElement extends JsSVGElement  implements SVGFETileElement {
+  protected JsSVGFETileElement() {}
+
+  public final native JsSVGAnimatedString getIn1() /*-{
+    return this.in1;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFETurbulenceElement.java b/elemental/src/elemental/js/svg/JsSVGFETurbulenceElement.java
new file mode 100644
index 0000000..831dcd1
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFETurbulenceElement.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedInteger;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGFETurbulenceElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFETurbulenceElement extends JsSVGElement  implements SVGFETurbulenceElement {
+  protected JsSVGFETurbulenceElement() {}
+
+  public final native JsSVGAnimatedNumber getBaseFrequencyX() /*-{
+    return this.baseFrequencyX;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getBaseFrequencyY() /*-{
+    return this.baseFrequencyY;
+  }-*/;
+
+  public final native JsSVGAnimatedInteger getNumOctaves() /*-{
+    return this.numOctaves;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getSeed() /*-{
+    return this.seed;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getStitchTiles() /*-{
+    return this.stitchTiles;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getType() /*-{
+    return this.type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFilterElement.java b/elemental/src/elemental/js/svg/JsSVGFilterElement.java
new file mode 100644
index 0000000..60250f8
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFilterElement.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGAnimatedInteger;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGFilterElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFilterElement extends JsSVGElement  implements SVGFilterElement {
+  protected JsSVGFilterElement() {}
+
+  public final native JsSVGAnimatedInteger getFilterResX() /*-{
+    return this.filterResX;
+  }-*/;
+
+  public final native JsSVGAnimatedInteger getFilterResY() /*-{
+    return this.filterResY;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getFilterUnits() /*-{
+    return this.filterUnits;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getPrimitiveUnits() /*-{
+    return this.primitiveUnits;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setFilterRes(int filterResX, int filterResY) /*-{
+    this.setFilterRes(filterResX, filterResY);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFontElement.java b/elemental/src/elemental/js/svg/JsSVGFontElement.java
new file mode 100644
index 0000000..1bcdf90
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFontElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGFontElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFontElement extends JsSVGElement  implements SVGFontElement {
+  protected JsSVGFontElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFontFaceElement.java b/elemental/src/elemental/js/svg/JsSVGFontFaceElement.java
new file mode 100644
index 0000000..720e7f1
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFontFaceElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFontFaceElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFontFaceElement extends JsSVGElement  implements SVGFontFaceElement {
+  protected JsSVGFontFaceElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFontFaceFormatElement.java b/elemental/src/elemental/js/svg/JsSVGFontFaceFormatElement.java
new file mode 100644
index 0000000..cb5cbc7
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFontFaceFormatElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGFontFaceFormatElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFontFaceFormatElement extends JsSVGElement  implements SVGFontFaceFormatElement {
+  protected JsSVGFontFaceFormatElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFontFaceNameElement.java b/elemental/src/elemental/js/svg/JsSVGFontFaceNameElement.java
new file mode 100644
index 0000000..2712126
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFontFaceNameElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFontFaceNameElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFontFaceNameElement extends JsSVGElement  implements SVGFontFaceNameElement {
+  protected JsSVGFontFaceNameElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFontFaceSrcElement.java b/elemental/src/elemental/js/svg/JsSVGFontFaceSrcElement.java
new file mode 100644
index 0000000..4b869ba
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFontFaceSrcElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFontFaceSrcElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFontFaceSrcElement extends JsSVGElement  implements SVGFontFaceSrcElement {
+  protected JsSVGFontFaceSrcElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGFontFaceUriElement.java b/elemental/src/elemental/js/svg/JsSVGFontFaceUriElement.java
new file mode 100644
index 0000000..b3c755f
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGFontFaceUriElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGFontFaceUriElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGFontFaceUriElement extends JsSVGElement  implements SVGFontFaceUriElement {
+  protected JsSVGFontFaceUriElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGForeignObjectElement.java b/elemental/src/elemental/js/svg/JsSVGForeignObjectElement.java
new file mode 100644
index 0000000..e5016cc
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGForeignObjectElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGForeignObjectElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGForeignObjectElement extends JsSVGElement  implements SVGForeignObjectElement {
+  protected JsSVGForeignObjectElement() {}
+
+  public final native JsSVGAnimatedLength getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY() /*-{
+    return this.y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGGElement.java b/elemental/src/elemental/js/svg/JsSVGGElement.java
new file mode 100644
index 0000000..994d98a
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGGElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGGElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGGElement extends JsSVGElement  implements SVGGElement {
+  protected JsSVGGElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGGlyphElement.java b/elemental/src/elemental/js/svg/JsSVGGlyphElement.java
new file mode 100644
index 0000000..e6994d6
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGGlyphElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGGlyphElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGGlyphElement extends JsSVGElement  implements SVGGlyphElement {
+  protected JsSVGGlyphElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGGlyphRefElement.java b/elemental/src/elemental/js/svg/JsSVGGlyphRefElement.java
new file mode 100644
index 0000000..1366582
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGGlyphRefElement.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGGlyphRefElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGGlyphRefElement extends JsSVGElement  implements SVGGlyphRefElement {
+  protected JsSVGGlyphRefElement() {}
+
+  public final native float getDx() /*-{
+    return this.dx;
+  }-*/;
+
+  public final native void setDx(float param_dx) /*-{
+    this.dx = param_dx;
+  }-*/;
+
+  public final native float getDy() /*-{
+    return this.dy;
+  }-*/;
+
+  public final native void setDy(float param_dy) /*-{
+    this.dy = param_dy;
+  }-*/;
+
+  public final native String getFormat() /*-{
+    return this.format;
+  }-*/;
+
+  public final native void setFormat(String param_format) /*-{
+    this.format = param_format;
+  }-*/;
+
+  public final native String getGlyphRef() /*-{
+    return this.glyphRef;
+  }-*/;
+
+  public final native void setGlyphRef(String param_glyphRef) /*-{
+    this.glyphRef = param_glyphRef;
+  }-*/;
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGGradientElement.java b/elemental/src/elemental/js/svg/JsSVGGradientElement.java
new file mode 100644
index 0000000..5008f26
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGGradientElement.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedTransformList;
+import elemental.svg.SVGGradientElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGGradientElement extends JsSVGElement  implements SVGGradientElement {
+  protected JsSVGGradientElement() {}
+
+  public final native JsSVGAnimatedTransformList getGradientTransform() /*-{
+    return this.gradientTransform;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getGradientUnits() /*-{
+    return this.gradientUnits;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getSpreadMethod() /*-{
+    return this.spreadMethod;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGHKernElement.java b/elemental/src/elemental/js/svg/JsSVGHKernElement.java
new file mode 100644
index 0000000..3a7bedb
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGHKernElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGHKernElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGHKernElement extends JsSVGElement  implements SVGHKernElement {
+  protected JsSVGHKernElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGImageElement.java b/elemental/src/elemental/js/svg/JsSVGImageElement.java
new file mode 100644
index 0000000..734b3ac
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGImageElement.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGAnimatedPreserveAspectRatio;
+import elemental.svg.SVGImageElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGImageElement extends JsSVGElement  implements SVGImageElement {
+  protected JsSVGImageElement() {}
+
+  public final native JsSVGAnimatedLength getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY() /*-{
+    return this.y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGLength.java b/elemental/src/elemental/js/svg/JsSVGLength.java
new file mode 100644
index 0000000..ab38cad
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGLength.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGLength;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGLength extends JsElementalMixinBase  implements SVGLength {
+  protected JsSVGLength() {}
+
+  public final native int getUnitType() /*-{
+    return this.unitType;
+  }-*/;
+
+  public final native float getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(float param_value) /*-{
+    this.value = param_value;
+  }-*/;
+
+  public final native String getValueAsString() /*-{
+    return this.valueAsString;
+  }-*/;
+
+  public final native void setValueAsString(String param_valueAsString) /*-{
+    this.valueAsString = param_valueAsString;
+  }-*/;
+
+  public final native float getValueInSpecifiedUnits() /*-{
+    return this.valueInSpecifiedUnits;
+  }-*/;
+
+  public final native void setValueInSpecifiedUnits(float param_valueInSpecifiedUnits) /*-{
+    this.valueInSpecifiedUnits = param_valueInSpecifiedUnits;
+  }-*/;
+
+  public final native void convertToSpecifiedUnits(int unitType) /*-{
+    this.convertToSpecifiedUnits(unitType);
+  }-*/;
+
+  public final native void newValueSpecifiedUnits(int unitType, float valueInSpecifiedUnits) /*-{
+    this.newValueSpecifiedUnits(unitType, valueInSpecifiedUnits);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGLengthList.java b/elemental/src/elemental/js/svg/JsSVGLengthList.java
new file mode 100644
index 0000000..52e6e89
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGLengthList.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGLength;
+import elemental.svg.SVGLengthList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGLengthList extends JsElementalMixinBase  implements SVGLengthList {
+  protected JsSVGLengthList() {}
+
+  public final native int getNumberOfItems() /*-{
+    return this.numberOfItems;
+  }-*/;
+
+  public final native JsSVGLength appendItem(SVGLength item) /*-{
+    return this.appendItem(item);
+  }-*/;
+
+  public final native void clear() /*-{
+    this.clear();
+  }-*/;
+
+  public final native JsSVGLength getItem(int index) /*-{
+    return this.getItem(index);
+  }-*/;
+
+  public final native JsSVGLength initialize(SVGLength item) /*-{
+    return this.initialize(item);
+  }-*/;
+
+  public final native JsSVGLength insertItemBefore(SVGLength item, int index) /*-{
+    return this.insertItemBefore(item, index);
+  }-*/;
+
+  public final native JsSVGLength removeItem(int index) /*-{
+    return this.removeItem(index);
+  }-*/;
+
+  public final native JsSVGLength replaceItem(SVGLength item, int index) /*-{
+    return this.replaceItem(item, index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGLineElement.java b/elemental/src/elemental/js/svg/JsSVGLineElement.java
new file mode 100644
index 0000000..c963508
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGLineElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGLineElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGLineElement extends JsSVGElement  implements SVGLineElement {
+  protected JsSVGLineElement() {}
+
+  public final native JsSVGAnimatedLength getX1() /*-{
+    return this.x1;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getX2() /*-{
+    return this.x2;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY1() /*-{
+    return this.y1;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY2() /*-{
+    return this.y2;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGLinearGradientElement.java b/elemental/src/elemental/js/svg/JsSVGLinearGradientElement.java
new file mode 100644
index 0000000..cd0c687
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGLinearGradientElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGLinearGradientElement;
+import elemental.svg.SVGGradientElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGLinearGradientElement extends JsSVGGradientElement  implements SVGLinearGradientElement {
+  protected JsSVGLinearGradientElement() {}
+
+  public final native JsSVGAnimatedLength getX1() /*-{
+    return this.x1;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getX2() /*-{
+    return this.x2;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY1() /*-{
+    return this.y1;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY2() /*-{
+    return this.y2;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGMPathElement.java b/elemental/src/elemental/js/svg/JsSVGMPathElement.java
new file mode 100644
index 0000000..e7bdb99
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGMPathElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGMPathElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGMPathElement extends JsSVGElement  implements SVGMPathElement {
+  protected JsSVGMPathElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGMarkerElement.java b/elemental/src/elemental/js/svg/JsSVGMarkerElement.java
new file mode 100644
index 0000000..5ed0fec
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGMarkerElement.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAngle;
+import elemental.svg.SVGMarkerElement;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGAnimatedAngle;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGMarkerElement extends JsSVGElement  implements SVGMarkerElement {
+  protected JsSVGMarkerElement() {}
+
+  public final native JsSVGAnimatedLength getMarkerHeight() /*-{
+    return this.markerHeight;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getMarkerUnits() /*-{
+    return this.markerUnits;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getMarkerWidth() /*-{
+    return this.markerWidth;
+  }-*/;
+
+  public final native JsSVGAnimatedAngle getOrientAngle() /*-{
+    return this.orientAngle;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getOrientType() /*-{
+    return this.orientType;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getRefX() /*-{
+    return this.refX;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getRefY() /*-{
+    return this.refY;
+  }-*/;
+
+  public final native void setOrientToAngle(SVGAngle angle) /*-{
+    this.setOrientToAngle(angle);
+  }-*/;
+
+  public final native void setOrientToAuto() /*-{
+    this.setOrientToAuto();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGMaskElement.java b/elemental/src/elemental/js/svg/JsSVGMaskElement.java
new file mode 100644
index 0000000..2173fe2
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGMaskElement.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGMaskElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGMaskElement extends JsSVGElement  implements SVGMaskElement {
+  protected JsSVGMaskElement() {}
+
+  public final native JsSVGAnimatedEnumeration getMaskContentUnits() /*-{
+    return this.maskContentUnits;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getMaskUnits() /*-{
+    return this.maskUnits;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY() /*-{
+    return this.y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGMatrix.java b/elemental/src/elemental/js/svg/JsSVGMatrix.java
new file mode 100644
index 0000000..0032346
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGMatrix.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGMatrix;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGMatrix extends JsElementalMixinBase  implements SVGMatrix {
+  protected JsSVGMatrix() {}
+
+  public final native double getA() /*-{
+    return this.a;
+  }-*/;
+
+  public final native void setA(double param_a) /*-{
+    this.a = param_a;
+  }-*/;
+
+  public final native double getB() /*-{
+    return this.b;
+  }-*/;
+
+  public final native void setB(double param_b) /*-{
+    this.b = param_b;
+  }-*/;
+
+  public final native double getC() /*-{
+    return this.c;
+  }-*/;
+
+  public final native void setC(double param_c) /*-{
+    this.c = param_c;
+  }-*/;
+
+  public final native double getD() /*-{
+    return this.d;
+  }-*/;
+
+  public final native void setD(double param_d) /*-{
+    this.d = param_d;
+  }-*/;
+
+  public final native double getE() /*-{
+    return this.e;
+  }-*/;
+
+  public final native void setE(double param_e) /*-{
+    this.e = param_e;
+  }-*/;
+
+  public final native double getF() /*-{
+    return this.f;
+  }-*/;
+
+  public final native void setF(double param_f) /*-{
+    this.f = param_f;
+  }-*/;
+
+  public final native JsSVGMatrix flipX() /*-{
+    return this.flipX();
+  }-*/;
+
+  public final native JsSVGMatrix flipY() /*-{
+    return this.flipY();
+  }-*/;
+
+  public final native JsSVGMatrix inverse() /*-{
+    return this.inverse();
+  }-*/;
+
+  public final native JsSVGMatrix multiply(SVGMatrix secondMatrix) /*-{
+    return this.multiply(secondMatrix);
+  }-*/;
+
+  public final native JsSVGMatrix rotate(float angle) /*-{
+    return this.rotate(angle);
+  }-*/;
+
+  public final native JsSVGMatrix rotateFromVector(float x, float y) /*-{
+    return this.rotateFromVector(x, y);
+  }-*/;
+
+  public final native JsSVGMatrix scale(float scaleFactor) /*-{
+    return this.scale(scaleFactor);
+  }-*/;
+
+  public final native JsSVGMatrix scaleNonUniform(float scaleFactorX, float scaleFactorY) /*-{
+    return this.scaleNonUniform(scaleFactorX, scaleFactorY);
+  }-*/;
+
+  public final native JsSVGMatrix skewX(float angle) /*-{
+    return this.skewX(angle);
+  }-*/;
+
+  public final native JsSVGMatrix skewY(float angle) /*-{
+    return this.skewY(angle);
+  }-*/;
+
+  public final native JsSVGMatrix translate(float x, float y) /*-{
+    return this.translate(x, y);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGMetadataElement.java b/elemental/src/elemental/js/svg/JsSVGMetadataElement.java
new file mode 100644
index 0000000..9977610
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGMetadataElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGMetadataElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGMetadataElement extends JsSVGElement  implements SVGMetadataElement {
+  protected JsSVGMetadataElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGMissingGlyphElement.java b/elemental/src/elemental/js/svg/JsSVGMissingGlyphElement.java
new file mode 100644
index 0000000..fca9d94
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGMissingGlyphElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGMissingGlyphElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGMissingGlyphElement extends JsSVGElement  implements SVGMissingGlyphElement {
+  protected JsSVGMissingGlyphElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGNumber.java b/elemental/src/elemental/js/svg/JsSVGNumber.java
new file mode 100644
index 0000000..554c336
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGNumber.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGNumber;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGNumber extends JsElementalMixinBase  implements SVGNumber {
+  protected JsSVGNumber() {}
+
+  public final native double getValue() /*-{
+    return this.value;
+  }-*/;
+
+  public final native void setValue(double param_value) /*-{
+    this.value = param_value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGNumberList.java b/elemental/src/elemental/js/svg/JsSVGNumberList.java
new file mode 100644
index 0000000..d3fb466
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGNumberList.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGNumber;
+import elemental.svg.SVGNumberList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGNumberList extends JsElementalMixinBase  implements SVGNumberList {
+  protected JsSVGNumberList() {}
+
+  public final native int getNumberOfItems() /*-{
+    return this.numberOfItems;
+  }-*/;
+
+  public final native JsSVGNumber appendItem(SVGNumber item) /*-{
+    return this.appendItem(item);
+  }-*/;
+
+  public final native void clear() /*-{
+    this.clear();
+  }-*/;
+
+  public final native JsSVGNumber getItem(int index) /*-{
+    return this.getItem(index);
+  }-*/;
+
+  public final native JsSVGNumber initialize(SVGNumber item) /*-{
+    return this.initialize(item);
+  }-*/;
+
+  public final native JsSVGNumber insertItemBefore(SVGNumber item, int index) /*-{
+    return this.insertItemBefore(item, index);
+  }-*/;
+
+  public final native JsSVGNumber removeItem(int index) /*-{
+    return this.removeItem(index);
+  }-*/;
+
+  public final native JsSVGNumber replaceItem(SVGNumber item, int index) /*-{
+    return this.replaceItem(item, index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPaint.java b/elemental/src/elemental/js/svg/JsSVGPaint.java
new file mode 100644
index 0000000..a69895e
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPaint.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPaint;
+import elemental.svg.SVGColor;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPaint extends JsSVGColor  implements SVGPaint {
+  protected JsSVGPaint() {}
+
+  public final native int getPaintType() /*-{
+    return this.paintType;
+  }-*/;
+
+  public final native String getUri() /*-{
+    return this.uri;
+  }-*/;
+
+  public final native void setPaint(int paintType, String uri, String rgbColor, String iccColor) /*-{
+    this.setPaint(paintType, uri, rgbColor, iccColor);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathElement.java b/elemental/src/elemental/js/svg/JsSVGPathElement.java
new file mode 100644
index 0000000..58ce384
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathElement.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegArcRel;
+import elemental.svg.SVGPathSegCurvetoQuadraticRel;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGPathSegLinetoVerticalRel;
+import elemental.svg.SVGPathSegMovetoRel;
+import elemental.svg.SVGPathSegLinetoRel;
+import elemental.svg.SVGPathSegMovetoAbs;
+import elemental.svg.SVGPathElement;
+import elemental.svg.SVGPoint;
+import elemental.svg.SVGPathSegLinetoHorizontalRel;
+import elemental.svg.SVGPathSegCurvetoCubicSmoothAbs;
+import elemental.svg.SVGPathSegLinetoAbs;
+import elemental.svg.SVGPathSegLinetoHorizontalAbs;
+import elemental.svg.SVGPathSegCurvetoCubicSmoothRel;
+import elemental.svg.SVGPathSegCurvetoCubicAbs;
+import elemental.svg.SVGPathSegClosePath;
+import elemental.svg.SVGPathSegCurvetoCubicRel;
+import elemental.svg.SVGPathSegCurvetoQuadraticSmoothAbs;
+import elemental.svg.SVGPathSegList;
+import elemental.svg.SVGPathSegCurvetoQuadraticSmoothRel;
+import elemental.svg.SVGPathSegArcAbs;
+import elemental.svg.SVGPathSegCurvetoQuadraticAbs;
+import elemental.svg.SVGPathSegLinetoVerticalAbs;
+import elemental.svg.SVGAnimatedNumber;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathElement extends JsSVGElement  implements SVGPathElement {
+  protected JsSVGPathElement() {}
+
+  public final native JsSVGPathSegList getAnimatedNormalizedPathSegList() /*-{
+    return this.animatedNormalizedPathSegList;
+  }-*/;
+
+  public final native JsSVGPathSegList getAnimatedPathSegList() /*-{
+    return this.animatedPathSegList;
+  }-*/;
+
+  public final native JsSVGPathSegList getNormalizedPathSegList() /*-{
+    return this.normalizedPathSegList;
+  }-*/;
+
+  public final native JsSVGAnimatedNumber getPathLength() /*-{
+    return this.pathLength;
+  }-*/;
+
+  public final native JsSVGPathSegList getPathSegList() /*-{
+    return this.pathSegList;
+  }-*/;
+
+  public final native JsSVGPathSegArcAbs createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, boolean largeArcFlag, boolean sweepFlag) /*-{
+    return this.createSVGPathSegArcAbs(x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  }-*/;
+
+  public final native JsSVGPathSegArcRel createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, boolean largeArcFlag, boolean sweepFlag) /*-{
+    return this.createSVGPathSegArcRel(x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  }-*/;
+
+  public final native JsSVGPathSegClosePath createSVGPathSegClosePath() /*-{
+    return this.createSVGPathSegClosePath();
+  }-*/;
+
+  public final native JsSVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2) /*-{
+    return this.createSVGPathSegCurvetoCubicAbs(x, y, x1, y1, x2, y2);
+  }-*/;
+
+  public final native JsSVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2) /*-{
+    return this.createSVGPathSegCurvetoCubicRel(x, y, x1, y1, x2, y2);
+  }-*/;
+
+  public final native JsSVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2) /*-{
+    return this.createSVGPathSegCurvetoCubicSmoothAbs(x, y, x2, y2);
+  }-*/;
+
+  public final native JsSVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2) /*-{
+    return this.createSVGPathSegCurvetoCubicSmoothRel(x, y, x2, y2);
+  }-*/;
+
+  public final native JsSVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1) /*-{
+    return this.createSVGPathSegCurvetoQuadraticAbs(x, y, x1, y1);
+  }-*/;
+
+  public final native JsSVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1) /*-{
+    return this.createSVGPathSegCurvetoQuadraticRel(x, y, x1, y1);
+  }-*/;
+
+  public final native JsSVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y) /*-{
+    return this.createSVGPathSegCurvetoQuadraticSmoothAbs(x, y);
+  }-*/;
+
+  public final native JsSVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y) /*-{
+    return this.createSVGPathSegCurvetoQuadraticSmoothRel(x, y);
+  }-*/;
+
+  public final native JsSVGPathSegLinetoAbs createSVGPathSegLinetoAbs(float x, float y) /*-{
+    return this.createSVGPathSegLinetoAbs(x, y);
+  }-*/;
+
+  public final native JsSVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(float x) /*-{
+    return this.createSVGPathSegLinetoHorizontalAbs(x);
+  }-*/;
+
+  public final native JsSVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(float x) /*-{
+    return this.createSVGPathSegLinetoHorizontalRel(x);
+  }-*/;
+
+  public final native JsSVGPathSegLinetoRel createSVGPathSegLinetoRel(float x, float y) /*-{
+    return this.createSVGPathSegLinetoRel(x, y);
+  }-*/;
+
+  public final native JsSVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(float y) /*-{
+    return this.createSVGPathSegLinetoVerticalAbs(y);
+  }-*/;
+
+  public final native JsSVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(float y) /*-{
+    return this.createSVGPathSegLinetoVerticalRel(y);
+  }-*/;
+
+  public final native JsSVGPathSegMovetoAbs createSVGPathSegMovetoAbs(float x, float y) /*-{
+    return this.createSVGPathSegMovetoAbs(x, y);
+  }-*/;
+
+  public final native JsSVGPathSegMovetoRel createSVGPathSegMovetoRel(float x, float y) /*-{
+    return this.createSVGPathSegMovetoRel(x, y);
+  }-*/;
+
+  public final native int getPathSegAtLength(float distance) /*-{
+    return this.getPathSegAtLength(distance);
+  }-*/;
+
+  public final native JsSVGPoint getPointAtLength(float distance) /*-{
+    return this.getPointAtLength(distance);
+  }-*/;
+
+  public final native float getTotalLength() /*-{
+    return this.getTotalLength();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSeg.java b/elemental/src/elemental/js/svg/JsSVGPathSeg.java
new file mode 100644
index 0000000..d836762
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSeg.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSeg extends JsElementalMixinBase  implements SVGPathSeg {
+  protected JsSVGPathSeg() {}
+
+  public final native int getPathSegType() /*-{
+    return this.pathSegType;
+  }-*/;
+
+  public final native String getPathSegTypeAsLetter() /*-{
+    return this.pathSegTypeAsLetter;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegArcAbs.java b/elemental/src/elemental/js/svg/JsSVGPathSegArcAbs.java
new file mode 100644
index 0000000..bb372f6
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegArcAbs.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegArcAbs;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegArcAbs extends JsSVGPathSeg  implements SVGPathSegArcAbs {
+  protected JsSVGPathSegArcAbs() {}
+
+  public final native float getAngle() /*-{
+    return this.angle;
+  }-*/;
+
+  public final native void setAngle(float param_angle) /*-{
+    this.angle = param_angle;
+  }-*/;
+
+  public final native boolean isLargeArcFlag() /*-{
+    return this.largeArcFlag;
+  }-*/;
+
+  public final native void setLargeArcFlag(boolean param_largeArcFlag) /*-{
+    this.largeArcFlag = param_largeArcFlag;
+  }-*/;
+
+  public final native float getR1() /*-{
+    return this.r1;
+  }-*/;
+
+  public final native void setR1(float param_r1) /*-{
+    this.r1 = param_r1;
+  }-*/;
+
+  public final native float getR2() /*-{
+    return this.r2;
+  }-*/;
+
+  public final native void setR2(float param_r2) /*-{
+    this.r2 = param_r2;
+  }-*/;
+
+  public final native boolean isSweepFlag() /*-{
+    return this.sweepFlag;
+  }-*/;
+
+  public final native void setSweepFlag(boolean param_sweepFlag) /*-{
+    this.sweepFlag = param_sweepFlag;
+  }-*/;
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegArcRel.java b/elemental/src/elemental/js/svg/JsSVGPathSegArcRel.java
new file mode 100644
index 0000000..63231bf
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegArcRel.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegArcRel;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegArcRel extends JsSVGPathSeg  implements SVGPathSegArcRel {
+  protected JsSVGPathSegArcRel() {}
+
+  public final native float getAngle() /*-{
+    return this.angle;
+  }-*/;
+
+  public final native void setAngle(float param_angle) /*-{
+    this.angle = param_angle;
+  }-*/;
+
+  public final native boolean isLargeArcFlag() /*-{
+    return this.largeArcFlag;
+  }-*/;
+
+  public final native void setLargeArcFlag(boolean param_largeArcFlag) /*-{
+    this.largeArcFlag = param_largeArcFlag;
+  }-*/;
+
+  public final native float getR1() /*-{
+    return this.r1;
+  }-*/;
+
+  public final native void setR1(float param_r1) /*-{
+    this.r1 = param_r1;
+  }-*/;
+
+  public final native float getR2() /*-{
+    return this.r2;
+  }-*/;
+
+  public final native void setR2(float param_r2) /*-{
+    this.r2 = param_r2;
+  }-*/;
+
+  public final native boolean isSweepFlag() /*-{
+    return this.sweepFlag;
+  }-*/;
+
+  public final native void setSweepFlag(boolean param_sweepFlag) /*-{
+    this.sweepFlag = param_sweepFlag;
+  }-*/;
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegClosePath.java b/elemental/src/elemental/js/svg/JsSVGPathSegClosePath.java
new file mode 100644
index 0000000..5c258f8
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegClosePath.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegClosePath;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegClosePath extends JsSVGPathSeg  implements SVGPathSegClosePath {
+  protected JsSVGPathSegClosePath() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicAbs.java b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicAbs.java
new file mode 100644
index 0000000..2639262
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicAbs.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegCurvetoCubicAbs;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegCurvetoCubicAbs extends JsSVGPathSeg  implements SVGPathSegCurvetoCubicAbs {
+  protected JsSVGPathSegCurvetoCubicAbs() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getX1() /*-{
+    return this.x1;
+  }-*/;
+
+  public final native void setX1(float param_x1) /*-{
+    this.x1 = param_x1;
+  }-*/;
+
+  public final native float getX2() /*-{
+    return this.x2;
+  }-*/;
+
+  public final native void setX2(float param_x2) /*-{
+    this.x2 = param_x2;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+
+  public final native float getY1() /*-{
+    return this.y1;
+  }-*/;
+
+  public final native void setY1(float param_y1) /*-{
+    this.y1 = param_y1;
+  }-*/;
+
+  public final native float getY2() /*-{
+    return this.y2;
+  }-*/;
+
+  public final native void setY2(float param_y2) /*-{
+    this.y2 = param_y2;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicRel.java b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicRel.java
new file mode 100644
index 0000000..4c7a1e9
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicRel.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegCurvetoCubicRel;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegCurvetoCubicRel extends JsSVGPathSeg  implements SVGPathSegCurvetoCubicRel {
+  protected JsSVGPathSegCurvetoCubicRel() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getX1() /*-{
+    return this.x1;
+  }-*/;
+
+  public final native void setX1(float param_x1) /*-{
+    this.x1 = param_x1;
+  }-*/;
+
+  public final native float getX2() /*-{
+    return this.x2;
+  }-*/;
+
+  public final native void setX2(float param_x2) /*-{
+    this.x2 = param_x2;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+
+  public final native float getY1() /*-{
+    return this.y1;
+  }-*/;
+
+  public final native void setY1(float param_y1) /*-{
+    this.y1 = param_y1;
+  }-*/;
+
+  public final native float getY2() /*-{
+    return this.y2;
+  }-*/;
+
+  public final native void setY2(float param_y2) /*-{
+    this.y2 = param_y2;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicSmoothAbs.java b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicSmoothAbs.java
new file mode 100644
index 0000000..417f63f
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicSmoothAbs.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegCurvetoCubicSmoothAbs;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegCurvetoCubicSmoothAbs extends JsSVGPathSeg  implements SVGPathSegCurvetoCubicSmoothAbs {
+  protected JsSVGPathSegCurvetoCubicSmoothAbs() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getX2() /*-{
+    return this.x2;
+  }-*/;
+
+  public final native void setX2(float param_x2) /*-{
+    this.x2 = param_x2;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+
+  public final native float getY2() /*-{
+    return this.y2;
+  }-*/;
+
+  public final native void setY2(float param_y2) /*-{
+    this.y2 = param_y2;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicSmoothRel.java b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicSmoothRel.java
new file mode 100644
index 0000000..a2fa417
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoCubicSmoothRel.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegCurvetoCubicSmoothRel;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegCurvetoCubicSmoothRel extends JsSVGPathSeg  implements SVGPathSegCurvetoCubicSmoothRel {
+  protected JsSVGPathSegCurvetoCubicSmoothRel() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getX2() /*-{
+    return this.x2;
+  }-*/;
+
+  public final native void setX2(float param_x2) /*-{
+    this.x2 = param_x2;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+
+  public final native float getY2() /*-{
+    return this.y2;
+  }-*/;
+
+  public final native void setY2(float param_y2) /*-{
+    this.y2 = param_y2;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticAbs.java b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticAbs.java
new file mode 100644
index 0000000..376e1c0
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticAbs.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegCurvetoQuadraticAbs;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegCurvetoQuadraticAbs extends JsSVGPathSeg  implements SVGPathSegCurvetoQuadraticAbs {
+  protected JsSVGPathSegCurvetoQuadraticAbs() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getX1() /*-{
+    return this.x1;
+  }-*/;
+
+  public final native void setX1(float param_x1) /*-{
+    this.x1 = param_x1;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+
+  public final native float getY1() /*-{
+    return this.y1;
+  }-*/;
+
+  public final native void setY1(float param_y1) /*-{
+    this.y1 = param_y1;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticRel.java b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticRel.java
new file mode 100644
index 0000000..695dc1d
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticRel.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegCurvetoQuadraticRel;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegCurvetoQuadraticRel extends JsSVGPathSeg  implements SVGPathSegCurvetoQuadraticRel {
+  protected JsSVGPathSegCurvetoQuadraticRel() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getX1() /*-{
+    return this.x1;
+  }-*/;
+
+  public final native void setX1(float param_x1) /*-{
+    this.x1 = param_x1;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+
+  public final native float getY1() /*-{
+    return this.y1;
+  }-*/;
+
+  public final native void setY1(float param_y1) /*-{
+    this.y1 = param_y1;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticSmoothAbs.java b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticSmoothAbs.java
new file mode 100644
index 0000000..a6fe18e
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticSmoothAbs.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegCurvetoQuadraticSmoothAbs;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegCurvetoQuadraticSmoothAbs extends JsSVGPathSeg  implements SVGPathSegCurvetoQuadraticSmoothAbs {
+  protected JsSVGPathSegCurvetoQuadraticSmoothAbs() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticSmoothRel.java b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticSmoothRel.java
new file mode 100644
index 0000000..3d50e36
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegCurvetoQuadraticSmoothRel.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegCurvetoQuadraticSmoothRel;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegCurvetoQuadraticSmoothRel extends JsSVGPathSeg  implements SVGPathSegCurvetoQuadraticSmoothRel {
+  protected JsSVGPathSegCurvetoQuadraticSmoothRel() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegLinetoAbs.java b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoAbs.java
new file mode 100644
index 0000000..541d0b5
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoAbs.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegLinetoAbs;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegLinetoAbs extends JsSVGPathSeg  implements SVGPathSegLinetoAbs {
+  protected JsSVGPathSegLinetoAbs() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegLinetoHorizontalAbs.java b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoHorizontalAbs.java
new file mode 100644
index 0000000..53b4f4d
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoHorizontalAbs.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegLinetoHorizontalAbs;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegLinetoHorizontalAbs extends JsSVGPathSeg  implements SVGPathSegLinetoHorizontalAbs {
+  protected JsSVGPathSegLinetoHorizontalAbs() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegLinetoHorizontalRel.java b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoHorizontalRel.java
new file mode 100644
index 0000000..db88c2f
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoHorizontalRel.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegLinetoHorizontalRel;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegLinetoHorizontalRel extends JsSVGPathSeg  implements SVGPathSegLinetoHorizontalRel {
+  protected JsSVGPathSegLinetoHorizontalRel() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegLinetoRel.java b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoRel.java
new file mode 100644
index 0000000..3f52557
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoRel.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegLinetoRel;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegLinetoRel extends JsSVGPathSeg  implements SVGPathSegLinetoRel {
+  protected JsSVGPathSegLinetoRel() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegLinetoVerticalAbs.java b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoVerticalAbs.java
new file mode 100644
index 0000000..8d3b063
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoVerticalAbs.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegLinetoVerticalAbs;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegLinetoVerticalAbs extends JsSVGPathSeg  implements SVGPathSegLinetoVerticalAbs {
+  protected JsSVGPathSegLinetoVerticalAbs() {}
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegLinetoVerticalRel.java b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoVerticalRel.java
new file mode 100644
index 0000000..2fce6c0
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegLinetoVerticalRel.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegLinetoVerticalRel;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegLinetoVerticalRel extends JsSVGPathSeg  implements SVGPathSegLinetoVerticalRel {
+  protected JsSVGPathSegLinetoVerticalRel() {}
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegList.java b/elemental/src/elemental/js/svg/JsSVGPathSegList.java
new file mode 100644
index 0000000..66670e6
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegList.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegList extends JsElementalMixinBase  implements SVGPathSegList {
+  protected JsSVGPathSegList() {}
+
+  public final native int getNumberOfItems() /*-{
+    return this.numberOfItems;
+  }-*/;
+
+  public final native JsSVGPathSeg appendItem(SVGPathSeg newItem) /*-{
+    return this.appendItem(newItem);
+  }-*/;
+
+  public final native void clear() /*-{
+    this.clear();
+  }-*/;
+
+  public final native JsSVGPathSeg getItem(int index) /*-{
+    return this.getItem(index);
+  }-*/;
+
+  public final native JsSVGPathSeg initialize(SVGPathSeg newItem) /*-{
+    return this.initialize(newItem);
+  }-*/;
+
+  public final native JsSVGPathSeg insertItemBefore(SVGPathSeg newItem, int index) /*-{
+    return this.insertItemBefore(newItem, index);
+  }-*/;
+
+  public final native JsSVGPathSeg removeItem(int index) /*-{
+    return this.removeItem(index);
+  }-*/;
+
+  public final native JsSVGPathSeg replaceItem(SVGPathSeg newItem, int index) /*-{
+    return this.replaceItem(newItem, index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegMovetoAbs.java b/elemental/src/elemental/js/svg/JsSVGPathSegMovetoAbs.java
new file mode 100644
index 0000000..47b45fb
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegMovetoAbs.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSeg;
+import elemental.svg.SVGPathSegMovetoAbs;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegMovetoAbs extends JsSVGPathSeg  implements SVGPathSegMovetoAbs {
+  protected JsSVGPathSegMovetoAbs() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPathSegMovetoRel.java b/elemental/src/elemental/js/svg/JsSVGPathSegMovetoRel.java
new file mode 100644
index 0000000..60f0f08
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPathSegMovetoRel.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPathSegMovetoRel;
+import elemental.svg.SVGPathSeg;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPathSegMovetoRel extends JsSVGPathSeg  implements SVGPathSegMovetoRel {
+  protected JsSVGPathSegMovetoRel() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPatternElement.java b/elemental/src/elemental/js/svg/JsSVGPatternElement.java
new file mode 100644
index 0000000..ef530bc
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPatternElement.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGAnimatedTransformList;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGPatternElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPatternElement extends JsSVGElement  implements SVGPatternElement {
+  protected JsSVGPatternElement() {}
+
+  public final native JsSVGAnimatedEnumeration getPatternContentUnits() /*-{
+    return this.patternContentUnits;
+  }-*/;
+
+  public final native JsSVGAnimatedTransformList getPatternTransform() /*-{
+    return this.patternTransform;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getPatternUnits() /*-{
+    return this.patternUnits;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY() /*-{
+    return this.y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPoint.java b/elemental/src/elemental/js/svg/JsSVGPoint.java
new file mode 100644
index 0000000..de55f21
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPoint.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGMatrix;
+import elemental.svg.SVGPoint;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPoint extends JsElementalMixinBase  implements SVGPoint {
+  protected JsSVGPoint() {}
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+
+  public final native JsSVGPoint matrixTransform(SVGMatrix matrix) /*-{
+    return this.matrixTransform(matrix);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPointList.java b/elemental/src/elemental/js/svg/JsSVGPointList.java
new file mode 100644
index 0000000..3905e01
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPointList.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPointList;
+import elemental.svg.SVGPoint;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPointList extends JsElementalMixinBase  implements SVGPointList {
+  protected JsSVGPointList() {}
+
+  public final native int getNumberOfItems() /*-{
+    return this.numberOfItems;
+  }-*/;
+
+  public final native JsSVGPoint appendItem(SVGPoint item) /*-{
+    return this.appendItem(item);
+  }-*/;
+
+  public final native void clear() /*-{
+    this.clear();
+  }-*/;
+
+  public final native JsSVGPoint getItem(int index) /*-{
+    return this.getItem(index);
+  }-*/;
+
+  public final native JsSVGPoint initialize(SVGPoint item) /*-{
+    return this.initialize(item);
+  }-*/;
+
+  public final native JsSVGPoint insertItemBefore(SVGPoint item, int index) /*-{
+    return this.insertItemBefore(item, index);
+  }-*/;
+
+  public final native JsSVGPoint removeItem(int index) /*-{
+    return this.removeItem(index);
+  }-*/;
+
+  public final native JsSVGPoint replaceItem(SVGPoint item, int index) /*-{
+    return this.replaceItem(item, index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPolygonElement.java b/elemental/src/elemental/js/svg/JsSVGPolygonElement.java
new file mode 100644
index 0000000..6cdbfbe
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPolygonElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPolygonElement;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGPointList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPolygonElement extends JsSVGElement  implements SVGPolygonElement {
+  protected JsSVGPolygonElement() {}
+
+  public final native JsSVGPointList getAnimatedPoints() /*-{
+    return this.animatedPoints;
+  }-*/;
+
+  public final native JsSVGPointList getPoints() /*-{
+    return this.points;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPolylineElement.java b/elemental/src/elemental/js/svg/JsSVGPolylineElement.java
new file mode 100644
index 0000000..8a1e95e
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPolylineElement.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPolylineElement;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGPointList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPolylineElement extends JsSVGElement  implements SVGPolylineElement {
+  protected JsSVGPolylineElement() {}
+
+  public final native JsSVGPointList getAnimatedPoints() /*-{
+    return this.animatedPoints;
+  }-*/;
+
+  public final native JsSVGPointList getPoints() /*-{
+    return this.points;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGPreserveAspectRatio.java b/elemental/src/elemental/js/svg/JsSVGPreserveAspectRatio.java
new file mode 100644
index 0000000..802caca
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGPreserveAspectRatio.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGPreserveAspectRatio;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGPreserveAspectRatio extends JsElementalMixinBase  implements SVGPreserveAspectRatio {
+  protected JsSVGPreserveAspectRatio() {}
+
+  public final native int getAlign() /*-{
+    return this.align;
+  }-*/;
+
+  public final native void setAlign(int param_align) /*-{
+    this.align = param_align;
+  }-*/;
+
+  public final native int getMeetOrSlice() /*-{
+    return this.meetOrSlice;
+  }-*/;
+
+  public final native void setMeetOrSlice(int param_meetOrSlice) /*-{
+    this.meetOrSlice = param_meetOrSlice;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGRadialGradientElement.java b/elemental/src/elemental/js/svg/JsSVGRadialGradientElement.java
new file mode 100644
index 0000000..72b38d3
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGRadialGradientElement.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGGradientElement;
+import elemental.svg.SVGRadialGradientElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGRadialGradientElement extends JsSVGGradientElement  implements SVGRadialGradientElement {
+  protected JsSVGRadialGradientElement() {}
+
+  public final native JsSVGAnimatedLength getCx() /*-{
+    return this.cx;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getCy() /*-{
+    return this.cy;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getFx() /*-{
+    return this.fx;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getFy() /*-{
+    return this.fy;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getR() /*-{
+    return this.r;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGRect.java b/elemental/src/elemental/js/svg/JsSVGRect.java
new file mode 100644
index 0000000..d36f072
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGRect.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGRect;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGRect extends JsElementalMixinBase  implements SVGRect {
+  protected JsSVGRect() {}
+
+  public final native float getHeight() /*-{
+    return this.height;
+  }-*/;
+
+  public final native void setHeight(float param_height) /*-{
+    this.height = param_height;
+  }-*/;
+
+  public final native float getWidth() /*-{
+    return this.width;
+  }-*/;
+
+  public final native void setWidth(float param_width) /*-{
+    this.width = param_width;
+  }-*/;
+
+  public final native float getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native void setX(float param_x) /*-{
+    this.x = param_x;
+  }-*/;
+
+  public final native float getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native void setY(float param_y) /*-{
+    this.y = param_y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGRectElement.java b/elemental/src/elemental/js/svg/JsSVGRectElement.java
new file mode 100644
index 0000000..5822fdc
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGRectElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGRectElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGRectElement extends JsSVGElement  implements SVGRectElement {
+  protected JsSVGRectElement() {}
+
+  public final native JsSVGAnimatedLength getRx() /*-{
+    return this.rx;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getRy() /*-{
+    return this.ry;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY() /*-{
+    return this.y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGRenderingIntent.java b/elemental/src/elemental/js/svg/JsSVGRenderingIntent.java
new file mode 100644
index 0000000..90da026
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGRenderingIntent.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGRenderingIntent;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGRenderingIntent extends JsElementalMixinBase  implements SVGRenderingIntent {
+  protected JsSVGRenderingIntent() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGSVGElement.java b/elemental/src/elemental/js/svg/JsSVGSVGElement.java
new file mode 100644
index 0000000..5c4f8a0
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGSVGElement.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGTransform;
+import elemental.svg.SVGAngle;
+import elemental.dom.Element;
+import elemental.svg.SVGRect;
+import elemental.svg.SVGNumber;
+import elemental.js.dom.JsElement;
+import elemental.svg.SVGViewSpec;
+import elemental.svg.SVGSVGElement;
+import elemental.svg.SVGPoint;
+import elemental.svg.SVGAnimatedLength;
+import elemental.js.dom.JsNodeList;
+import elemental.svg.SVGMatrix;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGLength;
+import elemental.dom.NodeList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGSVGElement extends JsSVGElement  implements SVGSVGElement {
+  protected JsSVGSVGElement() {}
+
+  public final native String getContentScriptType() /*-{
+    return this.contentScriptType;
+  }-*/;
+
+  public final native void setContentScriptType(String param_contentScriptType) /*-{
+    this.contentScriptType = param_contentScriptType;
+  }-*/;
+
+  public final native String getContentStyleType() /*-{
+    return this.contentStyleType;
+  }-*/;
+
+  public final native void setContentStyleType(String param_contentStyleType) /*-{
+    this.contentStyleType = param_contentStyleType;
+  }-*/;
+
+  public final native float getCurrentScale() /*-{
+    return this.currentScale;
+  }-*/;
+
+  public final native void setCurrentScale(float param_currentScale) /*-{
+    this.currentScale = param_currentScale;
+  }-*/;
+
+  public final native JsSVGPoint getCurrentTranslate() /*-{
+    return this.currentTranslate;
+  }-*/;
+
+  public final native JsSVGViewSpec getCurrentView() /*-{
+    return this.currentView;
+  }-*/;
+
+  public final native float getPixelUnitToMillimeterX() /*-{
+    return this.pixelUnitToMillimeterX;
+  }-*/;
+
+  public final native float getPixelUnitToMillimeterY() /*-{
+    return this.pixelUnitToMillimeterY;
+  }-*/;
+
+  public final native float getScreenPixelToMillimeterX() /*-{
+    return this.screenPixelToMillimeterX;
+  }-*/;
+
+  public final native float getScreenPixelToMillimeterY() /*-{
+    return this.screenPixelToMillimeterY;
+  }-*/;
+
+  public final native boolean isUseCurrentView() /*-{
+    return this.useCurrentView;
+  }-*/;
+
+  public final native JsSVGRect getViewport() /*-{
+    return this.viewport;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY() /*-{
+    return this.y;
+  }-*/;
+
+  public final native boolean animationsPaused() /*-{
+    return this.animationsPaused();
+  }-*/;
+
+  public final native boolean checkEnclosure(SVGElement element, SVGRect rect) /*-{
+    return this.checkEnclosure(element, rect);
+  }-*/;
+
+  public final native boolean checkIntersection(SVGElement element, SVGRect rect) /*-{
+    return this.checkIntersection(element, rect);
+  }-*/;
+
+  public final native JsSVGAngle createSVGAngle() /*-{
+    return this.createSVGAngle();
+  }-*/;
+
+  public final native JsSVGLength createSVGLength() /*-{
+    return this.createSVGLength();
+  }-*/;
+
+  public final native JsSVGMatrix createSVGMatrix() /*-{
+    return this.createSVGMatrix();
+  }-*/;
+
+  public final native JsSVGNumber createSVGNumber() /*-{
+    return this.createSVGNumber();
+  }-*/;
+
+  public final native JsSVGPoint createSVGPoint() /*-{
+    return this.createSVGPoint();
+  }-*/;
+
+  public final native JsSVGRect createSVGRect() /*-{
+    return this.createSVGRect();
+  }-*/;
+
+  public final native JsSVGTransform createSVGTransform() /*-{
+    return this.createSVGTransform();
+  }-*/;
+
+  public final native JsSVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) /*-{
+    return this.createSVGTransformFromMatrix(matrix);
+  }-*/;
+
+  public final native void deselectAll() /*-{
+    this.deselectAll();
+  }-*/;
+
+  public final native void forceRedraw() /*-{
+    this.forceRedraw();
+  }-*/;
+
+  public final native float getCurrentTime() /*-{
+    return this.getCurrentTime();
+  }-*/;
+
+  public final native JsElement getElementById(String elementId) /*-{
+    return this.getElementById(elementId);
+  }-*/;
+
+  public final native JsNodeList getEnclosureList(SVGRect rect, SVGElement referenceElement) /*-{
+    return this.getEnclosureList(rect, referenceElement);
+  }-*/;
+
+  public final native JsNodeList getIntersectionList(SVGRect rect, SVGElement referenceElement) /*-{
+    return this.getIntersectionList(rect, referenceElement);
+  }-*/;
+
+  public final native void pauseAnimations() /*-{
+    this.pauseAnimations();
+  }-*/;
+
+  public final native void setCurrentTime(float seconds) /*-{
+    this.setCurrentTime(seconds);
+  }-*/;
+
+  public final native int suspendRedraw(int maxWaitMilliseconds) /*-{
+    return this.suspendRedraw(maxWaitMilliseconds);
+  }-*/;
+
+  public final native void unpauseAnimations() /*-{
+    this.unpauseAnimations();
+  }-*/;
+
+  public final native void unsuspendRedraw(int suspendHandleId) /*-{
+    this.unsuspendRedraw(suspendHandleId);
+  }-*/;
+
+  public final native void unsuspendRedrawAll() /*-{
+    this.unsuspendRedrawAll();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGScriptElement.java b/elemental/src/elemental/js/svg/JsSVGScriptElement.java
new file mode 100644
index 0000000..10922a9
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGScriptElement.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGScriptElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGScriptElement extends JsSVGElement  implements SVGScriptElement {
+  protected JsSVGScriptElement() {}
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGSetElement.java b/elemental/src/elemental/js/svg/JsSVGSetElement.java
new file mode 100644
index 0000000..d942b9d
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGSetElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGSetElement;
+import elemental.svg.SVGAnimationElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGSetElement extends JsSVGAnimationElement  implements SVGSetElement {
+  protected JsSVGSetElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGStopElement.java b/elemental/src/elemental/js/svg/JsSVGStopElement.java
new file mode 100644
index 0000000..26eb9da
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGStopElement.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGStopElement;
+import elemental.svg.SVGAnimatedNumber;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGStopElement extends JsSVGElement  implements SVGStopElement {
+  protected JsSVGStopElement() {}
+
+  public final native JsSVGAnimatedNumber getOffset() /*-{
+    return this.offset;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGStringList.java b/elemental/src/elemental/js/svg/JsSVGStringList.java
new file mode 100644
index 0000000..0c54f9e
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGStringList.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGStringList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGStringList extends JsElementalMixinBase  implements SVGStringList {
+  protected JsSVGStringList() {}
+
+  public final native int getNumberOfItems() /*-{
+    return this.numberOfItems;
+  }-*/;
+
+  public final native String appendItem(String item) /*-{
+    return this.appendItem(item);
+  }-*/;
+
+  public final native void clear() /*-{
+    this.clear();
+  }-*/;
+
+  public final native String getItem(int index) /*-{
+    return this.getItem(index);
+  }-*/;
+
+  public final native String initialize(String item) /*-{
+    return this.initialize(item);
+  }-*/;
+
+  public final native String insertItemBefore(String item, int index) /*-{
+    return this.insertItemBefore(item, index);
+  }-*/;
+
+  public final native String removeItem(int index) /*-{
+    return this.removeItem(index);
+  }-*/;
+
+  public final native String replaceItem(String item, int index) /*-{
+    return this.replaceItem(item, index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGStyleElement.java b/elemental/src/elemental/js/svg/JsSVGStyleElement.java
new file mode 100644
index 0000000..615eb69
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGStyleElement.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGStyleElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGStyleElement extends JsSVGElement  implements SVGStyleElement {
+  protected JsSVGStyleElement() {}
+
+  public final native boolean isDisabled() /*-{
+    return this.disabled;
+  }-*/;
+
+  public final native void setDisabled(boolean param_disabled) /*-{
+    this.disabled = param_disabled;
+  }-*/;
+
+  public final native String getMedia() /*-{
+    return this.media;
+  }-*/;
+
+  public final native void setMedia(String param_media) /*-{
+    this.media = param_media;
+  }-*/;
+
+  public final native String getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setType(String param_type) /*-{
+    this.type = param_type;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGSwitchElement.java b/elemental/src/elemental/js/svg/JsSVGSwitchElement.java
new file mode 100644
index 0000000..b2548c8
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGSwitchElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGSwitchElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGSwitchElement extends JsSVGElement  implements SVGSwitchElement {
+  protected JsSVGSwitchElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGSymbolElement.java b/elemental/src/elemental/js/svg/JsSVGSymbolElement.java
new file mode 100644
index 0000000..987cffd
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGSymbolElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGSymbolElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGSymbolElement extends JsSVGElement  implements SVGSymbolElement {
+  protected JsSVGSymbolElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGTRefElement.java b/elemental/src/elemental/js/svg/JsSVGTRefElement.java
new file mode 100644
index 0000000..8e5102e
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGTRefElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGTRefElement;
+import elemental.svg.SVGTextPositioningElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGTRefElement extends JsSVGTextPositioningElement  implements SVGTRefElement {
+  protected JsSVGTRefElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGTSpanElement.java b/elemental/src/elemental/js/svg/JsSVGTSpanElement.java
new file mode 100644
index 0000000..25d89e7
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGTSpanElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGTextPositioningElement;
+import elemental.svg.SVGTSpanElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGTSpanElement extends JsSVGTextPositioningElement  implements SVGTSpanElement {
+  protected JsSVGTSpanElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGTextContentElement.java b/elemental/src/elemental/js/svg/JsSVGTextContentElement.java
new file mode 100644
index 0000000..9b10416
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGTextContentElement.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGRect;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGPoint;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGTextContentElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGTextContentElement extends JsSVGElement  implements SVGTextContentElement {
+  protected JsSVGTextContentElement() {}
+
+  public final native JsSVGAnimatedEnumeration getLengthAdjust() /*-{
+    return this.lengthAdjust;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getTextLength() /*-{
+    return this.textLength;
+  }-*/;
+
+  public final native int getCharNumAtPosition(SVGPoint point) /*-{
+    return this.getCharNumAtPosition(point);
+  }-*/;
+
+  public final native float getComputedTextLength() /*-{
+    return this.getComputedTextLength();
+  }-*/;
+
+  public final native JsSVGPoint getEndPositionOfChar(int offset) /*-{
+    return this.getEndPositionOfChar(offset);
+  }-*/;
+
+  public final native JsSVGRect getExtentOfChar(int offset) /*-{
+    return this.getExtentOfChar(offset);
+  }-*/;
+
+  public final native int getNumberOfChars() /*-{
+    return this.getNumberOfChars();
+  }-*/;
+
+  public final native float getRotationOfChar(int offset) /*-{
+    return this.getRotationOfChar(offset);
+  }-*/;
+
+  public final native JsSVGPoint getStartPositionOfChar(int offset) /*-{
+    return this.getStartPositionOfChar(offset);
+  }-*/;
+
+  public final native float getSubStringLength(int offset, int length) /*-{
+    return this.getSubStringLength(offset, length);
+  }-*/;
+
+  public final native void selectSubString(int offset, int length) /*-{
+    this.selectSubString(offset, length);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGTextElement.java b/elemental/src/elemental/js/svg/JsSVGTextElement.java
new file mode 100644
index 0000000..5975b7d
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGTextElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGTextPositioningElement;
+import elemental.svg.SVGTextElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGTextElement extends JsSVGTextPositioningElement  implements SVGTextElement {
+  protected JsSVGTextElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGTextPathElement.java b/elemental/src/elemental/js/svg/JsSVGTextPathElement.java
new file mode 100644
index 0000000..39c8a96
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGTextPathElement.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGAnimatedEnumeration;
+import elemental.svg.SVGTextContentElement;
+import elemental.svg.SVGTextPathElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGTextPathElement extends JsSVGTextContentElement  implements SVGTextPathElement {
+  protected JsSVGTextPathElement() {}
+
+  public final native JsSVGAnimatedEnumeration getMethod() /*-{
+    return this.method;
+  }-*/;
+
+  public final native JsSVGAnimatedEnumeration getSpacing() /*-{
+    return this.spacing;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getStartOffset() /*-{
+    return this.startOffset;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGTextPositioningElement.java b/elemental/src/elemental/js/svg/JsSVGTextPositioningElement.java
new file mode 100644
index 0000000..b41dd7f
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGTextPositioningElement.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLengthList;
+import elemental.svg.SVGTextPositioningElement;
+import elemental.svg.SVGTextContentElement;
+import elemental.svg.SVGAnimatedNumberList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGTextPositioningElement extends JsSVGTextContentElement  implements SVGTextPositioningElement {
+  protected JsSVGTextPositioningElement() {}
+
+  public final native JsSVGAnimatedLengthList getDx() /*-{
+    return this.dx;
+  }-*/;
+
+  public final native JsSVGAnimatedLengthList getDy() /*-{
+    return this.dy;
+  }-*/;
+
+  public final native JsSVGAnimatedNumberList getRotate() /*-{
+    return this.rotate;
+  }-*/;
+
+  public final native JsSVGAnimatedLengthList getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLengthList getY() /*-{
+    return this.y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGTitleElement.java b/elemental/src/elemental/js/svg/JsSVGTitleElement.java
new file mode 100644
index 0000000..5372c63
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGTitleElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGTitleElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGTitleElement extends JsSVGElement  implements SVGTitleElement {
+  protected JsSVGTitleElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGTransform.java b/elemental/src/elemental/js/svg/JsSVGTransform.java
new file mode 100644
index 0000000..0c79960
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGTransform.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGMatrix;
+import elemental.svg.SVGTransform;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGTransform extends JsElementalMixinBase  implements SVGTransform {
+  protected JsSVGTransform() {}
+
+  public final native float getAngle() /*-{
+    return this.angle;
+  }-*/;
+
+  public final native JsSVGMatrix getMatrix() /*-{
+    return this.matrix;
+  }-*/;
+
+  public final native int getType() /*-{
+    return this.type;
+  }-*/;
+
+  public final native void setRotate(float angle, float cx, float cy) /*-{
+    this.setRotate(angle, cx, cy);
+  }-*/;
+
+  public final native void setScale(float sx, float sy) /*-{
+    this.setScale(sx, sy);
+  }-*/;
+
+  public final native void setSkewX(float angle) /*-{
+    this.setSkewX(angle);
+  }-*/;
+
+  public final native void setSkewY(float angle) /*-{
+    this.setSkewY(angle);
+  }-*/;
+
+  public final native void setTranslate(float tx, float ty) /*-{
+    this.setTranslate(tx, ty);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGTransformList.java b/elemental/src/elemental/js/svg/JsSVGTransformList.java
new file mode 100644
index 0000000..4d4e737
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGTransformList.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGTransform;
+import elemental.svg.SVGMatrix;
+import elemental.svg.SVGTransformList;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGTransformList extends JsElementalMixinBase  implements SVGTransformList {
+  protected JsSVGTransformList() {}
+
+  public final native int getNumberOfItems() /*-{
+    return this.numberOfItems;
+  }-*/;
+
+  public final native JsSVGTransform appendItem(SVGTransform item) /*-{
+    return this.appendItem(item);
+  }-*/;
+
+  public final native void clear() /*-{
+    this.clear();
+  }-*/;
+
+  public final native JsSVGTransform consolidate() /*-{
+    return this.consolidate();
+  }-*/;
+
+  public final native JsSVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) /*-{
+    return this.createSVGTransformFromMatrix(matrix);
+  }-*/;
+
+  public final native JsSVGTransform getItem(int index) /*-{
+    return this.getItem(index);
+  }-*/;
+
+  public final native JsSVGTransform initialize(SVGTransform item) /*-{
+    return this.initialize(item);
+  }-*/;
+
+  public final native JsSVGTransform insertItemBefore(SVGTransform item, int index) /*-{
+    return this.insertItemBefore(item, index);
+  }-*/;
+
+  public final native JsSVGTransform removeItem(int index) /*-{
+    return this.removeItem(index);
+  }-*/;
+
+  public final native JsSVGTransform replaceItem(SVGTransform item, int index) /*-{
+    return this.replaceItem(item, index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGUnitTypes.java b/elemental/src/elemental/js/svg/JsSVGUnitTypes.java
new file mode 100644
index 0000000..98f8829
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGUnitTypes.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGUnitTypes;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGUnitTypes extends JsElementalMixinBase  implements SVGUnitTypes {
+  protected JsSVGUnitTypes() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGUseElement.java b/elemental/src/elemental/js/svg/JsSVGUseElement.java
new file mode 100644
index 0000000..fb72872
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGUseElement.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedLength;
+import elemental.svg.SVGUseElement;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGElementInstance;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGUseElement extends JsSVGElement  implements SVGUseElement {
+  protected JsSVGUseElement() {}
+
+  public final native JsSVGElementInstance getAnimatedInstanceRoot() /*-{
+    return this.animatedInstanceRoot;
+  }-*/;
+
+  public final native JsSVGElementInstance getInstanceRoot() /*-{
+    return this.instanceRoot;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getX() /*-{
+    return this.x;
+  }-*/;
+
+  public final native JsSVGAnimatedLength getY() /*-{
+    return this.y;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGVKernElement.java b/elemental/src/elemental/js/svg/JsSVGVKernElement.java
new file mode 100644
index 0000000..447c95f
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGVKernElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGVKernElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGVKernElement extends JsSVGElement  implements SVGVKernElement {
+  protected JsSVGVKernElement() {}
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGViewElement.java b/elemental/src/elemental/js/svg/JsSVGViewElement.java
new file mode 100644
index 0000000..d6d8926
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGViewElement.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGStringList;
+import elemental.svg.SVGViewElement;
+import elemental.svg.SVGElement;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGViewElement extends JsSVGElement  implements SVGViewElement {
+  protected JsSVGViewElement() {}
+
+  public final native JsSVGStringList getViewTarget() /*-{
+    return this.viewTarget;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGViewSpec.java b/elemental/src/elemental/js/svg/JsSVGViewSpec.java
new file mode 100644
index 0000000..650786e
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGViewSpec.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.svg.SVGAnimatedRect;
+import elemental.svg.SVGAnimatedPreserveAspectRatio;
+import elemental.svg.SVGTransformList;
+import elemental.svg.SVGElement;
+import elemental.svg.SVGViewSpec;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGViewSpec extends JsElementalMixinBase  implements SVGViewSpec {
+  protected JsSVGViewSpec() {}
+
+  public final native String getPreserveAspectRatioString() /*-{
+    return this.preserveAspectRatioString;
+  }-*/;
+
+  public final native JsSVGTransformList getTransform() /*-{
+    return this.transform;
+  }-*/;
+
+  public final native String getTransformString() /*-{
+    return this.transformString;
+  }-*/;
+
+  public final native String getViewBoxString() /*-{
+    return this.viewBoxString;
+  }-*/;
+
+  public final native JsSVGElement getViewTarget() /*-{
+    return this.viewTarget;
+  }-*/;
+
+  public final native String getViewTargetString() /*-{
+    return this.viewTargetString;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/svg/JsSVGZoomEvent.java b/elemental/src/elemental/js/svg/JsSVGZoomEvent.java
new file mode 100644
index 0000000..ae87bbc
--- /dev/null
+++ b/elemental/src/elemental/js/svg/JsSVGZoomEvent.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.svg;
+import elemental.events.UIEvent;
+import elemental.svg.SVGZoomEvent;
+import elemental.js.events.JsUIEvent;
+import elemental.svg.SVGPoint;
+import elemental.svg.SVGRect;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsSVGZoomEvent extends JsUIEvent  implements SVGZoomEvent {
+  protected JsSVGZoomEvent() {}
+
+  public final native float getNewScale() /*-{
+    return this.newScale;
+  }-*/;
+
+  public final native JsSVGPoint getNewTranslate() /*-{
+    return this.newTranslate;
+  }-*/;
+
+  public final native float getPreviousScale() /*-{
+    return this.previousScale;
+  }-*/;
+
+  public final native JsSVGPoint getPreviousTranslate() /*-{
+    return this.previousTranslate;
+  }-*/;
+
+  public final native JsSVGRect getZoomRectScreen() /*-{
+    return this.zoomRectScreen;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/traversal/JsNodeFilter.java b/elemental/src/elemental/js/traversal/JsNodeFilter.java
new file mode 100644
index 0000000..cf0f792
--- /dev/null
+++ b/elemental/src/elemental/js/traversal/JsNodeFilter.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.traversal;
+import elemental.dom.Node;
+import elemental.traversal.NodeFilter;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNodeFilter extends JsElementalMixinBase  implements NodeFilter {
+  protected JsNodeFilter() {}
+
+  public final native short acceptNode(Node n) /*-{
+    return this.acceptNode(n);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/traversal/JsNodeIterator.java b/elemental/src/elemental/js/traversal/JsNodeIterator.java
new file mode 100644
index 0000000..c6c91b7
--- /dev/null
+++ b/elemental/src/elemental/js/traversal/JsNodeIterator.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.traversal;
+import elemental.traversal.NodeFilter;
+import elemental.dom.Node;
+import elemental.traversal.NodeIterator;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsNodeIterator extends JsElementalMixinBase  implements NodeIterator {
+  protected JsNodeIterator() {}
+
+  public final native boolean isExpandEntityReferences() /*-{
+    return this.expandEntityReferences;
+  }-*/;
+
+  public final native JsNodeFilter getFilter() /*-{
+    return this.filter;
+  }-*/;
+
+  public final native boolean isPointerBeforeReferenceNode() /*-{
+    return this.pointerBeforeReferenceNode;
+  }-*/;
+
+  public final native JsNode getReferenceNode() /*-{
+    return this.referenceNode;
+  }-*/;
+
+  public final native JsNode getRoot() /*-{
+    return this.root;
+  }-*/;
+
+  public final native int getWhatToShow() /*-{
+    return this.whatToShow;
+  }-*/;
+
+  public final native void detach() /*-{
+    this.detach();
+  }-*/;
+
+  public final native JsNode nextNode() /*-{
+    return this.nextNode();
+  }-*/;
+
+  public final native JsNode previousNode() /*-{
+    return this.previousNode();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/traversal/JsTreeWalker.java b/elemental/src/elemental/js/traversal/JsTreeWalker.java
new file mode 100644
index 0000000..bfcf2ec
--- /dev/null
+++ b/elemental/src/elemental/js/traversal/JsTreeWalker.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.traversal;
+import elemental.dom.Node;
+import elemental.traversal.NodeFilter;
+import elemental.traversal.TreeWalker;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsTreeWalker extends JsElementalMixinBase  implements TreeWalker {
+  protected JsTreeWalker() {}
+
+  public final native JsNode getCurrentNode() /*-{
+    return this.currentNode;
+  }-*/;
+
+  public final native void setCurrentNode(Node param_currentNode) /*-{
+    this.currentNode = param_currentNode;
+  }-*/;
+
+  public final native boolean isExpandEntityReferences() /*-{
+    return this.expandEntityReferences;
+  }-*/;
+
+  public final native JsNodeFilter getFilter() /*-{
+    return this.filter;
+  }-*/;
+
+  public final native JsNode getRoot() /*-{
+    return this.root;
+  }-*/;
+
+  public final native int getWhatToShow() /*-{
+    return this.whatToShow;
+  }-*/;
+
+  public final native JsNode firstChild() /*-{
+    return this.firstChild();
+  }-*/;
+
+  public final native JsNode lastChild() /*-{
+    return this.lastChild();
+  }-*/;
+
+  public final native JsNode nextNode() /*-{
+    return this.nextNode();
+  }-*/;
+
+  public final native JsNode nextSibling() /*-{
+    return this.nextSibling();
+  }-*/;
+
+  public final native JsNode parentNode() /*-{
+    return this.parentNode();
+  }-*/;
+
+  public final native JsNode previousNode() /*-{
+    return this.previousNode();
+  }-*/;
+
+  public final native JsNode previousSibling() /*-{
+    return this.previousSibling();
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/util/JsArrayOf.java b/elemental/src/elemental/js/util/JsArrayOf.java
new file mode 100644
index 0000000..74d9e39
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsArrayOf.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.util.ArrayOf;
+import elemental.util.CanCompare;
+
+/**
+ * JavaScript native implementation of {@link ArrayOf}.
+ */
+public final class JsArrayOf<T> extends JavaScriptObject implements ArrayOf<T> {
+  
+  /**
+   * Create a new empty Array instance.
+   */
+  public static <T> JsArrayOf<T> create() {
+    return JavaScriptObject.createArray().cast();
+  }
+  
+  static native boolean isEmpty(JavaScriptObject array) /*-{
+    return !array.length;
+  }-*/;
+
+  static native <T extends JavaScriptObject> T splice(JavaScriptObject array, int index, int count) /*-{
+    return array.splice(index, count);
+  }-*/;
+
+  protected JsArrayOf() {
+  }
+  
+  public native JsArrayOf<T> concat(ArrayOf<T> values) /*-{
+    return this.concat(values);
+  }-*/;
+  
+  public boolean contains(T value) {
+    return indexOf(value) != -1;
+  }
+
+  public native T get(int index) /*-{
+      return this[index];
+  }-*/;
+
+  public native int indexOf(T value) /*-{
+    return this.indexOf(value);
+  }-*/;
+
+  public native void insert(int index, T value) /*-{
+    this.splice(index, 0, value);
+  }-*/;
+
+  public boolean isEmpty() {
+    return isEmpty(this);
+  }
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  public String join() {
+    // As per JS spec
+    return join(",");
+  }
+
+  public native String join(String separator) /*-{
+    return this.join(separator);
+  }-*/;
+
+  public native int length() /*-{
+      return this.length;
+  }-*/;
+
+  public native T peek() /*-{
+    return this[this.length - 1];
+  }-*/;
+
+  public native T pop() /*-{
+    return this.pop();
+  }-*/;
+  
+  /**
+   * Pushes the given value onto the end of the array.
+   */
+  public native void push(T value) /*-{
+    this[this.length] = value;
+  }-*/;
+  
+  public void remove(T value) {
+    final int index = indexOf(value);
+    if (index != -1) {
+      splice(index, 1);
+    }
+  }
+  
+  public void removeByIndex(int index) {
+    splice(index, 1);
+  }
+
+  public native void set(int index, T value) /*-{
+      this[index] = value;
+  }-*/;
+
+  public native void setLength(int newLength) /*-{
+    this.length = newLength;
+  }-*/;
+
+  public native T shift() /*-{
+    return this.shift();
+  }-*/;
+
+  public native void sort(CanCompare<T> comparator) /*-{
+    this.sort(function(a, b) {
+      return comparator.@elemental.util.CanCompare::compare(Ljava/lang/Object;Ljava/lang/Object;)(a, b);
+    });
+  }-*/;
+
+  public JsArrayOf<T> splice(int index, int count) {
+    return splice(this, index, count);
+  }
+
+  public native void unshift(T value) /*-{
+    this.unshift(value);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/util/JsArrayOfBoolean.java b/elemental/src/elemental/js/util/JsArrayOfBoolean.java
new file mode 100644
index 0000000..1b3495d
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsArrayOfBoolean.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArrayBoolean;
+
+import elemental.util.ArrayOfBoolean;
+
+/**
+ * JavaScript native implementation of {@link ArrayOfBoolean}.
+ */
+public final class JsArrayOfBoolean extends JsArrayBoolean implements ArrayOfBoolean {
+
+  /**
+   * Create a new empty instance.
+   */
+  public static JsArrayOfBoolean create() {
+    return JavaScriptObject.createArray().cast();
+  }
+
+  protected JsArrayOfBoolean() {
+  }
+
+  public native JsArrayOfBoolean concat(ArrayOfBoolean values) /*-{
+    return this.concat(values);
+  }-*/;
+
+  public boolean contains(boolean value) {
+    return indexOf(value) != -1;
+  }
+
+  public native int indexOf(boolean value) /*-{
+    return this.indexOf(value);
+  }-*/;
+
+  public native void insert(int index, boolean value) /*-{
+    this.splice(index, 0, value);
+  }-*/;
+
+  public boolean isEmpty() {
+    return JsArrayOf.isEmpty(this);
+  }
+
+  public native boolean isSet(int index) /*-{
+    return this[index] !== undefined;
+  }-*/;
+
+  public native boolean peek() /*-{
+    return this[this.length - 1];
+  }-*/;
+
+  public native boolean pop() /*-{
+    return this.pop();
+  }-*/;
+
+  public void remove(boolean value) {
+    final int index = indexOf(value);
+    if (index != -1) {
+      splice(index, 1);
+    }
+  }
+
+  public void removeByIndex(int index) {
+    splice(index, 1);
+  }
+
+  public JsArrayOfBoolean splice(int index, int count) {
+    return JsArrayOf.splice(this, index, count);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsArrayOfInt.java b/elemental/src/elemental/js/util/JsArrayOfInt.java
new file mode 100644
index 0000000..b95e64e
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsArrayOfInt.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArrayInteger;
+
+import elemental.util.ArrayOfInt;
+import elemental.util.CanCompareInt;
+
+/**
+ * JavaScript implementation of {@link ArrayOfInt}.
+ */
+public final class JsArrayOfInt extends JsArrayInteger implements ArrayOfInt {
+
+  /**
+   * Create a new empty instance.
+   */
+  public static JsArrayOfInt create() {
+    return JavaScriptObject.createArray().cast();
+  }
+
+  protected JsArrayOfInt() {
+  }
+
+  public native JsArrayOfInt concat(ArrayOfInt values) /*-{
+    return this.concat(values);
+  }-*/;
+
+  public boolean contains(int value) {
+    return indexOf(value) != -1;
+  }
+
+  public native int indexOf(int value) /*-{
+    return this.indexOf(value);
+  }-*/;
+
+  public native void insert(int index, int value) /*-{
+    this.splice(index, 0, value);
+  }-*/;
+
+  public boolean isEmpty() {
+    return JsArrayOf.isEmpty(this);
+  }
+
+  public native boolean isSet(int index) /*-{
+    return this[index] !== undefined;
+  }-*/;
+
+  public native int peek() /*-{
+    return this[this.length - 1];
+  }-*/;
+
+  public native int pop() /*-{
+    return this.pop();
+  }-*/;
+
+  public void remove(int value) {
+    final int index = indexOf(value);
+    if (index != -1) {
+      splice(index, 1);
+    }
+  }
+
+  public void removeByIndex(int index) {
+    splice(index, 1);
+  }
+
+  public native void sort() /*-{
+    this.sort();
+  }-*/;
+
+  public native void sort(CanCompareInt comparator) /*-{
+    this.sort(function(a, b) {
+      return comparator.@elemental.util.CanCompareInt::compare(II)(a, b);
+    });
+  }-*/;
+
+  public JsArrayOfInt splice(int index, int count) {
+    return JsArrayOf.splice(this, index, count);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsArrayOfNumber.java b/elemental/src/elemental/js/util/JsArrayOfNumber.java
new file mode 100644
index 0000000..b902c8a
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsArrayOfNumber.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArrayNumber;
+
+import elemental.util.ArrayOfNumber;
+import elemental.util.CanCompareNumber;
+
+/**
+ * JavaScript native implementation of {@link ArrayOfNumber}.
+ */
+public final class JsArrayOfNumber extends JsArrayNumber implements ArrayOfNumber {
+
+  /**
+   * Create a new empty instance.
+   */
+  public static JsArrayOfNumber create() {
+    return JavaScriptObject.createArray().cast();
+  }
+
+  protected JsArrayOfNumber() {
+  }
+
+  public native JsArrayOfNumber concat(ArrayOfNumber values) /*-{
+    return this.concat(values);
+  }-*/;
+
+  public native void insert(int index, double value) /*-{
+    this.splice(index, 0, value);
+  }-*/;
+
+  public boolean isEmpty() {
+    return JsArrayOf.isEmpty(this);
+  }
+
+  public native boolean isSet(int index) /*-{
+    return this[index] !== undefined;
+  }-*/;
+
+  public native double peek() /*-{
+    return this[this.length - 1];
+  }-*/;
+
+  public native double pop() /*-{
+    return this.pop();
+  }-*/;
+
+  public void removeByIndex(int index) {
+    splice(index, 1);
+  }
+
+  public native void sort() /*-{
+    this.sort();
+  }-*/;
+
+  public native void sort(CanCompareNumber comparator) /*-{
+    this.sort(function(a, b) {
+      return comparator.@elemental.util.CanCompareNumber::compare(DD)(a, b);
+    });
+  }-*/;
+
+  public JsArrayOfNumber splice(int index, int count) {
+    return JsArrayOf.splice(this, index, count);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsArrayOfString.java b/elemental/src/elemental/js/util/JsArrayOfString.java
new file mode 100644
index 0000000..3b50028
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsArrayOfString.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArrayString;
+
+import elemental.util.ArrayOfString;
+import elemental.util.CanCompareString;
+
+/**
+ * JavaScript native implementation of {@link ArrayOfString}.
+ */
+public final class JsArrayOfString extends JsArrayString implements ArrayOfString {
+  
+  /**
+   * Create a new empty instance.
+   */
+  public static JsArrayOfString create() {
+    return JavaScriptObject.createArray().cast();
+  }
+
+  protected JsArrayOfString() {
+  }
+
+  public native JsArrayOfString concat(ArrayOfString values) /*-{
+    return this.concat(values);
+  }-*/;
+
+  public boolean contains(String value) {
+    return indexOf(value) != -1;
+  }
+
+  public native int indexOf(String value) /*-{
+    return this.indexOf(value);
+  }-*/;
+
+  public native void insert(int index, String value) /*-{
+    this.splice(index, 0, value);
+  }-*/;
+
+  public boolean isEmpty() {
+    return JsArrayOf.isEmpty(this);
+  }
+
+  public native String peek() /*-{
+    return this[this.length - 1];
+  }-*/;
+
+  public native String pop() /*-{
+    return this.pop();
+  }-*/;
+
+  public void remove(String value) {
+    final int index = indexOf(value);
+    if (index != -1) {
+      splice(index, 1);
+    }
+  }
+
+  public void removeByIndex(int index) {
+    splice(index, 1);
+  }
+
+  public native void sort() /*-{
+    this.sort();
+  }-*/;
+
+  public native void sort(CanCompareString comparator) /*-{
+    this.sort(function(a, b) {
+      return comparator.@elemental.util.CanCompareString::compare(Ljava/lang/String;Ljava/lang/String;)(a, b);
+    });
+  }-*/;
+
+  public JsArrayOfString splice(int index, int count) {
+    return JsArrayOf.splice(this, index, count);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsElementalBase.java b/elemental/src/elemental/js/util/JsElementalBase.java
new file mode 100644
index 0000000..56fac9e
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsElementalBase.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import elemental.util.*;
+
+/**
+ * All Elemental classes must extend this base class, mixes in support for
+ * Indexable, Settable, Mappable.
+ */
+// TODO (cromwellian) add generic when JSO bug in gwt-dev fixed
+public class JsElementalBase extends JavaScriptObject implements Mappable, 
+    Indexable, IndexableInt, IndexableNumber, Settable, SettableInt, SettableNumber {
+
+  protected JsElementalBase() {}
+
+  public final native Object /* T */ at(int index) /*-{
+    return this[index];
+  }-*/;
+
+  public final native double numberAt(int index) /*-{
+    return this[index];
+  }-*/;
+
+  public final native int intAt(int index) /*-{
+    return this[index];
+  }-*/;
+
+  public final native int length() /*-{
+    return this.length;
+  }-*/;
+
+  public final native void setAt(int index, Object /* T */ value) /*-{
+    this[index] = value;
+  }-*/;
+
+  public final native void setAt(int index, double value) /*-{
+    this[index] = value;
+  }-*/;
+
+  public final native void setAt(int index, int value) /*-{
+    this[index] = value;
+  }-*/;
+
+  public final native Object /* T */ at(String key) /*-{
+    return this[key];
+  }-*/;
+
+  public final native int intAt(String key) /*-{
+    return this[key];
+  }-*/;
+
+  public final native double numberAt(String key) /*-{
+    return this[key];
+  }-*/;
+
+  public final native void setAt(String key, Object /* T */ value) /*-{
+    this[key] = value;
+  }-*/;
+
+  public final native void setAt(String key, int value) /*-{
+    this[key] = value;
+  }-*/;
+
+  public final native void setAt(String key, double value) /*-{
+    this[key] = value;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/util/JsGlobals.java b/elemental/src/elemental/js/util/JsGlobals.java
new file mode 100644
index 0000000..16df9b4
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsGlobals.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package elemental.js.util;
+
+
+/**
+ * A utility class for accessing global functions and values in an ECMAScript
+ * context.
+ */
+public class JsGlobals {
+  /**
+   * Decodes an encoded URI to a URI string.
+   */
+  public native static String decodeURI(String encodedURI) /*-{
+    return decodeURI(encodedURI);
+  }-*/;
+
+  /**
+   * Decodes an encoded URI component to a URI component string.
+   */
+  public native static String decodeURIComponent(String encodedURIComponent) /*-{
+    return decodeURIComponent(encodedURIComponent);
+  }-*/;
+
+  /**
+   * Encodes a URI string by escaping all characters not allowed in URIs.
+   */
+  public native static String encodeURI(String uri) /*-{
+    return encodeURI(uri);
+  }-*/;
+
+  /**
+   * Encodes a URI component string by escaping all characters not allowed in
+   * URIs.
+   */
+  public static native String encodeURIComponent(String uriComponent) /*-{
+    return encodeURIComponent(uriComponent);
+  }-*/;
+
+  /**
+   * Indicates if <code>value</code> is a finite number.
+   */
+  public native static boolean isFinite(double value) /*-{
+    return isFinite(value);
+  }-*/;
+
+  /**
+   * Indicates if <code>value</code> is <code>NaN</code>.
+   */
+  public native static boolean isNaN(double value) /*-{
+    return isNaN(value);
+  }-*/;
+
+  /**
+   * Produces a <code>double</code> value by interpreting the contents of
+   * <code>value</code> as a decimal literal.
+   */
+  public native static double parseFloat(String value) /*-{
+    return parseFloat(value);
+  }-*/;
+
+  /**
+   * Produces a <code>double</code> value by interpreting the contents of
+   * <code>value</code> as a decimal literal.
+   */
+  public native static double parseFloat(String value, int radix) /*-{
+    return parseFloat(value, radix);
+  }-*/;
+
+  /**
+   * Produces a integral value by interpreting the contents of
+   * <code>value</code> as a integer literal. The value returned by this method
+   * will be an integral value or <code>NaN</code>, so the return value is a
+   * <code>double</code>.
+   * 
+   * <pre>
+   * Example use:
+   * // Will yield zero if s is not a valid integer.
+   * int value = (int)parseInt(s);
+   * 
+   * // To check if the value is valid.
+   * double value = parseInt(s);
+   * if (isNaN(value))
+   *   //Invalid value.
+   * </pre>
+   */
+  public native static double parseInt(String value) /*-{
+    return parseInt(value);
+  }-*/;
+
+  /**
+   * Produces a integral value by interpreting the contents of
+   * <code>value</code> as a integer literal. The value returned by this method
+   * will be an integral value or <code>NaN</code>, so the return value is a
+   * <code>double</code>.
+   * 
+   * <pre>
+   * Example use:
+   * // Will yield zero if s is not a valid integer.
+   * int value = (int)parseInt(s);
+   * 
+   * // To check if the value is valid.
+   * double value = parseInt(s);
+   * if (isNaN(value))
+   *   //Invalid value.
+   * </pre>
+   */
+  public native static double parseInt(String value, int radix) /*-{
+    return parseInt(value, radix);
+  }-*/;
+
+  private JsGlobals() {
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsIndexable.java b/elemental/src/elemental/js/util/JsIndexable.java
new file mode 100644
index 0000000..e062f9e
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsIndexable.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import elemental.util.*;
+
+/**
+ */
+// TODO (cromwellian) add generic when JSO bug in gwt-dev fixed
+public class JsIndexable extends JsElementalBase implements Indexable {
+  protected JsIndexable() {}
+}
diff --git a/elemental/src/elemental/js/util/JsMapFromIntTo.java b/elemental/src/elemental/js/util/JsMapFromIntTo.java
new file mode 100644
index 0000000..d3ab0da
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsMapFromIntTo.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.util.MapFromIntTo;
+
+/**
+ * JavaScript native implementation of {@link MapFromIntTo}.
+ */
+public final class JsMapFromIntTo<V> extends JavaScriptObject implements MapFromIntTo<V> {
+  
+  /**
+   * Create a new empty map instance.
+   */
+  public static <T> JsMapFromIntTo<T> create() {
+    return JavaScriptObject.createArray().cast();
+  }
+
+  protected JsMapFromIntTo() {
+  }
+
+  public native V get(int key) /*-{
+      return this[key];
+  }-*/;
+
+  final static native boolean hasKey(JavaScriptObject map, int key) /*-{
+    return map[key] !== undefined;
+  }-*/;
+
+  final static native void remove(JavaScriptObject map, int key) /*-{
+    delete map[key];
+  }-*/;
+
+  final static native JsArrayOfInt keys(JavaScriptObject map) /*-{
+    var data = [];
+    for (var p in map) {
+      var key = parseInt(p);
+      if (!isNaN(key)) {
+        data.push(key);
+      }
+    }
+    return data;
+  }-*/;
+
+  final public boolean hasKey(int key) {
+    return hasKey(this, key);
+  }
+
+  final public JsArrayOfInt keys() {
+    return keys(this);
+  }
+
+  public native void put(int key, V value) /*-{
+      this[key] = value;
+  }-*/;
+
+  final public void remove(int key) {
+    remove(this, key);
+  }
+
+  final public JsArrayOf<V> values() {
+    return JsMapFromStringTo.values(this);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsMapFromIntToString.java b/elemental/src/elemental/js/util/JsMapFromIntToString.java
new file mode 100644
index 0000000..7eeae7e
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsMapFromIntToString.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.util.MapFromIntToString;
+
+/**
+ * JavaScript native implementation of {@link MapFromIntToString}.
+ */
+public final class JsMapFromIntToString extends JavaScriptObject implements MapFromIntToString {
+  /**
+   * Create a new empty map instance.
+   */
+  public static JsMapFromIntToString create() {
+    return JavaScriptObject.createArray().cast();
+  }
+
+  protected JsMapFromIntToString() {
+  }
+
+  public native String get(int key) /*-{
+    return this[key];
+  }-*/;
+
+  public boolean hasKey(int key) {
+    return JsMapFromIntTo.hasKey(this, key);
+  }
+
+  public JsArrayOfInt keys() {
+    return JsMapFromIntTo.keys(this);
+  }
+
+  public native void put(int key, String value) /*-{
+    this[key] = value;
+  }-*/;
+
+  public void remove(int key) {
+    JsMapFromIntTo.remove(this, key);
+  }
+
+  public native void set(int key, String value) /*-{
+    this[key] = value;
+  }-*/;
+
+  public JsArrayOfString values() {
+    return JsMapFromStringTo.values(this);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsMapFromStringTo.java b/elemental/src/elemental/js/util/JsMapFromStringTo.java
new file mode 100644
index 0000000..b847ea2
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsMapFromStringTo.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.util.MapFromStringTo;
+
+/**
+ * JavaScript native implementation of {@link MapFromStringTo}.
+ */
+public final class JsMapFromStringTo<V> extends JavaScriptObject implements MapFromStringTo<V> {
+
+  /**
+   * Create a new empty map instance.
+   */
+  public static native <T> JsMapFromStringTo<T> create() /*-{
+    return Object.create(null);
+  }-*/;
+
+  static native boolean hasKey(JavaScriptObject map, String key) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    return map[p] !== undefined;
+  }-*/;
+
+  static native <T extends JavaScriptObject> T keys(JavaScriptObject object) /*-{
+    var data = [];
+    for (var item in object) {
+      if (object.hasOwnProperty(item)) {
+        var key = @elemental.js.util.JsMapFromStringTo::keyForProperty(Ljava/lang/String;)(item);
+        data.push(key);
+      }
+    }
+    return data;
+  }-*/;
+
+  static native void remove(JavaScriptObject map, String key) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    delete map[p];
+  }-*/;
+
+  static native <T extends JavaScriptObject> T values(JavaScriptObject object) /*-{
+    var data = [];
+    for (var item in object) {
+      if (object.hasOwnProperty(item)) {
+        data.push(object[item]);
+      }
+    }
+    return data;
+  }-*/;
+
+  @SuppressWarnings("unused") // Called from JSNI.
+  private static String keyForProperty(String property) {
+    return property;
+  }
+
+  @SuppressWarnings("unused") // Called from JSNI.
+  private static String propertyForKey(String key) {
+    assert key != null : "native maps do not allow null key values.";
+    return key;
+  }
+
+  protected JsMapFromStringTo() {
+  }
+
+  public native V get(String key) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    return this[p];
+  }-*/;
+
+  public boolean hasKey(String key) {
+    return hasKey(this, key);
+  }
+
+  public JsArrayOfString keys() {
+    return keys(this);
+  }
+
+  public native void put(String key, V value) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    this[p] = value;
+  }-*/;
+
+  public void remove(String key) {
+    remove(this, key);
+  }
+
+  public JsArrayOf<V> values() {
+    return values(this);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsMapFromStringToBoolean.java b/elemental/src/elemental/js/util/JsMapFromStringToBoolean.java
new file mode 100644
index 0000000..03d88f2
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsMapFromStringToBoolean.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.util.MapFromStringToBoolean;
+
+/**
+ * A JavaScript native implementation of {@link MapFromStringToBoolean}.
+ */
+public final class JsMapFromStringToBoolean extends JavaScriptObject
+    implements MapFromStringToBoolean {
+
+  /**
+   * Create a new empty map instance.
+   */
+  public static native <T> JsMapFromStringToBoolean create() /*-{
+    return Object.create(null);
+  }-*/;
+
+  protected JsMapFromStringToBoolean() {
+  }
+
+  public native boolean get(String key) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    return this[p];
+  }-*/;
+
+  public boolean hasKey(String key) {
+    return JsMapFromStringTo.hasKey(this, key);
+  }
+
+  public JsArrayOfString keys() {
+    return JsMapFromStringTo.keys(this);
+  }
+
+  public native void put(String key, boolean value) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    this[p] = value;
+  }-*/;
+
+  public void remove(String key) {
+    JsMapFromStringTo.remove(this, key);
+  }
+
+  public JsArrayOfBoolean values() {
+    return JsMapFromStringTo.values(this);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsMapFromStringToInt.java b/elemental/src/elemental/js/util/JsMapFromStringToInt.java
new file mode 100644
index 0000000..7b56d79
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsMapFromStringToInt.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.util.MapFromStringToInt;
+
+/**
+ * JavaScript native implementation of {@link MapFromStringToInt}.
+ */
+public final class JsMapFromStringToInt extends JavaScriptObject implements MapFromStringToInt {
+
+  /**
+   * Create a new empty map instance.
+   */
+  public static native <T> JsMapFromStringToInt create() /*-{
+    return Object.create(null);
+  }-*/;
+
+  protected JsMapFromStringToInt() {
+  }
+
+  public native int get(String key) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    return this[p];
+  }-*/;
+
+  public boolean hasKey(String key) {
+    return JsMapFromStringTo.hasKey(this, key);
+  }
+
+  public JsArrayOfString keys() {
+    return JsMapFromStringTo.keys(this);
+  }
+
+  public native void put(String key, int value) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    this[p] = value;
+  }-*/;
+
+  public void remove(String key) {
+    JsMapFromStringTo.remove(this, key);
+  }
+
+  public JsArrayOfInt values() {
+    return JsMapFromStringTo.values(this);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsMapFromStringToNumber.java b/elemental/src/elemental/js/util/JsMapFromStringToNumber.java
new file mode 100644
index 0000000..3646dfa
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsMapFromStringToNumber.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.util.MapFromStringToNumber;
+
+/**
+ * A JavaScript native implementation of {@link MapFromStringToNumber}.
+ */
+public final class JsMapFromStringToNumber extends JavaScriptObject
+    implements MapFromStringToNumber {
+
+  /**
+   * Create a new empty map instance.
+   */
+  public static native <T> JsMapFromStringToNumber create() /*-{
+    return Object.create(null);
+  }-*/;
+
+  protected JsMapFromStringToNumber() {
+  }
+
+  public native double get(String key) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    return this[p];
+  }-*/;
+
+  public boolean hasKey(String key) {
+    return JsMapFromStringTo.hasKey(this, key);
+  }
+
+  public JsArrayOfString keys() {
+    return JsMapFromStringTo.keys(this);
+  }
+
+  public native void put(String key, double value) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    this[p] = value;
+  }-*/;
+
+  public void remove(String key) {
+    JsMapFromStringTo.remove(this, key);
+  }
+
+  public JsArrayOfNumber values() {
+    return JsMapFromStringTo.values(this);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsMapFromStringToString.java b/elemental/src/elemental/js/util/JsMapFromStringToString.java
new file mode 100644
index 0000000..24a69c4
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsMapFromStringToString.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.util.MapFromStringToString;
+
+/**
+ * A JavaScript native implementation of {@link MapFromStringToString}.
+ */
+public final class JsMapFromStringToString extends JavaScriptObject
+    implements MapFromStringToString {
+
+  /**
+   * Create a new empty map instance.
+   */
+  public static native <T> JsMapFromStringToString create() /*-{
+    return Object.create(null);
+  }-*/;
+
+  protected JsMapFromStringToString() {
+  }
+
+  public native String get(String key) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    return this[p];
+  }-*/;
+
+  public boolean hasKey(String key) {
+    return JsMapFromStringTo.hasKey(this, key);
+  }
+
+  public JsArrayOfString keys() {
+    return JsMapFromStringTo.keys(this);
+  }
+
+  public native void put(String key, String value) /*-{
+    var p = @elemental.js.util.JsMapFromStringTo::propertyForKey(Ljava/lang/String;)(key);
+    this[p] = value;
+  }-*/;
+
+  public void remove(String key) {
+    JsMapFromStringTo.remove(this, key);
+  }
+
+  public JsArrayOfString values() {
+    return JsMapFromStringTo.values(this);
+  }
+}
diff --git a/elemental/src/elemental/js/util/JsMappable.java b/elemental/src/elemental/js/util/JsMappable.java
new file mode 100644
index 0000000..e5961fa
--- /dev/null
+++ b/elemental/src/elemental/js/util/JsMappable.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import elemental.util.*;
+
+/**
+ */
+// TODO (cromwellian) add generic when JSO bug in gwt-dev fixed
+public class JsMappable extends JsElementalBase implements Mappable {
+  protected JsMappable() {}
+}
diff --git a/elemental/src/elemental/js/util/Json.java b/elemental/src/elemental/js/util/Json.java
new file mode 100644
index 0000000..d676b45
--- /dev/null
+++ b/elemental/src/elemental/js/util/Json.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+/**
+ * A static API to the browser's JSON object.
+ * TODO(knorton) : Remove this when generated DOM bindings are submitted. 
+ */
+public class Json {
+  /**
+   * Parse a string containing JSON into a {@link JavaScriptObject}.
+   *
+   * @param <T> the overlay type to expect from the parse
+   * @param jsonAsString
+   * @return a JavaScript object constructed from the parse
+   */
+  public native static <T extends JavaScriptObject> T parse(String jsonAsString) /*-{
+    return JSON.parse(jsonAsString);
+  }-*/;
+
+  /**
+   * Convert a {@link JavaScriptObject} into a string representation.
+   *
+   * @param json a JavaScript object to be converted to a string
+   * @return JSON in string representation
+   */
+  public native static String stringify(JavaScriptObject json) /*-{
+    return JSON.stringify(json);
+  }-*/;
+
+  private Json() {
+  }
+}
diff --git a/elemental/src/elemental/js/util/Numbers.java b/elemental/src/elemental/js/util/Numbers.java
new file mode 100644
index 0000000..61348db
--- /dev/null
+++ b/elemental/src/elemental/js/util/Numbers.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+/**
+ * Utility class for miscellaneous numeric stuff.
+ */
+public class Numbers {
+  /**
+   * Converts a <code>double</code> to a {@link String} with a specified number
+   * of decimal points.
+   * 
+   * @param number the number to be convert to a string
+   * @param n number of decimal points
+   * @return string representation of the number
+   */
+  public static native String toFixed(double number, int n) /*-{
+    return number.toFixed(n);
+  }-*/;
+
+  /**
+   * Converts a <code>double</code> to a {@link String} representing the integer
+   * floor value.
+   * 
+   * @param number the number to convert to a string
+   * @return string representation of the number
+   */
+  public static String toInt(double number) {
+    return toFixed(number, 0);
+  }
+
+  private Numbers() {
+    // You cannot have one of these, they're like Swedish Fish in the mini kitchens.
+  }
+}
diff --git a/elemental/src/elemental/js/util/StringUtil.java b/elemental/src/elemental/js/util/StringUtil.java
new file mode 100644
index 0000000..064716c
--- /dev/null
+++ b/elemental/src/elemental/js/util/StringUtil.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import elemental.util.ArrayOfString;
+
+/**
+ * Miscellaneous {@link String} utilities. Some methods overlap with what is
+ * supported directly in {@link String} in order to use the proper elemental
+ * types.
+ */
+public class StringUtil {
+  
+  /**
+   * Splits a {@link String} into an array of substrings.
+   */
+  public native static ArrayOfString split(String s, String regexp) /*-{
+    return s.split(regexp);
+  }-*/;
+
+  /**
+   *  Splits a {@link String} into an array of substrings.
+   */
+  public native static ArrayOfString split(String s, String regexp, int limit) /*-{
+    return s.split(regexp, limit);
+  }-*/;
+
+  private StringUtil() {
+  }
+}
diff --git a/elemental/src/elemental/js/util/Xhr.java b/elemental/src/elemental/js/util/Xhr.java
new file mode 100644
index 0000000..525b383
--- /dev/null
+++ b/elemental/src/elemental/js/util/Xhr.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.core.client.JavaScriptException;
+import com.google.gwt.xhr.client.ReadyStateChangeHandler;
+import com.google.gwt.xhr.client.XMLHttpRequest;
+
+
+import elemental.client.Browser;
+import elemental.html.Window;
+
+/**
+ * A Simpler way to use {@link XMLHttpRequest}.
+ */
+public class Xhr {
+  /**
+   * Interface for getting notified when an XHR successfully completes, or
+   * errors out.
+   */
+  public interface Callback {
+    void onFail(XMLHttpRequest xhr);
+
+    void onSuccess(XMLHttpRequest xhr);
+  }
+
+  private static class Handler implements ReadyStateChangeHandler {
+    private final Callback callback;
+
+    private Handler(Callback callback) {
+      this.callback = callback;
+    }
+
+    public void onReadyStateChange(XMLHttpRequest xhr) {
+      if (xhr.getReadyState() == XMLHttpRequest.DONE) {
+        if (xhr.getStatus() == 200) {
+          callback.onSuccess(xhr);
+          xhr.clearOnReadyStateChange();
+          return;
+        }
+        callback.onFail(xhr);
+        xhr.clearOnReadyStateChange();
+      }
+    }
+  }
+
+  /**
+   * Send a GET request to the <code>url</code> and dispatch updates to the
+   * <code>callback</code>.
+   *
+   * @param url
+   * @param callback
+   */
+  public static void get(String url, Callback callback) {
+    request(create(), "GET", url, callback);
+  }
+
+  /**
+   * Send a GET request to the <code>url</code> and dispatch updates to the
+   * <code>callback</code>.
+   *
+   * @param window the window object used to access the XMLHttpRequest
+   *        constructor
+   * @param url
+   * @param callback
+   */
+  public static void get(Window window, String url, Callback callback) {
+    request(create(window), "GET", url, callback);
+  }
+
+  /**
+   * Send a HEAD request to the <code>url</code> and dispatch updates to the
+   * <code>callback</code>.
+   *
+   * @param url
+   * @param callback
+   */
+  public static void head(String url, Callback callback) {
+    request(create(), "HEAD", url, callback);
+  }
+
+  /**
+   * Send a HEAD request to the <code>url</code> and dispatch updates to the
+   * <code>callback</code>.
+   *
+   * @param window the window object used to access the XMLHttpRequest
+   *        constructor
+   * @param url
+   * @param callback
+   */
+  public static void head(Window window, String url, Callback callback) {
+    request(create(window), "HEAD", url, callback);
+  }
+
+  /**
+   * Send a POST request to the <code>url</code> and dispatch updates to the
+   * <code>callback</code>.
+   *
+   * @param url
+   * @param requestData the data to be passed to XMLHttpRequest.send
+   * @param contentType a value for the Content-Type HTTP header
+   * @param callback
+   */
+  public static void post(String url, String requestData, String contentType, Callback callback) {
+    request(create(), "POST", url, requestData, contentType, callback);
+  }
+
+  /**
+   * Send a POST request to the <code>url</code> and dispatch updates to the
+   * <code>callback</code>.
+   *
+   * @param window the window object used to access the XMLHttpRequest
+   *        constructor
+   * @param url
+   * @param requestData the data to be passed to XMLHttpRequest.send
+   * @param contentType a value for the Content-Type HTTP header
+   * @param callback
+   */
+  public static void post(
+      Window window, String url, String requestData, String contentType, Callback callback) {
+    request(create(window), "POST", url, requestData, contentType, callback);
+  }
+
+  private static XMLHttpRequest create() {
+    return create(Browser.getWindow());
+  }
+
+  /**
+   * Replacement for {@link XMLHttpRequest#create()} that allows better control
+   * of which window object is used to access the XMLHttpRequest constructor.
+   */
+  private static native XMLHttpRequest create(Window window) /*-{
+    return new window.XMLHttpRequest();
+  }-*/;
+
+  private static void request(XMLHttpRequest xhr,
+      String method,
+      String url,
+      String requestData,
+      String contentType,
+      Callback callback) {
+    try {
+      xhr.setOnReadyStateChange(new Handler(callback));
+      xhr.open(method, url);
+      xhr.setRequestHeader("Content-type", contentType);
+      xhr.send(requestData);
+    } catch (JavaScriptException e) {
+      // Just fail.
+      callback.onFail(xhr);
+      xhr.clearOnReadyStateChange();
+    }
+  }
+
+  private static void request(XMLHttpRequest xhr,
+      String method,
+      String url,
+      final Callback callback) {
+    try {
+      xhr.setOnReadyStateChange(new Handler(callback));
+      xhr.open(method, url);
+      xhr.send();
+    } catch (JavaScriptException e) {
+      // Just fail.
+      callback.onFail(xhr);
+      xhr.clearOnReadyStateChange();
+    }
+  }
+}
diff --git a/elemental/src/elemental/js/xml/JsXMLHttpRequest.java b/elemental/src/elemental/js/xml/JsXMLHttpRequest.java
new file mode 100644
index 0000000..2f7eb65
--- /dev/null
+++ b/elemental/src/elemental/js/xml/JsXMLHttpRequest.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xml;
+import elemental.html.FormData;
+import elemental.js.html.JsFormData;
+import elemental.xml.XMLHttpRequest;
+import elemental.js.dom.JsDocument;
+import elemental.js.html.JsArrayBuffer;
+import elemental.js.events.JsEvent;
+import elemental.html.Blob;
+import elemental.js.html.JsBlob;
+import elemental.events.EventListener;
+import elemental.xml.XMLHttpRequestUpload;
+import elemental.html.ArrayBuffer;
+import elemental.events.Event;
+import elemental.js.events.JsEventListener;
+import elemental.dom.Document;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXMLHttpRequest extends JsElementalMixinBase  implements XMLHttpRequest {
+  protected JsXMLHttpRequest() {}
+
+  public final native boolean isAsBlob() /*-{
+    return this.asBlob;
+  }-*/;
+
+  public final native void setAsBlob(boolean param_asBlob) /*-{
+    this.asBlob = param_asBlob;
+  }-*/;
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onload);
+  }-*/;
+
+  public final native void setOnload(EventListener listener) /*-{
+    this.onload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnloadend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onloadend);
+  }-*/;
+
+  public final native void setOnloadend(EventListener listener) /*-{
+    this.onloadend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnloadstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onloadstart);
+  }-*/;
+
+  public final native void setOnloadstart(EventListener listener) /*-{
+    this.onloadstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnprogress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onprogress);
+  }-*/;
+
+  public final native void setOnprogress(EventListener listener) /*-{
+    this.onprogress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnreadystatechange() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onreadystatechange);
+  }-*/;
+
+  public final native void setOnreadystatechange(EventListener listener) /*-{
+    this.onreadystatechange = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native int getReadyState() /*-{
+    return this.readyState;
+  }-*/;
+
+  public final native Object getResponse() /*-{
+    return this.response;
+  }-*/;
+
+  public final native JsBlob getResponseBlob() /*-{
+    return this.responseBlob;
+  }-*/;
+
+  public final native String getResponseText() /*-{
+    return this.responseText;
+  }-*/;
+
+  public final native String getResponseType() /*-{
+    return this.responseType;
+  }-*/;
+
+  public final native void setResponseType(String param_responseType) /*-{
+    this.responseType = param_responseType;
+  }-*/;
+
+  public final native JsDocument getResponseXML() /*-{
+    return this.responseXML;
+  }-*/;
+
+  public final native int getStatus() /*-{
+    return this.status;
+  }-*/;
+
+  public final native String getStatusText() /*-{
+    return this.statusText;
+  }-*/;
+
+  public final native JsXMLHttpRequestUpload getUpload() /*-{
+    return this.upload;
+  }-*/;
+
+  public final native boolean isWithCredentials() /*-{
+    return this.withCredentials;
+  }-*/;
+
+  public final native void setWithCredentials(boolean param_withCredentials) /*-{
+    this.withCredentials = param_withCredentials;
+  }-*/;
+
+  public final native void abort() /*-{
+    this.abort();
+  }-*/;
+
+  public final native String getAllResponseHeaders() /*-{
+    return this.getAllResponseHeaders();
+  }-*/;
+
+  public final native String getResponseHeader(String header) /*-{
+    return this.getResponseHeader(header);
+  }-*/;
+
+  public final native void open(String method, String url) /*-{
+    this.open(method, url);
+  }-*/;
+
+  public final native void open(String method, String url, boolean async) /*-{
+    this.open(method, url, async);
+  }-*/;
+
+  public final native void open(String method, String url, boolean async, String user) /*-{
+    this.open(method, url, async, user);
+  }-*/;
+
+  public final native void open(String method, String url, boolean async, String user, String password) /*-{
+    this.open(method, url, async, user, password);
+  }-*/;
+
+  public final native void overrideMimeType(String override) /*-{
+    this.overrideMimeType(override);
+  }-*/;
+
+  public final native void send() /*-{
+    this.send();
+  }-*/;
+
+  public final native void send(ArrayBuffer data) /*-{
+    this.send(data);
+  }-*/;
+
+  public final native void send(Blob data) /*-{
+    this.send(data);
+  }-*/;
+
+  public final native void send(Document data) /*-{
+    this.send(data);
+  }-*/;
+
+  public final native void send(String data) /*-{
+    this.send(data);
+  }-*/;
+
+  public final native void send(FormData data) /*-{
+    this.send(data);
+  }-*/;
+
+  public final native void setRequestHeader(String header, String value) /*-{
+    this.setRequestHeader(header, value);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/xml/JsXMLHttpRequestException.java b/elemental/src/elemental/js/xml/JsXMLHttpRequestException.java
new file mode 100644
index 0000000..4b1ea8c
--- /dev/null
+++ b/elemental/src/elemental/js/xml/JsXMLHttpRequestException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xml;
+import elemental.xml.XMLHttpRequestException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXMLHttpRequestException extends JsElementalMixinBase  implements XMLHttpRequestException {
+  protected JsXMLHttpRequestException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/xml/JsXMLHttpRequestUpload.java b/elemental/src/elemental/js/xml/JsXMLHttpRequestUpload.java
new file mode 100644
index 0000000..18b33c2
--- /dev/null
+++ b/elemental/src/elemental/js/xml/JsXMLHttpRequestUpload.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xml;
+import elemental.events.EventListener;
+import elemental.xml.XMLHttpRequestUpload;
+import elemental.js.events.JsEvent;
+import elemental.js.events.JsEventListener;
+import elemental.events.Event;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXMLHttpRequestUpload extends JsElementalMixinBase  implements XMLHttpRequestUpload {
+  protected JsXMLHttpRequestUpload() {}
+
+  public final native EventListener getOnabort() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onabort);
+  }-*/;
+
+  public final native void setOnabort(EventListener listener) /*-{
+    this.onabort = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnerror() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onerror);
+  }-*/;
+
+  public final native void setOnerror(EventListener listener) /*-{
+    this.onerror = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnload() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onload);
+  }-*/;
+
+  public final native void setOnload(EventListener listener) /*-{
+    this.onload = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnloadend() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onloadend);
+  }-*/;
+
+  public final native void setOnloadend(EventListener listener) /*-{
+    this.onloadend = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnloadstart() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onloadstart);
+  }-*/;
+
+  public final native void setOnloadstart(EventListener listener) /*-{
+    this.onloadstart = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;
+  public final native EventListener getOnprogress() /*-{
+    return @elemental.js.dom.JsElementalMixinBase::getListenerFor(Lcom/google/gwt/core/client/JavaScriptObject;)(this.onprogress);
+  }-*/;
+
+  public final native void setOnprogress(EventListener listener) /*-{
+    this.onprogress = @elemental.js.dom.JsElementalMixinBase::getHandlerFor(Lelemental/events/EventListener;)(listener);
+  }-*/;}
diff --git a/elemental/src/elemental/js/xml/JsXSLTProcessor.java b/elemental/src/elemental/js/xml/JsXSLTProcessor.java
new file mode 100644
index 0000000..808a7d8
--- /dev/null
+++ b/elemental/src/elemental/js/xml/JsXSLTProcessor.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xml;
+import elemental.dom.Node;
+import elemental.xml.XSLTProcessor;
+import elemental.js.dom.JsDocument;
+import elemental.dom.DocumentFragment;
+import elemental.js.dom.JsDocumentFragment;
+import elemental.js.dom.JsNode;
+import elemental.dom.Document;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXSLTProcessor extends JsElementalMixinBase  implements XSLTProcessor {
+  protected JsXSLTProcessor() {}
+
+  public final native void clearParameters() /*-{
+    this.clearParameters();
+  }-*/;
+
+  public final native String getParameter(String namespaceURI, String localName) /*-{
+    return this.getParameter(namespaceURI, localName);
+  }-*/;
+
+  public final native void importStylesheet(Node stylesheet) /*-{
+    this.importStylesheet(stylesheet);
+  }-*/;
+
+  public final native void removeParameter(String namespaceURI, String localName) /*-{
+    this.removeParameter(namespaceURI, localName);
+  }-*/;
+
+  public final native void reset() /*-{
+    this.reset();
+  }-*/;
+
+  public final native void setParameter(String namespaceURI, String localName, String value) /*-{
+    this.setParameter(namespaceURI, localName, value);
+  }-*/;
+
+  public final native JsDocument transformToDocument(Node source) /*-{
+    return this.transformToDocument(source);
+  }-*/;
+
+  public final native JsDocumentFragment transformToFragment(Node source, Document docVal) /*-{
+    return this.transformToFragment(source, docVal);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/xpath/JsDOMParser.java b/elemental/src/elemental/js/xpath/JsDOMParser.java
new file mode 100644
index 0000000..4133065
--- /dev/null
+++ b/elemental/src/elemental/js/xpath/JsDOMParser.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xpath;
+import elemental.js.dom.JsDocument;
+import elemental.xpath.DOMParser;
+import elemental.dom.Document;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsDOMParser extends JsElementalMixinBase  implements DOMParser {
+  protected JsDOMParser() {}
+
+  public final native JsDocument parseFromString(String str, String contentType) /*-{
+    return this.parseFromString(str, contentType);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/xpath/JsXMLSerializer.java b/elemental/src/elemental/js/xpath/JsXMLSerializer.java
new file mode 100644
index 0000000..5e173a9
--- /dev/null
+++ b/elemental/src/elemental/js/xpath/JsXMLSerializer.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xpath;
+import elemental.dom.Node;
+import elemental.xpath.XMLSerializer;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXMLSerializer extends JsElementalMixinBase  implements XMLSerializer {
+  protected JsXMLSerializer() {}
+
+  public final native String serializeToString(Node node) /*-{
+    return this.serializeToString(node);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/xpath/JsXPathEvaluator.java b/elemental/src/elemental/js/xpath/JsXPathEvaluator.java
new file mode 100644
index 0000000..1a079fc
--- /dev/null
+++ b/elemental/src/elemental/js/xpath/JsXPathEvaluator.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xpath;
+import elemental.dom.Node;
+import elemental.js.dom.JsNode;
+import elemental.xpath.XPathResult;
+import elemental.xpath.XPathNSResolver;
+import elemental.xpath.XPathExpression;
+import elemental.xpath.XPathEvaluator;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXPathEvaluator extends JsElementalMixinBase  implements XPathEvaluator {
+  protected JsXPathEvaluator() {}
+
+  public final native JsXPathExpression createExpression(String expression, XPathNSResolver resolver) /*-{
+    return this.createExpression(expression, resolver);
+  }-*/;
+
+  public final native JsXPathNSResolver createNSResolver(Node nodeResolver) /*-{
+    return this.createNSResolver(nodeResolver);
+  }-*/;
+
+  public final native JsXPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) /*-{
+    return this.evaluate(expression, contextNode, resolver, type, inResult);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/xpath/JsXPathException.java b/elemental/src/elemental/js/xpath/JsXPathException.java
new file mode 100644
index 0000000..df9e3aa
--- /dev/null
+++ b/elemental/src/elemental/js/xpath/JsXPathException.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xpath;
+import elemental.xpath.XPathException;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXPathException extends JsElementalMixinBase  implements XPathException {
+  protected JsXPathException() {}
+
+  public final native int getCode() /*-{
+    return this.code;
+  }-*/;
+
+  public final native String getMessage() /*-{
+    return this.message;
+  }-*/;
+
+  public final native String getName() /*-{
+    return this.name;
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/xpath/JsXPathExpression.java b/elemental/src/elemental/js/xpath/JsXPathExpression.java
new file mode 100644
index 0000000..08f53a9
--- /dev/null
+++ b/elemental/src/elemental/js/xpath/JsXPathExpression.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xpath;
+import elemental.xpath.XPathResult;
+import elemental.dom.Node;
+import elemental.xpath.XPathExpression;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXPathExpression extends JsElementalMixinBase  implements XPathExpression {
+  protected JsXPathExpression() {}
+
+  public final native JsXPathResult evaluate(Node contextNode, int type, XPathResult inResult) /*-{
+    return this.evaluate(contextNode, type, inResult);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/xpath/JsXPathNSResolver.java b/elemental/src/elemental/js/xpath/JsXPathNSResolver.java
new file mode 100644
index 0000000..9c1f5d5
--- /dev/null
+++ b/elemental/src/elemental/js/xpath/JsXPathNSResolver.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xpath;
+import elemental.xpath.XPathNSResolver;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXPathNSResolver extends JsElementalMixinBase  implements XPathNSResolver {
+  protected JsXPathNSResolver() {}
+
+  public final native String lookupNamespaceURI(String prefix) /*-{
+    return this.lookupNamespaceURI(prefix);
+  }-*/;
+}
diff --git a/elemental/src/elemental/js/xpath/JsXPathResult.java b/elemental/src/elemental/js/xpath/JsXPathResult.java
new file mode 100644
index 0000000..518363b
--- /dev/null
+++ b/elemental/src/elemental/js/xpath/JsXPathResult.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.xpath;
+import elemental.dom.Node;
+import elemental.xpath.XPathResult;
+import elemental.js.dom.JsNode;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptObject;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.js.stylesheets.*;
+import elemental.js.events.*;
+import elemental.js.util.*;
+import elemental.js.dom.*;
+import elemental.js.html.*;
+import elemental.js.css.*;
+import elemental.js.stylesheets.*;
+
+import java.util.Date;
+
+public class JsXPathResult extends JsElementalMixinBase  implements XPathResult {
+  protected JsXPathResult() {}
+
+  public final native boolean isBooleanValue() /*-{
+    return this.booleanValue;
+  }-*/;
+
+  public final native boolean isInvalidIteratorState() /*-{
+    return this.invalidIteratorState;
+  }-*/;
+
+  public final native double getNumberValue() /*-{
+    return this.numberValue;
+  }-*/;
+
+  public final native int getResultType() /*-{
+    return this.resultType;
+  }-*/;
+
+  public final native JsNode getSingleNodeValue() /*-{
+    return this.singleNodeValue;
+  }-*/;
+
+  public final native int getSnapshotLength() /*-{
+    return this.snapshotLength;
+  }-*/;
+
+  public final native String getStringValue() /*-{
+    return this.stringValue;
+  }-*/;
+
+  public final native JsNode iterateNext() /*-{
+    return this.iterateNext();
+  }-*/;
+
+  public final native JsNode snapshotItem(int index) /*-{
+    return this.snapshotItem(index);
+  }-*/;
+}
diff --git a/elemental/src/elemental/json/Json.java b/elemental/src/elemental/json/Json.java
new file mode 100644
index 0000000..3c4902c
--- /dev/null
+++ b/elemental/src/elemental/json/Json.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+import elemental.json.impl.JreJsonFactory;
+
+/**
+ * Vends out implementation of JsonFactory.
+ */
+public class Json {
+
+  public static JsonString create(String string) {
+    return instance().create(string);
+  }
+
+  public static JsonBoolean create(boolean bool) {
+    return instance().create(bool);
+  }
+
+  public static JsonArray createArray() {
+    return instance().createArray();
+  }
+
+  public static JsonNull createNull() {
+    return instance().createNull();
+  }
+
+  public static JsonNumber create(double number) {
+    return instance().create(number);
+  }
+
+  public static JsonObject createObject() {
+    return instance().createObject();
+  }
+  public static JsonFactory instance() {
+    return new JreJsonFactory();
+  }
+
+  public static JsonObject parse(String jsonString) {
+    return instance().parse(jsonString);
+  }
+}
diff --git a/elemental/src/elemental/json/JsonArray.java b/elemental/src/elemental/json/JsonArray.java
new file mode 100644
index 0000000..17b324d
--- /dev/null
+++ b/elemental/src/elemental/json/JsonArray.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * Represents a Json array.
+ */
+public interface JsonArray extends JsonValue {
+
+  /**
+   * Return the ith element of the array.
+   */
+  <T extends JsonValue> T get(int index);
+
+  /**
+   * Return the ith element of the array (uncoerced) as a JsonArray. If the type is not an array,
+   * this can result in runtime errors.
+   */
+  JsonArray getArray(int index);
+
+  /**
+   * Return the ith element of the array (uncoerced) as a boolean. If the type is not a boolean,
+   * this can result in runtime errors.
+   */
+  boolean getBoolean(int index);
+
+  /**
+   * Return the ith element of the array (uncoerced) as a number. If the type is not a number, this
+   * can result in runtime errors.
+   */
+  double getNumber(int index);
+
+  /**
+   * Return the ith element of the array (uncoerced) as a JsonObject If the type is not an object,,
+   * this can result in runtime errors.
+   */
+  JsonObject getObject(int index);
+
+  /**
+   * Return the ith element of the array (uncoerced) as a String. If the type is not a String, this
+   * can result in runtime errors.
+   */
+  String getString(int index);
+
+  /**
+   * Length of the array.
+   */
+  int length();
+
+  /**
+   * Remove an element of the array at a particular index.
+   */
+  void remove(int index);
+
+  /**
+   * Set the value at index to be a given value.
+   */
+  void set(int index, JsonValue value);
+
+  /**
+   * Set the value at index to be a String value.
+   */
+  void set(int index, String string);
+
+  /**
+   * Set the value at index to be a number value.
+   */
+  void set(int index, double number);
+
+  /**
+   * Set the value at index to be a boolean value.
+   */
+  void set(int index, boolean bool);
+}
diff --git a/elemental/src/elemental/json/JsonBoolean.java b/elemental/src/elemental/json/JsonBoolean.java
new file mode 100644
index 0000000..35d9e07
--- /dev/null
+++ b/elemental/src/elemental/json/JsonBoolean.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * Represents a Json boolean.
+ */
+public interface JsonBoolean extends JsonValue {
+  boolean getBoolean();
+}
diff --git a/elemental/src/elemental/json/JsonException.java b/elemental/src/elemental/json/JsonException.java
new file mode 100644
index 0000000..ef6d97b
--- /dev/null
+++ b/elemental/src/elemental/json/JsonException.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * A exception representing an error in parsing or serializing Json.
+ */
+public class JsonException extends RuntimeException {
+
+  public JsonException(String s) {
+    super(s);
+  }
+}
diff --git a/elemental/src/elemental/json/JsonFactory.java b/elemental/src/elemental/json/JsonFactory.java
new file mode 100644
index 0000000..8e09e7c
--- /dev/null
+++ b/elemental/src/elemental/json/JsonFactory.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * Factory interface for parsing and creating JSON objects.
+ */
+public interface JsonFactory {
+
+  /**
+   * Create a JsonString from a Java String.
+   *
+   * @param string a Java String
+   * @return the parsed JsonString
+   */
+  JsonString create(String string);
+
+  /**
+   * Create a JsonNumber from a Java double.
+   *
+   * @param number a Java double
+   * @return the parsed JsonNumber
+   */
+  JsonNumber create(double number);
+
+  /**
+   * Create a JsonBoolean from a Java boolean.
+   *
+   * @param bool a Java boolean
+   * @return the parsed JsonBoolean
+   */
+  JsonBoolean create(boolean bool);
+
+  /**
+   * Create an empty JsonArray.
+   *
+   * @return a new JsonArray
+   */
+  elemental.json.JsonArray createArray();
+
+  /**
+   * Create a JsonNull.
+   *
+   * @return a JsonNull instance
+   */
+  JsonNull createNull();
+
+  /**
+   * Create an empty JsonObject.
+   *
+   * @return a new JsonObject
+   */
+  JsonObject createObject();
+
+  /**
+   * Parse a String in JSON format and return a JsonValue of the appropriate
+   * type.
+   *
+   * @param jsonString a String in JSON format
+   * @return a parsed JsonValue
+   */
+  <T extends JsonValue> T parse(String jsonString) throws elemental.json.JsonException;
+}
diff --git a/elemental/src/elemental/json/JsonNull.java b/elemental/src/elemental/json/JsonNull.java
new file mode 100644
index 0000000..cdd87c5
--- /dev/null
+++ b/elemental/src/elemental/json/JsonNull.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * Represents the Json null value.
+ */
+public interface JsonNull extends JsonValue {
+}
diff --git a/elemental/src/elemental/json/JsonNumber.java b/elemental/src/elemental/json/JsonNumber.java
new file mode 100644
index 0000000..13f9856
--- /dev/null
+++ b/elemental/src/elemental/json/JsonNumber.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * Represents a Json number value.
+ */
+public interface JsonNumber extends JsonValue {
+  double getNumber();
+}
diff --git a/elemental/src/elemental/json/JsonObject.java b/elemental/src/elemental/json/JsonObject.java
new file mode 100644
index 0000000..c8be0b1
--- /dev/null
+++ b/elemental/src/elemental/json/JsonObject.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * Represents a Json object.
+ */
+public interface JsonObject extends JsonValue {
+
+  /**
+   * Return the element (uncoerced) as a JsonValue.
+   */
+  <T extends JsonValue> T get(String key);
+
+  /**
+   * Return the element (uncoerced) as a JsonArray. If the type is not an array,
+   * this can result in runtime errors.
+   */
+  JsonArray getArray(String key);
+
+  /**
+   * Return the element (uncoerced) as a boolean. If the type is not a boolean,
+   * this can result in runtime errors.
+   */
+  boolean getBoolean(String key);
+
+  /**
+   * Return the element (uncoerced) as a number. If the type is not a number, this
+   * can result in runtime errors.
+   */
+  double getNumber(String key);
+
+  /**
+   * Return the element (uncoerced) as a JsonObject If the type is not an object,,
+   * this can result in runtime errors.
+   */
+  JsonObject getObject(String key);
+
+  /**
+   * Return the element (uncoerced) as a String. If the type is not a String, this
+   * can result in runtime errors.
+   */
+  String getString(String key);
+
+  /**
+   * All keys of the object.
+   */
+  String[] keys();
+
+  /**
+   * Set a given key to the given value.
+   */
+  void put(String key, JsonValue value);
+
+  /**
+   * Set a given key to the given String value.
+   */
+  void put(String key, String value);
+
+  /**
+   * Set a given key to the given double value.
+   */
+  void put(String key, double value);
+
+  /**
+   * Set a given key to the given boolean value.
+   */
+  void put(String key, boolean bool);
+
+  /**
+   * Test whether a given key has present.
+   */
+  boolean hasKey(String key);
+
+  /**
+   * Remove a given key and associated value from the object.
+   * @param key
+   */
+  void remove(String key);
+}
diff --git a/elemental/src/elemental/json/JsonString.java b/elemental/src/elemental/json/JsonString.java
new file mode 100644
index 0000000..2941fe2
--- /dev/null
+++ b/elemental/src/elemental/json/JsonString.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * Represents a Json String value.
+ */
+public interface JsonString extends JsonValue {
+  String getString();
+}
diff --git a/elemental/src/elemental/json/JsonType.java b/elemental/src/elemental/json/JsonType.java
new file mode 100644
index 0000000..6af0560
--- /dev/null
+++ b/elemental/src/elemental/json/JsonType.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * Represents the type of the underlying JsonValue.
+ */
+public enum JsonType {
+  OBJECT, ARRAY, STRING, NUMBER, BOOLEAN, NULL;
+}
diff --git a/elemental/src/elemental/json/JsonValue.java b/elemental/src/elemental/json/JsonValue.java
new file mode 100644
index 0000000..f4f2154
--- /dev/null
+++ b/elemental/src/elemental/json/JsonValue.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+/**
+ * Base interface for all Json values.
+ */
+public interface JsonValue {
+
+  /**
+   * Coerces underlying value to boolean according to the rules of Javascript coercion.
+   */
+  boolean asBoolean();
+
+  /**
+   * Coerces the underlying value to a number according to the rules of Javascript coercion.
+   */
+  double asNumber();
+
+  /**
+   * Coerces the underlying value to a String according to the rules of JavaScript coercion.
+   */
+  String asString();
+
+  /**
+   * Returns an enumeration representing the fundamental JSON type.
+   */
+  JsonType getType();
+
+  /**
+   * Returns a serialized JSON string representing this value.
+   * @return
+   */
+  String toJson();
+
+  /**
+   * Equivalent of Javascript '==' operator comparison between two values.
+   */
+  boolean jsEquals(JsonValue value);
+
+
+  /**
+   * If used in a GWT context (dev or prod mode), converts the object to a native JavaScriptObject
+   * suitable for passing to JSNI methods. Otherwise, returns the current object in other contexts,
+   * such as server-side use.
+   */
+  Object toNative();
+}
diff --git a/elemental/src/elemental/json/impl/JreJsonArray.java b/elemental/src/elemental/json/impl/JreJsonArray.java
new file mode 100644
index 0000000..5a6a240
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JreJsonArray.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import elemental.json.JsonArray;
+import elemental.json.JsonBoolean;
+import elemental.json.JsonFactory;
+import elemental.json.JsonNumber;
+import elemental.json.JsonObject;
+import elemental.json.JsonString;
+import elemental.json.JsonType;
+import elemental.json.JsonValue;
+
+/**
+ * Server-side implementation of JsonArray.
+ */
+public class JreJsonArray extends JreJsonValue implements JsonArray {
+
+  private ArrayList<JsonValue> arrayValues = new ArrayList<JsonValue>();
+
+  private JsonFactory factory;
+
+  public JreJsonArray(JsonFactory factory) {
+    this.factory = factory;
+  }
+
+  @Override
+  public boolean asBoolean() {
+    return true;
+  }
+
+  @Override
+  public double asNumber() {
+    switch (length()) {
+      case 0:
+        return 0;
+      case 1:
+        return get(0).asNumber();
+      default:
+        return Double.NaN;
+    }
+  }
+
+  @Override
+  public String asString() {
+    StringBuilder toReturn = new StringBuilder();
+    for (int i = 0; i < length(); i++) {
+      if (i > 0) {
+        toReturn.append(", ");
+      }
+      toReturn.append(get(i).asString());
+    }
+    return toReturn.toString();
+  }
+
+  public JsonValue get(int index) {
+    return arrayValues.get(index);
+  }
+
+  public JsonArray getArray(int index) {
+    return (JsonArray) get(index);
+  }
+
+
+  public boolean getBoolean(int index) {
+    return ((JsonBoolean) get(index)).getBoolean();
+  }
+
+  public double getNumber(int index) {
+    return ((JsonNumber) get(index)).getNumber();
+  }
+
+  public JsonObject getObject(int index) {
+    return (JsonObject) get(index);
+  }
+
+  public Object getObject() {
+    List<Object> objs = new ArrayList<Object>();
+    for (JsonValue val : arrayValues) {
+      objs.add(((JreJsonValue) val).getObject());
+    }
+    return objs;
+  }
+
+  public String getString(int index) {
+    return ((JsonString) get(index)).getString();
+  }
+
+  public JsonType getType() {
+    return elemental.json.JsonType.ARRAY;
+  }
+
+  @Override
+  public boolean jsEquals(JsonValue value) {
+    return getObject().equals(((JreJsonValue) value).getObject());
+  }
+
+  public int length() {
+    return arrayValues.size();
+  }
+
+  @Override
+  public void remove(int index) {
+    arrayValues.remove(index);
+  }
+
+  public void set(int index, JsonValue value) {
+    if (value == null) {
+      value = factory.createNull();
+    }
+    if (index == arrayValues.size()) {
+      arrayValues.add(index, value);
+    } else {
+      arrayValues.set(index, value);
+    }
+  }
+
+  public void set(int index, String string) {
+    set(index, factory.create(string));
+  }
+
+  public void set(int index, double number) {
+    set(index, factory.create(number));
+  }
+
+  public void set(int index, boolean bool) {
+    set(index, factory.create(bool));
+  }
+
+  public String toJson() {
+    return JsonUtil.stringify(this);
+  }
+
+  @Override
+  public void traverse(elemental.json.impl.JsonVisitor visitor,
+      elemental.json.impl.JsonContext ctx) {
+    if (visitor.visit(this, ctx)) {
+      JsonArrayContext arrayCtx = new JsonArrayContext(this);
+      for (int i = 0; i < length(); i++) {
+        arrayCtx.setCurrentIndex(i);
+        if (visitor.visitIndex(arrayCtx.getCurrentIndex(), arrayCtx)) {
+          visitor.accept(get(i), arrayCtx);
+          arrayCtx.setFirst(false);
+        }
+      }
+    }
+    visitor.endVisit(this, ctx);
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JreJsonBoolean.java b/elemental/src/elemental/json/impl/JreJsonBoolean.java
new file mode 100644
index 0000000..a947fd3
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JreJsonBoolean.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.JsonBoolean;
+import elemental.json.JsonType;
+import elemental.json.JsonValue;
+
+/**
+ * Server-side implementation of JsonBoolean.
+ */
+public class JreJsonBoolean extends JreJsonValue implements JsonBoolean {
+
+  private boolean bool;
+  public JreJsonBoolean(boolean bool) {
+    this.bool = bool;
+  }
+
+  @Override
+  public boolean asBoolean() {
+    return getBoolean();
+  }
+
+  @Override
+  public double asNumber() {
+    return getBoolean() ? 1 : 0;
+  }
+
+  @Override
+  public String asString() {
+    return Boolean.toString(getBoolean());
+  }
+
+  public boolean getBoolean() {
+    return bool;
+  }
+
+  public Object getObject() {
+    return getBoolean();
+  }
+
+  public JsonType getType() {
+    return JsonType.BOOLEAN;
+  }
+
+  @Override
+  public boolean jsEquals(JsonValue value) {
+    return getObject().equals(((JreJsonValue)value).getObject());
+  }
+
+  @Override
+  public void traverse(elemental.json.impl.JsonVisitor visitor, JsonContext ctx) {
+    visitor.visit(getBoolean(), ctx);
+  }
+
+  public String toJson() throws IllegalStateException {
+    return String.valueOf(bool);
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JreJsonFactory.java b/elemental/src/elemental/json/impl/JreJsonFactory.java
new file mode 100644
index 0000000..edc8706
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JreJsonFactory.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.JsonArray;
+import elemental.json.JsonBoolean;
+import elemental.json.JsonException;
+import elemental.json.JsonFactory;
+import elemental.json.JsonNull;
+import elemental.json.JsonNumber;
+import elemental.json.JsonObject;
+import elemental.json.JsonString;
+import elemental.json.JsonValue;
+
+
+/**
+ * Implementation of JsonFactory interface using org.json library.
+ */
+public class JreJsonFactory implements JsonFactory {
+
+  public JsonString create(String string) {
+    assert string != null;
+    return new JreJsonString(string);
+  }
+
+  public JsonNumber create(double number) {
+    return new JreJsonNumber(number);
+  }
+
+  public JsonBoolean create(boolean bool) {
+    return new JreJsonBoolean(bool);
+  }
+
+  public JsonArray createArray() {
+    return new JreJsonArray(this);
+  }
+
+  public JsonNull createNull() {
+    return JreJsonNull.NULL_INSTANCE;
+  }
+
+  public JsonObject createObject() {
+    return new JreJsonObject(this);
+  }
+
+  public <T extends JsonValue> T parse(String jsonString) throws JsonException {
+    if (jsonString.startsWith("(") && jsonString.endsWith(")")) {
+       // some clients send in (json) expecting an eval is required
+       jsonString = jsonString.substring(1, jsonString.length() - 1);
+    }
+    return new JsonTokenizer(this, jsonString).nextValue();
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JreJsonNull.java b/elemental/src/elemental/json/impl/JreJsonNull.java
new file mode 100644
index 0000000..25acab1
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JreJsonNull.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.JsonNull;
+import elemental.json.JsonType;
+import elemental.json.JsonValue;
+
+/**
+ * Server-side implementation of JsonObject.
+ */
+public class JreJsonNull extends JreJsonValue implements JsonNull {
+
+  public static final JsonNull NULL_INSTANCE = new JreJsonNull();
+
+  @Override
+  public double asNumber() {
+    return 0;
+  }
+
+  @Override
+  public boolean asBoolean() {
+    return false;
+  }
+
+  @Override
+  public String asString() {
+    return "null";
+  }
+
+  public Object getObject() {
+    return null;
+  }
+
+  public JsonType getType() {
+    return JsonType.NULL;
+  }
+
+  @Override
+  public boolean jsEquals(JsonValue value) {
+    return value == null || value.getType() == JsonType.NULL;
+  }
+
+  @Override
+  public void traverse(JsonVisitor visitor, elemental.json.impl.JsonContext ctx) {
+    visitor.visitNull(ctx);
+  }
+
+  public String toJson() {
+    return null;
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JreJsonNumber.java b/elemental/src/elemental/json/impl/JreJsonNumber.java
new file mode 100644
index 0000000..4fb2842
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JreJsonNumber.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.JsonNumber;
+import elemental.json.JsonType;
+import elemental.json.JsonValue;
+
+/**
+ * Server-side implementation of JsonNumber.
+ */
+public class JreJsonNumber extends JreJsonValue implements JsonNumber {
+
+  private double number;
+
+  public JreJsonNumber(double number) {
+    this.number = number;
+  }
+
+  @Override
+  public boolean asBoolean() {
+    return Double.isNaN(getNumber()) || Math.abs(getNumber()) == 0.0 ? false : true;
+  }
+
+  @Override
+  public double asNumber() {
+    return getNumber();
+  }
+
+  @Override
+  public String asString() {
+    return toJson();
+  }
+
+  public double getNumber() {
+    return number;
+  }
+
+  public Object getObject() {
+    return getNumber();
+  }
+
+  public JsonType getType() {
+    return JsonType.NUMBER;
+  }
+
+  @Override
+  public boolean jsEquals(JsonValue value) {
+    return getObject().equals(((JreJsonValue)value).getObject());
+  }
+
+  @Override
+  public void traverse(JsonVisitor visitor, elemental.json.impl.JsonContext ctx) {
+    visitor.visit(getNumber(), ctx);
+  }
+
+  public String toJson() {
+    String toReturn = String.valueOf(number);
+    if (toReturn.endsWith(".0")) {
+      toReturn = toReturn.substring(0, toReturn.length() - 2);
+    }
+    return toReturn;
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JreJsonObject.java b/elemental/src/elemental/json/impl/JreJsonObject.java
new file mode 100755
index 0000000..992f9a0
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JreJsonObject.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import elemental.json.JsonArray;
+import elemental.json.JsonBoolean;
+import elemental.json.JsonFactory;
+import elemental.json.JsonNumber;
+import elemental.json.JsonObject;
+import elemental.json.JsonString;
+import elemental.json.JsonType;
+import elemental.json.JsonValue;
+
+/**
+ * Server-side implementation of JsonObject.
+ */
+public class JreJsonObject extends JreJsonValue implements JsonObject {
+
+  private static List<String> stringifyOrder(String[] keys) {
+    List<String> toReturn = new ArrayList<String>();
+    List<String> nonNumeric = new ArrayList<String>();
+    for (String key : keys) {
+      if (key.matches("\\d+")) {
+        toReturn.add(key);
+      } else {
+        nonNumeric.add(key);
+      }
+    }
+    Collections.sort(toReturn);
+    toReturn.addAll(nonNumeric);
+    return toReturn;
+  }
+
+  private JsonFactory factory;
+  private Map<String, JsonValue> map = new LinkedHashMap<String, JsonValue>();
+
+  public JreJsonObject(JsonFactory factory) {
+    this.factory = factory;
+  }
+
+  @Override
+  public boolean asBoolean() {
+    return true;
+  }
+
+  @Override
+  public double asNumber() {
+    return Double.NaN;
+  }
+
+  @Override
+  public String asString() {
+    return "[object Object]";
+  }
+
+  public JsonValue get(String key) {
+    return map.get(key);
+  }
+
+  public JsonArray getArray(String key) {
+    return (JsonArray) get(key);
+  }
+
+
+  public boolean getBoolean(String key) {
+    return ((JsonBoolean) get(key)).getBoolean();
+  }
+
+  public double getNumber(String key) {
+    return ((JsonNumber) get(key)).getNumber();
+  }
+
+  public JsonObject getObject(String key) {
+    return (JsonObject) get(key);
+  }
+
+  public Object getObject() {
+    Map<String, Object> obj = new HashMap<String, Object>();
+    for (Map.Entry<String, JsonValue> e : map.entrySet()) {
+      obj.put(e.getKey(), ((JreJsonValue) e.getValue()).getObject());
+    }
+    return obj;
+  }
+
+
+  public String getString(String key) {
+    return ((JsonString) get(key)).getString();
+  }
+
+  public JsonType getType() {
+    return JsonType.OBJECT;
+  }
+
+  @Override
+  public boolean hasKey(String key) {
+    return map.containsKey(key);
+  }
+
+  @Override
+  public boolean jsEquals(JsonValue value) {
+    return getObject().equals(((JreJsonValue) value).getObject());
+  }
+
+  public String[] keys() {
+    return map.keySet().toArray(new String[map.size()]);
+  }
+
+  public void put(String key, JsonValue value) {
+    if (value == null) {
+      value = factory.createNull();
+    }
+    map.put(key, value);
+  }
+
+  public void put(String key, String value) {
+    put(key, factory.create(value));
+  }
+
+  public void put(String key, double value) {
+    put(key, factory.create(value));
+  }
+
+  public void put(String key, boolean bool) {
+    put(key, factory.create(bool));
+  }
+
+  @Override
+  public void remove(String key) {
+    map.remove(key);
+  }
+
+  public void set(String key, JsonValue value) {
+      put(key, value);
+  }
+
+  public String toJson() {
+    return JsonUtil.stringify(this);
+  }
+
+  public String toString() {
+    return toJson();
+  }
+
+  @Override
+  public void traverse(JsonVisitor visitor, JsonContext ctx) {
+    if (visitor.visit(this, ctx)) {
+      JsonObjectContext objCtx = new JsonObjectContext(this);
+      for (String key : stringifyOrder(keys())) {
+        objCtx.setCurrentKey(key);
+        if (visitor.visitKey(objCtx.getCurrentKey(), objCtx)) {
+          visitor.accept(get(key), objCtx);
+          objCtx.setFirst(false);
+        }
+      }
+    }
+    visitor.endVisit(this, ctx);
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JreJsonString.java b/elemental/src/elemental/json/impl/JreJsonString.java
new file mode 100644
index 0000000..f282245
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JreJsonString.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.JsonString;
+import elemental.json.JsonType;
+import elemental.json.JsonValue;
+
+/**
+ * Server-side implementation of JsonString.
+ */
+public class JreJsonString extends JreJsonValue implements JsonString {
+
+  private String string;
+
+  public JreJsonString(String string) {
+    this.string = string;
+  }
+
+  @Override
+  public boolean asBoolean() {
+    return !getString().isEmpty();
+  }
+
+  @Override
+  public double asNumber() {
+    try {
+      if (asString().isEmpty()) {
+        return 0.0;
+      } else {
+        return Double.parseDouble(asString());
+      }
+    } catch(NumberFormatException nfe) {
+      return Double.NaN;
+    }
+  }
+
+  @Override
+  public String asString() {
+    return getString();
+  }
+
+  public Object getObject() {
+    return getString();
+  }
+
+  public String getString() {
+    return string;
+  }
+
+  public JsonType getType() {
+    return JsonType.STRING;
+  }
+
+  @Override
+  public boolean jsEquals(JsonValue value) {
+    return getObject().equals(((JreJsonValue)value).getObject());
+  }
+
+  @Override
+  public void traverse(JsonVisitor visitor, JsonContext ctx) {
+    visitor.visit(getString(), ctx);
+  }
+
+  public String toJson() throws IllegalStateException {
+    return JsonUtil.quote(getString());
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JreJsonValue.java b/elemental/src/elemental/json/impl/JreJsonValue.java
new file mode 100644
index 0000000..313f8fb
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JreJsonValue.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.JsonValue;
+
+/**
+ * JRE (non-Client) implementation of JreJsonValue.
+ */
+public abstract class JreJsonValue implements JsonValue {
+  public abstract Object getObject();
+  public abstract void traverse(JsonVisitor visitor, JsonContext ctx);
+
+  @Override
+  public Object toNative() {
+    return this;
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JsonArrayContext.java b/elemental/src/elemental/json/impl/JsonArrayContext.java
new file mode 100644
index 0000000..f312f17
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JsonArrayContext.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.*;
+
+/**
+ * A {@link JsonContext} with integer based location context.
+ */
+class JsonArrayContext extends JsonContext {
+
+  int currentIndex = 0;
+
+  public JsonArrayContext(JsonArray array) {
+    super(array);
+  }
+
+  public JsonArray array() {
+    return (JsonArray) getValue();
+  }
+
+  public int getCurrentIndex() {
+    return currentIndex;
+  }
+  @Override
+  public void removeMe() {
+    array().remove(getCurrentIndex());
+  }
+  
+  @Override
+  public void replaceMe(double d) {
+    array().set(getCurrentIndex(), d);
+  }
+
+  @Override
+  public void replaceMe(String d) {
+    array().set(getCurrentIndex(), d);
+  }
+
+  @Override
+  public void replaceMe(boolean d) {
+    array().set(getCurrentIndex(), d);
+  }
+  
+  @Override
+  public void replaceMe(JsonValue value) {
+    array().set(getCurrentIndex(), value);
+  }
+
+  public void setCurrentIndex(int currentIndex) {
+    this.currentIndex = currentIndex;
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JsonContext.java b/elemental/src/elemental/json/impl/JsonContext.java
new file mode 100644
index 0000000..37ad7b0
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JsonContext.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.JsonValue;
+
+/**
+ * Represents the current location where a value is stored, and allows
+ * the value's replacement or deletion.
+ */
+abstract class JsonContext {
+
+  private JsonValue value;
+
+  private boolean isFirst = true;
+
+  JsonContext(JsonValue value) {
+    this.value = value;
+  }
+
+  /**
+   * Return the underlying JsonValue (Array or Object) that backs the
+   * context.
+   */
+  public JsonValue getValue() {
+    return value;
+  }
+
+  /**
+   * Whether or not the current context location within the value is the first
+   * key or array index.
+   */
+  public boolean isFirst() {
+    return isFirst;
+  }
+
+  /**
+   * Remove the current array index or key from the underlying json.
+   */
+  public abstract void removeMe();
+
+  /**
+   * Replace the current location's value with a double.
+   */
+  public abstract void replaceMe(double d);
+
+  /**
+   * Replace the current location's value with a String.
+   */
+  public abstract void replaceMe(String d);
+
+  /**
+   * Replace the current location's value with a boolean.
+   */
+  public abstract void replaceMe(boolean d);
+
+  /**
+   * Replace the current location's value with a JsonValue.
+   */
+  public abstract void replaceMe(JsonValue value);
+
+  public void setFirst(boolean first) {
+    isFirst = first;
+  }
+
+  void setValue(JsonValue value) {
+    this.value = value;
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JsonObjectContext.java b/elemental/src/elemental/json/impl/JsonObjectContext.java
new file mode 100644
index 0000000..db7840f
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JsonObjectContext.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.*;
+
+/**
+ * A {@link JsonContext} with String based location index.
+ */
+class JsonObjectContext extends JsonContext {
+
+  String currentKey;
+
+  public JsonObjectContext(JsonObject value) {
+    super(value);
+  }
+
+  private JsonObject object() {
+    return (JsonObject) getValue();
+  }
+  public String getCurrentKey() {
+    return currentKey;
+  }
+
+  @Override
+  public void removeMe() {
+    object().remove(getCurrentKey());
+  }
+
+  @Override
+  public void replaceMe(double d) {
+    object().put(getCurrentKey(), d);
+  }
+
+  @Override
+  public void replaceMe(String d) {
+    object().put(getCurrentKey(), d);
+  }
+
+  @Override
+  public void replaceMe(boolean d) {
+    object().put(getCurrentKey(), d);
+  }
+
+  @Override
+  public void replaceMe(JsonValue value) {
+    object().put(getCurrentKey(), value);
+  }
+
+  public void setCurrentKey(String currentKey) {
+    this.currentKey = currentKey;
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JsonTokenizer.java b/elemental/src/elemental/json/impl/JsonTokenizer.java
new file mode 100644
index 0000000..2e92d1f
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JsonTokenizer.java
@@ -0,0 +1,321 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.JsonArray;
+import elemental.json.JsonException;
+import elemental.json.JsonFactory;
+import elemental.json.JsonNumber;
+import elemental.json.JsonObject;
+import elemental.json.JsonValue;
+
+/**
+ * Implementation of parsing a JSON string into instances of {@link
+ * com.google.gwt.dev.json.JsonValue}.
+ */
+class JsonTokenizer {
+
+  private static final int INVALID_CHAR = -1;
+
+  private static final String STOPCHARS = ",:]}/\\\"[{;=#";
+
+  private JsonFactory jsonFactory;
+
+  private boolean lenient = true;
+
+  private int pushBackBuffer = INVALID_CHAR;
+
+  private final String json;
+  private int position = 0;
+
+  JsonTokenizer(JreJsonFactory serverJsonFactory, String json) {
+    this.jsonFactory = serverJsonFactory;
+    this.json = json;
+  }
+
+  void back(char c) {
+    assert pushBackBuffer == INVALID_CHAR;
+    pushBackBuffer = c;
+  }
+
+  void back(int c) {
+    back((char) c);
+  }
+
+  int next() {
+    if (pushBackBuffer != INVALID_CHAR) {
+      final int c = pushBackBuffer;
+      pushBackBuffer = INVALID_CHAR;
+      return c;
+    }
+
+    return position < json.length() ? json.charAt(position++) : INVALID_CHAR;
+  }
+
+  String next(int n) throws JsonException {
+    if (n == 0) {
+      return "";
+    }
+
+    char[] buffer = new char[n];
+    int pos = 0;
+
+    if (pushBackBuffer != INVALID_CHAR) {
+      buffer[0] = (char) pushBackBuffer;
+      pos = 1;
+      pushBackBuffer = INVALID_CHAR;
+    }
+
+    int len;
+    while ((pos < n) && ((len = read(buffer, pos, n - pos)) != -1)) {
+      pos += len;
+    }
+
+    if (pos < n) {
+      throw new JsonException("TODO"/* TODO(knorton): Add message. */);
+    }
+
+    return String.valueOf(buffer);
+  }
+
+  int nextNonWhitespace() {
+    while (true) {
+      final int c = next();
+      if (!Character.isSpace((char) c)) {
+        return c;
+      }
+    }
+  }
+
+  String nextString(int startChar) throws JsonException {
+    final StringBuffer buffer = new StringBuffer();
+    int c = next();
+    assert c == '"' || (lenient && c == '\'');
+    while (true) {
+      c = next();
+      switch (c) {
+        case '\r':
+        case '\n':
+          throw new JsonException("");
+        case '\\':
+          c = next();
+          switch (c) {
+            case 'b':
+              buffer.append('\b');
+              break;
+            case 't':
+              buffer.append('\t');
+              break;
+            case 'n':
+              buffer.append('\n');
+              break;
+            case 'f':
+              buffer.append('\f');
+              break;
+            case 'r':
+              buffer.append('\r');
+              break;
+            // TODO(knorton): I'm not sure I should even support this escaping
+            // mode since JSON is always UTF-8.
+            case 'u':
+              buffer.append((char) Integer.parseInt(next(4), 16));
+              break;
+            default:
+              buffer.append((char) c);
+          }
+          break;
+        default:
+          if (c == startChar) {
+            return buffer.toString();
+          }
+          buffer.append((char) c);
+      }
+    }
+  }
+
+  String nextUntilOneOf(String chars)  {
+    final StringBuffer buffer = new StringBuffer();
+    int c = next();
+    while (c != INVALID_CHAR) {
+      if (Character.isSpace((char) c) || chars.indexOf((char) c) >= 0) {
+        back(c);
+        break;
+      }
+      buffer.append((char) c);
+      c = next();
+    }
+    return buffer.toString();
+  }
+
+  <T extends JsonValue> T nextValue() throws JsonException {
+    final int c = nextNonWhitespace();
+    back(c);
+    switch (c) {
+      case '"':
+      case '\'':
+        return (T) jsonFactory.create(nextString(c));
+      case '{':
+        return (T) parseObject();
+      case '[':
+        return (T) parseArray();
+      default:
+        return (T) getValueForLiteral(nextUntilOneOf(STOPCHARS));
+    }
+  }
+
+  JsonArray parseArray() throws JsonException {
+     final JsonArray array = jsonFactory.createArray();
+     int c = nextNonWhitespace();
+     assert c == '[';
+     while (true) {
+       c = nextNonWhitespace();
+       switch (c) {
+         case ']':
+           return array;
+         default:
+           back(c);
+           array.set(array.length(), nextValue());
+           final int d = nextNonWhitespace();
+           switch (d) {
+             case ']':
+               return array;
+             case ',':
+               break;
+             default:
+               throw new JsonException("Invalid array: expected , or ]");
+           }
+       }
+     }
+   }
+
+  JsonObject parseObject() throws JsonException {
+    final JsonObject object = jsonFactory.createObject();
+    int c = nextNonWhitespace();
+    if (c != '{') {
+      throw new JsonException(
+          "Payload does not begin with '{'.  Got " + c + "("
+              + Character.valueOf((char) c) + ")");
+    }
+
+    while (true) {
+      c = nextNonWhitespace();
+      switch (c) {
+        case '}':
+          // We're done.
+          return object;
+        case '"':
+        case '\'':
+          back(c);
+          // Ready to start a key.
+          final String key = nextString(c);
+          if (nextNonWhitespace() != ':') {
+            throw new JsonException(
+                "Invalid object: expecting \":\"");
+          }
+          // TODO(knorton): Make sure this key is not already set.
+          object.put(key, nextValue());
+          switch (nextNonWhitespace()) {
+            case ',':
+              break;
+            case '}':
+              return object;
+            default:
+              throw new JsonException(
+                  "Invalid object: expecting } or ,");
+          }
+          break;
+        case ',':
+          break;
+        default:
+          if (lenient && (Character.isDigit((char) c) || Character.isLetterOrDigit((char) c)))
+        {
+          StringBuffer keyBuffer = new StringBuffer();
+          keyBuffer.append(c);
+          while (true) {
+            c = next();
+            if (Character.isDigit((char) c) || Character.isLetterOrDigit((char) c)) {
+              keyBuffer.append(c);
+            } else {
+              back(c);
+              break;
+            }
+          }
+          if (nextNonWhitespace() != ':') {
+            throw new JsonException(
+                "Invalid object: expecting \":\"");
+          }
+          // TODO(knorton): Make sure this key is not already set.
+          object.put(keyBuffer.toString(), nextValue());
+          switch (nextNonWhitespace()) {
+            case ',':
+              break;
+            case '}':
+              return object;
+            default:
+              throw new JsonException(
+                  "Invalid object: expecting } or ,");
+          }
+
+        }else{
+          throw new JsonException("Invalid object: ");
+        }
+      }
+    }
+  }
+
+  private JsonNumber getNumberForLiteral(String literal)
+      throws JsonException {
+    try {
+      return jsonFactory.create(Double.parseDouble(literal));
+    } catch (NumberFormatException e) {
+      throw new JsonException("Invalid number literal: " + literal);
+    }
+  }
+
+  private JsonValue getValueForLiteral(String literal) throws JsonException {
+    if ("".equals(literal)) {
+      throw new JsonException("Missing value");
+    }
+
+    if ("null".equals(literal) || "undefined".equals(literal)) {
+      return jsonFactory.createNull();
+    }
+
+    if ("true".equals(literal)) {
+      return jsonFactory.create(true);
+    }
+
+    if ("false".equals(literal)) {
+      return jsonFactory.create(false);
+    }
+
+    final char c = literal.charAt(0);
+    if (c == '-' || Character.isDigit(c)) {
+      return getNumberForLiteral(literal);
+    }
+
+    throw new JsonException("Invalid literal: \"" + literal + "\"");
+  }
+
+  private int read(char[] buffer, int pos, int len) {
+    int maxLen = Math.min(json.length() - position, len);
+    String src = json.substring(position, position + maxLen);
+    char result[] = src.toCharArray();
+    System.arraycopy(result, 0, buffer, pos, maxLen);
+    position += maxLen;
+    return maxLen;
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JsonUtil.java b/elemental/src/elemental/json/impl/JsonUtil.java
new file mode 100644
index 0000000..97d27ca
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JsonUtil.java
@@ -0,0 +1,343 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import com.google.gwt.regexp.shared.MatchResult;
+import com.google.gwt.regexp.shared.RegExp;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import elemental.json.Json;
+import elemental.json.JsonArray;
+import elemental.json.JsonException;
+import elemental.json.JsonObject;
+import elemental.json.JsonValue;
+import elemental.json.impl.JsonContext;
+
+/**
+ * Direct port of json2.js at http://www.json.org/json2.js to GWT.
+ */
+public class JsonUtil {
+
+  /**
+   * Callback invoked during a RegExp replace for each match. The return value
+   * is used as a substitution into the matched string.
+   */
+  private interface RegExpReplacer {
+
+    String replace(String match);
+  }
+
+  private static class StringifyJsonVisitor extends JsonVisitor {
+
+    private static final Set<String> skipKeys;
+
+    static {
+      Set<String> toSkip = new HashSet<String>();
+      toSkip.add("$H");
+      toSkip.add("__gwt_ObjectId");
+      skipKeys = Collections.unmodifiableSet(toSkip);
+    }
+
+    private String indentLevel;
+
+    private Set<JsonValue> visited;
+
+    private final String indent;
+
+    private final StringBuffer sb;
+
+    private final boolean pretty;
+
+    public StringifyJsonVisitor(String indent, StringBuffer sb,
+        boolean pretty) {
+      this.indent = indent;
+      this.sb = sb;
+      this.pretty = pretty;
+      indentLevel = "";
+      visited = new HashSet<JsonValue>();
+    }
+
+    @Override
+    public void endVisit(JsonArray array, JsonContext ctx) {
+      if (pretty) {
+        indentLevel = indentLevel
+            .substring(0, indentLevel.length() - indent.length());
+        sb.append('\n');
+        sb.append(indentLevel);
+      }
+      sb.append("]");
+      visited.remove(array);
+    }
+
+    @Override
+    public void endVisit(JsonObject object, JsonContext ctx) {
+      if (pretty) {
+        indentLevel = indentLevel
+            .substring(0, indentLevel.length() - indent.length());
+        sb.append('\n');
+        sb.append(indentLevel);
+      }
+      sb.append("}");
+      visited.remove(object);
+      assert !visited.contains(object);
+    }
+
+    @Override
+    public void visit(double number, JsonContext ctx) {
+      sb.append(Double.isInfinite(number) ? "null" : format(number));
+    }
+
+    @Override
+    public void visit(String string, JsonContext ctx) {
+      sb.append(quote(string));
+    }
+
+    @Override
+    public void visit(boolean bool, JsonContext ctx) {
+      sb.append(bool);
+    }
+
+    @Override
+    public boolean visit(JsonArray array, JsonContext ctx) {
+      checkCycle(array);
+      sb.append("[");
+      if (pretty) {
+        sb.append('\n');
+        indentLevel += indent;
+        sb.append(indentLevel);
+      }
+      return true;
+    }
+
+    @Override
+    public boolean visit(JsonObject object, JsonContext ctx) {
+      checkCycle(object);
+      sb.append("{");
+      if (pretty) {
+        sb.append('\n');
+        indentLevel += indent;
+        sb.append(indentLevel);
+      }
+      return true;
+    }
+
+    @Override
+    public boolean visitIndex(int index, JsonContext ctx) {
+      commaIfNotFirst(ctx);
+      return true;
+    }
+
+    @Override
+    public boolean visitKey(String key, JsonContext ctx) {
+      if ("".equals(key)) {
+        return true;
+      }
+      // skip properties injected by GWT runtime on JSOs
+      if (skipKeys.contains(key)) {
+        return false;
+      }
+      commaIfNotFirst(ctx);
+      sb.append(quote(key) + ":");
+      if (pretty) {
+        sb.append(' ');
+      }
+      return true;
+    }
+
+    @Override
+    public void visitNull(JsonContext ctx) {
+      sb.append("null");
+    }
+
+    private void checkCycle(JsonValue value) {
+      if (visited.contains(value)) {
+        throw new JsonException("Cycled detected during stringify");
+      } else {
+        visited.add(value);
+      }
+    }
+
+    private void commaIfNotFirst(JsonContext ctx) {
+      if (!ctx.isFirst()) {
+        sb.append(",");
+        if (pretty) {
+          sb.append('\n');
+          sb.append(indentLevel);
+        }
+      }
+    }
+
+    private String format(double number) {
+      String n = String.valueOf(number);
+      if (n.endsWith(".0")) {
+        n = n.substring(0, n.length() - 2);
+      }
+      return n;
+    }
+  }
+
+  /**
+   * Convert special control characters into unicode escape format.
+   */
+  public static String escapeControlChars(String text) {
+    StringBuffer toReturn = new StringBuffer();
+    for (int i = 0; i < text.length(); i++) {
+      char c = text.charAt(i);
+      if (isControlChar(c)) {
+        toReturn.append(escapeStringAsUnicode(String.valueOf(c)));
+      } else {
+        toReturn.append(c);
+      }
+    }
+    return toReturn.toString();
+  }
+
+  public static <T extends JsonValue> T parse(String json) throws JsonException {
+    return Json.instance().parse(json);
+  }
+
+  /**
+   * Safely escape an arbitrary string as a JSON string literal.
+   */
+  public static String quote(String value) {
+    StringBuffer toReturn = new StringBuffer();
+    toReturn.append("\"");
+    for (int i = 0; i < value.length(); i++) {
+      char c = value.charAt(i);
+
+      String toAppend = String.valueOf(c);
+      switch (c) {
+        case '\b':
+          toAppend = "\\b";
+          break;
+        case '\t':
+          toAppend = "\\t";
+          break;
+        case '\n':
+          toAppend = "\\n";
+          break;
+        case '\f':
+          toAppend = "\\f";
+          break;
+        case '\r':
+          toAppend = "\\r";
+          break;
+        case '"':
+          toAppend = "\\\"";
+          break;
+        case '\\':
+          toAppend = "\\\\";
+          break;
+        default:
+          if (isControlChar(c)) {
+            toAppend = escapeStringAsUnicode(String.valueOf(c));
+          }
+      }
+      toReturn.append(toAppend);
+    }
+    toReturn.append("\"");
+    return toReturn.toString();
+  }
+
+  /**
+   * Converts a Json Object to Json format.
+   *
+   * @param jsonValue  json object to stringify
+   * @return json formatted string
+   */
+  public static String stringify(JsonValue jsonValue) {
+    return stringify(jsonValue, 0);
+  }
+
+  /**
+   * Converts a JSO to Json format.
+   *
+   * @param jsonValue    json object to stringify
+   * @param spaces number of spaces to indent in pretty print mode
+   * @return json formatted string
+   */
+  public static String stringify(JsonValue jsonValue, int spaces) {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < spaces; i++) {
+      sb.append(' ');
+    }
+    return stringify(jsonValue, sb.toString());
+  }
+
+  /**
+   * Converts a Json object to Json formatted String.
+   *
+   * @param jsonValue    json object to stringify
+   * @param indent optional indention prefix for pretty printing
+   * @return json formatted string
+   */
+  public static String stringify(JsonValue jsonValue, final String indent) {
+    final StringBuffer sb = new StringBuffer();
+    final boolean isPretty = indent != null && !"".equals(indent);
+
+    new StringifyJsonVisitor(indent, sb, isPretty).accept(jsonValue);
+    return sb.toString();
+  }
+
+  /**
+   * Turn a single unicode character into a 32-bit unicode hex literal.
+   */
+  private static String escapeStringAsUnicode(String match) {
+    String hexValue = Integer.toString(match.charAt(0), 16);
+    hexValue = hexValue.length() > 4 ? hexValue.substring(hexValue.length() - 4)
+        : hexValue;
+    return "\\u0000" + hexValue;
+  }
+
+  private static boolean isControlChar(char c) {
+    return (c >= 0x00 && c <= 0x1f)  
+        || (c >= 0x7f && c <= 0x9f) 
+        || c == '\u00ad' || c == '\u070f' || c == '\u17b4' || c == '\u17b5'
+        || c == '\ufeff' 
+        || (c >= '\u0600' && c <= '\u0604')
+        || (c >= '\u200c' && c <= '\u200f')
+        || (c >= '\u2028' && c <= '\u202f')
+        || (c >= '\u2060' && c <= '\u206f')
+        || (c >= '\ufff0' && c <= '\uffff');
+  }
+
+  /**
+   * Execute a regular expression and invoke a callback for each match
+   * occurance. The return value of the callback is substituted for the match.
+   *
+   * @param expression a compiled regular expression
+   * @param text       a String on which to perform replacement
+   * @param replacer   a callback that maps matched strings into new values
+   */
+  private static String replace(RegExp expression, String text,
+      RegExpReplacer replacer) {
+    expression.setLastIndex(0);
+    MatchResult mresult = expression.exec(text);
+    StringBuffer toReturn = new StringBuffer();
+    int lastIndex = 0;
+    while (mresult != null) {
+      toReturn.append(text.substring(lastIndex, mresult.getIndex()));
+      toReturn.append(replacer.replace(mresult.getGroup(0)));
+      lastIndex = mresult.getIndex() + 1;
+      mresult = expression.exec(text);
+    }
+    toReturn.append(text.substring(lastIndex));
+    return toReturn.toString();
+  }
+}
diff --git a/elemental/src/elemental/json/impl/JsonVisitor.java b/elemental/src/elemental/json/impl/JsonVisitor.java
new file mode 100644
index 0000000..517b947
--- /dev/null
+++ b/elemental/src/elemental/json/impl/JsonVisitor.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import elemental.json.JsonArray;
+import elemental.json.JsonObject;
+import elemental.json.JsonValue;
+import elemental.json.impl.JsonContext;
+
+/**
+ * A visitor for JSON objects. For each unique JSON datatype, a callback is
+ * invoked with a {@link elemental.json.impl.JsonContext}
+ * that can be used to replace a value or remove it. For Object and Array
+ * types, the {@link #visitKey} and {@link #visitIndex} methods are invoked
+ * respectively for each contained value to determine if they should be
+ * processed or not. Finally, the visit methods for Object and Array types
+ * returns a boolean that determines whether or not to process its contained
+ * values.
+ */
+class JsonVisitor {
+
+  private class ImmutableJsonContext extends JsonContext {
+
+    public ImmutableJsonContext(JsonValue node) {
+      super(node);
+    }
+    
+    @Override
+    public void removeMe() {
+      immutableError();
+    }
+
+    @Override
+    public void replaceMe(double d) {
+      immutableError();
+    }
+
+    @Override
+    public void replaceMe(String d) {
+      immutableError();
+    }
+
+    @Override
+    public void replaceMe(boolean d) {
+      immutableError();
+    }
+
+    @Override
+    public void replaceMe(JsonValue value) {
+      immutableError();
+    }
+
+    private void immutableError() {
+      throw new UnsupportedOperationException("Immutable context");
+    }
+  }
+
+  public void accept(JsonValue node) {
+    accept(node, new ImmutableJsonContext(node));
+  }
+  
+  /**
+   * Accept array or object type and visit its members.
+   */
+  public void accept(JsonValue node, JsonContext ctx) {
+    if (node == null) {
+      return;
+    }
+    ((JreJsonValue) node).traverse(this, ctx);
+  }
+
+  /**
+   * Called after every element of array has been visited.
+   */
+  public void endVisit(JsonArray array, JsonContext ctx) {
+  }
+
+  /**
+   * Called after every field of an object has been visited.
+   * @param object
+   * @param ctx
+   */
+  public void endVisit(JsonObject object, JsonContext ctx) {
+  }
+
+  /**
+   * Called for JS numbers present in a JSON object.
+   */
+  public void visit(double number, JsonContext ctx) {
+  }
+
+  /**
+   * Called for JS strings present in a JSON object.
+   */
+  public void visit(String string, JsonContext ctx) {
+  }
+
+  /**
+   * Called for JS boolean present in a JSON object.
+   */
+  public void visit(boolean bool, elemental.json.impl.JsonContext ctx) {
+  }
+
+  /**
+   * Called for JS arrays present in a JSON object. Return true if array
+   * elements should be visited.
+   * @param array a JS array
+   * @param ctx a context to replace or delete the array
+   * @return true if the array elements should be visited
+   */
+  public boolean visit(JsonArray array, JsonContext ctx) {
+    return true;
+  }
+
+  /**
+   * Called for JS objects present in a JSON object. Return true if object
+   * fields should be visited.
+   * @param object a Json object
+   * @param ctx a context to replace or delete the object
+   * @return true if object fields should be visited
+   */
+  public boolean visit(JsonObject object, JsonContext ctx) {
+    return true;
+  }
+
+  /**
+   * Return true if the value for a given array index should be visited.
+   * @param index an index in a JSON array
+   * @param ctx a context object used to delete or replace values
+   * @return true if the value associated with the index should be visited
+   */
+  public boolean visitIndex(int index, JsonContext ctx) {
+    return true;
+  }
+
+  /**
+   * Return true if the value for a given object key should be visited.
+   * @param key a key in a JSON object
+   * @param ctx a context object used to delete or replace values
+   * @return true if the value associated with the key should be visited
+   */
+  public boolean visitKey(String key, JsonContext ctx) {
+    return true;
+  }
+
+  /**
+   * Called for nulls present in a JSON object.
+   */
+  public void visitNull(JsonContext ctx) {
+  }
+}
diff --git a/elemental/src/elemental/ranges/Range.java b/elemental/src/elemental/ranges/Range.java
new file mode 100644
index 0000000..31f62cd
--- /dev/null
+++ b/elemental/src/elemental/ranges/Range.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.ranges;
+import elemental.dom.Node;
+import elemental.html.ClientRect;
+import elemental.html.ClientRectList;
+import elemental.dom.DocumentFragment;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>Range</code> object represents a fragment of a document that can contain nodes and parts of text nodes in a given document.</p>
+<p>A range can be created using the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Document.createRange">Document.createRange</a></code>
+&nbsp;method of the&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Document">Document</a></code>
+&nbsp;object. Range objects can also be retrieved by using the <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/Selection.getRangeAt" class="new">Selection.getRangeAt</a></code>
+&nbsp;method of the&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Selection">Selection</a></code>
+&nbsp;object.</p>
+  */
+public interface Range {
+
+    static final int END_TO_END = 2;
+
+    static final int END_TO_START = 3;
+
+    static final int NODE_AFTER = 1;
+
+    static final int NODE_BEFORE = 0;
+
+    static final int NODE_BEFORE_AND_AFTER = 2;
+
+    static final int NODE_INSIDE = 3;
+
+    static final int START_TO_END = 1;
+
+    static final int START_TO_START = 0;
+
+
+  /**
+    * Returns a&nbsp;<code>boolean</code>&nbsp;indicating whether the range's start and end points are at the same position.
+    */
+  boolean isCollapsed();
+
+
+  /**
+    * Returns the deepest&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+&nbsp;that contains the startContainer and endContainer Nodes.
+    */
+  Node getCommonAncestorContainer();
+
+
+  /**
+    * Returns the&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+&nbsp;within which the Range ends.
+    */
+  Node getEndContainer();
+
+
+  /**
+    * Returns a number representing where in the endContainer the Range ends.
+    */
+  int getEndOffset();
+
+
+  /**
+    * Returns the&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+&nbsp;within which the Range starts.
+    */
+  Node getStartContainer();
+
+
+  /**
+    * Returns a number representing where in the startContainer the Range starts.
+    */
+  int getStartOffset();
+
+
+  /**
+    * Returns a&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DocumentFragment">DocumentFragment</a></code>
+&nbsp;copying the nodes of a Range.
+    */
+  DocumentFragment cloneContents();
+
+
+  /**
+    * Returns a Range object with boundary points identical to the cloned Range.
+    */
+  Range cloneRange();
+
+
+  /**
+    * Collapses the Range to one of its boundary points.
+    */
+  void collapse(boolean toStart);
+
+
+  /**
+    * Returns a constant representing whether the&nbsp;<a title="en/DOM/Node" rel="internal" href="https://developer.mozilla.org/en/DOM/Node">Node</a>&nbsp;is before, after, inside, or surrounding the range.
+    */
+  short compareNode(Node refNode);
+
+
+  /**
+    * Returns -1, 0, or 1 indicating whether the point occurs before, inside, or after the range.
+    */
+  short comparePoint(Node refNode, int offset);
+
+
+  /**
+    * Returns a&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DocumentFragment">DocumentFragment</a></code>
+&nbsp;created from a given string of code.
+    */
+  DocumentFragment createContextualFragment(String html);
+
+
+  /**
+    * Removes the contents of a Range from the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Document">Document</a></code>
+.
+    */
+  void deleteContents();
+
+
+  /**
+    * Releases Range from use to improve performance.
+    */
+  void detach();
+
+  void expand(String unit);
+
+
+  /**
+    * Moves contents of a Range from the document tree into a&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DocumentFragment">DocumentFragment</a></code>
+.
+    */
+  DocumentFragment extractContents();
+
+
+  /**
+    * Returns a <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/ClientRect" class="new">ClientRect</a></code>
+ object which bounds the entire contents of the range; this would be the union of all the rectangles returned by <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/range.getClientRects">range.getClientRects()</a></code>
+.
+    */
+  ClientRect getBoundingClientRect();
+
+
+  /**
+    * Returns a list of <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/ClientRect" class="new">ClientRect</a></code>
+ objects that aggregates the results of <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Element.getClientRects">Element.getClientRects()</a></code>
+ for all the elements in the range.
+    */
+  ClientRectList getClientRects();
+
+
+  /**
+    * Insert a&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+&nbsp;at the start of a Range.
+    */
+  void insertNode(Node newNode);
+
+
+  /**
+    * Returns a <code>boolean</code> indicating whether the given node intersects the range.
+    */
+  boolean intersectsNode(Node refNode);
+
+
+  /**
+    * Returns a <code>boolean</code> indicating whether the given point is in the range.
+    */
+  boolean isPointInRange(Node refNode, int offset);
+
+
+  /**
+    * Sets the Range to contain the&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+&nbsp;and its contents.
+    */
+  void selectNode(Node refNode);
+
+
+  /**
+    * Sets the Range to contain the contents of a&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+.
+    */
+  void selectNodeContents(Node refNode);
+
+
+  /**
+    * Sets the end position of a Range.
+    */
+  void setEnd(Node refNode, int offset);
+
+
+  /**
+    * Sets the end position of a Range relative to another&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+.
+    */
+  void setEndAfter(Node refNode);
+
+
+  /**
+    * Sets the end position of a Range relative to another&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+.
+    */
+  void setEndBefore(Node refNode);
+
+
+  /**
+    * Sets the start position of a Range.
+    */
+  void setStart(Node refNode, int offset);
+
+
+  /**
+    * Sets the start position of a Range relative to another&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+.
+    */
+  void setStartAfter(Node refNode);
+
+
+  /**
+    * Sets the start position of a Range relative to another&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+.
+    */
+  void setStartBefore(Node refNode);
+
+
+  /**
+    * Moves content of a Range into a new&nbsp;<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Node">Node</a></code>
+.
+    */
+  void surroundContents(Node newParent);
+}
diff --git a/elemental/src/elemental/ranges/RangeException.java b/elemental/src/elemental/ranges/RangeException.java
new file mode 100644
index 0000000..73bdddc
--- /dev/null
+++ b/elemental/src/elemental/ranges/RangeException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.ranges;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface RangeException {
+
+    static final int BAD_BOUNDARYPOINTS_ERR = 1;
+
+    static final int INVALID_NODE_TYPE_ERR = 2;
+
+  int getCode();
+
+  String getMessage();
+
+  String getName();
+}
diff --git a/elemental/src/elemental/stylesheets/MediaList.java b/elemental/src/elemental/stylesheets/MediaList.java
new file mode 100644
index 0000000..57b179e
--- /dev/null
+++ b/elemental/src/elemental/stylesheets/MediaList.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.stylesheets;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface MediaList extends Indexable {
+
+  int getLength();
+
+  String getMediaText();
+
+  void setMediaText(String arg);
+
+  void appendMedium(String newMedium);
+
+  void deleteMedium(String oldMedium);
+
+  String item(int index);
+}
diff --git a/elemental/src/elemental/stylesheets/StyleSheet.java b/elemental/src/elemental/stylesheets/StyleSheet.java
new file mode 100644
index 0000000..82cabf9
--- /dev/null
+++ b/elemental/src/elemental/stylesheets/StyleSheet.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.stylesheets;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * An object implementing the <code>StyleSheet</code> interface represents a single style sheet.&nbsp; CSS style sheets will further implement the more specialized <code><a title="en/DOM/CSSStyleSheet" rel="internal" href="https://developer.mozilla.org/en/DOM/CSSStyleSheet">CSSStyleSheet</a></code> interface.
+  */
+public interface StyleSheet {
+
+
+  /**
+    * This property indicates whether the current stylesheet has been applied or not.
+    */
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * Returns the location of the stylesheet.
+    */
+  String getHref();
+
+
+  /**
+    * Specifies the intended destination medium for style information.
+    */
+  MediaList getMedia();
+
+
+  /**
+    * Returns the node that associates this style sheet with the document.
+    */
+  Node getOwnerNode();
+
+
+  /**
+    * Returns the stylesheet that is including this one, if any.
+    */
+  StyleSheet getParentStyleSheet();
+
+
+  /**
+    * Returns the advisory title of the current style sheet.
+    */
+  String getTitle();
+
+
+  /**
+    * Specifies the style sheet language for this style sheet.
+    */
+  String getType();
+}
diff --git a/elemental/src/elemental/stylesheets/StyleSheetList.java b/elemental/src/elemental/stylesheets/StyleSheetList.java
new file mode 100644
index 0000000..cf6c2bf
--- /dev/null
+++ b/elemental/src/elemental/stylesheets/StyleSheetList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.stylesheets;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface StyleSheetList extends Indexable {
+
+  int getLength();
+
+  StyleSheet item(int index);
+}
diff --git a/elemental/src/elemental/super/elemental/json/Json.java b/elemental/src/elemental/super/elemental/json/Json.java
new file mode 100644
index 0000000..8891146
--- /dev/null
+++ b/elemental/src/elemental/super/elemental/json/Json.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.GwtScriptOnly;
+import elemental.js.json.JsJsonFactory;
+import elemental.json.impl.JreJsonFactory;
+
+/**
+ * Vends out implementation of JsonFactory.
+ */
+@GwtScriptOnly
+public class Json {
+
+  public static JsonString create(String string) {
+    return instance().create(string);
+  }
+
+  public static JsonBoolean create(boolean bool) {
+    return instance().create(bool);
+  }
+
+  public static JsonArray createArray() {
+    return instance().createArray();
+  }
+
+  public static JsonNull createNull() {
+    return instance().createNull();
+  }
+
+  public static JsonNumber create(double number) {
+    return instance().create(number);
+  }
+
+  public static JsonObject createObject() {
+    return instance().createObject();
+  }
+
+  public static JsonFactory instance() {
+      assert GWT.isScript() : "Super-sourced Json class ran in DevMode";
+      return new JsJsonFactory();
+  }
+
+  public static JsonObject parse(String jsonString) {
+    return instance().parse(jsonString);
+  }
+}
diff --git a/elemental/src/elemental/super/elemental/json/impl/JreJsonValue.java b/elemental/src/elemental/super/elemental/json/impl/JreJsonValue.java
new file mode 100644
index 0000000..c0402a9
--- /dev/null
+++ b/elemental/src/elemental/super/elemental/json/impl/JreJsonValue.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json.impl;
+
+import com.google.gwt.core.client.JsonUtils;
+
+import elemental.json.JsonValue;
+
+/**
+ * Client-side Dev-Mode implementation of JreJsonValue.
+ */
+public abstract class JreJsonValue implements JsonValue {
+  public abstract Object getObject();
+  public abstract void traverse(JsonVisitor visitor, JsonContext ctx);
+
+  @Override
+  public Object toNative() {
+    // use browser JS parser, returns JSO
+    return JsonUtils.safeEval(((JsonValue) this).toJson());
+  }
+}
diff --git a/elemental/src/elemental/super/elemental/util/Collections.java b/elemental/src/elemental/super/elemental/util/Collections.java
new file mode 100644
index 0000000..0a575b1
--- /dev/null
+++ b/elemental/src/elemental/super/elemental/util/Collections.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+import com.google.gwt.core.client.GwtScriptOnly;
+
+import elemental.js.util.JsArrayOf;
+import elemental.js.util.JsArrayOfBoolean;
+import elemental.js.util.JsArrayOfInt;
+import elemental.js.util.JsArrayOfNumber;
+import elemental.js.util.JsArrayOfString;
+import elemental.js.util.JsMapFromIntTo;
+import elemental.js.util.JsMapFromIntToString;
+import elemental.js.util.JsMapFromStringTo;
+import elemental.js.util.JsMapFromStringToBoolean;
+import elemental.js.util.JsMapFromStringToInt;
+import elemental.js.util.JsMapFromStringToNumber;
+import elemental.js.util.JsMapFromStringToString;
+import elemental.util.impl.JreArrayOf;
+import elemental.util.impl.JreArrayOfBoolean;
+import elemental.util.impl.JreArrayOfInt;
+import elemental.util.impl.JreArrayOfNumber;
+import elemental.util.impl.JreArrayOfString;
+import elemental.util.impl.JreMapFromIntTo;
+import elemental.util.impl.JreMapFromIntToString;
+import elemental.util.impl.JreMapFromStringTo;
+import elemental.util.impl.JreMapFromStringToBoolean;
+import elemental.util.impl.JreMapFromStringToInt;
+import elemental.util.impl.JreMapFromStringToNumber;
+import elemental.util.impl.JreMapFromStringToString;
+
+/**
+ * Factory and utility methods for elemental collections.
+ */
+@GwtScriptOnly
+public class Collections {
+
+  /**
+   * Create an ArrayOf collection using the most efficient implementation strategy for the given
+   * client.
+   *
+   * @param <T>   the element type contained in the collection
+   * @return a JreArrayOf or JsArrayOf instance
+   */
+  public static <T> ArrayOf<T> arrayOf() {
+    return JsArrayOf.<T>create();
+  }
+
+  /**
+   * Create an ArrayOfBoolean collection using the most efficient implementation strategy for the
+   * given client.
+   *
+   * @return a JreArrayOfBoolean or JsArrayOfBoolean instance
+   */
+  public static <T> ArrayOfBoolean arrayOfBoolean() {
+    return JsArrayOfBoolean.create();
+  }
+
+  /**
+   * Create an ArrayOfInt collection using the most efficient implementation strategy for the given
+   * client.
+   *
+   * @return a JreArrayOfInt or JsArrayOfInt instance
+   */
+  public static <T> ArrayOfInt arrayOfInt() {
+    return JsArrayOfInt.create();
+  }
+
+  /**
+   * Create an ArrayOfNumber collection using the most efficient implementation strategy for the
+   * given client.
+   *
+   * @return a JreArrayOfNumber or JsArrayOfNumber instance
+   */
+  public static <T> ArrayOfNumber arrayOfNumber() {
+    return JsArrayOfNumber.create();
+  }
+
+  /**
+   * Create an ArrayOfString collection using the most efficient implementation strategy for the
+   * given client.
+   *
+   * @return a JreArrayOfString or JsArrayOfString instance
+   */
+  public static <T> ArrayOfString arrayOfString() {
+    return JsArrayOfString.create();
+  }
+
+  /**
+   * Create a MapFromIntTo collection for a given type using the most efficient implementation
+   * strategy for the given client.
+   *
+   * @param <T>   the element type contained in the collection
+   * @return a JreMapFromIntTo or JsMapFromIntTo instance
+   */
+  public static <T> MapFromIntTo<T> mapFromIntTo() {
+    return JsMapFromIntTo.<T>create();
+  }
+
+  /**
+   * Create a MapFromIntToString collection for a given type using the most efficient implementation
+   * strategy for the given client.
+   *
+   * @return a JreMapFromIntToString or JsMapFromIntToString instance
+   */
+  public static MapFromIntToString mapFromIntToString() {
+    return JsMapFromIntToString.create();
+  }
+
+  /**
+   * Create a MapFromStringTo collection for a given type using the most efficient implementation
+   * strategy for the given client.
+   *
+   * @param <T>   the element type contained in the collection
+   * @return a JreMapFromStringTo or JsMapFromStringTo instance
+   */
+  public static <T> MapFromStringTo<T> mapFromStringTo() {
+    return JsMapFromStringTo.<T>create();
+  }
+
+  /**
+   * Create a MapFromStringToBoolean collection for a given type using the most efficient
+   * implementation strategy for the given client.
+   *
+   * @return a JreMapFromStringToBoolean or JsMapFromStringToBoolean instance
+   */
+  public static MapFromStringToBoolean mapFromStringToBoolean() {
+    return JsMapFromStringToBoolean.create();
+  }
+
+  /**
+   * Create a MapFromStringToInt collection for a given type using the most efficient implementation
+   * strategy for the given client.
+   *
+   * @return a JreMapFromStringToInt or JsMapFromStringToInt instance
+   */
+  public static MapFromStringToInt mapFromStringToInt() {
+    return JsMapFromStringToInt.create();
+  }
+
+  /**
+   * Create a MapFromStringToNumber collection for a given type using the most efficient
+   * implementation strategy for the given client.
+   *
+   * @return a JreMapFromStringToNumber or JsMapFromStringToNumber instance
+   */
+  public static MapFromStringToNumber mapFromStringToNumber() {
+    return JsMapFromStringToNumber.create();
+  }
+
+  /**
+   * Create a MapFromStringToString collection for a given type using the most efficient
+   * implementation strategy for the given client.
+   *
+   * @return a JreMapFromStringToString or JsMapFromStringToString instance
+   */
+  public static MapFromStringToString mapFromStringToString() {
+    return JsMapFromStringToString.create();
+  }
+}
diff --git a/elemental/src/elemental/svg/ElementTimeControl.java b/elemental/src/elemental/svg/ElementTimeControl.java
new file mode 100644
index 0000000..03fd942
--- /dev/null
+++ b/elemental/src/elemental/svg/ElementTimeControl.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface ElementTimeControl {
+
+  void beginElement();
+
+  void beginElementAt(float offset);
+
+  void endElement();
+
+  void endElementAt(float offset);
+}
diff --git a/elemental/src/elemental/svg/SVGAElement.java b/elemental/src/elemental/svg/SVGAElement.java
new file mode 100644
index 0000000..bf1a7c7
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/a">&lt;a&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGAElement extends SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/target" class="new">target</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/a">&lt;a&gt;</a></code>
+ element.
+    */
+  SVGAnimatedString getTarget();
+}
diff --git a/elemental/src/elemental/svg/SVGAltGlyphDefElement.java b/elemental/src/elemental/svg/SVGAltGlyphDefElement.java
new file mode 100644
index 0000000..cb1f975
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAltGlyphDefElement.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>altGlyphDef</code> element defines a substitution representation for glyphs.
+  */
+public interface SVGAltGlyphDefElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGAltGlyphElement.java b/elemental/src/elemental/svg/SVGAltGlyphElement.java
new file mode 100644
index 0000000..3b2daa5
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAltGlyphElement.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>altGlyph</code> element allows sophisticated selection of the glyphs used to render its child character data.
+  */
+public interface SVGAltGlyphElement extends SVGTextPositioningElement, SVGURIReference {
+
+  String getFormat();
+
+  void setFormat(String arg);
+
+  String getGlyphRef();
+
+  void setGlyphRef(String arg);
+}
diff --git a/elemental/src/elemental/svg/SVGAltGlyphItemElement.java b/elemental/src/elemental/svg/SVGAltGlyphItemElement.java
new file mode 100644
index 0000000..f5cbf36
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAltGlyphItemElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>altGlyphItem</code> element provides a set of candidates for glyph substitution by the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/altGlyph">&lt;altGlyph&gt;</a></code>
+ element.
+  */
+public interface SVGAltGlyphItemElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGAngle.java b/elemental/src/elemental/svg/SVGAngle.java
new file mode 100644
index 0000000..4dd1c9e
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAngle.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGAngle</code> interface correspond to the <a title="https://developer.mozilla.org/en/SVG/Content_type#Angle" rel="internal" href="https://developer.mozilla.org/en/SVG/Content_type#Angle">&lt;angle&gt;</a> basic data type.</p>
+<p>An <code>SVGAngle</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+  */
+public interface SVGAngle {
+
+  /**
+    * The unit type was explicitly set to degrees.
+    */
+
+    static final int SVG_ANGLETYPE_DEG = 2;
+
+  /**
+    * The unit type is gradians.
+    */
+
+    static final int SVG_ANGLETYPE_GRAD = 4;
+
+  /**
+    * The unit type is radians.
+    */
+
+    static final int SVG_ANGLETYPE_RAD = 3;
+
+  /**
+    * The unit type is not one of predefined unit types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.
+    */
+
+    static final int SVG_ANGLETYPE_UNKNOWN = 0;
+
+  /**
+    * No unit type was provided (i.e., a unitless value was specified). For angles, a unitless value is treated the same as if degrees were specified.
+    */
+
+    static final int SVG_ANGLETYPE_UNSPECIFIED = 1;
+
+
+  /**
+    * The type of the value as specified by one of the SVG_ANGLETYPE_* constants defined on this interface.
+    */
+  int getUnitType();
+
+
+  /**
+    * <p>The value as a floating point value, in user units. Setting this attribute will cause <code>valueInSpecifiedUnits</code> and <code>valueAsString</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</p>
+    */
+  float getValue();
+
+  void setValue(float arg);
+
+
+  /**
+    * <p>The value as a string value, in the units expressed by <code>unitType</code>. Setting this attribute will cause <code>value</code>, <code>valueInSpecifiedUnits</code> and <code>unitType</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>SYNTAX_ERR</code> is raised if the assigned string cannot be parsed as a valid <a title="https://developer.mozilla.org/en/SVG/Content_type#Angle" rel="internal" href="https://developer.mozilla.org/en/SVG/Content_type#Angle">&lt;angle&gt;</a>.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  String getValueAsString();
+
+  void setValueAsString(String arg);
+
+
+  /**
+    * <p>The value as a floating point value, in the units expressed by <code>unitType</code>. Setting this attribute will cause <code>value</code> and <code>valueAsString</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</p>
+    */
+  float getValueInSpecifiedUnits();
+
+  void setValueInSpecifiedUnits(float arg);
+
+
+  /**
+    * Preserve the same underlying stored value, but reset the stored unit identifier to the given <code><em>unitType</em></code>. Object attributes <code>unitType</code>, <code>valueInSpecifiedUnits</code> and <code>valueAsString</code> might be modified as a result of this method.
+    */
+  void convertToSpecifiedUnits(int unitType);
+
+
+  /**
+    * <p>Reset the value as a number with an associated unitType, thereby replacing the values for all of the attributes on the object.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NOT_SUPPORTED_ERR</code> is raised if <code>unitType</code> is <code>SVG_ANGLETYPE_UNKNOWN</code> or not a valid unit type constant (one of the other <code>SVG_ANGLETYPE_*</code> constants defined on this interface).</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void newValueSpecifiedUnits(int unitType, float valueInSpecifiedUnits);
+}
diff --git a/elemental/src/elemental/svg/SVGAnimateColorElement.java b/elemental/src/elemental/svg/SVGAnimateColorElement.java
new file mode 100644
index 0000000..921ccb1
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimateColorElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimateColorElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/animateColor">&lt;animateColor&gt;</a></code>
+ element.
+  */
+public interface SVGAnimateColorElement extends SVGAnimationElement {
+}
diff --git a/elemental/src/elemental/svg/SVGAnimateElement.java b/elemental/src/elemental/svg/SVGAnimateElement.java
new file mode 100644
index 0000000..403c548
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimateElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimateElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/animate">&lt;animate&gt;</a></code>
+ element.
+  */
+public interface SVGAnimateElement extends SVGAnimationElement {
+}
diff --git a/elemental/src/elemental/svg/SVGAnimateMotionElement.java b/elemental/src/elemental/svg/SVGAnimateMotionElement.java
new file mode 100644
index 0000000..6cdc6d5
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimateMotionElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimateMotionElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/animateMotion">&lt;animateMotion&gt;</a></code>
+ element.
+  */
+public interface SVGAnimateMotionElement extends SVGAnimationElement {
+}
diff --git a/elemental/src/elemental/svg/SVGAnimateTransformElement.java b/elemental/src/elemental/svg/SVGAnimateTransformElement.java
new file mode 100644
index 0000000..70ea4aa
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimateTransformElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimateTransformElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/animateTransform">&lt;animateTransform&gt;</a></code>
+ element.
+  */
+public interface SVGAnimateTransformElement extends SVGAnimationElement {
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedAngle.java b/elemental/src/elemental/svg/SVGAnimatedAngle.java
new file mode 100644
index 0000000..6970412
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedAngle.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedAngle</code> interface is used for attributes of basic type <a title="https://developer.mozilla.org/en/SVG/Content_type#Angle" rel="internal" href="https://developer.mozilla.org/en/SVG/Content_type#Angle">&lt;angle&gt;</a> which can be animated.
+  */
+public interface SVGAnimatedAngle {
+
+
+  /**
+    * A read only <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGAngle">SVGAngle</a></code>
+ representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGAngle">SVGAngle</a></code>
+ will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.
+    */
+  SVGAngle getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  SVGAngle getBaseVal();
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedBoolean.java b/elemental/src/elemental/svg/SVGAnimatedBoolean.java
new file mode 100644
index 0000000..d73f01d
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedBoolean.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedBoolean</code> interface is used for attributes of type boolean which can be animated.
+  */
+public interface SVGAnimatedBoolean {
+
+
+  /**
+    * If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.
+    */
+  boolean isAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  boolean isBaseVal();
+
+  void setBaseVal(boolean arg);
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedEnumeration.java b/elemental/src/elemental/svg/SVGAnimatedEnumeration.java
new file mode 100644
index 0000000..7a40de8
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedEnumeration.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedEnumeration</code> interface is used for attributes whose value must be a constant from a particular enumeration and which can be animated.
+  */
+public interface SVGAnimatedEnumeration {
+
+
+  /**
+    * If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.
+    */
+  int getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  int getBaseVal();
+
+  void setBaseVal(int arg);
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedInteger.java b/elemental/src/elemental/svg/SVGAnimatedInteger.java
new file mode 100644
index 0000000..568e8a4
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedInteger.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedInteger</code> interface is used for attributes of basic type <a title="https://developer.mozilla.org/en/SVG/Content_type#Integer" rel="internal" href="https://developer.mozilla.org/en/SVG/Content_type#Integer">&lt;integer&gt;</a> which can be animated.
+  */
+public interface SVGAnimatedInteger {
+
+
+  /**
+    * If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.
+    */
+  int getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  int getBaseVal();
+
+  void setBaseVal(int arg);
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedLength.java b/elemental/src/elemental/svg/SVGAnimatedLength.java
new file mode 100644
index 0000000..4eb331d
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedLength.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedLength</code> interface is used for attributes of basic type <a title="https://developer.mozilla.org/en/SVG/Content_type#Length" rel="internal" href="https://developer.mozilla.org/en/SVG/Content_type#Length">&lt;length&gt;</a> which can be animated.
+  */
+public interface SVGAnimatedLength {
+
+
+  /**
+    * If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.
+    */
+  SVGLength getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  SVGLength getBaseVal();
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedLengthList.java b/elemental/src/elemental/svg/SVGAnimatedLengthList.java
new file mode 100644
index 0000000..eb5c40d
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedLengthList.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedLengthList</code> interface is used for attributes of type <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGLengthList">SVGLengthList</a></code>
+ which can be animated.
+  */
+public interface SVGAnimatedLengthList {
+
+
+  /**
+    * A read only <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGLengthList">SVGLengthList</a></code>
+ representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGLengthList">SVGLengthList</a></code>
+ will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.
+    */
+  SVGLengthList getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  SVGLengthList getBaseVal();
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedNumber.java b/elemental/src/elemental/svg/SVGAnimatedNumber.java
new file mode 100644
index 0000000..deca205
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedNumber.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedNumber</code> interface is used for attributes of basic type <a title="https://developer.mozilla.org/en/SVG/Content_type#Number" rel="internal" href="https://developer.mozilla.org/en/SVG/Content_type#Number">&lt;Number&gt;</a> which can be animated.
+  */
+public interface SVGAnimatedNumber {
+
+
+  /**
+    * If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.
+    */
+  float getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  float getBaseVal();
+
+  void setBaseVal(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedNumberList.java b/elemental/src/elemental/svg/SVGAnimatedNumberList.java
new file mode 100644
index 0000000..1aa968e
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedNumberList.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedNumber</code> interface is used for attributes which take a list of numbers and which can be animated.
+  */
+public interface SVGAnimatedNumberList {
+
+
+  /**
+    * A read only <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGNumberList">SVGNumberList</a></code>
+ representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGNumberList">SVGNumberList</a></code>
+ will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.
+    */
+  SVGNumberList getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  SVGNumberList getBaseVal();
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedPreserveAspectRatio.java b/elemental/src/elemental/svg/SVGAnimatedPreserveAspectRatio.java
new file mode 100644
index 0000000..bc064e3
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedPreserveAspectRatio.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedPreserveAspectRatio</code> interface is used for attributes of type <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGPreserveAspectRatio">SVGPreserveAspectRatio</a></code>
+ which can be animated.
+  */
+public interface SVGAnimatedPreserveAspectRatio {
+
+
+  /**
+    * A read only <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGPreserveAspectRatio">SVGPreserveAspectRatio</a></code>
+ representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGPreserveAspectRatio">SVGPreserveAspectRatio</a></code>
+ will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> is always distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.
+    */
+  SVGPreserveAspectRatio getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  SVGPreserveAspectRatio getBaseVal();
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedRect.java b/elemental/src/elemental/svg/SVGAnimatedRect.java
new file mode 100644
index 0000000..35e9781
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedRect.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedRect</code> interface is used for attributes of basic <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGRect">SVGRect</a></code>
+ which can be animated.
+  */
+public interface SVGAnimatedRect {
+
+
+  /**
+    * A read only <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGRect">SVGRect</a></code>
+ representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGRect">SVGRect</a></code>
+ will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.
+    */
+  SVGRect getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  SVGRect getBaseVal();
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedString.java b/elemental/src/elemental/svg/SVGAnimatedString.java
new file mode 100644
index 0000000..76aad0e
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedString.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedString</code> interface is used for attributes of type <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMString">DOMString</a></code>
+ which can be animated.
+  */
+public interface SVGAnimatedString {
+
+
+  /**
+    * If the given attribute or property is being animated, contains the current animated value of the attribute or property. If the given attribute or property is not currently being animated, contains the same value as <code>baseVal</code>.
+    */
+  String getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  String getBaseVal();
+
+  void setBaseVal(String arg);
+}
diff --git a/elemental/src/elemental/svg/SVGAnimatedTransformList.java b/elemental/src/elemental/svg/SVGAnimatedTransformList.java
new file mode 100644
index 0000000..209d40d
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimatedTransformList.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimatedTransformList</code> interface is used for attributes which take a list of numbers and which can be animated.
+  */
+public interface SVGAnimatedTransformList {
+
+
+  /**
+    * A read only <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGTransformList">SVGTransformList</a></code>
+ representing the current animated value of the given attribute. If the given attribute is not currently being animated, then the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGTransformList">SVGTransformList</a></code>
+ will have the same contents as <code>baseVal</code>. The object referenced by <code>animVal</code> will always be distinct from the one referenced by <code>baseVal</code>, even when the attribute is not animated.
+    */
+  SVGTransformList getAnimVal();
+
+
+  /**
+    * The base value of the given attribute before applying any animations.
+    */
+  SVGTransformList getBaseVal();
+}
diff --git a/elemental/src/elemental/svg/SVGAnimationElement.java b/elemental/src/elemental/svg/SVGAnimationElement.java
new file mode 100644
index 0000000..915c17f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGAnimationElement.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGAnimationElement</code> interface is the base interface for all of the animation element interfaces: <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGAnimateElement">SVGAnimateElement</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGSetElement">SVGSetElement</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGAnimateColorElement">SVGAnimateColorElement</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGAnimateMotionElement">SVGAnimateMotionElement</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGAnimateTransformElement">SVGAnimateTransformElement</a></code>
+.
+  */
+public interface SVGAnimationElement extends SVGElement, SVGTests, SVGExternalResourcesRequired, ElementTimeControl {
+
+
+  /**
+    * The element which is being animated.
+    */
+  SVGElement getTargetElement();
+
+
+  /**
+    * Returns the current time in seconds relative to time zero for the given time container.
+    */
+  float getCurrentTime();
+
+
+  /**
+    * Returns the number of seconds for the simple duration for this animation. If the simple duration is undefined (e.g., the end time is indefinite), then a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code NOT_SUPPORTED_ERR is raised.
+    */
+  float getSimpleDuration();
+
+
+  /**
+    * Returns the begin time, in seconds, for this animation element's current interval, if it exists, regardless of whether the interval has begun yet. If there is no current interval, then a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code INVALID_STATE_ERR is thrown.
+    */
+  float getStartTime();
+}
diff --git a/elemental/src/elemental/svg/SVGCircleElement.java b/elemental/src/elemental/svg/SVGCircleElement.java
new file mode 100644
index 0000000..0745ff2
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGCircleElement.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGCircleElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/circle">&lt;circle&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGCircleElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/cx">cx</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/circle">&lt;circle&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getCx();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/cy">cy</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/circle">&lt;circle&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getCy();
+
+  SVGAnimatedLength getR();
+}
diff --git a/elemental/src/elemental/svg/SVGClipPathElement.java b/elemental/src/elemental/svg/SVGClipPathElement.java
new file mode 100644
index 0000000..811568d
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGClipPathElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGClipPathElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/clipPath">&lt;clipPath&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGClipPathElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/clipPathUnits">clipPathUnits</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/clipPath">&lt;clipPath&gt;</a></code>
+ element. Takes one of the constants defined in <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes" class="new">SVGUnitTypes</a></code>
+    */
+  SVGAnimatedEnumeration getClipPathUnits();
+}
diff --git a/elemental/src/elemental/svg/SVGColor.java b/elemental/src/elemental/svg/SVGColor.java
new file mode 100644
index 0000000..64f84a8
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGColor.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+import elemental.css.RGBColor;
+import elemental.css.CSSValue;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>This page explains more about how you can specify color in CSS.
+</p><p>In your sample stylesheet, you introduce background colors.
+</p>
+  */
+public interface SVGColor extends CSSValue {
+
+    static final int SVG_COLORTYPE_CURRENTCOLOR = 3;
+
+    static final int SVG_COLORTYPE_RGBCOLOR = 1;
+
+    static final int SVG_COLORTYPE_RGBCOLOR_ICCCOLOR = 2;
+
+    static final int SVG_COLORTYPE_UNKNOWN = 0;
+
+  int getColorType();
+
+  RGBColor getRgbColor();
+
+  void setColor(int colorType, String rgbColor, String iccColor);
+
+  void setRGBColor(String rgbColor);
+
+  void setRGBColorICCColor(String rgbColor, String iccColor);
+}
diff --git a/elemental/src/elemental/svg/SVGComponentTransferFunctionElement.java b/elemental/src/elemental/svg/SVGComponentTransferFunctionElement.java
new file mode 100644
index 0000000..8b49fe8
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGComponentTransferFunctionElement.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGComponentTransferFunctionElement extends SVGElement {
+
+    static final int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
+
+    static final int SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;
+
+    static final int SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
+
+    static final int SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;
+
+    static final int SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;
+
+    static final int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
+
+  SVGAnimatedNumber getAmplitude();
+
+  SVGAnimatedNumber getExponent();
+
+  SVGAnimatedNumber getIntercept();
+
+  SVGAnimatedNumber getOffset();
+
+  SVGAnimatedNumber getSlope();
+
+  SVGAnimatedNumberList getTableValues();
+
+  SVGAnimatedEnumeration getType();
+}
diff --git a/elemental/src/elemental/svg/SVGCursorElement.java b/elemental/src/elemental/svg/SVGCursorElement.java
new file mode 100644
index 0000000..62933fc
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGCursorElement.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGCursorElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/cursor">&lt;cursor&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGCursorElement extends SVGElement, SVGURIReference, SVGTests, SVGExternalResourcesRequired {
+
+  SVGAnimatedLength getX();
+
+  SVGAnimatedLength getY();
+}
diff --git a/elemental/src/elemental/svg/SVGDefsElement.java b/elemental/src/elemental/svg/SVGDefsElement.java
new file mode 100644
index 0000000..a9485f7
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGDefsElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGDefsElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/defs">&lt;defs&gt;</a></code>
+ element.
+  */
+public interface SVGDefsElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+}
diff --git a/elemental/src/elemental/svg/SVGDescElement.java b/elemental/src/elemental/svg/SVGDescElement.java
new file mode 100644
index 0000000..154fe30
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGDescElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGDescElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/desc">&lt;desc&gt;</a></code>
+ element.
+  */
+public interface SVGDescElement extends SVGElement, SVGLangSpace, SVGStylable {
+}
diff --git a/elemental/src/elemental/svg/SVGDocument.java b/elemental/src/elemental/svg/SVGDocument.java
new file mode 100644
index 0000000..7b3af59
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGDocument.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+import elemental.dom.Document;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGDocument extends Document {
+
+  SVGSVGElement getRootElement();
+
+  Event createEvent(String eventType);
+}
diff --git a/elemental/src/elemental/svg/SVGElement.java b/elemental/src/elemental/svg/SVGElement.java
new file mode 100644
index 0000000..9a0a1bd
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGElement.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+import elemental.dom.Element;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * All of the SVG DOM interfaces that correspond directly to elements in the SVG language derive from the <code>SVGElement</code> interface.
+  */
+public interface SVGElement extends Element {
+
+
+  /**
+    * The value of the 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/id" class="new">id</a></code> attribute on the given element, or the empty string if <code>id</code> is not present. 
+    */
+  String getId();
+
+  void setId(String arg);
+
+
+  /**
+    * The nearest ancestor <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element. <code>Null</code> if the given element is the outermost svg element.
+    */
+  SVGSVGElement getOwnerSVGElement();
+
+
+  /**
+    * The element which established the current viewport. Often, the nearest ancestor <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element. <code>Null</code> if the given element is the outermost svg element.
+    */
+  SVGElement getViewportElement();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/xml%3Abase" class="new">xml:base</a></code> on the given element.
+    */
+  String getXmlbase();
+
+  void setXmlbase(String arg);
+}
diff --git a/elemental/src/elemental/svg/SVGElementInstance.java b/elemental/src/elemental/svg/SVGElementInstance.java
new file mode 100644
index 0000000..ddc6e46
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGElementInstance.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+import elemental.events.EventListener;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGElementInstance {
+
+  SVGElementInstanceList getChildNodes();
+
+  SVGElement getCorrespondingElement();
+
+  SVGUseElement getCorrespondingUseElement();
+
+  SVGElementInstance getFirstChild();
+
+  SVGElementInstance getLastChild();
+
+  SVGElementInstance getNextSibling();
+
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+  EventListener getOnbeforecopy();
+
+  void setOnbeforecopy(EventListener arg);
+
+  EventListener getOnbeforecut();
+
+  void setOnbeforecut(EventListener arg);
+
+  EventListener getOnbeforepaste();
+
+  void setOnbeforepaste(EventListener arg);
+
+  EventListener getOnblur();
+
+  void setOnblur(EventListener arg);
+
+  EventListener getOnchange();
+
+  void setOnchange(EventListener arg);
+
+  EventListener getOnclick();
+
+  void setOnclick(EventListener arg);
+
+  EventListener getOncontextmenu();
+
+  void setOncontextmenu(EventListener arg);
+
+  EventListener getOncopy();
+
+  void setOncopy(EventListener arg);
+
+  EventListener getOncut();
+
+  void setOncut(EventListener arg);
+
+  EventListener getOndblclick();
+
+  void setOndblclick(EventListener arg);
+
+  EventListener getOndrag();
+
+  void setOndrag(EventListener arg);
+
+  EventListener getOndragend();
+
+  void setOndragend(EventListener arg);
+
+  EventListener getOndragenter();
+
+  void setOndragenter(EventListener arg);
+
+  EventListener getOndragleave();
+
+  void setOndragleave(EventListener arg);
+
+  EventListener getOndragover();
+
+  void setOndragover(EventListener arg);
+
+  EventListener getOndragstart();
+
+  void setOndragstart(EventListener arg);
+
+  EventListener getOndrop();
+
+  void setOndrop(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnfocus();
+
+  void setOnfocus(EventListener arg);
+
+  EventListener getOninput();
+
+  void setOninput(EventListener arg);
+
+  EventListener getOnkeydown();
+
+  void setOnkeydown(EventListener arg);
+
+  EventListener getOnkeypress();
+
+  void setOnkeypress(EventListener arg);
+
+  EventListener getOnkeyup();
+
+  void setOnkeyup(EventListener arg);
+
+  EventListener getOnload();
+
+  void setOnload(EventListener arg);
+
+  EventListener getOnmousedown();
+
+  void setOnmousedown(EventListener arg);
+
+  EventListener getOnmousemove();
+
+  void setOnmousemove(EventListener arg);
+
+  EventListener getOnmouseout();
+
+  void setOnmouseout(EventListener arg);
+
+  EventListener getOnmouseover();
+
+  void setOnmouseover(EventListener arg);
+
+  EventListener getOnmouseup();
+
+  void setOnmouseup(EventListener arg);
+
+  EventListener getOnmousewheel();
+
+  void setOnmousewheel(EventListener arg);
+
+  EventListener getOnpaste();
+
+  void setOnpaste(EventListener arg);
+
+  EventListener getOnreset();
+
+  void setOnreset(EventListener arg);
+
+  EventListener getOnresize();
+
+  void setOnresize(EventListener arg);
+
+  EventListener getOnscroll();
+
+  void setOnscroll(EventListener arg);
+
+  EventListener getOnsearch();
+
+  void setOnsearch(EventListener arg);
+
+  EventListener getOnselect();
+
+  void setOnselect(EventListener arg);
+
+  EventListener getOnselectstart();
+
+  void setOnselectstart(EventListener arg);
+
+  EventListener getOnsubmit();
+
+  void setOnsubmit(EventListener arg);
+
+  EventListener getOnunload();
+
+  void setOnunload(EventListener arg);
+
+  SVGElementInstance getParentNode();
+
+  SVGElementInstance getPreviousSibling();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event event);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/svg/SVGElementInstanceList.java b/elemental/src/elemental/svg/SVGElementInstanceList.java
new file mode 100644
index 0000000..27207ae
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGElementInstanceList.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGElementInstanceList {
+
+  int getLength();
+
+  SVGElementInstance item(int index);
+}
diff --git a/elemental/src/elemental/svg/SVGEllipseElement.java b/elemental/src/elemental/svg/SVGEllipseElement.java
new file mode 100644
index 0000000..0444b7f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGEllipseElement.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGEllipseElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/ellipse">&lt;ellipse&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGEllipseElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/cx">cx</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/ellipse">&lt;ellipse&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getCx();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/cy">cy</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/ellipse">&lt;ellipse&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getCy();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/rx">rx</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/ellipse">&lt;ellipse&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getRx();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/ry">ry</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/ellipse">&lt;ellipse&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getRy();
+}
diff --git a/elemental/src/elemental/svg/SVGException.java b/elemental/src/elemental/svg/SVGException.java
new file mode 100644
index 0000000..2783495
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGException.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGException {
+
+    static final int SVG_INVALID_VALUE_ERR = 1;
+
+    static final int SVG_MATRIX_NOT_INVERTABLE = 2;
+
+    static final int SVG_WRONG_TYPE_ERR = 0;
+
+  int getCode();
+
+  String getMessage();
+
+  String getName();
+}
diff --git a/elemental/src/elemental/svg/SVGExternalResourcesRequired.java b/elemental/src/elemental/svg/SVGExternalResourcesRequired.java
new file mode 100644
index 0000000..f9bcd29
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGExternalResourcesRequired.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGExternalResourcesRequired {
+
+  SVGAnimatedBoolean getExternalResourcesRequired();
+}
diff --git a/elemental/src/elemental/svg/SVGFEBlendElement.java b/elemental/src/elemental/svg/SVGFEBlendElement.java
new file mode 100644
index 0000000..8d31571
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEBlendElement.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>feBlend</code> filter composes two objects together ruled by a certain blending mode. This is similar to what is known from image editing software when blending two layers. The mode is defined by the 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/mode" class="new">mode</a></code> attribute.
+  */
+public interface SVGFEBlendElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+    static final int SVG_FEBLEND_MODE_DARKEN = 4;
+
+    static final int SVG_FEBLEND_MODE_LIGHTEN = 5;
+
+    static final int SVG_FEBLEND_MODE_MULTIPLY = 2;
+
+    static final int SVG_FEBLEND_MODE_NORMAL = 1;
+
+    static final int SVG_FEBLEND_MODE_SCREEN = 3;
+
+    static final int SVG_FEBLEND_MODE_UNKNOWN = 0;
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedString getIn2();
+
+  SVGAnimatedEnumeration getMode();
+}
diff --git a/elemental/src/elemental/svg/SVGFEColorMatrixElement.java b/elemental/src/elemental/svg/SVGFEColorMatrixElement.java
new file mode 100644
index 0000000..95f9a89
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEColorMatrixElement.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * This filter changes colors based on a transformation matrix. Every pixel's color value (represented by an [R,G,B,A] vector) is <a title="http://en.wikipedia.org/wiki/Matrix_multiplication" class=" external" rel="external" href="http://en.wikipedia.org/wiki/Matrix_multiplication" target="_blank">matrix multiplated</a> to create a new color.
+  */
+public interface SVGFEColorMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+    static final int SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
+
+    static final int SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
+
+    static final int SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
+
+    static final int SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
+
+    static final int SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedEnumeration getType();
+
+  SVGAnimatedNumberList getValues();
+}
diff --git a/elemental/src/elemental/svg/SVGFEComponentTransferElement.java b/elemental/src/elemental/svg/SVGFEComponentTransferElement.java
new file mode 100644
index 0000000..e0560ac
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEComponentTransferElement.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The color of each pixel is modified by changing each channel (R, G, B, and A) to the result of what the children <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/feFuncR">&lt;feFuncR&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/feFuncB">&lt;feFuncB&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/feFuncG">&lt;feFuncG&gt;</a></code>
+, and <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/feFuncA">&lt;feFuncA&gt;</a></code>
+ return.
+  */
+public interface SVGFEComponentTransferElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+  SVGAnimatedString getIn1();
+}
diff --git a/elemental/src/elemental/svg/SVGFECompositeElement.java b/elemental/src/elemental/svg/SVGFECompositeElement.java
new file mode 100644
index 0000000..33525ff
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFECompositeElement.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>Two input images are joined by means of an 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/operator" class="new">operator</a></code> applied to each input pixel together with an arithmetic operation</p>
+<pre>result = k1*in1*in2 + k2*in1 + k3*in2 + k4</pre>
+  */
+public interface SVGFECompositeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+    static final int SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
+
+    static final int SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
+
+    static final int SVG_FECOMPOSITE_OPERATOR_IN = 2;
+
+    static final int SVG_FECOMPOSITE_OPERATOR_OUT = 3;
+
+    static final int SVG_FECOMPOSITE_OPERATOR_OVER = 1;
+
+    static final int SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
+
+    static final int SVG_FECOMPOSITE_OPERATOR_XOR = 5;
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedString getIn2();
+
+  SVGAnimatedNumber getK1();
+
+  SVGAnimatedNumber getK2();
+
+  SVGAnimatedNumber getK3();
+
+  SVGAnimatedNumber getK4();
+
+  SVGAnimatedEnumeration getOperator();
+}
diff --git a/elemental/src/elemental/svg/SVGFEConvolveMatrixElement.java b/elemental/src/elemental/svg/SVGFEConvolveMatrixElement.java
new file mode 100644
index 0000000..bb9602b
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEConvolveMatrixElement.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The filter modifies a pixel by means of a convolution matrix, that also takes neighboring pixels into account.
+  */
+public interface SVGFEConvolveMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+    static final int SVG_EDGEMODE_DUPLICATE = 1;
+
+    static final int SVG_EDGEMODE_NONE = 3;
+
+    static final int SVG_EDGEMODE_UNKNOWN = 0;
+
+    static final int SVG_EDGEMODE_WRAP = 2;
+
+  SVGAnimatedNumber getBias();
+
+  SVGAnimatedNumber getDivisor();
+
+  SVGAnimatedEnumeration getEdgeMode();
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedNumberList getKernelMatrix();
+
+  SVGAnimatedNumber getKernelUnitLengthX();
+
+  SVGAnimatedNumber getKernelUnitLengthY();
+
+  SVGAnimatedInteger getOrderX();
+
+  SVGAnimatedInteger getOrderY();
+
+  SVGAnimatedBoolean getPreserveAlpha();
+
+  SVGAnimatedInteger getTargetX();
+
+  SVGAnimatedInteger getTargetY();
+}
diff --git a/elemental/src/elemental/svg/SVGFEDiffuseLightingElement.java b/elemental/src/elemental/svg/SVGFEDiffuseLightingElement.java
new file mode 100644
index 0000000..9aca298
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEDiffuseLightingElement.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * This filter takes in a light source and applies it to an image, using the alpha channel as a bump map.
+  */
+public interface SVGFEDiffuseLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+  SVGAnimatedNumber getDiffuseConstant();
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedNumber getKernelUnitLengthX();
+
+  SVGAnimatedNumber getKernelUnitLengthY();
+
+  SVGAnimatedNumber getSurfaceScale();
+}
diff --git a/elemental/src/elemental/svg/SVGFEDisplacementMapElement.java b/elemental/src/elemental/svg/SVGFEDisplacementMapElement.java
new file mode 100644
index 0000000..e6e921a
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEDisplacementMapElement.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The pixel value of an input image i2 is used to displace the original image i1.
+  */
+public interface SVGFEDisplacementMapElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+    static final int SVG_CHANNEL_A = 4;
+
+    static final int SVG_CHANNEL_B = 3;
+
+    static final int SVG_CHANNEL_G = 2;
+
+    static final int SVG_CHANNEL_R = 1;
+
+    static final int SVG_CHANNEL_UNKNOWN = 0;
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedString getIn2();
+
+  SVGAnimatedNumber getScale();
+
+  SVGAnimatedEnumeration getXChannelSelector();
+
+  SVGAnimatedEnumeration getYChannelSelector();
+}
diff --git a/elemental/src/elemental/svg/SVGFEDistantLightElement.java b/elemental/src/elemental/svg/SVGFEDistantLightElement.java
new file mode 100644
index 0000000..f0e67c3
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEDistantLightElement.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFEDistantLightElement extends SVGElement {
+
+  SVGAnimatedNumber getAzimuth();
+
+  SVGAnimatedNumber getElevation();
+}
diff --git a/elemental/src/elemental/svg/SVGFEDropShadowElement.java b/elemental/src/elemental/svg/SVGFEDropShadowElement.java
new file mode 100644
index 0000000..8b9f6e0
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEDropShadowElement.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFEDropShadowElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+  SVGAnimatedNumber getDx();
+
+  SVGAnimatedNumber getDy();
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedNumber getStdDeviationX();
+
+  SVGAnimatedNumber getStdDeviationY();
+
+  void setStdDeviation(float stdDeviationX, float stdDeviationY);
+}
diff --git a/elemental/src/elemental/svg/SVGFEFloodElement.java b/elemental/src/elemental/svg/SVGFEFloodElement.java
new file mode 100644
index 0000000..861925f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEFloodElement.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The filter fills the filter subregion with the color and opacity defined by 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/flood-color">flood-color</a></code> and 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/flood-opacity">flood-opacity</a></code>.
+  */
+public interface SVGFEFloodElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+}
diff --git a/elemental/src/elemental/svg/SVGFEFuncAElement.java b/elemental/src/elemental/svg/SVGFEFuncAElement.java
new file mode 100644
index 0000000..1b9db9e
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEFuncAElement.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFEFuncAElement extends SVGComponentTransferFunctionElement {
+}
diff --git a/elemental/src/elemental/svg/SVGFEFuncBElement.java b/elemental/src/elemental/svg/SVGFEFuncBElement.java
new file mode 100644
index 0000000..374e816
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEFuncBElement.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFEFuncBElement extends SVGComponentTransferFunctionElement {
+}
diff --git a/elemental/src/elemental/svg/SVGFEFuncGElement.java b/elemental/src/elemental/svg/SVGFEFuncGElement.java
new file mode 100644
index 0000000..2b5088d
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEFuncGElement.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFEFuncGElement extends SVGComponentTransferFunctionElement {
+}
diff --git a/elemental/src/elemental/svg/SVGFEFuncRElement.java b/elemental/src/elemental/svg/SVGFEFuncRElement.java
new file mode 100644
index 0000000..b3fcfe4
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEFuncRElement.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFEFuncRElement extends SVGComponentTransferFunctionElement {
+}
diff --git a/elemental/src/elemental/svg/SVGFEGaussianBlurElement.java b/elemental/src/elemental/svg/SVGFEGaussianBlurElement.java
new file mode 100644
index 0000000..20f1ccf
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEGaussianBlurElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The filter blurs the input image by the amount specified in 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/stdDeviation" class="new">stdDeviation</a></code>, which defines the bell-curve.
+  */
+public interface SVGFEGaussianBlurElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedNumber getStdDeviationX();
+
+  SVGAnimatedNumber getStdDeviationY();
+
+  void setStdDeviation(float stdDeviationX, float stdDeviationY);
+}
diff --git a/elemental/src/elemental/svg/SVGFEImageElement.java b/elemental/src/elemental/svg/SVGFEImageElement.java
new file mode 100644
index 0000000..a1d74b5
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEImageElement.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The feImage filter fetches image data from an external source and provides the pixel data as output.
+  */
+public interface SVGFEImageElement extends SVGElement, SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGFilterPrimitiveStandardAttributes {
+
+  SVGAnimatedPreserveAspectRatio getPreserveAspectRatio();
+}
diff --git a/elemental/src/elemental/svg/SVGFEMergeElement.java b/elemental/src/elemental/svg/SVGFEMergeElement.java
new file mode 100644
index 0000000..2f81d1f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEMergeElement.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The feMerge filter allows filter effects to be applied concurrently instead of sequentially. This is achieved by other filters storing their output via the 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/result" class="new">result</a></code> attribute and then accessing it in a <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/feMergeNode">&lt;feMergeNode&gt;</a></code>
+ child.
+  */
+public interface SVGFEMergeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+}
diff --git a/elemental/src/elemental/svg/SVGFEMergeNodeElement.java b/elemental/src/elemental/svg/SVGFEMergeNodeElement.java
new file mode 100644
index 0000000..be0a2e0
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEMergeNodeElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The feMergeNode takes the result of another filter to be processed by its parent <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/feMerge">&lt;feMerge&gt;</a></code>
+.
+  */
+public interface SVGFEMergeNodeElement extends SVGElement {
+
+  SVGAnimatedString getIn1();
+}
diff --git a/elemental/src/elemental/svg/SVGFEMorphologyElement.java b/elemental/src/elemental/svg/SVGFEMorphologyElement.java
new file mode 100644
index 0000000..7185f02
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEMorphologyElement.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * This filter is used to erode or dilate the input image. It's usefulness lies especially in fattening or thinning effects.
+  */
+public interface SVGFEMorphologyElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+    static final int SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
+
+    static final int SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
+
+    static final int SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedEnumeration getOperator();
+
+  SVGAnimatedNumber getRadiusX();
+
+  SVGAnimatedNumber getRadiusY();
+
+  void setRadius(float radiusX, float radiusY);
+}
diff --git a/elemental/src/elemental/svg/SVGFEOffsetElement.java b/elemental/src/elemental/svg/SVGFEOffsetElement.java
new file mode 100644
index 0000000..3829593
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEOffsetElement.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The input image as a whole is offset by the values specified in the 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/dx" class="new">dx</a></code> and 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/dy" class="new">dy</a></code> attributes. It's used in creating drop-shadows.
+  */
+public interface SVGFEOffsetElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+  SVGAnimatedNumber getDx();
+
+  SVGAnimatedNumber getDy();
+
+  SVGAnimatedString getIn1();
+}
diff --git a/elemental/src/elemental/svg/SVGFEPointLightElement.java b/elemental/src/elemental/svg/SVGFEPointLightElement.java
new file mode 100644
index 0000000..ff6f031
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFEPointLightElement.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFEPointLightElement extends SVGElement {
+
+  SVGAnimatedNumber getX();
+
+  SVGAnimatedNumber getY();
+
+  SVGAnimatedNumber getZ();
+}
diff --git a/elemental/src/elemental/svg/SVGFESpecularLightingElement.java b/elemental/src/elemental/svg/SVGFESpecularLightingElement.java
new file mode 100644
index 0000000..07ed6e1
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFESpecularLightingElement.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFESpecularLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+  SVGAnimatedString getIn1();
+
+  SVGAnimatedNumber getSpecularConstant();
+
+  SVGAnimatedNumber getSpecularExponent();
+
+  SVGAnimatedNumber getSurfaceScale();
+}
diff --git a/elemental/src/elemental/svg/SVGFESpotLightElement.java b/elemental/src/elemental/svg/SVGFESpotLightElement.java
new file mode 100644
index 0000000..69bcda8
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFESpotLightElement.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFESpotLightElement extends SVGElement {
+
+  SVGAnimatedNumber getLimitingConeAngle();
+
+  SVGAnimatedNumber getPointsAtX();
+
+  SVGAnimatedNumber getPointsAtY();
+
+  SVGAnimatedNumber getPointsAtZ();
+
+  SVGAnimatedNumber getSpecularExponent();
+
+  SVGAnimatedNumber getX();
+
+  SVGAnimatedNumber getY();
+
+  SVGAnimatedNumber getZ();
+}
diff --git a/elemental/src/elemental/svg/SVGFETileElement.java b/elemental/src/elemental/svg/SVGFETileElement.java
new file mode 100644
index 0000000..35fe619
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFETileElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * An input image is tiled and the result used to fill a target. The effect is similar to the one of a <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/pattern">&lt;pattern&gt;</a></code>
+.
+  */
+public interface SVGFETileElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+  SVGAnimatedString getIn1();
+}
diff --git a/elemental/src/elemental/svg/SVGFETurbulenceElement.java b/elemental/src/elemental/svg/SVGFETurbulenceElement.java
new file mode 100644
index 0000000..74fa7ce
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFETurbulenceElement.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The filter primitive creates a perturbation image, like cloud or marble textures.
+  */
+public interface SVGFETurbulenceElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+
+    static final int SVG_STITCHTYPE_NOSTITCH = 2;
+
+    static final int SVG_STITCHTYPE_STITCH = 1;
+
+    static final int SVG_STITCHTYPE_UNKNOWN = 0;
+
+    static final int SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
+
+    static final int SVG_TURBULENCE_TYPE_TURBULENCE = 2;
+
+    static final int SVG_TURBULENCE_TYPE_UNKNOWN = 0;
+
+  SVGAnimatedNumber getBaseFrequencyX();
+
+  SVGAnimatedNumber getBaseFrequencyY();
+
+  SVGAnimatedInteger getNumOctaves();
+
+  SVGAnimatedNumber getSeed();
+
+  SVGAnimatedEnumeration getStitchTiles();
+
+  SVGAnimatedEnumeration getType();
+}
diff --git a/elemental/src/elemental/svg/SVGFilterElement.java b/elemental/src/elemental/svg/SVGFilterElement.java
new file mode 100644
index 0000000..d0af43a
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFilterElement.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>filter</code> element serves as container for atomic filter operations. It is never rendered directly. A filter is referenced by using the 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/filter" class="new">filter</a></code> attribute on the target SVG element.
+  */
+public interface SVGFilterElement extends SVGElement, SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
+
+  SVGAnimatedInteger getFilterResX();
+
+  SVGAnimatedInteger getFilterResY();
+
+  SVGAnimatedEnumeration getFilterUnits();
+
+  SVGAnimatedLength getAnimatedHeight();
+
+  SVGAnimatedEnumeration getPrimitiveUnits();
+
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getX();
+
+  SVGAnimatedLength getY();
+
+  void setFilterRes(int filterResX, int filterResY);
+}
diff --git a/elemental/src/elemental/svg/SVGFilterPrimitiveStandardAttributes.java b/elemental/src/elemental/svg/SVGFilterPrimitiveStandardAttributes.java
new file mode 100644
index 0000000..be2b825
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFilterPrimitiveStandardAttributes.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFilterPrimitiveStandardAttributes extends SVGStylable {
+
+  SVGAnimatedLength getAnimatedHeight();
+
+  SVGAnimatedString getAnimatedResult();
+
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getAnimatedX();
+
+  SVGAnimatedLength getAnimatedY();
+}
diff --git a/elemental/src/elemental/svg/SVGFitToViewBox.java b/elemental/src/elemental/svg/SVGFitToViewBox.java
new file mode 100644
index 0000000..39515a6
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFitToViewBox.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGFitToViewBox {
+
+  SVGAnimatedPreserveAspectRatio getPreserveAspectRatio();
+
+  SVGAnimatedRect getViewBox();
+}
diff --git a/elemental/src/elemental/svg/SVGFontElement.java b/elemental/src/elemental/svg/SVGFontElement.java
new file mode 100644
index 0000000..77a988f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFontElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGHFontElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font">&lt;font&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font">&lt;font&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGFontElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGFontFaceElement.java b/elemental/src/elemental/svg/SVGFontFaceElement.java
new file mode 100644
index 0000000..b36ff45
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFontFaceElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGFontFaceElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face">&lt;font-face&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face">&lt;font-face&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGFontFaceElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGFontFaceFormatElement.java b/elemental/src/elemental/svg/SVGFontFaceFormatElement.java
new file mode 100644
index 0000000..ab699e4
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFontFaceFormatElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGFontFaceFormatElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face-format">&lt;font-face-format&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face-format">&lt;font-face-format&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGFontFaceFormatElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGFontFaceNameElement.java b/elemental/src/elemental/svg/SVGFontFaceNameElement.java
new file mode 100644
index 0000000..fc22813
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFontFaceNameElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGFontFaceNameElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face-name">&lt;font-face-name&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face-name">&lt;font-face-name&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGFontFaceNameElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGFontFaceSrcElement.java b/elemental/src/elemental/svg/SVGFontFaceSrcElement.java
new file mode 100644
index 0000000..9c336a0
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFontFaceSrcElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGFontFaceSrcElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face-src">&lt;font-face-src&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face-src">&lt;font-face-src&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGFontFaceSrcElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGFontFaceUriElement.java b/elemental/src/elemental/svg/SVGFontFaceUriElement.java
new file mode 100644
index 0000000..92d57f7
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGFontFaceUriElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGFontFaceUriElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face-uri">&lt;font-face-uri&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/font-face-uri">&lt;font-face-uri&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGFontFaceUriElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGForeignObjectElement.java b/elemental/src/elemental/svg/SVGForeignObjectElement.java
new file mode 100644
index 0000000..ef218fc
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGForeignObjectElement.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGForeignObjectElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/foreignObject">&lt;foreignObject&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGForeignObjectElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/height">height</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/foreignObject">&lt;foreignObject&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedHeight();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/width">width</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/foreignObject">&lt;foreignObject&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getX();
+
+  SVGAnimatedLength getY();
+}
diff --git a/elemental/src/elemental/svg/SVGGElement.java b/elemental/src/elemental/svg/SVGGElement.java
new file mode 100644
index 0000000..8d2a7f7
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGGElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGGElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/g">&lt;g&gt;</a></code>
+ element.
+  */
+public interface SVGGElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+}
diff --git a/elemental/src/elemental/svg/SVGGlyphElement.java b/elemental/src/elemental/svg/SVGGlyphElement.java
new file mode 100644
index 0000000..61061c6
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGGlyphElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGGlyphElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/glyph">&lt;glyph&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/glyph">&lt;glyph&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGGlyphElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGGlyphRefElement.java b/elemental/src/elemental/svg/SVGGlyphRefElement.java
new file mode 100644
index 0000000..6676198
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGGlyphRefElement.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGGlyphRefElement extends SVGElement, SVGURIReference, SVGStylable {
+
+  float getDx();
+
+  void setDx(float arg);
+
+  float getDy();
+
+  void setDy(float arg);
+
+  String getFormat();
+
+  void setFormat(String arg);
+
+  String getGlyphRef();
+
+  void setGlyphRef(String arg);
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGGradientElement.java b/elemental/src/elemental/svg/SVGGradientElement.java
new file mode 100644
index 0000000..316a25c
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGGradientElement.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGGradient</code> interface is a base interface used by <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGLinearGradientElement">SVGLinearGradientElement</a></code>
+ and <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGRadialGradientElement">SVGRadialGradientElement</a></code>
+.
+  */
+public interface SVGGradientElement extends SVGElement, SVGURIReference, SVGExternalResourcesRequired, SVGStylable {
+
+  /**
+    * Corresponds to value <em>pad</em>.
+    */
+
+    static final int SVG_SPREADMETHOD_PAD = 1;
+
+  /**
+    * Corresponds to value <em>reflect</em>.
+    */
+
+    static final int SVG_SPREADMETHOD_REFLECT = 2;
+
+  /**
+    * Corresponds to value <em>repeat</em>.
+    */
+
+    static final int SVG_SPREADMETHOD_REPEAT = 3;
+
+  /**
+    * The type is not one of predefined types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.
+    */
+
+    static final int SVG_SPREADMETHOD_UNKNOWN = 0;
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/gradientTransform" class="new">gradientTransform</a></code> on the given element.
+    */
+  SVGAnimatedTransformList getGradientTransform();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/gradientUnits" class="new">gradientUnits</a></code> on the given element. Takes one of the constants defined in <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes" class="new">SVGUnitTypes</a></code>
+.
+    */
+  SVGAnimatedEnumeration getGradientUnits();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/spreadMethod" class="new">spreadMethod</a></code> on the given element. One of the Spread Method Types defined on this interface.
+    */
+  SVGAnimatedEnumeration getSpreadMethod();
+}
diff --git a/elemental/src/elemental/svg/SVGHKernElement.java b/elemental/src/elemental/svg/SVGHKernElement.java
new file mode 100644
index 0000000..b7ed45f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGHKernElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGHKernElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/hkern">&lt;hkern&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/hkern">&lt;hkern&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGHKernElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGImageElement.java b/elemental/src/elemental/svg/SVGImageElement.java
new file mode 100644
index 0000000..c7a50fe
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGImageElement.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGImageElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/image">&lt;image&gt;</a></code>
+ element.
+  */
+public interface SVGImageElement extends SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/height">height</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/image">&lt;image&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedHeight();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/image">&lt;image&gt;</a></code>
+ element.
+    */
+  SVGAnimatedPreserveAspectRatio getPreserveAspectRatio();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/width">width</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/image">&lt;image&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getX();
+
+  SVGAnimatedLength getY();
+}
diff --git a/elemental/src/elemental/svg/SVGLangSpace.java b/elemental/src/elemental/svg/SVGLangSpace.java
new file mode 100644
index 0000000..222a9b6
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGLangSpace.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGLangSpace {
+
+  String getXmllang();
+
+  void setXmllang(String arg);
+
+  String getXmlspace();
+
+  void setXmlspace(String arg);
+}
diff --git a/elemental/src/elemental/svg/SVGLength.java b/elemental/src/elemental/svg/SVGLength.java
new file mode 100644
index 0000000..d338edb
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGLength.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGLength</code> interface correspond to the <a title="https://developer.mozilla.org/en/SVG/Content_type#Length" rel="internal" href="https://developer.mozilla.org/en/SVG/Content_type#Length">&lt;length&gt;</a> basic data type.</p>
+<p>An <code>SVGLength</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+  */
+public interface SVGLength {
+
+  /**
+    * A value was specified using the cm units defined in CSS2.
+    */
+
+    static final int SVG_LENGTHTYPE_CM = 6;
+
+  /**
+    * A value was specified using the em units defined in CSS2.
+    */
+
+    static final int SVG_LENGTHTYPE_EMS = 3;
+
+  /**
+    * A value was specified using the ex units defined in CSS2.
+    */
+
+    static final int SVG_LENGTHTYPE_EXS = 4;
+
+  /**
+    * A value was specified using the in units defined in CSS2.
+    */
+
+    static final int SVG_LENGTHTYPE_IN = 8;
+
+  /**
+    * A value was specified using the mm units defined in CSS2.
+    */
+
+    static final int SVG_LENGTHTYPE_MM = 7;
+
+  /**
+    * No unit type was provided (i.e., a unitless value was specified), which indicates a value in user units.
+    */
+
+    static final int SVG_LENGTHTYPE_NUMBER = 1;
+
+  /**
+    * A value was specified using the pc units defined in CSS2.
+    */
+
+    static final int SVG_LENGTHTYPE_PC = 10;
+
+  /**
+    * A percentage value was specified.
+    */
+
+    static final int SVG_LENGTHTYPE_PERCENTAGE = 2;
+
+  /**
+    * A value was specified using the pt units defined in CSS2.
+    */
+
+    static final int SVG_LENGTHTYPE_PT = 9;
+
+  /**
+    * A value was specified using the px units defined in CSS2.
+    */
+
+    static final int SVG_LENGTHTYPE_PX = 5;
+
+  /**
+    * The unit type is not one of predefined unit types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.
+    */
+
+    static final int SVG_LENGTHTYPE_UNKNOWN = 0;
+
+
+  /**
+    * The type of the value as specified by one of the SVG_LENGTHTYPE_* constants defined on this interface.
+    */
+  int getUnitType();
+
+
+  /**
+    * <p>The value as a floating point value, in user units. Setting this attribute will cause <code>valueInSpecifiedUnits</code> and <code>valueAsString</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</p>
+    */
+  float getValue();
+
+  void setValue(float arg);
+
+
+  /**
+    * <p>The value as a string value, in the units expressed by <code>unitType</code>. Setting this attribute will cause <code>value</code>, <code>valueInSpecifiedUnits</code> and <code>unitType</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>SYNTAX_ERR</code> is raised if the assigned string cannot be parsed as a valid <a title="https://developer.mozilla.org/en/SVG/Content_type#Length" rel="internal" href="https://developer.mozilla.org/en/SVG/Content_type#Length">&lt;length&gt;</a>.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  String getValueAsString();
+
+  void setValueAsString(String arg);
+
+
+  /**
+    * <p>The value as a floating point value, in the units expressed by <code>unitType</code>. Setting this attribute will cause <code>value</code> and <code>valueAsString</code> to be updated automatically to reflect this setting.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</p>
+    */
+  float getValueInSpecifiedUnits();
+
+  void setValueInSpecifiedUnits(float arg);
+
+
+  /**
+    * Preserve the same underlying stored value, but reset the stored unit identifier to the given <code><em>unitType</em></code>. Object attributes <code>unitType</code>, <code>valueInSpecifiedUnits</code> and <code>valueAsString</code> might be modified as a result of this method. For example, if the original value were "<em>0.5cm</em>" and the method was invoked to convert to millimeters, then the <code>unitType</code> would be changed to <code>SVG_LENGTHTYPE_MM</code>, <code>valueInSpecifiedUnits</code> would be changed to the numeric value 5 and <code>valueAsString</code> would be changed to "<em>5mm</em>".
+    */
+  void convertToSpecifiedUnits(int unitType);
+
+
+  /**
+    * <p>Reset the value as a number with an associated unitType, thereby replacing the values for all of the attributes on the object.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NOT_SUPPORTED_ERR</code> is raised if <code>unitType</code> is <code>SVG_LENGTHTYPE_UNKNOWN</code> or not a valid unit type constant (one of the other <code>SVG_LENGTHTYPE_*</code> constants defined on this interface).</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the length corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void newValueSpecifiedUnits(int unitType, float valueInSpecifiedUnits);
+}
diff --git a/elemental/src/elemental/svg/SVGLengthList.java b/elemental/src/elemental/svg/SVGLengthList.java
new file mode 100644
index 0000000..41b618f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGLengthList.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGLengthList</code> defines a list of <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGLength">SVGLength</a></code>
+ objects.</p>
+<p>An <code>SVGLengthList</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+<div class="geckoVersionNote">
+<p>
+</p><div class="geckoVersionHeading">Gecko 5.0 note<div>(Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+</div></div>
+<p></p>
+<p>Starting in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+,the <code>SVGLengthList</code> DOM interface is now indexable and can be accessed like arrays</p>
+</div>
+  */
+public interface SVGLengthList {
+
+  int getNumberOfItems();
+
+
+  /**
+    * <p>Inserts a new item at the end of the list. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGLength appendItem(SVGLength item);
+
+
+  /**
+    * <p>Clears all existing current items from the list, with the result being an empty list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void clear();
+
+
+  /**
+    * <p>Returns the specified item from the list. The returned item is the item itself and not a copy. Any changes made to the item are immediately reflected in the list. The first item is number&nbsp;0.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGLength getItem(int index);
+
+
+  /**
+    * <p>Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter. If the inserted item is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. The return value is the item inserted into the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGLength initialize(SVGLength item);
+
+
+  /**
+    * <p>Inserts a new item into the list at the specified position. The first item is number 0. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to insert before is before the removal of the item. If the <code>index</code> is equal to 0, then the new item is inserted at the front of the list. If the index is greater than or equal to <code>numberOfItems</code>, then the new item is appended to the end of the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGLength insertItemBefore(SVGLength item, int index);
+
+
+  /**
+    * <p>Removes an existing item from the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>
+    */
+  SVGLength removeItem(int index);
+
+
+  /**
+    * <p>Replaces an existing item in the list with a new item. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to replace is before the removal of the item.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>
+    */
+  SVGLength replaceItem(SVGLength item, int index);
+}
diff --git a/elemental/src/elemental/svg/SVGLineElement.java b/elemental/src/elemental/svg/SVGLineElement.java
new file mode 100644
index 0000000..549199c
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGLineElement.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGLineElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/line">&lt;line&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGLineElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/x1">x1</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/line">&lt;line&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getX1();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/x2">x2</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/line">&lt;line&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getX2();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/y1">y1</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/line">&lt;line&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getY1();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/y2">y2</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/line">&lt;line&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getY2();
+}
diff --git a/elemental/src/elemental/svg/SVGLinearGradientElement.java b/elemental/src/elemental/svg/SVGLinearGradientElement.java
new file mode 100644
index 0000000..34f48b1
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGLinearGradientElement.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGLinearGradientElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/linearGradient">&lt;linearGradient&gt;</a></code>
+ element.
+  */
+public interface SVGLinearGradientElement extends SVGGradientElement {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/x1">x1</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/linearGradient">&lt;linearGradient&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getX1();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/x2">x2</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/linearGradient">&lt;linearGradient&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getX2();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/y1">y1</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/linearGradient">&lt;linearGradient&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getY1();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/y2">y2</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/linearGradient">&lt;linearGradient&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getY2();
+}
diff --git a/elemental/src/elemental/svg/SVGLocatable.java b/elemental/src/elemental/svg/SVGLocatable.java
new file mode 100644
index 0000000..c51f63b
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGLocatable.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGLocatable {
+
+  SVGElement getFarthestViewportElement();
+
+  SVGElement getNearestViewportElement();
+
+  SVGRect getBBox();
+
+  SVGMatrix getCTM();
+
+  SVGMatrix getScreenCTM();
+
+  SVGMatrix getTransformToElement(SVGElement element);
+}
diff --git a/elemental/src/elemental/svg/SVGMPathElement.java b/elemental/src/elemental/svg/SVGMPathElement.java
new file mode 100644
index 0000000..0dd3aea
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGMPathElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGMPathElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/mpath">&lt;mpath&gt;</a></code>
+ element.
+  */
+public interface SVGMPathElement extends SVGElement, SVGURIReference, SVGExternalResourcesRequired {
+}
diff --git a/elemental/src/elemental/svg/SVGMarkerElement.java b/elemental/src/elemental/svg/SVGMarkerElement.java
new file mode 100644
index 0000000..534027e
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGMarkerElement.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>marker</code> element defines the graphics that is to be used for drawing arrowheads or polymarkers on a given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/path">&lt;path&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/line">&lt;line&gt;</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/polyline">&lt;polyline&gt;</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/polygon">&lt;polygon&gt;</a></code>
+ element.
+  */
+public interface SVGMarkerElement extends SVGElement, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox {
+
+    static final int SVG_MARKERUNITS_STROKEWIDTH = 2;
+
+    static final int SVG_MARKERUNITS_UNKNOWN = 0;
+
+    static final int SVG_MARKERUNITS_USERSPACEONUSE = 1;
+
+    static final int SVG_MARKER_ORIENT_ANGLE = 2;
+
+    static final int SVG_MARKER_ORIENT_AUTO = 1;
+
+    static final int SVG_MARKER_ORIENT_UNKNOWN = 0;
+
+  SVGAnimatedLength getMarkerHeight();
+
+  SVGAnimatedEnumeration getMarkerUnits();
+
+  SVGAnimatedLength getMarkerWidth();
+
+  SVGAnimatedAngle getOrientAngle();
+
+  SVGAnimatedEnumeration getOrientType();
+
+  SVGAnimatedLength getRefX();
+
+  SVGAnimatedLength getRefY();
+
+  void setOrientToAngle(SVGAngle angle);
+
+  void setOrientToAuto();
+}
diff --git a/elemental/src/elemental/svg/SVGMaskElement.java b/elemental/src/elemental/svg/SVGMaskElement.java
new file mode 100644
index 0000000..c5f6c3f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGMaskElement.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGMaskElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/mask">&lt;mask&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGMaskElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/height">height</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/mask">&lt;mask&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedHeight();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/maskContentUnits" class="new">maskContentUnits</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/mask">&lt;mask&gt;</a></code>
+ element. Takes one of the constants defined in <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes" class="new">SVGUnitTypes</a></code>
+    */
+  SVGAnimatedEnumeration getMaskContentUnits();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/maskUnits" class="new">maskUnits</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/mask">&lt;mask&gt;</a></code>
+ element. Takes one of the constants defined in <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes" class="new">SVGUnitTypes</a></code>
+    */
+  SVGAnimatedEnumeration getMaskUnits();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/width">width</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/mask">&lt;mask&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getX();
+
+  SVGAnimatedLength getY();
+}
diff --git a/elemental/src/elemental/svg/SVGMatrix.java b/elemental/src/elemental/svg/SVGMatrix.java
new file mode 100644
index 0000000..ae59931
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGMatrix.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>Many of SVG's graphics operations utilize 2x3 matrices of the form:</p>
+<pre>[a c e]
+[b d f]</pre>
+<p>which, when expanded into a 3x3 matrix for the purposes of matrix arithmetic, become:</p>
+<pre>[a c e]
+[b d f]
+[0 0 1]
+</pre>
+<p>An <code>SVGMatrix</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+  */
+public interface SVGMatrix {
+
+  double getA();
+
+  void setA(double arg);
+
+  double getB();
+
+  void setB(double arg);
+
+  double getC();
+
+  void setC(double arg);
+
+  double getD();
+
+  void setD(double arg);
+
+  double getE();
+
+  void setE(double arg);
+
+  double getF();
+
+  void setF(double arg);
+
+
+  /**
+    * Post-multiplies the transformation [-1&nbsp;0&nbsp;0&nbsp;1&nbsp;0&nbsp;0] and returns the resulting matrix.
+    */
+  SVGMatrix flipX();
+
+
+  /**
+    * Post-multiplies the transformation [1&nbsp;0&nbsp;0&nbsp;-1&nbsp;0&nbsp;0] and returns the resulting matrix.
+    */
+  SVGMatrix flipY();
+
+
+  /**
+    * <p>Return the inverse matrix</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>SVG_MATRIX_NOT_INVERTABLE</code> is raised if the matrix is not invertable.</li> </ul>
+    */
+  SVGMatrix inverse();
+
+
+  /**
+    * Performs matrix multiplication. This matrix is post-multiplied by another matrix, returning the resulting new matrix.
+    */
+  SVGMatrix multiply(SVGMatrix secondMatrix);
+
+
+  /**
+    * Post-multiplies a rotation transformation on the current matrix and returns the resulting matrix.
+    */
+  SVGMatrix rotate(float angle);
+
+
+  /**
+    * <p>Post-multiplies a rotation transformation on the current matrix and returns the resulting matrix. The rotation angle is determined by taking (+/-) atan(y/x). The direction of the vector (x,&nbsp;y) determines whether the positive or negative angle value is used.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>SVG_INVALID_VALUE_ERR</code> is raised if one of the parameters has an invalid value.</li> </ul>
+    */
+  SVGMatrix rotateFromVector(float x, float y);
+
+
+  /**
+    * Post-multiplies a uniform scale transformation on the current matrix and returns the resulting matrix.
+    */
+  SVGMatrix scale(float scaleFactor);
+
+
+  /**
+    * Post-multiplies a non-uniform scale transformation on the current matrix and returns the resulting matrix.
+    */
+  SVGMatrix scaleNonUniform(float scaleFactorX, float scaleFactorY);
+
+
+  /**
+    * Post-multiplies a skewX transformation on the current matrix and returns the resulting matrix.
+    */
+  SVGMatrix skewX(float angle);
+
+
+  /**
+    * Post-multiplies a skewY transformation on the current matrix and returns the resulting matrix.
+    */
+  SVGMatrix skewY(float angle);
+
+
+  /**
+    * Post-multiplies a translation transformation on the current matrix and returns the resulting matrix.
+    */
+  SVGMatrix translate(float x, float y);
+}
diff --git a/elemental/src/elemental/svg/SVGMetadataElement.java b/elemental/src/elemental/svg/SVGMetadataElement.java
new file mode 100644
index 0000000..0e863c5
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGMetadataElement.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Metadata is structured data about data. Metadata which is included with SVG content should be specified within <code>metadata</code> elements. The contents of the <code>metadata</code> should be elements from other XML namespaces such as RDF, FOAF, etc.
+  */
+public interface SVGMetadataElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGMissingGlyphElement.java b/elemental/src/elemental/svg/SVGMissingGlyphElement.java
new file mode 100644
index 0000000..7da2d22
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGMissingGlyphElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGMissingGlyphElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/missing-glyph">&lt;missing-glyph&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/missing-glyph">&lt;missing-glyph&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGMissingGlyphElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGNumber.java b/elemental/src/elemental/svg/SVGNumber.java
new file mode 100644
index 0000000..564c295
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGNumber.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGNumber</code> interface correspond to the <a title="https://developer.mozilla.org/en/SVG/Content_type#Number" rel="internal" href="https://developer.mozilla.org/en/SVG/Content_type#Number">&lt;number&gt;</a> basic data type.</p>
+<p>An <code>SVGNumber</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+  */
+public interface SVGNumber {
+
+
+  /**
+    * <p>The value of the given attribute.</p> <p><strong>Exceptions on setting:</strong> a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is Raised on an attempt to change the value of a read only attribute.</p>
+    */
+  double getValue();
+
+  void setValue(double arg);
+}
diff --git a/elemental/src/elemental/svg/SVGNumberList.java b/elemental/src/elemental/svg/SVGNumberList.java
new file mode 100644
index 0000000..ea2c60b
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGNumberList.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGNumberList</code> defines a list of <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGNumber">SVGNumber</a></code>
+ objects.</p>
+<p>An <code>SVGNumberList</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+<div class="geckoVersionNote"> <p>
+</p><div class="geckoVersionHeading">Gecko 5.0 note<div>(Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+</div></div>
+<p></p> <p>Starting in Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)
+,the <code>SVGNumberList</code> DOM interface is now indexable and can be accessed like arrays</p>
+</div>
+  */
+public interface SVGNumberList {
+
+  int getNumberOfItems();
+
+
+  /**
+    * <p>Inserts a new item at the end of the list. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGNumber appendItem(SVGNumber item);
+
+
+  /**
+    * <p>Clears all existing current items from the list, with the result being an empty list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void clear();
+
+
+  /**
+    * <p>Returns the specified item from the list. The returned item is the item itself and not a copy. Any changes made to the item are immediately reflected in the list. The first item is number&nbsp;0.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGNumber getItem(int index);
+
+
+  /**
+    * <p>Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter. If the inserted item is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. The return value is the item inserted into the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGNumber initialize(SVGNumber item);
+
+
+  /**
+    * <p>Inserts a new item into the list at the specified position. The first item is number 0. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to insert before is before the removal of the item. If the <code>index</code> is equal to 0, then the new item is inserted at the front of the list. If the index is greater than or equal to <code>numberOfItems</code>, then the new item is appended to the end of the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGNumber insertItemBefore(SVGNumber item, int index);
+
+
+  /**
+    * <p>Removes an existing item from the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>
+    */
+  SVGNumber removeItem(int index);
+
+
+  /**
+    * <p>Replaces an existing item in the list with a new item. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to replace is before the removal of the item.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>
+    */
+  SVGNumber replaceItem(SVGNumber item, int index);
+}
diff --git a/elemental/src/elemental/svg/SVGPaint.java b/elemental/src/elemental/svg/SVGPaint.java
new file mode 100644
index 0000000..9725dd4
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPaint.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPaint extends SVGColor {
+
+    static final int SVG_PAINTTYPE_CURRENTCOLOR = 102;
+
+    static final int SVG_PAINTTYPE_NONE = 101;
+
+    static final int SVG_PAINTTYPE_RGBCOLOR = 1;
+
+    static final int SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2;
+
+    static final int SVG_PAINTTYPE_UNKNOWN = 0;
+
+    static final int SVG_PAINTTYPE_URI = 107;
+
+    static final int SVG_PAINTTYPE_URI_CURRENTCOLOR = 104;
+
+    static final int SVG_PAINTTYPE_URI_NONE = 103;
+
+    static final int SVG_PAINTTYPE_URI_RGBCOLOR = 105;
+
+    static final int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;
+
+  int getPaintType();
+
+  String getUri();
+
+  void setPaint(int paintType, String uri, String rgbColor, String iccColor);
+}
diff --git a/elemental/src/elemental/svg/SVGPathElement.java b/elemental/src/elemental/svg/SVGPathElement.java
new file mode 100644
index 0000000..d44e5eb
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathElement.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGPathElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/path">&lt;path&gt;</a></code>
+ element.
+  */
+public interface SVGPathElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+  SVGPathSegList getAnimatedNormalizedPathSegList();
+
+  SVGPathSegList getAnimatedPathSegList();
+
+  SVGPathSegList getNormalizedPathSegList();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/pathLength">pathLength</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/path">&lt;path&gt;</a></code>
+ element.
+    */
+  SVGAnimatedNumber getPathLength();
+
+  SVGPathSegList getPathSegList();
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegArcAbs" class="new">SVGPathSegArcAbs</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>r1</em></code><br> The x-axis radius for the ellipse.</li> <li><code>float <em>r2 </em></code><br> The y-axis radius for the ellipse.</li> <li><code>float <em>angle </em></code><br> The rotation angle in degrees for the ellipse's x-axis relative to the x-axis of the user coordinate system.</li> <li><code>boolean <em>largeArcFlag </em></code><br> The value of the large-arc-flag parameter.</li> <li><code>boolean <em>sweepFlag </em></code><br> The value of the large-arc-flag parameter.</li> </ul>
+    */
+  SVGPathSegArcAbs createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, boolean largeArcFlag, boolean sweepFlag);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegArcRel" class="new">SVGPathSegArcRel</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The relative Y coordinate for the end point of this path segment.</li> <li><code>float <em>r1</em></code><br> The x-axis radius for the ellipse.</li> <li><code>float <em>r2 </em></code><br> The y-axis radius for the ellipse.</li> <li><code>float <em>angle </em></code><br> The rotation angle in degrees for the ellipse's x-axis relative to the x-axis of the user coordinate system.</li> <li><code>boolean <em>largeArcFlag </em></code><br> The value of the large-arc-flag parameter.</li> <li><code>boolean <em>sweepFlag </em></code><br> The value of the large-arc-flag parameter.</li> </ul>
+    */
+  SVGPathSegArcRel createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, boolean largeArcFlag, boolean sweepFlag);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegClosePath" class="new">SVGPathSegClosePath</a></code>
+ object.
+    */
+  SVGPathSegClosePath createSVGPathSegClosePath();
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoCubicAbs" class="new">SVGPathSegCurvetoCubicAbs</a></code>
+ object.<br> <br> Parameters: <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>x1</em></code><br> The absolute X coordinate for the first control point.</li> <li><code>float <em>y1</em></code><br> The absolute Y coordinate for the first control point.</li> <li><code>float <em>x2</em></code><br> The absolute X coordinate for the second control point.</li> <li><code>float <em>y2</em></code><br> The absolute Y coordinate for the second control point.</li> </ul>
+    */
+  SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoCubicRel" class="new">SVGPathSegCurvetoCubicRel</a></code>
+ object.<br> <br> Parameters: <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The relative Y coordinate for the end point of this path segment.</li> <li><code>float <em>x1</em></code><br> The relative X coordinate for the first control point.</li> <li><code>float <em>y1</em></code><br> The relative Y coordinate for the first control point.</li> <li><code>float <em>x2</em></code><br> The relative X coordinate for the second control point.</li> <li><code>float <em>y2</em></code><br> The relative Y coordinate for the second control point.</li> </ul>
+    */
+  SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoCubicSmoothAbs" class="new">SVGPathSegCurvetoCubicSmoothAbs</a></code>
+ object.<br> <br> Parameters <ul> <li><code>float <em>x </em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y </em></code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>x2 </em></code><br> The absolute X coordinate for the second control point.</li> <li><code>float <em>y2 </em></code><br> The absolute Y coordinate for the second control point.</li> </ul>
+    */
+  SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoCubicSmoothRel" class="new">SVGPathSegCurvetoCubicSmoothRel</a></code>
+ object.<br> <br> Parameters <ul> <li><code>float <em>x </em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y </em></code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>x2 </em></code><br> The absolute X coordinate for the second control point.</li> <li><code>float <em>y2 </em></code><br> The absolute Y coordinate for the second control point.</li> </ul>
+    */
+  SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoQuadraticAbs" class="new">SVGPathSegCurvetoQuadraticAbs</a></code>
+ object.<br> <br> Parameters: <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The absolute Y coordinate for the end point of this path segment.</li> <li><code>float <em>x1</em></code><br> The absolute X coordinate for the first control point.</li> <li><code>float <em>y1</em></code><br> The absolute Y coordinate for the first control point.</li> </ul>
+    */
+  SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoQuadraticRel" class="new">SVGPathSegCurvetoQuadraticRel</a></code>
+ object.<br> <br> Parameters: <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em> </code><br> The relative Y coordinate for the end point of this path segment.</li> <li><code>float <em>x1</em></code><br> The relative X coordinate for the first control point.</li> <li><code>float <em>y1</em></code><br> The relative Y coordinate for the first control point.</li> </ul>
+    */
+  SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoQuadraticSmoothAbs" class="new">SVGPathSegCurvetoQuadraticSmoothAbs</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegCurvetoQuadraticSmoothRel" class="new">SVGPathSegCurvetoQuadraticSmoothRel</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoAbs" class="new">SVGPathSegLinetoAbs</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(float x, float y);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoHorizontalAbs" class="new">SVGPathSegLinetoHorizontalAbs</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(float x);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoHorizontalRel" class="new">SVGPathSegLinetoHorizontalRel</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(float x);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoRel" class="new">SVGPathSegLinetoRel</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The relative Y coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegLinetoRel createSVGPathSegLinetoRel(float x, float y);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoVerticalAbs" class="new">SVGPathSegLinetoVerticalAbs</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(float y);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegLinetoVerticalRel" class="new">SVGPathSegLinetoVerticalRel</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>y</em></code><br> The relative Y coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(float y);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegMovetoAbs" class="new">SVGPathSegMovetoAbs</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The absolute X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The absolute Y coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(float x, float y);
+
+
+  /**
+    * Returns a stand-alone, parentless <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGPathSegMovetoRel" class="new">SVGPathSegMovetoRel</a></code>
+ object.<br> <br> <strong>Parameters:</strong> <ul> <li><code>float <em>x</em></code><br> The relative X coordinate for the end point of this path segment.</li> <li><code>float <em>y</em></code><br> The relative Y coordinate for the end point of this path segment.</li> </ul>
+    */
+  SVGPathSegMovetoRel createSVGPathSegMovetoRel(float x, float y);
+
+
+  /**
+    * Returns the index into <code>pathSegList</code> which is <code>distance</code> units along the path, utilizing the user agent's distance-along-a-path algorithm.
+    */
+  int getPathSegAtLength(float distance);
+
+
+  /**
+    * Returns the (x,y) coordinate in user space which is distance units along the path, utilizing the browser's distance-along-a-path algorithm.
+    */
+  SVGPoint getPointAtLength(float distance);
+
+
+  /**
+    * Returns the computed value for the total length of the path using the browser's distance-along-a-path algorithm, as a distance in the current user coordinate system.
+    */
+  float getTotalLength();
+}
diff --git a/elemental/src/elemental/svg/SVGPathSeg.java b/elemental/src/elemental/svg/SVGPathSeg.java
new file mode 100644
index 0000000..3ca1e5d
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSeg.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSeg {
+
+    static final int PATHSEG_ARC_ABS = 10;
+
+    static final int PATHSEG_ARC_REL = 11;
+
+    static final int PATHSEG_CLOSEPATH = 1;
+
+    static final int PATHSEG_CURVETO_CUBIC_ABS = 6;
+
+    static final int PATHSEG_CURVETO_CUBIC_REL = 7;
+
+    static final int PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
+
+    static final int PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
+
+    static final int PATHSEG_CURVETO_QUADRATIC_ABS = 8;
+
+    static final int PATHSEG_CURVETO_QUADRATIC_REL = 9;
+
+    static final int PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
+
+    static final int PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
+
+    static final int PATHSEG_LINETO_ABS = 4;
+
+    static final int PATHSEG_LINETO_HORIZONTAL_ABS = 12;
+
+    static final int PATHSEG_LINETO_HORIZONTAL_REL = 13;
+
+    static final int PATHSEG_LINETO_REL = 5;
+
+    static final int PATHSEG_LINETO_VERTICAL_ABS = 14;
+
+    static final int PATHSEG_LINETO_VERTICAL_REL = 15;
+
+    static final int PATHSEG_MOVETO_ABS = 2;
+
+    static final int PATHSEG_MOVETO_REL = 3;
+
+    static final int PATHSEG_UNKNOWN = 0;
+
+  int getPathSegType();
+
+  String getPathSegTypeAsLetter();
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegArcAbs.java b/elemental/src/elemental/svg/SVGPathSegArcAbs.java
new file mode 100644
index 0000000..c27a3b8
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegArcAbs.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegArcAbs extends SVGPathSeg {
+
+  float getAngle();
+
+  void setAngle(float arg);
+
+  boolean isLargeArcFlag();
+
+  void setLargeArcFlag(boolean arg);
+
+  float getR1();
+
+  void setR1(float arg);
+
+  float getR2();
+
+  void setR2(float arg);
+
+  boolean isSweepFlag();
+
+  void setSweepFlag(boolean arg);
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegArcRel.java b/elemental/src/elemental/svg/SVGPathSegArcRel.java
new file mode 100644
index 0000000..175f24b
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegArcRel.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegArcRel extends SVGPathSeg {
+
+  float getAngle();
+
+  void setAngle(float arg);
+
+  boolean isLargeArcFlag();
+
+  void setLargeArcFlag(boolean arg);
+
+  float getR1();
+
+  void setR1(float arg);
+
+  float getR2();
+
+  void setR2(float arg);
+
+  boolean isSweepFlag();
+
+  void setSweepFlag(boolean arg);
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegClosePath.java b/elemental/src/elemental/svg/SVGPathSegClosePath.java
new file mode 100644
index 0000000..72e43a8
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegClosePath.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegClosePath extends SVGPathSeg {
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegCurvetoCubicAbs.java b/elemental/src/elemental/svg/SVGPathSegCurvetoCubicAbs.java
new file mode 100644
index 0000000..d6ce486
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegCurvetoCubicAbs.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegCurvetoCubicAbs extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getX1();
+
+  void setX1(float arg);
+
+  float getX2();
+
+  void setX2(float arg);
+
+  float getY();
+
+  void setY(float arg);
+
+  float getY1();
+
+  void setY1(float arg);
+
+  float getY2();
+
+  void setY2(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegCurvetoCubicRel.java b/elemental/src/elemental/svg/SVGPathSegCurvetoCubicRel.java
new file mode 100644
index 0000000..a1cd401
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegCurvetoCubicRel.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegCurvetoCubicRel extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getX1();
+
+  void setX1(float arg);
+
+  float getX2();
+
+  void setX2(float arg);
+
+  float getY();
+
+  void setY(float arg);
+
+  float getY1();
+
+  void setY1(float arg);
+
+  float getY2();
+
+  void setY2(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegCurvetoCubicSmoothAbs.java b/elemental/src/elemental/svg/SVGPathSegCurvetoCubicSmoothAbs.java
new file mode 100644
index 0000000..05f8c2f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegCurvetoCubicSmoothAbs.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getX2();
+
+  void setX2(float arg);
+
+  float getY();
+
+  void setY(float arg);
+
+  float getY2();
+
+  void setY2(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegCurvetoCubicSmoothRel.java b/elemental/src/elemental/svg/SVGPathSegCurvetoCubicSmoothRel.java
new file mode 100644
index 0000000..4f889ef
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegCurvetoCubicSmoothRel.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getX2();
+
+  void setX2(float arg);
+
+  float getY();
+
+  void setY(float arg);
+
+  float getY2();
+
+  void setY2(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticAbs.java b/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticAbs.java
new file mode 100644
index 0000000..8d2964d
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticAbs.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getX1();
+
+  void setX1(float arg);
+
+  float getY();
+
+  void setY(float arg);
+
+  float getY1();
+
+  void setY1(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticRel.java b/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticRel.java
new file mode 100644
index 0000000..7a1f4cc
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticRel.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getX1();
+
+  void setX1(float arg);
+
+  float getY();
+
+  void setY(float arg);
+
+  float getY1();
+
+  void setY1(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticSmoothAbs.java b/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticSmoothAbs.java
new file mode 100644
index 0000000..f56cc3c
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticSmoothAbs.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticSmoothRel.java b/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticSmoothRel.java
new file mode 100644
index 0000000..04f82b4
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegCurvetoQuadraticSmoothRel.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegLinetoAbs.java b/elemental/src/elemental/svg/SVGPathSegLinetoAbs.java
new file mode 100644
index 0000000..5956f0e
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegLinetoAbs.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegLinetoAbs extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegLinetoHorizontalAbs.java b/elemental/src/elemental/svg/SVGPathSegLinetoHorizontalAbs.java
new file mode 100644
index 0000000..cf513dd
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegLinetoHorizontalAbs.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegLinetoHorizontalRel.java b/elemental/src/elemental/svg/SVGPathSegLinetoHorizontalRel.java
new file mode 100644
index 0000000..f158603
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegLinetoHorizontalRel.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegLinetoHorizontalRel extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegLinetoRel.java b/elemental/src/elemental/svg/SVGPathSegLinetoRel.java
new file mode 100644
index 0000000..5e25e42
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegLinetoRel.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegLinetoRel extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegLinetoVerticalAbs.java b/elemental/src/elemental/svg/SVGPathSegLinetoVerticalAbs.java
new file mode 100644
index 0000000..2055303
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegLinetoVerticalAbs.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegLinetoVerticalAbs extends SVGPathSeg {
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegLinetoVerticalRel.java b/elemental/src/elemental/svg/SVGPathSegLinetoVerticalRel.java
new file mode 100644
index 0000000..76f10bf
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegLinetoVerticalRel.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegLinetoVerticalRel extends SVGPathSeg {
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegList.java b/elemental/src/elemental/svg/SVGPathSegList.java
new file mode 100644
index 0000000..0693468
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegList.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegList {
+
+  int getNumberOfItems();
+
+  SVGPathSeg appendItem(SVGPathSeg newItem);
+
+  void clear();
+
+  SVGPathSeg getItem(int index);
+
+  SVGPathSeg initialize(SVGPathSeg newItem);
+
+  SVGPathSeg insertItemBefore(SVGPathSeg newItem, int index);
+
+  SVGPathSeg removeItem(int index);
+
+  SVGPathSeg replaceItem(SVGPathSeg newItem, int index);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegMovetoAbs.java b/elemental/src/elemental/svg/SVGPathSegMovetoAbs.java
new file mode 100644
index 0000000..f31f00a
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegMovetoAbs.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegMovetoAbs extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPathSegMovetoRel.java b/elemental/src/elemental/svg/SVGPathSegMovetoRel.java
new file mode 100644
index 0000000..d3e73a6
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPathSegMovetoRel.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPathSegMovetoRel extends SVGPathSeg {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGPatternElement.java b/elemental/src/elemental/svg/SVGPatternElement.java
new file mode 100644
index 0000000..341185f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPatternElement.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGPatternElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/pattern">&lt;pattern&gt;</a></code>
+ element.
+  */
+public interface SVGPatternElement extends SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/height">height</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/pattern">&lt;pattern&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedHeight();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/patternContentUnits" class="new">patternContentUnits</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/pattern">&lt;pattern&gt;</a></code>
+ element. Takes one of the constants defined in <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes" class="new">SVGUnitTypes</a></code>
+.
+    */
+  SVGAnimatedEnumeration getPatternContentUnits();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/patternTransform" class="new">patternTransform</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/pattern">&lt;pattern&gt;</a></code>
+ element.
+    */
+  SVGAnimatedTransformList getPatternTransform();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/patternUnits" class="new">patternUnits</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/pattern">&lt;pattern&gt;</a></code>
+ element. Takes one of the constants defined in <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGUnitTypes" class="new">SVGUnitTypes</a></code>
+.
+    */
+  SVGAnimatedEnumeration getPatternUnits();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/width">width</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/pattern">&lt;pattern&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getX();
+
+  SVGAnimatedLength getY();
+}
diff --git a/elemental/src/elemental/svg/SVGPoint.java b/elemental/src/elemental/svg/SVGPoint.java
new file mode 100644
index 0000000..2284257
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPoint.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPoint {
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+
+  SVGPoint matrixTransform(SVGMatrix matrix);
+}
diff --git a/elemental/src/elemental/svg/SVGPointList.java b/elemental/src/elemental/svg/SVGPointList.java
new file mode 100644
index 0000000..75280a6
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPointList.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGPointList {
+
+  int getNumberOfItems();
+
+  SVGPoint appendItem(SVGPoint item);
+
+  void clear();
+
+  SVGPoint getItem(int index);
+
+  SVGPoint initialize(SVGPoint item);
+
+  SVGPoint insertItemBefore(SVGPoint item, int index);
+
+  SVGPoint removeItem(int index);
+
+  SVGPoint replaceItem(SVGPoint item, int index);
+}
diff --git a/elemental/src/elemental/svg/SVGPolygonElement.java b/elemental/src/elemental/svg/SVGPolygonElement.java
new file mode 100644
index 0000000..2605cc6
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPolygonElement.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>polygon</code> element defines a closed shape consisting of a set of connected straight line segments.
+  */
+public interface SVGPolygonElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+  SVGPointList getAnimatedPoints();
+
+  SVGPointList getPoints();
+}
diff --git a/elemental/src/elemental/svg/SVGPolylineElement.java b/elemental/src/elemental/svg/SVGPolylineElement.java
new file mode 100644
index 0000000..90ed0ed
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPolylineElement.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>polyline</code> element is an SVG basic shape, used to create a series of straight lines connecting several points. Typically a <code>polyline</code> is used to create open shapes
+  */
+public interface SVGPolylineElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+  SVGPointList getAnimatedPoints();
+
+  SVGPointList getPoints();
+}
diff --git a/elemental/src/elemental/svg/SVGPreserveAspectRatio.java b/elemental/src/elemental/svg/SVGPreserveAspectRatio.java
new file mode 100644
index 0000000..86059b1
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGPreserveAspectRatio.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGPreserveAspectRatio</code> interface corresponds to the 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code> attribute, which is available for some of SVG's elements.</p>
+<p>An <code>SVGPreserveAspectRatio</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+  */
+public interface SVGPreserveAspectRatio {
+
+  /**
+    * Corresponds to value <code>meet</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_MEETORSLICE_MEET = 1;
+
+  /**
+    * Corresponds to value <code>slice</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_MEETORSLICE_SLICE = 2;
+
+  /**
+    * The enumeration was set to a value that is not one of predefined types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.
+    */
+
+    static final int SVG_MEETORSLICE_UNKNOWN = 0;
+
+  /**
+    * Corresponds to value <code>none</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_NONE = 1;
+
+  /**
+    * The enumeration was set to a value that is not one of predefined types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
+
+  /**
+    * Corresponds to value <code>xMaxYMax</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
+
+  /**
+    * Corresponds to value <code>xMaxYMid</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
+
+  /**
+    * Corresponds to value <code>xMaxYMin</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
+
+  /**
+    * Corresponds to value <code>xMidYMax</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
+
+  /**
+    * Corresponds to value <code>xMidYMid</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
+
+  /**
+    * Corresponds to value <code>xMidYMin</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
+
+  /**
+    * Corresponds to value <code>xMinYMax</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
+
+  /**
+    * Corresponds to value <code>xMinYMid</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
+
+  /**
+    * Corresponds to value <code>xMinYMin</code> for attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>.
+    */
+
+    static final int SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
+
+
+  /**
+    * The type of the alignment value as specified by one of the SVG_PRESERVEASPECTRATIO_* constants defined on this interface.
+    */
+  int getAlign();
+
+  void setAlign(int arg);
+
+
+  /**
+    * The type of the meet-or-slice value as specified by one of the SVG_MEETORSLICE_* constants defined on this interface.
+    */
+  int getMeetOrSlice();
+
+  void setMeetOrSlice(int arg);
+}
diff --git a/elemental/src/elemental/svg/SVGRadialGradientElement.java b/elemental/src/elemental/svg/SVGRadialGradientElement.java
new file mode 100644
index 0000000..dcac9e5
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGRadialGradientElement.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGRadialGradientElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/radialGradient">&lt;radialGradient&gt;</a></code>
+ element.
+  */
+public interface SVGRadialGradientElement extends SVGGradientElement {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/cx">cx</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/radialGradient">&lt;radialGradient&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getCx();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/cy">cy</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/radialGradient">&lt;radialGradient&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getCy();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/fx" class="new">fx</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/radialGradient">&lt;radialGradient&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getFx();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/fy" class="new">fy</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/radialGradient">&lt;radialGradient&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getFy();
+
+  SVGAnimatedLength getR();
+}
diff --git a/elemental/src/elemental/svg/SVGRect.java b/elemental/src/elemental/svg/SVGRect.java
new file mode 100644
index 0000000..5ce2825
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGRect.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGRect</code> represents rectangular geometry. Rectangles are defined as consisting of a (x,y) coordinate pair identifying a minimum X value, a minimum Y value, and a width and height, which are usually constrained to be non-negative.</p>
+<p>An <code>SVGRect</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+  */
+public interface SVGRect {
+
+
+  /**
+    * The <em>height</em> coordinate of the rectangle, in user units.
+    */
+  float getHeight();
+
+  void setHeight(float arg);
+
+
+  /**
+    * The <em>width</em> coordinate of the rectangle, in user units.
+    */
+  float getWidth();
+
+  void setWidth(float arg);
+
+  float getX();
+
+  void setX(float arg);
+
+  float getY();
+
+  void setY(float arg);
+}
diff --git a/elemental/src/elemental/svg/SVGRectElement.java b/elemental/src/elemental/svg/SVGRectElement.java
new file mode 100644
index 0000000..5e37c9e
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGRectElement.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGRectElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/rect">&lt;rect&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGRectElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/height">height</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/rect">&lt;rect&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedHeight();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/rx">rx</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/rect">&lt;rect&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getRx();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/ry">ry</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/rect">&lt;rect&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getRy();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/width">width</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/rect">&lt;rect&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getX();
+
+  SVGAnimatedLength getY();
+}
diff --git a/elemental/src/elemental/svg/SVGRenderingIntent.java b/elemental/src/elemental/svg/SVGRenderingIntent.java
new file mode 100644
index 0000000..53d6950
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGRenderingIntent.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGRenderingIntent {
+
+    static final int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
+
+    static final int RENDERING_INTENT_AUTO = 1;
+
+    static final int RENDERING_INTENT_PERCEPTUAL = 2;
+
+    static final int RENDERING_INTENT_RELATIVE_COLORIMETRIC = 3;
+
+    static final int RENDERING_INTENT_SATURATION = 4;
+
+    static final int RENDERING_INTENT_UNKNOWN = 0;
+}
diff --git a/elemental/src/elemental/svg/SVGSVGElement.java b/elemental/src/elemental/svg/SVGSVGElement.java
new file mode 100644
index 0000000..44b6061
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGSVGElement.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+import elemental.dom.Element;
+import elemental.dom.NodeList;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGSVGElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ elements, as well as methods to manipulate them. This interface contains also various miscellaneous commonly-used utility methods, such as matrix operations and the ability to control the time of redraw on visual rendering devices.
+  */
+public interface SVGSVGElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGLocatable, SVGFitToViewBox, SVGZoomAndPan {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/contentScriptType">contentScriptType</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element.
+    */
+  String getContentScriptType();
+
+  void setContentScriptType(String arg);
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/contentStyleType">contentStyleType</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element.
+    */
+  String getContentStyleType();
+
+  void setContentStyleType(String arg);
+
+
+  /**
+    * On an outermost <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element, this attribute indicates the current scale factor relative to the initial view to take into account user magnification and panning operations. DOM attributes <code>currentScale</code> and <code>currentTranslate</code> are equivalent to the 2x3 matrix <code>[a b c d e f] = [currentScale 0 0 currentScale currentTranslate.x currentTranslate.y]</code>. If "magnification" is enabled (i.e., <code>zoomAndPan="magnify"</code>), then the effect is as if an extra transformation were placed at the outermost level on the SVG document fragment (i.e., outside the outermost <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element).
+    */
+  float getCurrentScale();
+
+  void setCurrentScale(float arg);
+
+
+  /**
+    * On an outermost <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element, the corresponding translation factor that takes into account user "magnification".
+    */
+  SVGPoint getCurrentTranslate();
+
+
+  /**
+    * The definition of the initial view (i.e., before magnification and panning) of the current innermost SVG document fragment. The meaning depends on the situation:<br> <ul> <li>If the initial view was a "standard" view, then: <ul> <li>the values for 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewBox" class="new">viewBox</a></code>, 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code> and 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/zoomAndPan" class="new">zoomAndPan</a></code> within 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/currentView" class="new">currentView</a></code> will match the values for the corresponding DOM attributes that are on <code>SVGSVGElement</code> directly</li> <li>the values for 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/transform">transform</a></code> and 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewTarget" class="new">viewTarget</a></code> within 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/currentView" class="new">currentView</a></code> will be null</li> </ul> </li> <li>If the initial view was a link into a <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/view">&lt;view&gt;</a></code>
+ element, then: <ul> <li>the values for 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewBox" class="new">viewBox</a></code>, 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code> and 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/zoomAndPan" class="new">zoomAndPan</a></code> within 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/currentView" class="new">currentView</a></code> will correspond to the corresponding attributes for the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/view">&lt;view&gt;</a></code>
+ element</li> <li>the values for 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/transform">transform</a></code> and 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewTarget" class="new">viewTarget</a></code> within 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/currentView" class="new">currentView</a></code> will be null</li> </ul> </li> <li>If the initial view was a link into another element (i.e., other than a <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/view">&lt;view&gt;</a></code>
+), then: <ul> <li>the values for 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewBox" class="new">viewBox</a></code>, 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code> and 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/zoomAndPan" class="new">zoomAndPan</a></code> within 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/currentView" class="new">currentView</a></code> will match the values for the corresponding DOM attributes that are on <code>SVGSVGElement</code> directly for the closest ancestor <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element</li> <li>the values for 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/transform">transform</a></code> within 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/currentView" class="new">currentView</a></code> will be null</li> <li>the 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewTarget" class="new">viewTarget</a></code> within 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/currentView" class="new">currentView</a></code> will represent the target of the link</li> </ul> </li> <li>If the initial view was a link into the SVG document fragment using an SVG view specification fragment identifier (i.e., #svgView(...)), then: <ul> <li>the values for 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewBox" class="new">viewBox</a></code>, 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/preserveAspectRatio">preserveAspectRatio</a></code>, 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/zoomAndPan" class="new">zoomAndPan</a></code>, 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/transform">transform</a></code> and 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewTarget" class="new">viewTarget</a></code> within 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/currentView" class="new">currentView</a></code> will correspond to the values from the SVG view specification fragment identifier</li> </ul> </li> </ul>
+    */
+  SVGViewSpec getCurrentView();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/height">height</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedHeight();
+
+
+  /**
+    * Size of a pixel units (as defined by CSS2) along the x-axis of the viewport, which represents a unit somewhere in the range of 70dpi to 120dpi, and, on systems that support this, might actually match the characteristics of the target medium. On systems where it is impossible to know the size of a pixel, a suitable default pixel size is provided.
+    */
+  float getPixelUnitToMillimeterX();
+
+
+  /**
+    * Corresponding size of a pixel unit along the y-axis of the viewport.
+    */
+  float getPixelUnitToMillimeterY();
+
+
+  /**
+    * User interface (UI) events in DOM Level 2 indicate the screen positions at which the given UI event occurred. When the browser actually knows the physical size of a "screen unit", this attribute will express that information; otherwise, user agents will provide a suitable default value such as .28mm.
+    */
+  float getScreenPixelToMillimeterX();
+
+
+  /**
+    * Corresponding size of a screen pixel along the y-axis of the viewport.
+    */
+  float getScreenPixelToMillimeterY();
+
+
+  /**
+    * The initial view (i.e., before magnification and panning) of the current innermost SVG document fragment can be either the "standard" view (i.e., based on attributes on the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element such as 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewBox" class="new">viewBox</a></code>) or to a "custom" view (i.e., a hyperlink into a particular <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/view">&lt;view&gt;</a></code>
+ or other element). If the initial view is the "standard" view, then this attribute is false. If the initial view is a "custom" view, then this attribute is true.
+    */
+  boolean isUseCurrentView();
+
+
+  /**
+    * The position and size of the viewport (implicit or explicit) that corresponds to this <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element. When the browser is actually rendering the content, then the position and size values represent the actual values when rendering. The position and size values are unitless values in the coordinate system of the parent element. If no parent element exists (i.e., <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element represents the root of the document tree), if this SVG document is embedded as part of another document (e.g., via the HTML <code><a rel="custom" href="https://developer.mozilla.org/en/HTML/Element/object">&lt;object&gt;</a></code>
+ element), then the position and size are unitless values in the coordinate system of the parent document. (If the parent uses CSS or XSL layout, then unitless values represent pixel units for the current CSS or XSL viewport.)
+    */
+  SVGRect getViewport();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/width">width</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getX();
+
+  SVGAnimatedLength getY();
+
+
+  /**
+    * Returns true if this SVG document fragment is in a paused state.
+    */
+  boolean animationsPaused();
+
+
+  /**
+    * Returns true if the rendered content of the given element is entirely contained within the supplied rectangle. Each candidate graphics element is to be considered a match only if the same graphics element can be a target of pointer events as defined in 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/pointer-events">pointer-events</a></code> processing.
+    */
+  boolean checkEnclosure(SVGElement element, SVGRect rect);
+
+
+  /**
+    * Returns true if the rendered content of the given element intersects the supplied rectangle. Each candidate graphics element is to be considered a match only if the same graphics element can be a target of pointer events as defined in 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/pointer-events">pointer-events</a></code> processing.
+    */
+  boolean checkIntersection(SVGElement element, SVGRect rect);
+
+
+  /**
+    * Creates an <code>SVGAngle</code> object outside of any document trees. The object is initialized to a value of zero degrees (unitless).
+    */
+  SVGAngle createSVGAngle();
+
+
+  /**
+    * Creates an <code>SVGLength</code> object outside of any document trees. The object is initialized to a value of zero user units.
+    */
+  SVGLength createSVGLength();
+
+
+  /**
+    * Creates an <code>SVGMatrix</code> object outside of any document trees. The object is initialized to the identity matrix.
+    */
+  SVGMatrix createSVGMatrix();
+
+
+  /**
+    * Creates an <code>SVGNumber</code> object outside of any document trees. The object is initialized to a value of zero.
+    */
+  SVGNumber createSVGNumber();
+
+
+  /**
+    * Creates an <code>SVGPoint</code> object outside of any document trees. The object is initialized to the point (0,0) in the user coordinate system.
+    */
+  SVGPoint createSVGPoint();
+
+
+  /**
+    * Creates an <code>SVGRect</code> object outside of any document trees. The object is initialized such that all values are set to 0 user units.
+    */
+  SVGRect createSVGRect();
+
+
+  /**
+    * Creates an <code>SVGTransform</code> object outside of any document trees. The object is initialized to an identity matrix transform (<code>SVG_TRANSFORM_MATRIX</code>).
+    */
+  SVGTransform createSVGTransform();
+
+
+  /**
+    * Creates an <code>SVGTransform</code> object outside of any document trees. The object is initialized to the given matrix transform (i.e., <code>SVG_TRANSFORM_MATRIX</code>). The values from the parameter matrix are copied, the matrix parameter is not adopted as <code>SVGTransform::matrix</code>.
+    */
+  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
+
+
+  /**
+    * Unselects any selected objects, including any selections of text strings and type-in bars.
+    */
+  void deselectAll();
+
+
+  /**
+    * In rendering environments supporting interactivity, forces the user agent to immediately redraw all regions of the viewport that require updating.
+    */
+  void forceRedraw();
+
+
+  /**
+    * Returns the current time in seconds relative to the start time for the current SVG document fragment. If getCurrentTime is called before the document timeline has begun (for example, by script running in a <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/script">&lt;script&gt;</a></code>
+ element before the document's SVGLoad event is dispatched), then 0 is returned.
+    */
+  float getCurrentTime();
+
+
+  /**
+    * Searches this SVG document fragment (i.e., the search is restricted to a subset of the document tree) for an Element whose id is given by <em>elementId</em>. If an Element is found, that Element is returned. If no such element exists, returns null. Behavior is not defined if more than one element has this id.
+    */
+  Element getElementById(String elementId);
+
+
+  /**
+    * Returns the list of graphics elements whose rendered content is entirely contained within the supplied rectangle. Each candidate graphics element is to be considered a match only if the same graphics element can be a target of pointer events as defined in 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/pointer-events">pointer-events</a></code> processing.
+    */
+  NodeList getEnclosureList(SVGRect rect, SVGElement referenceElement);
+
+
+  /**
+    * Returns the list of graphics elements whose rendered content intersects the supplied rectangle. Each candidate graphics element is to be considered a match only if the same graphics element can be a target of pointer events as defined in 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/pointer-events">pointer-events</a></code> processing.
+    */
+  NodeList getIntersectionList(SVGRect rect, SVGElement referenceElement);
+
+
+  /**
+    * Suspends (i.e., pauses) all currently running animations that are defined within the SVG document fragment corresponding to this <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/svg">&lt;svg&gt;</a></code>
+ element, causing the animation clock corresponding to this document fragment to stand still until it is unpaused.
+    */
+  void pauseAnimations();
+
+
+  /**
+    * Adjusts the clock for this SVG document fragment, establishing a new current time. If <code>setCurrentTime</code> is called before the document timeline has begun (for example, by script running in a <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/script">&lt;script&gt;</a></code>
+ element before the document's SVGLoad event is dispatched), then the value of seconds in the last invocation of the method gives the time that the document will seek to once the document timeline has begun.
+    */
+  void setCurrentTime(float seconds);
+
+
+  /**
+    * <p>Takes a time-out value which indicates that redraw shall not occur until:</p> <ol> <li>the corresponding unsuspendRedraw() call has been made,</li> <li>an unsuspendRedrawAll() call has been made, or</li> <li>its timer has timed out.</li> </ol> <p>In environments that do not support interactivity (e.g., print media), then redraw shall not be suspended. Calls to <code>suspendRedraw()</code> and <code>unsuspendRedraw()</code> should, but need not be, made in balanced pairs.</p> <p>To suspend redraw actions as a collection of SVG DOM changes occur, precede the changes to the SVG DOM with a method call similar to:</p> <p><code>suspendHandleID = suspendRedraw(maxWaitMilliseconds);</code></p> <p>and follow the changes with a method call similar to:</p> <p><code>unsuspendRedraw(suspendHandleID);</code></p> <p>Note that multiple suspendRedraw calls can be used at once and that each such method call is treated independently of the other suspendRedraw method calls.</p>
+    */
+  int suspendRedraw(int maxWaitMilliseconds);
+
+
+  /**
+    * Unsuspends (i.e., unpauses) currently running animations that are defined within the SVG document fragment, causing the animation clock to continue from the time at which it was suspended.
+    */
+  void unpauseAnimations();
+
+
+  /**
+    * Cancels a specified <code>suspendRedraw()</code> by providing a unique suspend handle ID that was returned by a previous <code>suspendRedraw()</code> call.
+    */
+  void unsuspendRedraw(int suspendHandleId);
+
+
+  /**
+    * Cancels all currently active <code>suspendRedraw()</code> method calls. This method is most useful at the very end of a set of SVG DOM calls to ensure that all pending <code>suspendRedraw()</code> method calls have been cancelled.
+    */
+  void unsuspendRedrawAll();
+}
diff --git a/elemental/src/elemental/svg/SVGScriptElement.java b/elemental/src/elemental/svg/SVGScriptElement.java
new file mode 100644
index 0000000..ea46e5c
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGScriptElement.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGScriptElement</code> interface corresponds to the SVG <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/script">&lt;script&gt;</a></code>
+ element.
+  */
+public interface SVGScriptElement extends SVGElement, SVGURIReference, SVGExternalResourcesRequired {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/type" class="new">type</a></code> on the given element. A <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ is raised with code <code>NO_MODIFICATION_ALLOWED_ERR</code> on an attempt to change the value of a read only attribut.
+    */
+  String getType();
+
+  void setType(String arg);
+}
diff --git a/elemental/src/elemental/svg/SVGSetElement.java b/elemental/src/elemental/svg/SVGSetElement.java
new file mode 100644
index 0000000..b993f4f
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGSetElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGSetElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/set">&lt;set&gt;</a></code>
+ element.
+  */
+public interface SVGSetElement extends SVGAnimationElement {
+}
diff --git a/elemental/src/elemental/svg/SVGStopElement.java b/elemental/src/elemental/svg/SVGStopElement.java
new file mode 100644
index 0000000..cfa043b
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGStopElement.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGStopElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/stop">&lt;stop&gt;</a></code>
+ element.
+  */
+public interface SVGStopElement extends SVGElement, SVGStylable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/offset" class="new">offset</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/stop">&lt;stop&gt;</a></code>
+ element.
+    */
+  SVGAnimatedNumber getOffset();
+}
diff --git a/elemental/src/elemental/svg/SVGStringList.java b/elemental/src/elemental/svg/SVGStringList.java
new file mode 100644
index 0000000..d62c055
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGStringList.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGStringList</code> defines a list of <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMString">DOMString</a></code>
+ objects.</p>
+<p>An <code>SVGStringList</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+  */
+public interface SVGStringList {
+
+  int getNumberOfItems();
+
+
+  /**
+    * <p>Inserts a new item at the end of the list. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  String appendItem(String item);
+
+
+  /**
+    * <p>Clears all existing current items from the list, with the result being an empty list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void clear();
+
+
+  /**
+    * <p>Returns the specified item from the list. The returned item is the item itself and not a copy. Any changes made to the item are immediately reflected in the list. The first item is number&nbsp;0.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  String getItem(int index);
+
+
+  /**
+    * <p>Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter. If the inserted item is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. The return value is the item inserted into the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  String initialize(String item);
+
+
+  /**
+    * <p>Inserts a new item into the list at the specified position. The first item is number 0. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to insert before is before the removal of the item. If the <code>index</code> is equal to 0, then the new item is inserted at the front of the list. If the index is greater than or equal to <code>numberOfItems</code>, then the new item is appended to the end of the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  String insertItemBefore(String item, int index);
+
+
+  /**
+    * <p>Removes an existing item from the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>
+    */
+  String removeItem(int index);
+
+
+  /**
+    * <p>Replaces an existing item in the list with a new item. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to replace is before the removal of the item.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>
+    */
+  String replaceItem(String item, int index);
+}
diff --git a/elemental/src/elemental/svg/SVGStylable.java b/elemental/src/elemental/svg/SVGStylable.java
new file mode 100644
index 0000000..ff37f68
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGStylable.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+import elemental.css.CSSStyleDeclaration;
+import elemental.css.CSSValue;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGStylable</code> interface is implemented on all objects corresponding to SVG elements that can have 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/style">style</a></code>, {{SVGAttr("class") and presentation attributes specified on them.
+  */
+public interface SVGStylable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/class">class</a></code> on the given element.
+    */
+  SVGAnimatedString getAnimatedClassName();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/style">style</a></code> on the given element.
+    */
+  CSSStyleDeclaration getSvgStyle();
+
+
+  /**
+    * Returns the base (i.e., static) value of a given presentation attribute as an object of type <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/CSSValue" class="new">CSSValue</a></code>
+. The returned object is live; changes to the objects represent immediate changes to the objects to which the <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/CSSValue" class="new">CSSValue</a></code>
+ is attached.
+    */
+  CSSValue getPresentationAttribute(String name);
+}
diff --git a/elemental/src/elemental/svg/SVGStyleElement.java b/elemental/src/elemental/svg/SVGStyleElement.java
new file mode 100644
index 0000000..ae8c4b1
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGStyleElement.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGStyleElement</code> interface corresponds to the SVG <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/style">&lt;style&gt;</a></code>
+ element.
+  */
+public interface SVGStyleElement extends SVGElement, SVGLangSpace {
+
+  boolean isDisabled();
+
+  void setDisabled(boolean arg);
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/media" class="new">media</a></code> on the given element. A <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ is raised with code <code>NO_MODIFICATION_ALLOWED_ERR</code> on an attempt to change the value of a read only attribut.
+    */
+  String getMedia();
+
+  void setMedia(String arg);
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/title" class="new">title</a></code> on the given element. A <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ is raised with code <code>NO_MODIFICATION_ALLOWED_ERR</code> on an attempt to change the value of a read only attribut.
+    */
+  String getTitle();
+
+  void setTitle(String arg);
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/type" class="new">type</a></code> on the given element. A <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ is raised with code <code>NO_MODIFICATION_ALLOWED_ERR</code> on an attempt to change the value of a read only attribut.
+    */
+  String getType();
+
+  void setType(String arg);
+}
diff --git a/elemental/src/elemental/svg/SVGSwitchElement.java b/elemental/src/elemental/svg/SVGSwitchElement.java
new file mode 100644
index 0000000..0996a5e
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGSwitchElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGSwitchElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/switch">&lt;switch&gt;</a></code>
+ element.
+  */
+public interface SVGSwitchElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+}
diff --git a/elemental/src/elemental/svg/SVGSymbolElement.java b/elemental/src/elemental/svg/SVGSymbolElement.java
new file mode 100644
index 0000000..c1a8c9a
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGSymbolElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGSymbolElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/symbol">&lt;symbol&gt;</a></code>
+ element.
+  */
+public interface SVGSymbolElement extends SVGElement, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox {
+}
diff --git a/elemental/src/elemental/svg/SVGTRefElement.java b/elemental/src/elemental/svg/SVGTRefElement.java
new file mode 100644
index 0000000..5b78923
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTRefElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGTRefElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/tref">&lt;tref&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGTRefElement extends SVGTextPositioningElement, SVGURIReference {
+}
diff --git a/elemental/src/elemental/svg/SVGTSpanElement.java b/elemental/src/elemental/svg/SVGTSpanElement.java
new file mode 100644
index 0000000..93c613b
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTSpanElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGTSpanElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/tspan">&lt;tspan&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGTSpanElement extends SVGTextPositioningElement {
+}
diff --git a/elemental/src/elemental/svg/SVGTests.java b/elemental/src/elemental/svg/SVGTests.java
new file mode 100644
index 0000000..be76cc5
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTests.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Interface <code>SVGTests</code> defines an interface which applies to all elements which have attributes 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/requiredFeatures">requiredFeatures</a></code>, 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/requiredExtensions" class="new">requiredExtensions</a></code> and 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/systemLanguage" class="new">systemLanguage</a></code>.
+  */
+public interface SVGTests {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/requiredExtensions" class="new">requiredExtensions</a></code> on the given element.
+    */
+  SVGStringList getRequiredExtensions();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/requiredFeatures">requiredFeatures</a></code> on the given element.
+    */
+  SVGStringList getRequiredFeatures();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/systemLanguage" class="new">systemLanguage</a></code> on the given element.
+    */
+  SVGStringList getSystemLanguage();
+
+
+  /**
+    * Returns true if the browser supports the given extension, specified by a URI.
+    */
+  boolean hasExtension(String extension);
+}
diff --git a/elemental/src/elemental/svg/SVGTextContentElement.java b/elemental/src/elemental/svg/SVGTextContentElement.java
new file mode 100644
index 0000000..2b2aa6b
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTextContentElement.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGTextContentElement extends SVGElement, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
+
+    static final int LENGTHADJUST_SPACING = 1;
+
+    static final int LENGTHADJUST_SPACINGANDGLYPHS = 2;
+
+    static final int LENGTHADJUST_UNKNOWN = 0;
+
+  SVGAnimatedEnumeration getLengthAdjust();
+
+  SVGAnimatedLength getTextLength();
+
+  int getCharNumAtPosition(SVGPoint point);
+
+  float getComputedTextLength();
+
+  SVGPoint getEndPositionOfChar(int offset);
+
+  SVGRect getExtentOfChar(int offset);
+
+  int getNumberOfChars();
+
+  float getRotationOfChar(int offset);
+
+  SVGPoint getStartPositionOfChar(int offset);
+
+  float getSubStringLength(int offset, int length);
+
+  void selectSubString(int offset, int length);
+}
diff --git a/elemental/src/elemental/svg/SVGTextElement.java b/elemental/src/elemental/svg/SVGTextElement.java
new file mode 100644
index 0000000..c3982cc
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTextElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGTextElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/text">&lt;text&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGTextElement extends SVGTextPositioningElement, SVGTransformable {
+}
diff --git a/elemental/src/elemental/svg/SVGTextPathElement.java b/elemental/src/elemental/svg/SVGTextPathElement.java
new file mode 100644
index 0000000..3ff7643
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTextPathElement.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * In addition to text drawn in a straight line, SVG also includes the ability to place text along the shape of a <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/path">&lt;path&gt;</a></code>
+ element. To specify that a block of text is to be rendered along the shape of a <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/path">&lt;path&gt;</a></code>
+, include the given text within a <code>textPath</code> element which includes an <code>xlink:href</code> attribute with a reference to a <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/path">&lt;path&gt;</a></code>
+ element.
+  */
+public interface SVGTextPathElement extends SVGTextContentElement, SVGURIReference {
+
+    static final int TEXTPATH_METHODTYPE_ALIGN = 1;
+
+    static final int TEXTPATH_METHODTYPE_STRETCH = 2;
+
+    static final int TEXTPATH_METHODTYPE_UNKNOWN = 0;
+
+    static final int TEXTPATH_SPACINGTYPE_AUTO = 1;
+
+    static final int TEXTPATH_SPACINGTYPE_EXACT = 2;
+
+    static final int TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
+
+  SVGAnimatedEnumeration getMethod();
+
+  SVGAnimatedEnumeration getSpacing();
+
+  SVGAnimatedLength getStartOffset();
+}
diff --git a/elemental/src/elemental/svg/SVGTextPositioningElement.java b/elemental/src/elemental/svg/SVGTextPositioningElement.java
new file mode 100644
index 0000000..b4b73e9
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTextPositioningElement.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGTextPositioningElement</code> interface is inherited by text-related interfaces: <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGTextElement">SVGTextElement</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGTSpanElement">SVGTSpanElement</a></code>
+, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGTRefElement">SVGTRefElement</a></code>
+ and <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGAltGlyphElement" class="new">SVGAltGlyphElement</a></code>
+.
+  */
+public interface SVGTextPositioningElement extends SVGTextContentElement {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/dx" class="new">dx</a></code> on the given element.
+    */
+  SVGAnimatedLengthList getDx();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/dy" class="new">dy</a></code> on the given element.
+    */
+  SVGAnimatedLengthList getDy();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/rotate" class="new">rotate</a></code> on the given element.
+    */
+  SVGAnimatedNumberList getRotate();
+
+  SVGAnimatedLengthList getX();
+
+  SVGAnimatedLengthList getY();
+}
diff --git a/elemental/src/elemental/svg/SVGTitleElement.java b/elemental/src/elemental/svg/SVGTitleElement.java
new file mode 100644
index 0000000..1fa274a
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTitleElement.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGTitleElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/title">&lt;title&gt;</a></code>
+ element.
+  */
+public interface SVGTitleElement extends SVGElement, SVGLangSpace, SVGStylable {
+}
diff --git a/elemental/src/elemental/svg/SVGTransform.java b/elemental/src/elemental/svg/SVGTransform.java
new file mode 100644
index 0000000..f3b8d05
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTransform.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><code>SVGTransform</code> is the interface for one of the component transformations within an <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGTransformList">SVGTransformList</a></code>
+; thus, an <code>SVGTransform</code> object corresponds to a single component (e.g., <code>scale(…)</code> or <code>matrix(…)</code>) within a 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/transform">transform</a></code> attribute.</p>
+<p>An <code>SVGTransform</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+  */
+public interface SVGTransform {
+
+  /**
+    * A <code>matrix(…)</code> transformation
+    */
+
+    static final int SVG_TRANSFORM_MATRIX = 1;
+
+    static final int SVG_TRANSFORM_ROTATE = 4;
+
+  /**
+    * A <code>scale(…)</code> transformation
+    */
+
+    static final int SVG_TRANSFORM_SCALE = 3;
+
+    static final int SVG_TRANSFORM_SKEWX = 5;
+
+    static final int SVG_TRANSFORM_SKEWY = 6;
+
+  /**
+    * A <code>translate(…)</code> transformation
+    */
+
+    static final int SVG_TRANSFORM_TRANSLATE = 2;
+
+  /**
+    * The unit type is not one of predefined unit types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type.
+    */
+
+    static final int SVG_TRANSFORM_UNKNOWN = 0;
+
+
+  /**
+    * A convenience attribute for <code>SVG_TRANSFORM_ROTATE</code>, <code>SVG_TRANSFORM_SKEWX</code> and <code>SVG_TRANSFORM_SKEWY</code>. It holds the angle that was specified.<br> <br> For <code>SVG_TRANSFORM_MATRIX</code>, <code>SVG_TRANSFORM_TRANSLATE</code> and <code>SVG_TRANSFORM_SCALE</code>, <code>angle</code> will be zero.
+    */
+  float getAngle();
+
+
+  /**
+    * <p>The matrix that represents this transformation. The matrix object is live, meaning that any changes made to the <code>SVGTransform</code> object are immediately reflected in the matrix object and vice versa. In case the matrix object is changed directly (i.e., without using the methods on the <code>SVGTransform</code> interface itself) then the type of the <code>SVGTransform</code> changes to <code>SVG_TRANSFORM_MATRIX</code>.</p> <ul> <li>For <code>SVG_TRANSFORM_MATRIX</code>, the matrix contains the a, b, c, d, e, f values supplied by the user.</li> <li>For <code>SVG_TRANSFORM_TRANSLATE</code>, e and f represent the translation amounts (a=1, b=0, c=0 and d=1).</li> <li>For <code>SVG_TRANSFORM_SCALE</code>, a and d represent the scale amounts (b=0, c=0, e=0 and f=0).</li> <li>For <code>SVG_TRANSFORM_SKEWX</code> and <code>SVG_TRANSFORM_SKEWY</code>, a, b, c and d represent the matrix which will result in the given skew (e=0 and f=0).</li> <li>For <code>SVG_TRANSFORM_ROTATE</code>, a, b, c, d, e and f together represent the matrix which will result in the given rotation. When the rotation is around the center point (0, 0), e and f will be zero.</li> </ul>
+    */
+  SVGMatrix getMatrix();
+
+
+  /**
+    * The type of the value as specified by one of the SVG_TRANSFORM_* constants defined on this interface.
+    */
+  int getType();
+
+
+  /**
+    * <p>Sets the transform type to <code>SVG_TRANSFORM_ROTATE</code>, with parameter <code>angle</code> defining the rotation angle and parameters <code>cx</code> and <code>cy</code> defining the optional center of rotation.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void setRotate(float angle, float cx, float cy);
+
+
+  /**
+    * <p>Sets the transform type to <code>SVG_TRANSFORM_SCALE</code>, with parameters <code>sx</code> and <code>sy</code> defining the scale amounts.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void setScale(float sx, float sy);
+
+
+  /**
+    * <p>Sets the transform type to <code>SVG_TRANSFORM_SKEWX</code>, with parameter <code>angle</code> defining the amount of skew.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void setSkewX(float angle);
+
+
+  /**
+    * <p>Sets the transform type to <code>SVG_TRANSFORM_SKEWY</code>, with parameter <code>angle</code> defining the amount of skew.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void setSkewY(float angle);
+
+
+  /**
+    * <p>Sets the transform type to <code>SVG_TRANSFORM_TRANSLATE</code>, with parameters <code>tx</code> and <code>ty</code> defining the translation amounts.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when attempting to modify a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void setTranslate(float tx, float ty);
+}
diff --git a/elemental/src/elemental/svg/SVGTransformList.java b/elemental/src/elemental/svg/SVGTransformList.java
new file mode 100644
index 0000000..cfb51c7
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTransformList.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGTransformList</code> defines a list of <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/SVGTransform">SVGTransform</a></code>
+ objects.</p>
+<p>An <code>SVGTransformList</code> object can be designated as read only, which means that attempts to modify the object will result in an exception being thrown.</p>
+<div class="geckoVersionNote"> <p>
+</p><div class="geckoVersionHeading">Gecko 9.0 note<div>(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+</div></div>
+<p></p> <p>Starting in Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+,the <code>SVGTransformList</code> DOM interface is now indexable and can be accessed like Arrays</p>
+</div>
+  */
+public interface SVGTransformList {
+
+  int getNumberOfItems();
+
+
+  /**
+    * <p>Inserts a new item at the end of the list. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGTransform appendItem(SVGTransform item);
+
+
+  /**
+    * <p>Clears all existing current items from the list, with the result being an empty list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  void clear();
+
+  SVGTransform consolidate();
+
+  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
+
+
+  /**
+    * <p>Returns the specified item from the list. The returned item is the item itself and not a copy. Any changes made to the item are immediately reflected in the list. The first item is number&nbsp;0.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGTransform getItem(int index);
+
+
+  /**
+    * <p>Clears all existing current items from the list and re-initializes the list to hold the single item specified by the parameter. If the inserted item is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. The return value is the item inserted into the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGTransform initialize(SVGTransform item);
+
+
+  /**
+    * <p>Inserts a new item into the list at the specified position. The first item is number 0. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to insert before is before the removal of the item. If the <code>index</code> is equal to 0, then the new item is inserted at the front of the list. If the index is greater than or equal to <code>numberOfItems</code>, then the new item is appended to the end of the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> </ul>
+    */
+  SVGTransform insertItemBefore(SVGTransform item, int index);
+
+
+  /**
+    * <p>Removes an existing item from the list.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>
+    */
+  SVGTransform removeItem(int index);
+
+
+  /**
+    * <p>Replaces an existing item in the list with a new item. If <code>newItem</code> is already in a list, it is removed from its previous list before it is inserted into this list. The inserted item is the item itself and not a copy. If the item is already in this list, note that the index of the item to replace is before the removal of the item.</p> <p><strong>Exceptions:</strong></p> <ul> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>NO_MODIFICATION_ALLOWED_ERR</code> is raised when the list corresponds to a read only attribute or when the object itself is read only.</li> <li>a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DOMException">DOMException</a></code>
+ with code <code>INDEX_SIZE_ERR</code> is raised if the index number is greater than or equal to <code>numberOfItems</code>.</li> </ul>
+    */
+  SVGTransform replaceItem(SVGTransform item, int index);
+}
diff --git a/elemental/src/elemental/svg/SVGTransformable.java b/elemental/src/elemental/svg/SVGTransformable.java
new file mode 100644
index 0000000..9be9c51
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGTransformable.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Interface <code>SVGTransformable</code> contains properties and methods that apply to all elements which have attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/transform">transform</a></code>.
+  */
+public interface SVGTransformable extends SVGLocatable {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/transform">transform</a></code> on the given element.
+    */
+  SVGAnimatedTransformList getAnimatedTransform();
+}
diff --git a/elemental/src/elemental/svg/SVGURIReference.java b/elemental/src/elemental/svg/SVGURIReference.java
new file mode 100644
index 0000000..b01ea6d
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGURIReference.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGURIReference {
+
+  SVGAnimatedString getAnimatedHref();
+}
diff --git a/elemental/src/elemental/svg/SVGUnitTypes.java b/elemental/src/elemental/svg/SVGUnitTypes.java
new file mode 100644
index 0000000..5bc83ee
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGUnitTypes.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGUnitTypes {
+
+    static final int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
+
+    static final int SVG_UNIT_TYPE_UNKNOWN = 0;
+
+    static final int SVG_UNIT_TYPE_USERSPACEONUSE = 1;
+}
diff --git a/elemental/src/elemental/svg/SVGUseElement.java b/elemental/src/elemental/svg/SVGUseElement.java
new file mode 100644
index 0000000..11c90f1
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGUseElement.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGUseElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/use">&lt;use&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGUseElement extends SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGTransformable {
+
+
+  /**
+    * If the 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/xlink%3Ahref">xlink:href</a></code> attribute is being animated, contains the current animated root of the instance tree. If the 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/xlink%3Ahref">xlink:href</a></code> attribute is not currently being animated, contains the same value as <code>instanceRoot</code>. See description of <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGElementInstance" class="new">SVGElementInstance</a></code>
+ to learn more about the instance tree.
+    */
+  SVGElementInstance getAnimatedInstanceRoot();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/height">height</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/use">&lt;use&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedHeight();
+
+
+  /**
+    * The root of the instance tree. See description of <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/SVGElementInstance" class="new">SVGElementInstance</a></code>
+ to learn more about the instance tree.
+    */
+  SVGElementInstance getInstanceRoot();
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Attribute/width">width</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/use">&lt;use&gt;</a></code>
+ element.
+    */
+  SVGAnimatedLength getAnimatedWidth();
+
+  SVGAnimatedLength getX();
+
+  SVGAnimatedLength getY();
+}
diff --git a/elemental/src/elemental/svg/SVGVKernElement.java b/elemental/src/elemental/svg/SVGVKernElement.java
new file mode 100644
index 0000000..a75e0f5
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGVKernElement.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>SVGVKernElement</code> interface corresponds to the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/vkern">&lt;vkern&gt;</a></code>
+ elements.</p>
+<p>Object-oriented access to the attributes of the <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/vkern">&lt;vkern&gt;</a></code>
+ element via the SVG DOM is not possible.</p>
+  */
+public interface SVGVKernElement extends SVGElement {
+}
diff --git a/elemental/src/elemental/svg/SVGViewElement.java b/elemental/src/elemental/svg/SVGViewElement.java
new file mode 100644
index 0000000..13156d3
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGViewElement.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * The <code>SVGViewElement</code> interface provides access to the properties of <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/view">&lt;view&gt;</a></code>
+ elements, as well as methods to manipulate them.
+  */
+public interface SVGViewElement extends SVGElement, SVGExternalResourcesRequired, SVGFitToViewBox, SVGZoomAndPan {
+
+
+  /**
+    * Corresponds to attribute 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewTarget" class="new">viewTarget</a></code> on the given <code><a rel="custom" href="https://developer.mozilla.org/en/SVG/Element/view">&lt;view&gt;</a></code>
+ element. A list of DOMString values which contain the names listed in the 
+<code><a rel="internal" href="https://developer.mozilla.org/en/SVG/Attribute/viewTarget" class="new">viewTarget</a></code> attribute. Each of the DOMString values can be associated with the corresponding element using the getElementById() method call.
+    */
+  SVGStringList getViewTarget();
+}
diff --git a/elemental/src/elemental/svg/SVGViewSpec.java b/elemental/src/elemental/svg/SVGViewSpec.java
new file mode 100644
index 0000000..0e998a7
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGViewSpec.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGViewSpec {
+
+  SVGAnimatedPreserveAspectRatio getPreserveAspectRatio();
+
+  String getPreserveAspectRatioString();
+
+  SVGTransformList getTransform();
+
+  String getTransformString();
+
+  SVGAnimatedRect getViewBox();
+
+  String getViewBoxString();
+
+  SVGElement getViewTarget();
+
+  String getViewTargetString();
+
+  int getZoomAndPan();
+
+  void setZoomAndPan(int arg);
+}
diff --git a/elemental/src/elemental/svg/SVGZoomAndPan.java b/elemental/src/elemental/svg/SVGZoomAndPan.java
new file mode 100644
index 0000000..0cd6b26
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGZoomAndPan.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGZoomAndPan {
+
+    static final int SVG_ZOOMANDPAN_DISABLE = 1;
+
+    static final int SVG_ZOOMANDPAN_MAGNIFY = 2;
+
+    static final int SVG_ZOOMANDPAN_UNKNOWN = 0;
+
+  int getZoomAndPan();
+
+  void setZoomAndPan(int arg);
+}
diff --git a/elemental/src/elemental/svg/SVGZoomEvent.java b/elemental/src/elemental/svg/SVGZoomEvent.java
new file mode 100644
index 0000000..0fe14a2
--- /dev/null
+++ b/elemental/src/elemental/svg/SVGZoomEvent.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.svg;
+import elemental.events.UIEvent;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface SVGZoomEvent extends UIEvent {
+
+  float getNewScale();
+
+  SVGPoint getNewTranslate();
+
+  float getPreviousScale();
+
+  SVGPoint getPreviousTranslate();
+
+  SVGRect getZoomRectScreen();
+}
diff --git a/elemental/src/elemental/traversal/NodeFilter.java b/elemental/src/elemental/traversal/NodeFilter.java
new file mode 100644
index 0000000..ab1515f
--- /dev/null
+++ b/elemental/src/elemental/traversal/NodeFilter.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.traversal;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface NodeFilter {
+
+  /**
+    * Value returned by the <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/NodeFilter.acceptNode" class="new">NodeFilter.acceptNode()</a></code>
+ method when a node should be accepted.
+    */
+
+    static final short FILTER_ACCEPT = 1;
+
+  /**
+    * Value to be returned by the <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/NodeFilter.acceptNode" class="new">NodeFilter.acceptNode()</a></code>
+ method when a node should be rejected. The children of rejected nodes are not visited by the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/NodeIterator">NodeIterator</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TreeWalker">TreeWalker</a></code>
+ object; this value is treated as "skip this node and all its children".
+    */
+
+    static final short FILTER_REJECT = 2;
+
+  /**
+    * Value to be returned by <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/DOM/NodeFilter.acceptNode" class="new">NodeFilter.acceptNode()</a></code>
+ for nodes to be skipped by the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/NodeIterator">NodeIterator</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TreeWalker">TreeWalker</a></code>
+ object. The children of skipped nodes are still considered. This is treated as "skip this node but not its children".
+    */
+
+    static final short FILTER_SKIP = 3;
+
+  /**
+    * Shows all nodes.
+    */
+
+    static final int SHOW_ALL = 0xFFFFFFFF;
+
+  /**
+    * Shows attribute <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Attr">Attr</a></code>
+ nodes. This is meaningful only when creating a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/NodeIterator">NodeIterator</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TreeWalker">TreeWalker</a></code>
+ with an <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Attr">Attr</a></code>
+ node as its root; in this case, it means that the attribute node will appear in the first position of the iteration or traversal. Since attributes are never children of other nodes, they do not appear when traversing over the document tree.
+    */
+
+    static final int SHOW_ATTRIBUTE = 0x00000002;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/CDATASection">CDATASection</a></code>
+&nbsp;nodes.
+    */
+
+    static final int SHOW_CDATA_SECTION = 0x00000008;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Comment">Comment</a></code>
+&nbsp;nodes.
+    */
+
+    static final int SHOW_COMMENT = 0x00000080;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Document">Document</a></code>
+&nbsp;nodes.
+    */
+
+    static final int SHOW_DOCUMENT = 0x00000100;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DocumentFragment">DocumentFragment</a></code>
+&nbsp;nodes.
+    */
+
+    static final int SHOW_DOCUMENT_FRAGMENT = 0x00000400;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/DocumentType">DocumentType</a></code>
+&nbsp;nodes.
+    */
+
+    static final int SHOW_DOCUMENT_TYPE = 0x00000200;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Element">Element</a></code>
+&nbsp;nodes.
+    */
+
+    static final int SHOW_ELEMENT = 0x00000001;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Entity">Entity</a></code>
+&nbsp;nodes. This is meaningful only when creating a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/NodeIterator">NodeIterator</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TreeWalker">TreeWalker</a></code>
+ with an <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Entity">Entity</a></code>
+ node as its root; in this case, it means that the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Entity">Entity</a></code>
+ node will appear in the first position of the traversal. Since entities are not part of the document tree, they do not appear when traversing over the document tree.
+    */
+
+    static final int SHOW_ENTITY = 0x00000020;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/EntityReference">EntityReference</a></code>
+&nbsp;nodes.
+    */
+
+    static final int SHOW_ENTITY_REFERENCE = 0x00000010;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Notation">Notation</a></code>
+ nodes. This is meaningful only when creating a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/NodeIterator">NodeIterator</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TreeWalker">TreeWalker</a></code>
+ with a <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Notation">Notation</a></code>
+ node as its root; in this case, it means that the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Notation">Notation</a></code>
+ node will appear in the first position of the traversal. Since entities are not part of the document tree, they do not appear when traversing over the document tree.
+    */
+
+    static final int SHOW_NOTATION = 0x00000800;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/ProcessingInstruction">ProcessingInstruction</a></code>
+&nbsp;nodes.
+    */
+
+    static final int SHOW_PROCESSING_INSTRUCTION = 0x00000040;
+
+  /**
+    * Shows <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Text">Text</a></code>
+&nbsp;nodes.
+    */
+
+    static final int SHOW_TEXT = 0x00000004;
+
+
+  /**
+    * The accept node method used by the filter is supplied as an object property when constructing the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/NodeIterator">NodeIterator</a></code>
+ or <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/TreeWalker">TreeWalker</a></code>
+.
+    */
+  short acceptNode(Node n);
+}
diff --git a/elemental/src/elemental/traversal/NodeIterator.java b/elemental/src/elemental/traversal/NodeIterator.java
new file mode 100644
index 0000000..67b9f90
--- /dev/null
+++ b/elemental/src/elemental/traversal/NodeIterator.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.traversal;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface NodeIterator {
+
+  boolean isExpandEntityReferences();
+
+  NodeFilter getFilter();
+
+  boolean isPointerBeforeReferenceNode();
+
+  Node getReferenceNode();
+
+  Node getRoot();
+
+  int getWhatToShow();
+
+  void detach();
+
+  Node nextNode();
+
+  Node previousNode();
+}
diff --git a/elemental/src/elemental/traversal/TreeWalker.java b/elemental/src/elemental/traversal/TreeWalker.java
new file mode 100644
index 0000000..e67c991
--- /dev/null
+++ b/elemental/src/elemental/traversal/TreeWalker.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.traversal;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>The <code>TreeWalker</code> object represents the nodes of a document subtree and a position within them.</p>
+<p>A TreeWalker can be created using the <code><a title="en/DOM/document.createTreeWalker" rel="internal" href="https://developer.mozilla.org/en/DOM/document.createTreeWalker">createTreeWalker()</a></code> method of the <code><a title="en/DOM/document" rel="internal" href="https://developer.mozilla.org/en/DOM/document">document</a></code> object.</p>
+  */
+public interface TreeWalker {
+
+  Node getCurrentNode();
+
+  void setCurrentNode(Node arg);
+
+  boolean isExpandEntityReferences();
+
+  NodeFilter getFilter();
+
+  Node getRoot();
+
+  int getWhatToShow();
+
+  Node firstChild();
+
+  Node lastChild();
+
+  Node nextNode();
+
+  Node nextSibling();
+
+  Node parentNode();
+
+  Node previousNode();
+
+  Node previousSibling();
+}
diff --git a/elemental/src/elemental/util/ArrayOf.java b/elemental/src/elemental/util/ArrayOf.java
new file mode 100644
index 0000000..b5a4e43
--- /dev/null
+++ b/elemental/src/elemental/util/ArrayOf.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight array of homogeneous Object values.
+ *
+ * @param <T>
+ *
+ * @see elemental.js.util.JsArrayOf
+ */
+public interface ArrayOf<T> {
+
+  /**
+   * Returns a new array that is the concatenation of this array and <code>
+   * values</code>. This method does not mutate the current array.
+   */
+  ArrayOf<T> concat(ArrayOf<T> values);
+
+  /**
+   * Indicates whether the array contains the specified value.
+   */
+  boolean contains(T value);
+
+  /**
+   * Gets the value at a given index.
+   *
+   * @param index the index to be retrieved
+   * @return the value at the given index
+   */
+  T get(int index);
+
+  /**
+   * Returns the index of the specified value or <code>-1</code> if the value is
+   * not found.
+   */
+  int indexOf(T value);
+
+  /**
+   * Inserts a new element into the array at the specified index.
+   *
+   *  Note: If index >= the length of the array, the element will be appended to
+   * the end. Also if the index is negative, the element will be inserted
+   * starting from the end of the array.
+   */
+  void insert(int index, T value);
+
+  /**
+   * Returns true if the length of the array is zero.
+   *
+   * @return true when length is zero
+   */
+  boolean isEmpty();
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join();
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join(String separator);
+
+  /**
+   * Gets the length of the array.
+   *
+   * @return the array length
+   */
+  int length();
+
+  /**
+   * Returns the last value of the array;
+   *
+   * @return the last value
+   */
+  T peek();
+
+  /**
+   * Remove and return the element from the end of the array.
+   *
+   * @return the removed value
+   */
+  T pop();
+
+  /**
+   * Pushes the given value onto the end of the array.
+   */
+  void push(T value);
+
+  /**
+   * Searches for the specified value in the array and removes the first
+   * occurrence if found.
+   */
+  void remove(T value);
+
+  /**
+   * Removes the element at the specified index.
+   */
+  void removeByIndex(int index);
+
+  /**
+   * sets the value value at a given index.
+   *
+   *  if the index is out of bounds, the value will still be set. the array's
+   * length will be updated to encompass the bounds implied by the added value.
+   *
+   * @param index the index to be set
+   * @param value the value to be stored
+   */
+  void set(int index, T value);
+
+  /**
+   * Reset the length of the array.
+   *
+   * @param length the new length of the array
+   */
+  void setLength(int length);
+
+  /**
+   * Shifts the first value off the array.
+   *
+   * @return the shifted value
+   */
+  T shift();
+
+  /**
+   * Sorts the contents of the Array based on the {@link CanCompare}.
+   *
+   * @param comparator
+   */
+  void sort(CanCompare<T> comparator);
+
+  /**
+   * Removes the specified number of elements starting at index and returns the
+   * removed elements.
+   */
+  ArrayOf<T> splice(int index, int count);
+
+  /**
+   * Shifts a value onto the beginning of the array.
+   *
+   * @param value the value to the stored
+   */
+  void unshift(T value);
+}
diff --git a/elemental/src/elemental/util/ArrayOfBoolean.java b/elemental/src/elemental/util/ArrayOfBoolean.java
new file mode 100644
index 0000000..1dd5c81
--- /dev/null
+++ b/elemental/src/elemental/util/ArrayOfBoolean.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight array of booleans.
+ *
+ * @see elemental.js.util.JsArrayOfBoolean
+ */
+public interface ArrayOfBoolean {
+  /**
+   * Returns a new array that is the concatenation of this array and <code>
+   * values</code>. This method does not mutate the current array.
+   */
+  ArrayOfBoolean concat(ArrayOfBoolean values);
+
+  /**
+   * Indicates whether the array contains the specified value.
+   */
+  boolean contains(boolean value);
+
+  /**
+   * Gets the value at a given index.
+   *
+   * @param index the index to be retrieved
+   * @return the value at the given index
+   */
+  boolean get(int index);
+
+  /**
+   * Returns the index of the specified value or <code>-1</code> if the value is
+   * not found.
+   */
+  int indexOf(boolean value);
+
+  /**
+   * Inserts a new element into the array at the specified index.
+   *
+   * Note: If index >= the length of the array, the element will be appended to
+   * the end. Also if the index is negative, the element will be inserted
+   * starting from the end of the array.
+   */  
+  void insert(int index, boolean value);
+
+  /**
+   * Returns true if the length of the array is zero.
+   *
+   * @return true when length is zero
+   */
+  boolean isEmpty();
+
+  /**
+   * Check that the specified <code>index</code> has been initialized to a valid
+   * value.
+   */
+  boolean isSet(int index);
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join();
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join(String separator);
+
+  /**
+   * Gets the length of the array.
+   *
+   * @return the array length
+   */
+  int length();
+
+  /**
+   * Returns the last value of the array;
+   *
+   * @return the last value
+   */
+  boolean peek();
+
+  /**
+   * Remove and return the element from the end of the array.
+   *
+   * @return the removed value
+   */
+  boolean pop();
+
+  /**
+   * Pushes the given boolean onto the end of the array.
+   */
+  void push(boolean value);
+
+  /**
+   * Searches for the specified value in the array and removes the first
+   * occurrence if found.
+   */
+  void remove(boolean value);
+
+  /**
+   * Removes the element at the specified index.
+   */
+  void removeByIndex(int index);
+
+  /**
+   * Sets the value value at a given index.
+   *
+   *  If the index is out of bounds, the value will still be set. The array's
+   * length will be updated to encompass the bounds implied by the added value.
+   *
+   * @param index the index to be set
+   * @param value the value to be stored
+   */
+  void set(int index, boolean value);
+
+  /**
+   * Reset the length of the array.
+   *
+   * @param length the new length of the array
+   */
+  void setLength(int length);
+
+  /**
+   * Shifts the first value off the array.
+   *
+   * @return the shifted value
+   */
+  boolean shift();
+
+  /**
+   * Removes the specified number of elements starting at index and returns the
+   * removed elements.
+   */
+  ArrayOfBoolean splice(int index, int count);
+
+  /**
+   * Shifts a value onto the beginning of the array.
+   *
+   * @param value the value to the stored
+   */
+  void unshift(boolean value);
+}
diff --git a/elemental/src/elemental/util/ArrayOfInt.java b/elemental/src/elemental/util/ArrayOfInt.java
new file mode 100644
index 0000000..cb4dbbf
--- /dev/null
+++ b/elemental/src/elemental/util/ArrayOfInt.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight array of integers.
+ *
+ * @see elemental.js.util.JsArrayOfInt
+ */
+public interface ArrayOfInt {
+
+  /**
+   * Returns a new array that is the concatenation of this array and <code>
+   * values</code>. This method does not mutate the current array.
+   */
+  ArrayOfInt concat(ArrayOfInt values);
+
+  /**
+   * Indicates whether the array contains the specified value.
+   */
+  boolean contains(int value);
+
+  /**
+   * Gets the value at a given index.
+   *
+   *  If no value exists at the given index, a type-conversion error will occur
+   * in hosted mode and unpredictable behavior may occur in web mode. If the
+   * numeric value returned is non-integral, it will cause a warning in hosted
+   * mode, and may affect the results of mathematical expressions.
+   *
+   * @param index the index to be retrieved
+   * @return the value at the given index
+   */
+  int get(int index);
+
+  /**
+   * Returns the index of the specified value or <code>-1</code> if the value is
+   * not found.
+   */
+  int indexOf(int value);
+
+  /**
+   * Inserts a new element into the array at the specified index.
+   *
+   *  Note: If index >= the length of the array, the element will be appended to
+   * the end. Also if the index is negative, the element will be inserted
+   * starting from the end of the array.
+   */
+  void insert(int index, int value);
+
+  /**
+   * Returns true if the length of the array is zero.
+   *
+   * @return true when length is zero
+   */
+  boolean isEmpty();
+
+  /**
+   * Check that the specified <code>index</code> has been initialized to a valid
+   * value.
+   */
+  boolean isSet(int index);
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join();
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join(String separator);
+
+  /**
+   * Gets the length of the array.
+   *
+   * @return the array length
+   */
+  int length();
+
+  /**
+   * Returns the last value of the array;
+   *
+   * @return the last value
+   */
+  int peek();
+
+  /**
+   * Remove and return the element from the end of the array.
+   *
+   * @return the removed value
+   */
+  int pop();
+
+  /**
+   * Pushes the given integer onto the end of the array.
+   */
+  void push(int value);
+
+  /**
+   * Searches for the specified value in the array and removes the first
+   * occurrence if found.
+   */
+  void remove(int value);
+
+  /**
+   * Removes the element at the specified index.
+   */
+  void removeByIndex(int index);
+
+  /**
+   * Sets the value value at a given index.
+   *
+   *  If the index is out of bounds, the value will still be set. The array's
+   * length will be updated to encompass the bounds implied by the added value.
+   *
+   * @param index the index to be set
+   * @param value the value to be stored
+   */
+  void set(int index, int value);
+
+  /**
+   * Reset the length of the array.
+   *
+   * @param length the new length of the array
+   */
+  void setLength(int length);
+
+  /**
+   * Shifts the first value off the array.
+   *
+   * @return the shifted value
+   */
+  int shift();
+
+  /**
+   * Sorts the contents of the array in ascending order.
+   */
+  void sort();
+
+  /**
+   * Sorts the contents of the Array based on the {@link CanCompareInt}.
+   *
+   * @param comparator
+   */
+  void sort(CanCompareInt comparator);
+
+  /**
+   * Removes the specified number of elements starting at index and returns the
+   * removed elements.
+   */
+  ArrayOfInt splice(int index, int count);
+
+  /**
+   * Shifts a value onto the beginning of the array.
+   *
+   * @param value the value to the stored
+   */
+  void unshift(int value);
+}
diff --git a/elemental/src/elemental/util/ArrayOfNumber.java b/elemental/src/elemental/util/ArrayOfNumber.java
new file mode 100644
index 0000000..fc25a54
--- /dev/null
+++ b/elemental/src/elemental/util/ArrayOfNumber.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight array of numbers.
+ *
+ * @see elemental.js.util.JsArrayOfNumber
+ */
+public interface ArrayOfNumber {
+  /**
+   * Returns a new array that is the concatenation of this array and <code>
+   * values</code>. This method does not mutate the current array.
+   */
+  ArrayOfNumber concat(ArrayOfNumber values);
+
+  /**
+   * Gets the value at a given index.
+   *
+   *  If an undefined or non-numeric value exists at the given index, a
+   * type-conversion error will occur in hosted mode and unpredictable behavior
+   * may occur in web mode.
+   *
+   * @param index the index to be retrieved
+   * @return the value at the given index
+   */
+  double get(int index);
+
+  /**
+   * Inserts a new element into the array at the specified index.
+   *
+   * Note: If index >= the length of the array, the element will be appended to
+   * the end. Also if the index is negative, the element will be inserted
+   * starting from the end of the array.
+   */  
+  void insert(int index, double value);
+
+  /**
+   * Returns true if the length of the array is zero.
+   *
+   * @return true when length is zero
+   */
+  boolean isEmpty();
+
+  /**
+   * Check that the specified <code>index</code> has been initialized to a valid
+   * value.
+   */
+  boolean isSet(int index);
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join();
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join(String separator);
+
+  /**
+   * Gets the length of the array.
+   *
+   * @return the array length
+   */
+  int length();
+
+  /**
+   * Returns the last value of the array;
+   *
+   * @return the last value
+   */
+  double peek();
+
+  /**
+   * Remove and return the element from the end of the array.
+   *
+   * @return the removed value
+   */
+  double pop();
+
+  /**
+   * Pushes the given number onto the end of the array.
+   */
+  void push(double value);
+
+  /**
+   * Removes the element at the specified index.
+   */
+  void removeByIndex(int index);
+
+  /**
+   * Sets the value value at a given index.
+   *
+   * If the index is out of bounds, the value will still be set. The array's
+   * length will be updated to encompass the bounds implied by the added value.
+   *
+   * @param index the index to be set
+   * @param value the value to be stored
+   */
+  void set(int index, double value);
+
+  /**
+   * Reset the length of the array.
+   *
+   * @param length the new length of the array
+   */
+  void setLength(int length);
+
+  /**
+   * Shifts the first value off the array.
+   *
+   * @return the shifted value
+   */
+  double shift();
+
+  /**
+   * Sorts the contents of the array in ascending order.
+   */
+  void sort();
+
+  /**
+   * Sorts the contents of the Array based on the {@link CanCompareNumber}.
+   *
+   * @param comparator
+   */
+  void sort(CanCompareNumber comparator);
+
+  /**
+   * Removes the specified number of elements starting at index and returns the
+   * removed elements.
+   */
+  ArrayOfNumber splice(int index, int count);
+
+  /**
+   * Shifts a value onto the beginning of the array.
+   *
+   * @param value the value to the stored
+   */
+  void unshift(double value);
+}
diff --git a/elemental/src/elemental/util/ArrayOfString.java b/elemental/src/elemental/util/ArrayOfString.java
new file mode 100644
index 0000000..a976b0b
--- /dev/null
+++ b/elemental/src/elemental/util/ArrayOfString.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight array of Strings.
+ * 
+ * @see elemental.js.util.JsArrayOfString
+ */
+public interface ArrayOfString {
+  /**
+   * Returns a new array that is the concatenation of this array and <code>
+   * values</code>. This method does not mutate the current array.
+   */
+  ArrayOfString concat(ArrayOfString values);
+
+  /**
+   * Indicates whether the array contains the specified value.
+   */
+  boolean contains(String value);
+
+  /**
+   * Gets the value at a given index.
+   * 
+   * @param index the index to be retrieved
+   * @return the value at the given index, or <code>null</code> if none exists
+   */
+  String get(int index);
+
+  /**
+   * Returns the index of the specified value or <code>-1</code> if the value is
+   * not found.
+   */
+  int indexOf(String value);
+
+  /**
+   * Inserts a new element into the array at the specified index.
+   *
+   * Note: If index >= the length of the array, the element will be appended to
+   * the end. Also if the index is negative, the element will be inserted
+   * starting from the end of the array.
+   */  
+  void insert(int index, String value);
+
+  /**
+   * Returns true if the length of the array is zero.
+   *
+   * @return true when length is zero
+   */
+  boolean isEmpty();
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join();
+
+  /**
+   * Convert each element of the array to a String and join them with a comma
+   * separator. The value returned from this method may vary between browsers
+   * based on how JavaScript values are converted into strings.
+   */
+  String join(String separator);
+
+  /**
+   * Gets the length of the array.
+   * 
+   * @return the array length
+   */
+  int length();
+
+  /**
+   * Returns the last value of the array;
+   *
+   * @return the last value
+   */
+  String peek();
+
+  /**
+   * Remove and return the element from the end of the array.
+   *
+   * @return the removed value
+   */
+  String pop();
+
+  /**
+   * Pushes the given value onto the end of the array.
+   */
+  void push(String value);
+
+  /**
+   * Searches for the specified value in the array and removes the first
+   * occurrence if found.
+   */
+  void remove(String value);
+
+  /**
+   * Removes the element at the specified index.
+   */
+  void removeByIndex(int index);
+
+  /**
+   * Sets the value value at a given index.
+   * 
+   * If the index is out of bounds, the value will still be set. The array's
+   * length will be updated to encompass the bounds implied by the added value.
+   * 
+   * @param index the index to be set
+   * @param value the value to be stored
+   */
+  void set(int index, String value);
+  
+  /**
+   * Reset the length of the array.
+   * 
+   * @param length the new length of the array
+   */
+  void setLength(int length);
+  
+  /**
+   * Shifts the first value off the array.
+   * 
+   * @return the shifted value
+   */
+  String shift();
+  
+  /**
+   * Sorts the contents of the array in ascending order.
+   */
+  void sort();
+
+  /**
+   * Sorts the contents of the Array based on the {@link CanCompareString}.
+   *
+   * @param comparator
+   */
+  void sort(CanCompareString comparator);
+
+  /**
+   * Removes the specified number of elements starting at index and returns the
+   * removed elements.
+   */
+  ArrayOfString splice(int index, int count);
+
+  /**
+   * Shifts a value onto the beginning of the array.
+   * 
+   * @param value the value to the stored
+   */
+  void unshift(String value);
+}
diff --git a/elemental/src/elemental/util/CanCompare.java b/elemental/src/elemental/util/CanCompare.java
new file mode 100644
index 0000000..4e18ec7
--- /dev/null
+++ b/elemental/src/elemental/util/CanCompare.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+import elemental.util.ArrayOf;
+
+/**
+ * A comparison function which imposes total ordering on a set of objects.
+ *
+ * @see ArrayOf#sort(CanCompare)
+ *
+ * @param <T>
+ */
+public interface CanCompare<T> {
+
+  /**
+   * Compares its two arguments for order.
+   * 
+   * @param a the first object to be compared
+   * @param b the second object to be compared
+   * @return a negative integer, zero, or a positive integer as the first
+   *         argument is less than, equal to, or greater than the second
+   */
+  int compare(T a, T b);
+}
diff --git a/elemental/src/elemental/util/CanCompareInt.java b/elemental/src/elemental/util/CanCompareInt.java
new file mode 100644
index 0000000..bc1a20b
--- /dev/null
+++ b/elemental/src/elemental/util/CanCompareInt.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+import elemental.util.ArrayOfInt;
+
+/**
+ * A comparison function which imposes total ordering on a set of integers.
+ *
+ * @see ArrayOfInt#sort(CanCompareInt)
+ */
+public interface CanCompareInt {
+
+  /**
+   * Compares its two arguments for order.
+   * 
+   * @param a the first integer to be compared
+   * @param b the second integer to be compared
+   * @return a negative integer, zero, or a positive integer as the first
+   *         argument is less than, equal to, or greater than the second
+   */
+  int compare(int a, int b);
+}
diff --git a/elemental/src/elemental/util/CanCompareNumber.java b/elemental/src/elemental/util/CanCompareNumber.java
new file mode 100644
index 0000000..81c7749
--- /dev/null
+++ b/elemental/src/elemental/util/CanCompareNumber.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+import elemental.util.ArrayOfNumber;
+
+/**
+ * A comparison function which imposes total ordering on a set of numbers.
+ *
+ * @see ArrayOfNumber#sort(CanCompareNumber)
+ */
+public interface CanCompareNumber {
+
+  /**
+   * Compares its two arguments for order.
+   * 
+   * @param a the first number to be compared
+   * @param b the second number to be compared
+   * @return a negative integer, zero, or a positive integer as the first
+   *         argument is less than, equal to, or greater than the second
+   */
+  int compare(double a, double b);
+}
diff --git a/elemental/src/elemental/util/CanCompareString.java b/elemental/src/elemental/util/CanCompareString.java
new file mode 100644
index 0000000..5c4f996
--- /dev/null
+++ b/elemental/src/elemental/util/CanCompareString.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+import elemental.util.ArrayOfString;
+
+/**
+ * A comparison function which imposes total ordering on a set of numbers.
+ *
+ * @see ArrayOfString#sort(CanCompareString)
+ */
+public interface CanCompareString {
+  
+  /**
+   * Compares its two arguments for order.
+   * 
+   * @param a the first string to be compared
+   * @param b the second string to be compared
+   * @return a negative integer, zero, or a positive integer as the first
+   *         argument is less than, equal to, or greater than the second
+   */
+  int compare(String a, String b);
+}
diff --git a/elemental/src/elemental/util/Collections.java b/elemental/src/elemental/util/Collections.java
new file mode 100644
index 0000000..738a42d
--- /dev/null
+++ b/elemental/src/elemental/util/Collections.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+import com.google.gwt.core.client.GWT;
+
+import elemental.util.impl.JreArrayOf;
+import elemental.util.impl.JreArrayOfBoolean;
+import elemental.util.impl.JreArrayOfInt;
+import elemental.util.impl.JreArrayOfNumber;
+import elemental.util.impl.JreArrayOfString;
+import elemental.util.impl.JreMapFromIntTo;
+import elemental.util.impl.JreMapFromIntToString;
+import elemental.util.impl.JreMapFromStringTo;
+import elemental.util.impl.JreMapFromStringToBoolean;
+import elemental.util.impl.JreMapFromStringToInt;
+import elemental.util.impl.JreMapFromStringToNumber;
+import elemental.util.impl.JreMapFromStringToString;
+
+/**
+ * Factory and utility methods for elemental collections.
+ */
+public class Collections {
+
+  /**
+   * Create an ArrayOf collection using the most efficient implementation strategy for the given
+   * client.
+   *
+   * @param <T>   the element type contained in the collection
+   * @return a JreArrayOf or JsArrayOf instance
+   */
+  public static <T> ArrayOf<T> arrayOf() {
+    return new JreArrayOf<T>();
+  }
+
+  /**
+   * Create an ArrayOfBoolean collection using the most efficient implementation strategy for the
+   * given client.
+   *
+   * @return a JreArrayOfBoolean or JsArrayOfBoolean instance
+   */
+  public static <T> ArrayOfBoolean arrayOfBoolean() {
+    return new JreArrayOfBoolean();
+  }
+
+  /**
+   * Create an ArrayOfInt collection using the most efficient implementation strategy for the given
+   * client.
+   *
+   * @return a JreArrayOfInt or JsArrayOfInt instance
+   */
+  public static <T> ArrayOfInt arrayOfInt() {
+    return new JreArrayOfInt();
+  }
+
+  /**
+   * Create an ArrayOfNumber collection using the most efficient implementation strategy for the
+   * given client.
+   *
+   * @return a JreArrayOfNumber or JsArrayOfNumber instance
+   */
+  public static <T> ArrayOfNumber arrayOfNumber() {
+    return new JreArrayOfNumber();
+  }
+
+  /**
+   * Create an ArrayOfString collection using the most efficient implementation strategy for the
+   * given client.
+   *
+   * @return a JreArrayOfString or JsArrayOfString instance
+   */
+  public static <T> ArrayOfString arrayOfString() {
+    return new JreArrayOfString();
+  }
+
+  /**
+   * Create a MapFromIntTo collection for a given type using the most efficient implementation
+   * strategy for the given client.
+   *
+   * @param <T>   the element type contained in the collection
+   * @return a JreMapFromIntTo or JsMapFromIntTo instance
+   */
+  public static <T> MapFromIntTo<T> mapFromIntTo() {
+    return new JreMapFromIntTo<T>();
+  }
+
+  /**
+   * Create a MapFromIntToString collection for a given type using the most efficient implementation
+   * strategy for the given client.
+   *
+   * @return a JreMapFromIntToString or JsMapFromIntToString instance
+   */
+  public static MapFromIntToString mapFromIntToString() {
+    return new JreMapFromIntToString();
+  }
+
+  /**
+   * Create a MapFromStringTo collection for a given type using the most efficient implementation
+   * strategy for the given client.
+   *
+   * @param <T>   the element type contained in the collection
+   * @return a JreMapFromStringTo or JsMapFromStringTo instance
+   */
+  public static <T> MapFromStringTo<T> mapFromStringTo() {
+    return new JreMapFromStringTo<T>();
+  }
+
+  /**
+   * Create a MapFromStringToBoolean collection for a given type using the most efficient
+   * implementation strategy for the given client.
+   *
+   * @return a JreMapFromStringToBoolean or JsMapFromStringToBoolean instance
+   */
+  public static MapFromStringToBoolean mapFromStringToBoolean() {
+    return new JreMapFromStringToBoolean();
+  }
+
+  /**
+   * Create a MapFromStringToInt collection for a given type using the most efficient implementation
+   * strategy for the given client.
+   *
+   * @return a JreMapFromStringToInt or JsMapFromStringToInt instance
+   */
+  public static MapFromStringToInt mapFromStringToInt() {
+    return new JreMapFromStringToInt();
+  }
+
+  /**
+   * Create a MapFromStringToNumber collection for a given type using the most efficient
+   * implementation strategy for the given client.
+   *
+   * @return a JreMapFromStringToNumber or JsMapFromStringToNumber instance
+   */
+  public static MapFromStringToNumber mapFromStringToNumber() {
+    return new JreMapFromStringToNumber();
+  }
+
+  /**
+   * Create a MapFromStringToString collection for a given type using the most efficient
+   * implementation strategy for the given client.
+   *
+   * @return a JreMapFromStringToString or JsMapFromStringToString instance
+   */
+  public static MapFromStringToString mapFromStringToString() {
+    return new JreMapFromStringToString();
+  }
+}
diff --git a/elemental/src/elemental/util/Indexable.java b/elemental/src/elemental/util/Indexable.java
new file mode 100644
index 0000000..b559677
--- /dev/null
+++ b/elemental/src/elemental/util/Indexable.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * Models any object which can act like a Javascript array, having length and a getter.
+ */
+// TODO (cromwellian) add generic when JSO bug in gwt-dev fixed
+public interface Indexable /* <T> */ {
+
+  /**
+   * Gets the value at a given index.
+   *
+   * @param index the index to be retrieved
+   * @return the value at the given index
+   */
+  Object /* T */ at(int index);
+
+  /**
+   * Gets the length of the array.
+   *
+   * @return the array length
+   */
+  int length();
+}
diff --git a/elemental/src/elemental/util/IndexableInt.java b/elemental/src/elemental/util/IndexableInt.java
new file mode 100644
index 0000000..ecb373d
--- /dev/null
+++ b/elemental/src/elemental/util/IndexableInt.java
@@ -0,0 +1,22 @@
+package elemental.util;
+
+/**
+ * Models any object which acts like a Javascript array of primitive integers.
+ */
+public interface IndexableInt extends IndexableNumber {
+
+  /**
+   * Gets the value at a given index.
+   *
+   * @param index the index to be retrieved
+   * @return the value at the given index
+   */
+  int intAt(int index);
+
+  /**
+   * Gets the length of the array.
+   *
+   * @return the array length
+   */
+  int length();
+}
diff --git a/elemental/src/elemental/util/IndexableNumber.java b/elemental/src/elemental/util/IndexableNumber.java
new file mode 100644
index 0000000..b419e65
--- /dev/null
+++ b/elemental/src/elemental/util/IndexableNumber.java
@@ -0,0 +1,22 @@
+package elemental.util;
+
+/**
+ * Models any object which acts like a Javascript array of primitive numbers..
+ */
+public interface IndexableNumber {
+
+  /**
+   * Gets the value at a given index.
+   *
+   * @param index the index to be retrieved
+   * @return the value at the given index
+   */
+  double numberAt(int index);
+
+  /**
+   * Gets the length of the array.
+   *
+   * @return the array length
+   */
+  int length();
+}
diff --git a/elemental/src/elemental/util/MapFromIntTo.java b/elemental/src/elemental/util/MapFromIntTo.java
new file mode 100644
index 0000000..e1e8620
--- /dev/null
+++ b/elemental/src/elemental/util/MapFromIntTo.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight map from <code>int</code> to objects.
+ * 
+ * @see elemental.js.util.JsMapFromIntTo
+ */
+public interface MapFromIntTo<V> {
+  /**
+   * Retrieves a value for the specified key.
+   */
+  V get(int key);
+
+  /**
+   * Indicates whether the map contains a value for the specified key.
+   */
+  boolean hasKey(int key);
+
+  /**
+   * The keys contained within this map.
+   * 
+   * This copies the keys into a new array.
+   */
+  ArrayOfInt keys();
+  
+  /**
+   * Associates a value to the specified key.
+   */  
+  void put(int key, V value);
+
+  /**
+   * Removes the value associated with the specified value, if one exists.
+   */
+  void remove(int key);
+  
+  /**
+   * The values contained in this map.
+   * 
+   * This copies the values into a new array.
+   */
+  ArrayOf<V> values();  
+}
diff --git a/elemental/src/elemental/util/MapFromIntToString.java b/elemental/src/elemental/util/MapFromIntToString.java
new file mode 100644
index 0000000..88365f1
--- /dev/null
+++ b/elemental/src/elemental/util/MapFromIntToString.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight map from <code>int</code> to {@link String}.
+ * 
+ * @see elemental.js.util.JsMapFromIntToString
+ */
+public interface MapFromIntToString {
+
+  /**
+   * Retrieves a value for the specified key.
+   */
+  String get(int key);
+
+  /**
+   * Indicates whether the map contains a value for the specified key.
+   */
+  boolean hasKey(int key);
+
+  /**
+   * The keys contained within this map.
+   * 
+   * This copies the keys into a new array.
+   */
+  ArrayOfInt keys();
+  
+  /**
+   * Associates a value to the specified key.
+   */  
+  void put(int key, String value);
+
+  /**
+   * Removes the value associated with the specified value, if one exists.
+   */
+  void remove(int key);
+  
+  /**
+   * The values contained in this map.
+   * 
+   * This copies the values into a new array.
+   */
+  ArrayOfString values();
+}
diff --git a/elemental/src/elemental/util/MapFromStringTo.java b/elemental/src/elemental/util/MapFromStringTo.java
new file mode 100644
index 0000000..3f3907e
--- /dev/null
+++ b/elemental/src/elemental/util/MapFromStringTo.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight map from {@link String} to any object type.
+ * 
+ * @param <V>
+ * 
+ * @see elemental.js.util.JsMapFromStringTo
+ */
+public interface MapFromStringTo<V> {
+
+  /**
+   * Retrieves a value for the specified key.
+   */  
+  V get(String key);
+
+  /**
+   * Indicates whether the map contains a value for the specified key.
+   */
+  boolean hasKey(String key);
+
+  /**
+   * The keys contained within this map.
+   * 
+   * This copies the keys into a new array.
+   */
+  ArrayOfString keys();
+
+  /**
+   * Associates a value to the specified key.
+   */
+  void put(String key, V value);
+
+  /**
+   * Removes the value associated with the specified value, if one exists.
+   */
+  void remove(String key);
+
+  /**
+   * The values contained in this map.
+   * 
+   * This copies the values into a new array.
+   */
+  ArrayOf<V> values();
+}
diff --git a/elemental/src/elemental/util/MapFromStringToBoolean.java b/elemental/src/elemental/util/MapFromStringToBoolean.java
new file mode 100644
index 0000000..46f307a
--- /dev/null
+++ b/elemental/src/elemental/util/MapFromStringToBoolean.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight map from {@link String} to <code>boolean</code> types.
+ *
+ * @see elemental.js.util.JsMapFromStringToBoolean
+ */
+public interface MapFromStringToBoolean {
+
+  /**
+   * Retrieves a value for the specified key.
+   */
+  boolean get(String key);
+
+  /**
+   * Indicates whether the map contains a value for the specified key.
+   */
+  boolean hasKey(String key);
+
+  /**
+   * The keys contained within this map.
+   *
+   * This copies the keys into a new array.
+   */
+  ArrayOfString keys();
+
+  /**
+   * Associates a value to the specified key.
+   */
+  void put(String key, boolean value);
+
+  /**
+   * Removes the value associated with the specified value, if one exists.
+   */
+  void remove(String key);
+
+  /**
+   * The values contained in this map.
+   *
+   * This copies the values into a new array.
+   */
+  ArrayOfBoolean values();
+}
diff --git a/elemental/src/elemental/util/MapFromStringToInt.java b/elemental/src/elemental/util/MapFromStringToInt.java
new file mode 100644
index 0000000..fe732ad
--- /dev/null
+++ b/elemental/src/elemental/util/MapFromStringToInt.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight map from {@link String} to <code>int</code>.
+ * 
+ * @see elemental.js.util.JsMapFromStringToInt
+ */
+public interface MapFromStringToInt {
+
+  /**
+   * Retrieves a value for the specified key.
+   */
+  int get(String key);
+
+  /**
+   * Indicates whether the map contains a value for the specified key.
+   */
+  boolean hasKey(String key);
+  
+  /**
+   * The keys contained within this map.
+   * 
+   * This copies the keys into a new array.
+   */
+  ArrayOfString keys();
+  
+  /**
+   * Associates a value to the specified key.
+   */
+  void put(String key, int value);
+
+  /**
+   * Removes the value associated with the specified value, if one exists.
+   */
+  void remove(String key);
+  
+  /**
+   * The values contained in this map.
+   * 
+   * This copies the values into a new array.
+   */  
+  ArrayOfInt values();
+}
diff --git a/elemental/src/elemental/util/MapFromStringToNumber.java b/elemental/src/elemental/util/MapFromStringToNumber.java
new file mode 100644
index 0000000..c6c6694
--- /dev/null
+++ b/elemental/src/elemental/util/MapFromStringToNumber.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight map from {@link String} to <code>double</code>.
+ * 
+ * @see elemental.js.util.JsMapFromStringToNumber
+ */
+public interface MapFromStringToNumber {
+
+  /**
+   * Retrieves a value for the specified key.
+   */
+  double get(String key);
+
+  /**
+   * Indicates whether the map contains a value for the specified key.
+   */
+  boolean hasKey(String key);
+
+  /**
+   * The keys contained within this map.
+   *
+   * This copies the keys into a new array.
+   */
+  ArrayOfString keys();
+
+  /**
+   * Associates a value to the specified key.
+   */
+  void put(String key, double value);
+
+  /**
+   * Removes the value associated with the specified value, if one exists.
+   */
+  void remove(String key);
+
+  /**
+   * The values contained in this map.
+   *
+   * This copies the values into a new array.
+   */
+  ArrayOfNumber values();
+}
diff --git a/elemental/src/elemental/util/MapFromStringToString.java b/elemental/src/elemental/util/MapFromStringToString.java
new file mode 100644
index 0000000..de4437b
--- /dev/null
+++ b/elemental/src/elemental/util/MapFromStringToString.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * A lightweight map from {@link String} to {@link String}.
+ * 
+ * @see elemental.js.util.JsMapFromStringToString
+ */
+public interface MapFromStringToString {
+
+  /**
+   * Retrieves a value for the specified key.
+   */
+  String get(String key);
+  
+  /**
+   * Indicates whether the map contains a value for the specified key.
+   */
+  boolean hasKey(String key);
+
+  /**
+   * The keys contained within this map.
+   * 
+   * This copies the keys into a new array.
+   */
+  ArrayOfString keys();
+  
+  /**
+   * Associates a value to the specified key.
+   */
+  void put(String key, String value);
+
+  /**
+   * Removes the value associated with the specified value, if one exists.
+   */
+  void remove(String key);
+
+  /**
+   * The values contained in this map.
+   * 
+   * This copies the values into a new array.
+   */
+  ArrayOfString values();
+}
diff --git a/elemental/src/elemental/util/Mappable.java b/elemental/src/elemental/util/Mappable.java
new file mode 100644
index 0000000..9f33d73
--- /dev/null
+++ b/elemental/src/elemental/util/Mappable.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * An object which can act like a Javascript object with String keys.
+ */
+// TODO (cromwellian) add generic when JSO bug in gwt-dev fixed
+public interface Mappable /* <T> */ {
+
+  /**
+   * Gets the value at a given key.
+   *
+   * @param key the key to be retrieved
+   * @return the value at the given index
+   */
+    Object /* T */ at(String key);
+
+  /**
+   * Sets the value at a given key.
+   *
+   * @param key the key to assign to
+   * @return the value at the given index
+   */
+  void setAt(String key, Object /* T */ value);
+}
diff --git a/elemental/src/elemental/util/Settable.java b/elemental/src/elemental/util/Settable.java
new file mode 100644
index 0000000..6f25021
--- /dev/null
+++ b/elemental/src/elemental/util/Settable.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * Models an object which can act like a Javascript array capable of indexed assignment.
+ */
+// TODO (cromwellian) add generic when JSO bug in gwt-dev fixed
+public interface Settable /* <T> */ extends Indexable /* <T> */ {
+
+  /**
+   * Gets the value at a given index.
+   *
+   * @param index the index to be retrieved
+   * @param value the value to be set
+   */
+    void setAt(int index, Object /* T */ value);
+}
diff --git a/elemental/src/elemental/util/SettableInt.java b/elemental/src/elemental/util/SettableInt.java
new file mode 100644
index 0000000..c915688
--- /dev/null
+++ b/elemental/src/elemental/util/SettableInt.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * Models an object which can act like a Javascript array capable of indexed assignment.
+ */
+// TODO (cromwellian) add generic when JSO bug in gwt-dev fixed
+public interface SettableInt extends IndexableInt {
+
+  /**
+   * Gets the value at a given index.
+   *
+   * @param index the index to be retrieved
+   * @param value the value to be set
+   */
+    void setAt(int index, int value);
+}
diff --git a/elemental/src/elemental/util/SettableNumber.java b/elemental/src/elemental/util/SettableNumber.java
new file mode 100644
index 0000000..94b08e7
--- /dev/null
+++ b/elemental/src/elemental/util/SettableNumber.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+/**
+ * Models an object which can act like a Javascript array capable of indexed assignment.
+ */
+// TODO (cromwellian) add generic when JSO bug in gwt-dev fixed
+public interface SettableNumber extends IndexableNumber {
+
+  /**
+   * Gets the value at a given index.
+   *
+   * @param index the index to be retrieved
+   * @param value the value to be set
+   */
+    void setAt(int index, double value);
+}
diff --git a/elemental/src/elemental/util/Timer.java b/elemental/src/elemental/util/Timer.java
new file mode 100644
index 0000000..9de4df7
--- /dev/null
+++ b/elemental/src/elemental/util/Timer.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+import static elemental.client.Browser.getWindow;
+
+import elemental.html.Window;
+import elemental.dom.TimeoutHandler;
+
+/**
+ * A simplified, browser-safe timer class. This class serves the same purpose as
+ * java.util.Timer, but is simplified because of the single-threaded
+ * environment.
+ * 
+ * To schedule a timer, simply create a subclass of it (overriding {@link #run})
+ * and call {@link #schedule} or {@link #scheduleRepeating}.
+ */
+public abstract class Timer {
+
+  private boolean isRepeating;
+  private int timerId;
+
+  /**
+   * Cancels this timer.
+   */
+  public void cancel() {
+    if (isRepeating) {
+      getWindow().clearInterval(timerId);
+    } else {
+      getWindow().clearTimeout(timerId);
+    }
+  }
+
+  /**
+   * This method will be called when a timer fires. Override it to implement the
+   * timer's logic.
+   */
+  public abstract void run();
+
+  /**
+   * Schedules a timer to elapse in the future.
+   * 
+   * @param delayMillis how long to wait before the timer elapses, in
+   *          milliseconds
+   */
+  public void schedule(int delayMillis) {
+    if (delayMillis <= 0) {
+      throw new IllegalArgumentException("must be positive");
+    }
+    cancel();
+    isRepeating = false;
+
+    timerId = getWindow().setTimeout(new TimeoutHandler() {
+      @Override
+      public void onTimeoutHandler() {
+        run();
+      }
+    }, delayMillis);
+  }
+
+  /**
+   * Schedules a timer that elapses repeatedly.
+   * 
+   * @param periodMillis how long to wait before the timer elapses, in
+   *          milliseconds, between each repetition
+   */
+  public void scheduleRepeating(int periodMillis) {
+    if (periodMillis <= 0) {
+      throw new IllegalArgumentException("must be positive");
+    }
+    cancel();
+    isRepeating = true;
+    timerId = getWindow().setInterval(new TimeoutHandler() {
+      @Override
+      public void onTimeoutHandler() {
+        run();
+      }
+    }, periodMillis);
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreArrayOf.java b/elemental/src/elemental/util/impl/JreArrayOf.java
new file mode 100644
index 0000000..3c0087b
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreArrayOf.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+import elemental.util.ArrayOf;
+import elemental.util.CanCompare;
+
+/**
+ * JRE implementation of ArrayOf for server and dev mode.
+ */
+public class JreArrayOf<T> implements ArrayOf<T> {
+
+  /*
+   * TODO(cromwellian): this implemation uses JRE ArrayList. A direct
+   * implementation would be more efficient. 
+   */
+  private ArrayList<T> array;
+
+  public JreArrayOf() {
+    array = new ArrayList<T>();
+  }
+
+  JreArrayOf(ArrayList<T> array) {
+    this.array = array;
+  }
+
+  @Override
+  public ArrayOf<T> concat(ArrayOf<T> values) {
+    assert values instanceof JreArrayOf;
+    ArrayList<T> toReturn = new ArrayList<T>(array);
+    toReturn.addAll(((JreArrayOf<T>) values).array);
+    return new JreArrayOf<T>(toReturn);
+  }
+
+  @Override
+  public boolean contains(T value) {
+    return array.contains(value);
+  }
+
+  @Override
+  public T get(int index) {
+    return index >= length() ? null : array.get(index);
+  }
+
+  @Override
+  public int indexOf(T value) {
+    return array.indexOf(value);
+  }
+
+  @Override
+  public void insert(int index, T value) {
+    if (index >= length()) {
+      array.add(value);
+    } else {
+      if (index < 0) {
+        index = index + length();
+        if (index < 0) {
+          index = 0;
+        }
+      }
+      array.add(index, value);
+    }
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return array.isEmpty();
+  }
+
+  @Override
+  public String join() {
+    return join(",");
+  }
+
+  @Override
+  public String join(String separator) {
+    StringBuilder toReturn = new StringBuilder();
+    boolean first = true;
+    for (T val : array) {
+      if (first) {
+        first = false;
+      } else {
+        toReturn.append(separator);
+      }
+      // JS treats null as "" for purposes of join()
+      toReturn.append(val == null ? "" : toStringWithTrim(val));
+    }
+    return toReturn.toString();
+  }
+
+  @Override
+  public int length() {
+    return array.size();
+  }
+
+  @Override
+  public T peek() {
+    return isEmpty() ? null : array.get(array.size() - 1);
+  }
+
+  @Override
+  public T pop() {
+    return isEmpty() ? null : array.remove(array.size() - 1);
+  }
+
+  @Override
+  public void push(T value) {
+    array.add(value);
+  }
+
+  @Override
+  public void remove(T value) {
+    array.remove(value);
+  }
+
+  @Override
+  public void removeByIndex(int index) {
+    if (index < length()) {
+      array.remove(index);
+    }
+  }
+
+  @Override
+  public void set(int index, T value) {
+    ensureLength(index);
+    array.set(index, value);
+  }
+
+  @Override
+  public void setLength(int length) {
+    if (length > length()) {
+      for (int i = length(); i < length; i++) {
+        array.add(null);
+      }
+    } else if (length < length()) {
+      for (int i = length(); i > length; i--) {
+        array.remove(i - 1);
+      }
+    }
+  }
+
+  @Override
+  public T shift() {
+    return isEmpty() ? null : array.remove(0);
+  }
+
+  @Override
+  public void sort(final CanCompare<T> comparator) {
+    Collections.sort(array, new Comparator<T>() {
+      @Override
+      public int compare(T o1, T o2) {
+        return comparator.compare(o1, o2);
+      }
+    });
+  }
+
+  @Override
+  public ArrayOf<T> splice(int index, int count) {
+    ArrayList<T> toReturn = new ArrayList<T>(
+        array.subList(index, index + count));
+    for (int i = 0; i < count && !isEmpty(); i++) {
+      array.remove(index);
+    }
+    return new JreArrayOf<T>(toReturn);
+  }
+
+  @Override
+  public void unshift(T value) {
+    array.add(0, value);
+  }
+
+  private void ensureLength(int index) {
+    if (index >= length()) {
+      setLength(index + 1);
+    }
+  }
+
+  static String toStringWithTrim(Object obj) {
+    if (obj instanceof Number) {
+      String numberStr = obj.toString();
+      if (numberStr.endsWith(".0")) {
+        numberStr = numberStr.substring(0, numberStr.length() - 2);
+      }
+      return numberStr;
+    }
+    return obj.toString();
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreArrayOfBoolean.java b/elemental/src/elemental/util/impl/JreArrayOfBoolean.java
new file mode 100644
index 0000000..23e59e7
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreArrayOfBoolean.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfBoolean;
+import elemental.util.Collections;
+
+/**
+ * JRE implementation of ArrayOfBoolean for server and dev mode.
+ */
+public class JreArrayOfBoolean implements ArrayOfBoolean {
+
+  /*
+   * TODO(cromwellian): this implemation uses JRE ArrayList. A direct
+   * implementation would be more efficient.
+   */
+
+  public ArrayOfBoolean concat(ArrayOfBoolean values) {
+    return new JreArrayOfBoolean(array.concat(((JreArrayOfBoolean) values).array));
+  }
+
+  public boolean contains(boolean value) {
+    return array.contains(value);
+  }
+
+  @Override
+  public boolean get(int index) {
+    return array.get(index);
+  }
+
+  public int indexOf(boolean value) {
+    return array.indexOf(value);
+  }
+
+  public void insert(int index, boolean value) {
+    array.insert(index, value);
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return array.isEmpty();
+  }
+
+  @Override
+  public boolean isSet(int index) {
+    return array.get(index) != null;
+  }
+
+  @Override
+  public String join() {
+    return array.join();
+  }
+
+  @Override
+  public String join(String separator) {
+    return array.join(separator);
+  }
+
+  @Override
+  public int length() {
+    return array.length();
+  }
+
+  @Override
+  public boolean peek() {
+    return array.peek();
+  }
+
+  @Override
+  public boolean pop() {
+    return array.pop();
+  }
+
+  public void push(boolean value) {
+    array.push(value);
+  }
+
+  public void remove(boolean value) {
+    array.remove(value);
+  }
+
+  @Override
+  public void removeByIndex(int index) {
+    array.removeByIndex(index);
+  }
+
+  public void set(int index, boolean value) {
+    array.set(index, value);
+  }
+
+  @Override
+  public void setLength(int length) {
+    array.setLength(length);
+  }
+
+  @Override
+  public boolean shift() {
+    return array.shift();
+  }
+
+  @Override
+  public ArrayOfBoolean splice(int index, int count) {
+    return new JreArrayOfBoolean(array.splice(index, count));
+  }
+
+  public void unshift(boolean value) {
+    array.unshift(value);
+  }
+
+  private ArrayOf<Boolean> array;
+
+  public JreArrayOfBoolean() {
+    array = Collections.arrayOf();
+  }
+
+  JreArrayOfBoolean(ArrayOf<Boolean> array) {
+     this.array = array;
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreArrayOfInt.java b/elemental/src/elemental/util/impl/JreArrayOfInt.java
new file mode 100644
index 0000000..14ba8af
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreArrayOfInt.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfInt;
+import elemental.util.CanCompare;
+import elemental.util.CanCompareInt;
+import elemental.util.Collections;
+
+/**
+ * JRE implementation of ArrayOfInt for server and dev mode.
+ */
+public class JreArrayOfInt implements ArrayOfInt {
+
+  /*
+   * TODO(cromwellian): this implemation uses JRE ArrayList. A direct
+   * implementation would be more efficient.
+   */
+
+  public ArrayOfInt concat(ArrayOfInt values) {
+    return new JreArrayOfInt(array.concat(((JreArrayOfInt) values).array));
+  }
+
+  public boolean contains(int value) {
+    return array.contains(value);
+  }
+
+  @Override
+  public int get(int index) {
+    return array.get(index);
+  }
+
+  public int indexOf(int value) {
+    return array.indexOf(value);
+  }
+
+  public void insert(int index, int value) {
+    array.insert(index, value);
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return array.isEmpty();
+  }
+
+  @Override
+  public boolean isSet(int index) {
+    return array.get(index) != null;
+  }
+
+  @Override
+  public String join() {
+    return array.join();
+  }
+
+  @Override
+  public String join(String separator) {
+    return array.join(separator);
+  }
+
+  @Override
+  public int length() {
+    return array.length();
+  }
+
+  @Override
+  public int peek() {
+    return array.peek();
+  }
+
+  @Override
+  public int pop() {
+    return array.pop();
+  }
+
+  public void push(int value) {
+    array.push(value);
+  }
+
+  public void remove(int value) {
+    array.remove(value);
+  }
+
+  @Override
+  public void removeByIndex(int index) {
+    array.removeByIndex(index);
+  }
+
+  public void set(int index, int value) {
+    array.set(index, value);
+  }
+
+  @Override
+  public void setLength(int length) {
+    array.setLength(length);
+  }
+
+  @Override
+  public int shift() {
+    return array.shift();
+  }
+
+  @Override
+  public void sort() {
+    array.sort(new CanCompare<Integer>() {
+      @Override
+      public int compare(Integer a, Integer b) {
+        return a == null ? (a == b ? 0 : -1) : a.compareTo(b);
+      }
+    });
+  }
+
+  @Override
+  public void sort(final CanCompareInt comparator) {
+    array.sort(new CanCompare<Integer>() {
+      @Override
+      public int compare(Integer a, Integer b) {
+        return comparator.compare(a, b);
+      }
+    });
+  }
+
+  @Override
+  public ArrayOfInt splice(int index, int count) {
+    return new JreArrayOfInt(array.splice(index, count));
+  }
+
+  public void unshift(int value) {
+    array.unshift(value);
+  }
+
+  private ArrayOf<Integer> array;
+
+  public JreArrayOfInt() {
+    array = Collections.arrayOf();
+  }
+
+  JreArrayOfInt(ArrayOf<Integer> array) {
+     this.array = array;
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreArrayOfNumber.java b/elemental/src/elemental/util/impl/JreArrayOfNumber.java
new file mode 100644
index 0000000..ded7193
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreArrayOfNumber.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfNumber;
+import elemental.util.CanCompare;
+import elemental.util.CanCompareNumber;
+import elemental.util.Collections;
+
+/**
+ * JRE implementation of ArrayOfInt for server and dev mode.
+ */
+public class JreArrayOfNumber implements ArrayOfNumber {
+
+  /*
+   * TODO(cromwellian): this implemation uses JRE ArrayList. A direct
+   * implementation would be more efficient.
+   */
+
+  public ArrayOfNumber concat(ArrayOfNumber values) {
+    return new JreArrayOfNumber(array.concat(((JreArrayOfNumber) values).array));
+  }
+
+  public boolean contains(double value) {
+    return array.contains(value);
+  }
+
+  @Override
+  public double get(int index) {
+    return array.get(index);
+  }
+
+  public int indexOf(double value) {
+    return array.indexOf(value);
+  }
+
+  public void insert(int index, double value) {
+    array.insert(index, value);
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return array.isEmpty();
+  }
+
+  @Override
+  public boolean isSet(int index) {
+    return array.get(index) != null;
+  }
+
+  @Override
+  public String join() {
+    return array.join();
+  }
+
+  @Override
+  public String join(String separator) {
+    return array.join(separator);
+  }
+
+  @Override
+  public int length() {
+    return array.length();
+  }
+
+  @Override
+  public double peek() {
+    return array.peek();
+  }
+
+  @Override
+  public double pop() {
+    return array.pop();
+  }
+
+  public void push(double value) {
+    array.push(value);
+  }
+
+  public void remove(double value) {
+    array.remove(value);
+  }
+
+  @Override
+  public void removeByIndex(int index) {
+    array.removeByIndex(index);
+  }
+
+  public void set(int index, double value) {
+    array.set(index, value);
+  }
+
+  @Override
+  public void setLength(int length) {
+    array.setLength(length);
+  }
+
+  @Override
+  public double shift() {
+    return array.shift();
+  }
+
+  @Override
+  public void sort() {
+    array.sort(new CanCompare<Double>() {
+      @Override
+      public int compare(Double a, Double b) {
+        return a == null ? (a == b ? 0 : -1) : a.compareTo(b);
+      }
+    });
+  }
+
+  @Override
+  public void sort(final CanCompareNumber comparator) {
+    array.sort(new CanCompare<Double>() {
+      @Override
+      public int compare(Double a, Double b) {
+        return comparator.compare(a, b);
+      }
+    });
+  }
+
+  @Override
+  public ArrayOfNumber splice(int index, int count) {
+    return new JreArrayOfNumber(array.splice(index, count));
+  }
+
+  public void unshift(double value) {
+    array.unshift(value);
+  }
+
+  private ArrayOf<Double> array;
+
+  public JreArrayOfNumber() {
+    array = Collections.arrayOf();
+  }
+
+  JreArrayOfNumber(ArrayOf<Double> array) {
+     this.array = array;
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreArrayOfString.java b/elemental/src/elemental/util/impl/JreArrayOfString.java
new file mode 100644
index 0000000..11fa335
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreArrayOfString.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+
+import java.util.ArrayList;
+
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfString;
+import elemental.util.CanCompare;
+import elemental.util.CanCompareString;
+import elemental.util.Collections;
+
+/**
+ * JRE implementation of ArrayOfString for server and dev mode.
+ */
+public class JreArrayOfString implements ArrayOfString {
+
+  private ArrayOf<String> array;
+
+  public JreArrayOfString(ArrayList<String> array) {
+    this((new JreArrayOf<String>(array)));
+  }
+
+  public JreArrayOfString() {
+    array = Collections.arrayOf();
+  }
+
+  JreArrayOfString(ArrayOf<String> array) {
+     this.array = array;
+  }
+
+  /*
+   * TODO(cromwellian): this implemation uses JRE ArrayList. A direct
+   * implementation would be more efficient.
+   */
+
+  public ArrayOfString concat(ArrayOfString values) {
+    return new JreArrayOfString(array.concat(((JreArrayOfString) values).array));
+  }
+
+  public boolean contains(String value) {
+    return array.contains(value);
+  }
+
+  @Override
+  public String get(int index) {
+    return array.get(index);
+  }
+
+  public int indexOf(String value) {
+    return array.indexOf(value);
+  }
+
+  public void insert(int index, String value) {
+    array.insert(index, value);
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return array.isEmpty();
+  }
+
+  @Override
+  public String join() {
+    return array.join();
+  }
+
+  @Override
+  public String join(String separator) {
+    return array.join(separator);
+  }
+
+  @Override
+  public int length() {
+    return array.length();
+  }
+
+  @Override
+  public String peek() {
+    return array.peek();
+  }
+
+  @Override
+  public String pop() {
+    return array.pop();
+  }
+
+  public void push(String value) {
+    array.push(value);
+  }
+
+  public void remove(String value) {
+    array.remove(value);
+  }
+
+  @Override
+  public void removeByIndex(int index) {
+    array.removeByIndex(index);
+  }
+
+  public void set(int index, String value) {
+    array.set(index, value);
+  }
+
+  @Override
+  public void setLength(int length) {
+    array.setLength(length);
+  }
+
+  @Override
+  public String shift() {
+    return array.shift();
+  }
+
+  @Override
+  public void sort() {
+    array.sort(new CanCompare<String>() {
+      @Override
+      public int compare(String a, String b) {
+        return a == null ? (a == b ? 0 : -1) : a.compareTo(b);
+      }
+    });
+  }
+
+  @Override
+  public void sort(final CanCompareString comparator) {
+    array.sort(new CanCompare<String>() {
+      @Override
+      public int compare(String a, String b) {
+        return comparator.compare(a, b);
+      }
+    });
+  }
+
+  @Override
+  public ArrayOfString splice(int index, int count) {
+    return new JreArrayOfString(array.splice(index, count));
+  }
+
+  public void unshift(String value) {
+    array.unshift(value);
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreMapFromIntTo.java b/elemental/src/elemental/util/impl/JreMapFromIntTo.java
new file mode 100644
index 0000000..72eaef7
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreMapFromIntTo.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfInt;
+import elemental.util.MapFromIntTo;
+
+/**
+ * JRE implementation of MapFromIntTo for server and dev mode.
+ */
+public class JreMapFromIntTo<T> implements MapFromIntTo<T> {
+
+  /*
+   * TODO(cromwellian): this implemation uses JRE HashMap. A direct
+   * implementation would be more efficient.
+   */
+  private HashMap<Integer, T> map;
+
+  public JreMapFromIntTo() {
+    map = new HashMap<Integer,T>();
+  }
+
+  JreMapFromIntTo(HashMap<Integer, T> map) {
+    this.map = map;
+  }
+
+  @Override
+  public T get(int key) {
+    return map.get(key);
+  }
+
+  @Override
+  public boolean hasKey(int key) {
+    return map.containsKey(key);
+  }
+
+  @Override
+  public ArrayOfInt keys() {
+    return new JreArrayOfInt(new JreArrayOf<Integer>(new ArrayList<Integer>(map.keySet())));
+  }
+
+  @Override
+  public void put(int key, T value) {
+    map.put(key, value);
+  }
+
+  @Override
+  public void remove(int key) {
+    map.remove(key);
+  }
+
+  @Override
+  public ArrayOf<T> values() {
+    return new JreArrayOf<T>(new ArrayList<T>(map.values()));
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreMapFromIntToString.java b/elemental/src/elemental/util/impl/JreMapFromIntToString.java
new file mode 100644
index 0000000..578674b
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreMapFromIntToString.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+import elemental.util.ArrayOfInt;
+import elemental.util.ArrayOfString;
+import elemental.util.MapFromIntToString;
+
+/**
+ * JRE implementation of MapFromIntToString for server and dev mode.
+ */
+public class JreMapFromIntToString implements MapFromIntToString {
+
+ /*
+   * TODO(cromwellian): this implementation delegates, direct implementation would be more efficient.
+   */
+  private JreMapFromIntTo<String> map;
+
+  public JreMapFromIntToString() {
+    map = new JreMapFromIntTo<String>();
+  }
+
+  @Override
+  public String get(int key) {
+    return map.get(key);
+  }
+
+  @Override
+  public boolean hasKey(int key) {
+    return map.hasKey(key);
+  }
+
+  @Override
+  public ArrayOfInt keys() {
+    return map.keys();
+  }
+
+  @Override
+  public void put(int key, String value) {
+    map.put(key, value);
+  }
+
+  @Override
+  public void remove(int key) {
+    map.remove(key);
+  }
+
+  public void set(int key, String value) {
+    put(key, value);
+  }
+
+  @Override
+  public ArrayOfString values() {
+    return new JreArrayOfString(map.values());
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreMapFromStringTo.java b/elemental/src/elemental/util/impl/JreMapFromStringTo.java
new file mode 100644
index 0000000..0045c01
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreMapFromStringTo.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfString;
+import elemental.util.MapFromStringTo;
+
+/**
+ * JRE implementation of MapFromStringTo for server and dev mode.
+ */
+public class JreMapFromStringTo<T> implements MapFromStringTo<T> {
+
+  /*
+   * TODO(cromwellian): this implemation uses JRE HashMap. A direct
+   * implementation would be more efficient.
+   */
+  private HashMap<String, T> map;
+
+  public JreMapFromStringTo() {
+    map = new HashMap<String,T>();
+  }
+
+  JreMapFromStringTo(HashMap<String, T> map) {
+    this.map = map;
+  }
+
+
+  @Override
+  public T get(String key) {
+    return map.get(key);
+  }
+
+  @Override
+  public boolean hasKey(String key) {
+    return map.containsKey(key);
+  }
+
+  @Override
+  public ArrayOfString keys() {
+    return new JreArrayOfString(new ArrayList<String>(map.keySet()));
+  }
+
+  @Override
+  public void put(String key, T value) {
+    map.put(key, value);
+  }
+
+  @Override
+  public void remove(String key) {
+    map.remove(key);
+  }
+
+  @Override
+  public ArrayOf<T> values() {
+    return new JreArrayOf<T>(new ArrayList<T>(map.values()));
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreMapFromStringToBoolean.java b/elemental/src/elemental/util/impl/JreMapFromStringToBoolean.java
new file mode 100644
index 0000000..23e5fb1
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreMapFromStringToBoolean.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+import elemental.util.ArrayOfBoolean;
+import elemental.util.ArrayOfString;
+import elemental.util.MapFromStringToBoolean;
+
+/**
+ * JRE implementation of MapFromStringToBoolean for server and dev mode.
+ */
+public class JreMapFromStringToBoolean implements MapFromStringToBoolean {
+
+ /*
+   * TODO(cromwellian): this implementation delegates, direct implementation would be more efficient.
+   */
+  private JreMapFromStringTo<Boolean> map;
+
+  public JreMapFromStringToBoolean() {
+    map = new JreMapFromStringTo<Boolean>();
+  }
+
+  @Override
+  public boolean get(String key) {
+    return map.get(key);
+  }
+
+  @Override
+  public boolean hasKey(String key) {
+    return map.hasKey(key);
+  }
+
+  @Override
+  public ArrayOfString keys() {
+    return map.keys();
+  }
+
+  @Override
+  public void put(String key, boolean value) {
+    map.put(key, value);
+  }
+
+  @Override
+  public void remove(String key) {
+    map.remove(key);
+  }
+
+  @Override
+  public ArrayOfBoolean values() {
+    return new JreArrayOfBoolean(map.values());
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreMapFromStringToInt.java b/elemental/src/elemental/util/impl/JreMapFromStringToInt.java
new file mode 100644
index 0000000..58c1a67
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreMapFromStringToInt.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+import elemental.util.ArrayOfInt;
+import elemental.util.ArrayOfString;
+import elemental.util.MapFromStringToInt;
+
+/**
+ * JRE implementation of MapFromStringToInt for server and dev mode.
+ */
+public class JreMapFromStringToInt implements MapFromStringToInt {
+
+  /*
+   * TODO(cromwellian): this implementation delegates, direct implementation would be more efficient.
+   */
+  private JreMapFromStringTo<Integer> map;
+
+  public JreMapFromStringToInt() {
+    map = new JreMapFromStringTo<Integer>();
+  }
+
+  @Override
+  public int get(String key) {
+    return map.get(key);
+  }
+
+  @Override
+  public boolean hasKey(String key) {
+    return map.hasKey(key);
+  }
+
+  @Override
+  public ArrayOfString keys() {
+    return map.keys();
+  }
+
+  @Override
+  public void put(String key, int value) {
+    map.put(key, value);
+  }
+
+  @Override
+  public void remove(String key) {
+    map.remove(key);
+  }
+
+  @Override
+  public ArrayOfInt values() {
+    return new JreArrayOfInt(map.values());
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreMapFromStringToNumber.java b/elemental/src/elemental/util/impl/JreMapFromStringToNumber.java
new file mode 100644
index 0000000..63ca0c4
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreMapFromStringToNumber.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+import elemental.util.ArrayOfNumber;
+import elemental.util.ArrayOfString;
+import elemental.util.MapFromStringToNumber;
+
+/**
+ * JRE implementation of MapFromStringToNumber for server and dev mode.
+ */
+public class JreMapFromStringToNumber implements MapFromStringToNumber {
+
+  /*
+   * TODO(cromwellian): this implementation delegates, direct implementation would be more efficient.
+   */
+  private JreMapFromStringTo<Double> map;
+
+  public JreMapFromStringToNumber() {
+    map = new JreMapFromStringTo<Double>();
+  }
+
+  @Override
+  public double get(String key) {
+    return map.get(key);
+  }
+
+  @Override
+  public boolean hasKey(String key) {
+    return map.hasKey(key);
+  }
+
+  @Override
+  public ArrayOfString keys() {
+    return map.keys();
+  }
+
+  @Override
+  public void put(String key, double value) {
+    map.put(key, value);
+  }
+
+  @Override
+  public void remove(String key) {
+    map.remove(key);
+  }
+
+  @Override
+  public ArrayOfNumber values() {
+    return new JreArrayOfNumber(map.values());
+  }
+}
diff --git a/elemental/src/elemental/util/impl/JreMapFromStringToString.java b/elemental/src/elemental/util/impl/JreMapFromStringToString.java
new file mode 100644
index 0000000..5ac73b4
--- /dev/null
+++ b/elemental/src/elemental/util/impl/JreMapFromStringToString.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util.impl;
+
+import elemental.util.ArrayOfString;
+import elemental.util.MapFromStringToString;
+
+/**
+ * JRE implementation of MapFromStringToString for server and dev mode.
+ */
+public class JreMapFromStringToString implements MapFromStringToString {
+
+  /*
+   * TODO(cromwellian): this implementation delegates, direct implementation would be more efficient.
+   */
+  private JreMapFromStringTo<String> map;
+
+  public JreMapFromStringToString() {
+    map = new JreMapFromStringTo<String>();
+  }
+
+  @Override
+  public String get(String key) {
+    return map.get(key);
+  }
+
+  @Override
+  public boolean hasKey(String key) {
+    return map.hasKey(key);
+  }
+
+  @Override
+  public ArrayOfString keys() {
+    return map.keys();
+  }
+
+  @Override
+  public void put(String key, String value) {
+    map.put(key, value);
+  }
+
+  @Override
+  public void remove(String key) {
+    map.remove(key);
+  }
+
+  @Override
+  public ArrayOfString values() {
+    return new JreArrayOfString(map.values());
+  }
+}
diff --git a/elemental/src/elemental/xml/XMLHttpRequest.java b/elemental/src/elemental/xml/XMLHttpRequest.java
new file mode 100644
index 0000000..70ed2c4
--- /dev/null
+++ b/elemental/src/elemental/xml/XMLHttpRequest.java
@@ -0,0 +1,352 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xml;
+import elemental.events.EventTarget;
+import elemental.html.ArrayBuffer;
+import elemental.html.Blob;
+import elemental.html.FormData;
+import elemental.events.EventListener;
+import elemental.dom.Document;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p><code>XMLHttpRequest</code> is a <a class="internal" title="En/JavaScript" rel="internal" href="https://developer.mozilla.org/en/JavaScript">JavaScript</a> object that was designed by Microsoft and adopted by Mozilla, Apple, and Google. It's now being <a class="external" title="http://www.w3.org/TR/XMLHttpRequest/" rel="external" href="http://www.w3.org/TR/XMLHttpRequest/" target="_blank">standardized in the W3C</a>. It provides an easy way to retrieve data at a URL. Despite its name, <code>XMLHttpRequest</code> can be used to retrieve any type of data, not just XML, and it supports protocols other than <a title="en/HTTP" rel="internal" href="https://developer.mozilla.org/en/HTTP">HTTP</a> (including <code>file</code> and <code>ftp</code>).</p>
+<p>To create an instance of <code>XMLHttpRequest</code>, simply do this:</p>
+<pre>var req = new XMLHttpRequest();
+</pre>
+<p>For details about how to use <code>XMLHttpRequest</code>, see <a class="internal" title="En/Using XMLHttpRequest" rel="internal" href="https://developer.mozilla.org/en/DOM/XMLHttpRequest/Using_XMLHttpRequest">Using XMLHttpRequest</a>.</p>
+  */
+public interface XMLHttpRequest extends EventTarget {
+
+  /**
+    * The operation is complete.
+    */
+
+    static final int DONE = 4;
+
+  /**
+    * <code>send()</code> has been called, and headers and status are available.
+    */
+
+    static final int HEADERS_RECEIVED = 2;
+
+  /**
+    * Downloading; <code>responseText</code> holds partial data.
+    */
+
+    static final int LOADING = 3;
+
+  /**
+    * <code>send()</code>has not been called yet.
+    */
+
+    static final int OPENED = 1;
+
+  /**
+    * <code>open()</code>has not been called yet.
+    */
+
+    static final int UNSENT = 0;
+
+  boolean isAsBlob();
+
+  void setAsBlob(boolean arg);
+
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnload();
+
+  void setOnload(EventListener arg);
+
+  EventListener getOnloadend();
+
+  void setOnloadend(EventListener arg);
+
+  EventListener getOnloadstart();
+
+  void setOnloadstart(EventListener arg);
+
+  EventListener getOnprogress();
+
+  void setOnprogress(EventListener arg);
+
+  EventListener getOnreadystatechange();
+
+  void setOnreadystatechange(EventListener arg);
+
+
+  /**
+    * <p>The state of the request:</p> <table class="standard-table"> <tbody> <tr> <td class="header">Value</td> <td class="header">State</td> <td class="header">Description</td> </tr> <tr> <td><code>0</code></td> <td><code>UNSENT</code></td> <td><code>open()</code>has not been called yet.</td> </tr> <tr> <td><code>1</code></td> <td><code>OPENED</code></td> <td><code>send()</code>has not been called yet.</td> </tr> <tr> <td><code>2</code></td> <td><code>HEADERS_RECEIVED</code></td> <td><code>send()</code> has been called, and headers and status are available.</td> </tr> <tr> <td><code>3</code></td> <td><code>LOADING</code></td> <td>Downloading; <code>responseText</code> holds partial data.</td> </tr> <tr> <td><code>4</code></td> <td><code>DONE</code></td> <td>The operation is complete.</td> </tr> </tbody> </table>
+    */
+  int getReadyState();
+
+
+  /**
+    * The response entity body according to <code><a href="#responseType">responseType</a></code>, as an <a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a>, <a title="en/DOM/Blob" rel="internal" href="https://developer.mozilla.org/en/DOM/Blob"><code>Blob</code></a>, <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Document">Document</a></code>
+, JavaScript object (for "moz-json"), or string. This is <code>NULL</code>&nbsp;if the request is not complete or was not successful.
+    */
+  Object getResponse();
+
+  Blob getResponseBlob();
+
+
+  /**
+    * The response to the request as text, or <code>null</code> if the request was unsuccessful or has not yet been sent. <strong>Read-only.</strong>
+    */
+  String getResponseText();
+
+
+  /**
+    * <p>Can be set to change the response type. This tells the server what format you want the response to be in.</p> <table class="standard-table"> <tbody> <tr> <td class="header">Value</td> <td class="header">Data type of <code>response</code> property</td> </tr> <tr> <td><em>empty string</em></td> <td>String (this is the default)</td> </tr> <tr> <td>"arraybuffer"</td> <td><a title="en/JavaScript typed arrays/ArrayBuffer" rel="internal" href="https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer"><code>ArrayBuffer</code></a></td> </tr> <tr> <td>"blob"</td> <td><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Blob">Blob</a></code>
+</td> </tr> <tr> <td>"document"</td> <td><code><a rel="custom" href="https://developer.mozilla.org/en/DOM/Document">Document</a></code>
+</td> </tr> <tr> <td>"text"</td> <td>String</td> </tr> <tr> <td>"moz-json"</td> <td>JavaScript object, parsed from a JSON string returned by the server 
+<span title="(Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6)
+">Requires Gecko 9.0</span>
+</td> </tr> </tbody> </table>
+    */
+  String getResponseType();
+
+  void setResponseType(String arg);
+
+
+  /**
+    * <p>The response to the request as a DOM <code><a class="internal" title="En/DOM/Document" rel="internal" href="https://developer.mozilla.org/en/DOM/document">Document</a></code> object, or <code>null</code> if the request was unsuccessful, has not yet been sent, or cannot be parsed as XML. The response is parsed as if it were a <code>text/xml</code> stream. <strong>Read-only.</strong></p> <div class="note"><strong>Note:</strong> If the server doesn't apply the <code>text/xml</code> Content-Type header, you can use <code>overrideMimeType()</code>to force <code>XMLHttpRequest</code> to parse it as XML anyway.</div>
+    */
+  Document getResponseXML();
+
+
+  /**
+    * The status of the response to the request. This is the HTTP result code (for example, <code>status</code> is 200 for a successful request). <strong>Read-only.</strong>
+    */
+  int getStatus();
+
+
+  /**
+    * The response string returned by the HTTP server. Unlike <code>status</code>, this includes the entire text of the response message ("<code>200 OK</code>", for example). <strong>Read-only.</strong>
+    */
+  String getStatusText();
+
+
+  /**
+    * The upload process can be tracked by adding an event listener to <code>upload</code>. 
+<span>New in <a rel="custom" href="https://developer.mozilla.org/en/Firefox_3.5_for_developers">Firefox 3.5</a></span>
+    */
+  XMLHttpRequestUpload getUpload();
+
+
+  /**
+    * <p>Indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies or authorization headers. 
+<span>New in <a rel="custom" href="https://developer.mozilla.org/en/Firefox_3.5_for_developers">Firefox 3.5</a></span>
+</p> <div class="note"><strong>Note:</strong> This never affects same-site requests.</div> <p>The default is <code>false</code>.</p>
+    */
+  boolean isWithCredentials();
+
+  void setWithCredentials(boolean arg);
+
+
+  /**
+    * Aborts the request if it has already been sent.
+    */
+  void abort();
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+
+  /**
+    * <pre>string getAllResponseHeaders();
+</pre>
+<p>Returns all the response headers as a string, or <code>null</code> if no response has been received.<strong> Note:</strong> For multipart requests, this returns the headers from the <em>current</em> part of the request, not from the original channel.</p>
+    */
+  String getAllResponseHeaders();
+
+
+  /**
+    * Returns the string containing the text of the specified header, or <code>null</code> if either the response has not yet been received or the header doesn't exist in the response.
+    */
+  String getResponseHeader(String header);
+
+
+  /**
+    * <p>Initializes a request. This method is to be used from JavaScript code; to initialize a request from native code, use <a class="internal" title="/en/XMLHttpRequest#openRequest()" rel="internal" href="https://developer.mozilla.org/en/nsIXMLHttpRequest#openRequest()"><code>openRequest()</code></a>instead.</p>
+<div class="note"><strong>Note:</strong> Calling this method an already active request (one for which <code>open()</code>or <code>openRequest()</code>has already been called) is the equivalent of calling <code>abort()</code>.</div>
+
+<div id="section_9"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>method</code></dt> <dd>The HTTP method to use; either "POST" or "GET". Ignored for non-HTTP(S) URLs.</dd> <dt><code>url</code></dt> <dd>The URL to which to send the request.</dd> <dt><code>async</code></dt> <dd>An optional boolean parameter, defaulting to <code>true</code>, indicating whether or not to perform the operation asynchronously. If this value is <code>false</code>, the <code>send()</code>method does not return until the response is received. If <code>true</code>, notification of a completed transaction is provided using event listeners. This <em>must</em> be true if the <code>multipart</code> attribute is <code>true</code>, or an exception will be thrown.</dd> <dt><code>user</code></dt> <dd>The optional user name to use for authentication purposes; by default, this is an empty string.</dd> <dt><code>password</code></dt> <dd>The optional password to use for authentication purposes; by default, this is an empty string.</dd>
+</dl>
+<p></p></div>
+    */
+  void open(String method, String url);
+
+
+  /**
+    * <p>Initializes a request. This method is to be used from JavaScript code; to initialize a request from native code, use <a class="internal" title="/en/XMLHttpRequest#openRequest()" rel="internal" href="https://developer.mozilla.org/en/nsIXMLHttpRequest#openRequest()"><code>openRequest()</code></a>instead.</p>
+<div class="note"><strong>Note:</strong> Calling this method an already active request (one for which <code>open()</code>or <code>openRequest()</code>has already been called) is the equivalent of calling <code>abort()</code>.</div>
+
+<div id="section_9"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>method</code></dt> <dd>The HTTP method to use; either "POST" or "GET". Ignored for non-HTTP(S) URLs.</dd> <dt><code>url</code></dt> <dd>The URL to which to send the request.</dd> <dt><code>async</code></dt> <dd>An optional boolean parameter, defaulting to <code>true</code>, indicating whether or not to perform the operation asynchronously. If this value is <code>false</code>, the <code>send()</code>method does not return until the response is received. If <code>true</code>, notification of a completed transaction is provided using event listeners. This <em>must</em> be true if the <code>multipart</code> attribute is <code>true</code>, or an exception will be thrown.</dd> <dt><code>user</code></dt> <dd>The optional user name to use for authentication purposes; by default, this is an empty string.</dd> <dt><code>password</code></dt> <dd>The optional password to use for authentication purposes; by default, this is an empty string.</dd>
+</dl>
+<p></p></div>
+    */
+  void open(String method, String url, boolean async);
+
+
+  /**
+    * <p>Initializes a request. This method is to be used from JavaScript code; to initialize a request from native code, use <a class="internal" title="/en/XMLHttpRequest#openRequest()" rel="internal" href="https://developer.mozilla.org/en/nsIXMLHttpRequest#openRequest()"><code>openRequest()</code></a>instead.</p>
+<div class="note"><strong>Note:</strong> Calling this method an already active request (one for which <code>open()</code>or <code>openRequest()</code>has already been called) is the equivalent of calling <code>abort()</code>.</div>
+
+<div id="section_9"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>method</code></dt> <dd>The HTTP method to use; either "POST" or "GET". Ignored for non-HTTP(S) URLs.</dd> <dt><code>url</code></dt> <dd>The URL to which to send the request.</dd> <dt><code>async</code></dt> <dd>An optional boolean parameter, defaulting to <code>true</code>, indicating whether or not to perform the operation asynchronously. If this value is <code>false</code>, the <code>send()</code>method does not return until the response is received. If <code>true</code>, notification of a completed transaction is provided using event listeners. This <em>must</em> be true if the <code>multipart</code> attribute is <code>true</code>, or an exception will be thrown.</dd> <dt><code>user</code></dt> <dd>The optional user name to use for authentication purposes; by default, this is an empty string.</dd> <dt><code>password</code></dt> <dd>The optional password to use for authentication purposes; by default, this is an empty string.</dd>
+</dl>
+<p></p></div>
+    */
+  void open(String method, String url, boolean async, String user);
+
+
+  /**
+    * <p>Initializes a request. This method is to be used from JavaScript code; to initialize a request from native code, use <a class="internal" title="/en/XMLHttpRequest#openRequest()" rel="internal" href="https://developer.mozilla.org/en/nsIXMLHttpRequest#openRequest()"><code>openRequest()</code></a>instead.</p>
+<div class="note"><strong>Note:</strong> Calling this method an already active request (one for which <code>open()</code>or <code>openRequest()</code>has already been called) is the equivalent of calling <code>abort()</code>.</div>
+
+<div id="section_9"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>method</code></dt> <dd>The HTTP method to use; either "POST" or "GET". Ignored for non-HTTP(S) URLs.</dd> <dt><code>url</code></dt> <dd>The URL to which to send the request.</dd> <dt><code>async</code></dt> <dd>An optional boolean parameter, defaulting to <code>true</code>, indicating whether or not to perform the operation asynchronously. If this value is <code>false</code>, the <code>send()</code>method does not return until the response is received. If <code>true</code>, notification of a completed transaction is provided using event listeners. This <em>must</em> be true if the <code>multipart</code> attribute is <code>true</code>, or an exception will be thrown.</dd> <dt><code>user</code></dt> <dd>The optional user name to use for authentication purposes; by default, this is an empty string.</dd> <dt><code>password</code></dt> <dd>The optional password to use for authentication purposes; by default, this is an empty string.</dd>
+</dl>
+<p></p></div>
+    */
+  void open(String method, String url, boolean async, String user, String password);
+
+
+  /**
+    * Overrides the MIME type returned by the server. This may be used, for example, to force a stream to be treated and parsed as text/xml, even if the server does not report it as such.This method must be called before <code>send()</code>.
+    */
+  void overrideMimeType(String override);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+
+
+  /**
+    * <p>Sends the request. If the request is asynchronous (which is the default), this method returns as soon as the request is sent. If the request is synchronous, this method doesn't return until the response has arrived.</p>
+<div class="note"><strong>Note:</strong> Any event listeners you wish to set must be set before calling <code>send()</code>.</div>
+
+<div id="section_11"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>body</code></dt> <dd>This may be an <code>nsIDocument</code>, <code>nsIInputStream</code>, or a string (an <code>nsISupportsString</code> if called from native code) that is used to populate the body of a POST request. Starting with Gecko 1.9.2, you may also specify an DOM<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ , and starting with Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ you may also specify a <a title="en/XMLHttpRequest/FormData" rel="internal" href="https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData"><code>FormData</code></a> object.</dd>
+</dl>
+</div>
+    */
+  void send();
+
+
+  /**
+    * <p>Sends the request. If the request is asynchronous (which is the default), this method returns as soon as the request is sent. If the request is synchronous, this method doesn't return until the response has arrived.</p>
+<div class="note"><strong>Note:</strong> Any event listeners you wish to set must be set before calling <code>send()</code>.</div>
+
+<div id="section_11"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>body</code></dt> <dd>This may be an <code>nsIDocument</code>, <code>nsIInputStream</code>, or a string (an <code>nsISupportsString</code> if called from native code) that is used to populate the body of a POST request. Starting with Gecko 1.9.2, you may also specify an DOM<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ , and starting with Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ you may also specify a <a title="en/XMLHttpRequest/FormData" rel="internal" href="https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData"><code>FormData</code></a> object.</dd>
+</dl>
+</div>
+    */
+  void send(ArrayBuffer data);
+
+
+  /**
+    * <p>Sends the request. If the request is asynchronous (which is the default), this method returns as soon as the request is sent. If the request is synchronous, this method doesn't return until the response has arrived.</p>
+<div class="note"><strong>Note:</strong> Any event listeners you wish to set must be set before calling <code>send()</code>.</div>
+
+<div id="section_11"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>body</code></dt> <dd>This may be an <code>nsIDocument</code>, <code>nsIInputStream</code>, or a string (an <code>nsISupportsString</code> if called from native code) that is used to populate the body of a POST request. Starting with Gecko 1.9.2, you may also specify an DOM<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ , and starting with Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ you may also specify a <a title="en/XMLHttpRequest/FormData" rel="internal" href="https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData"><code>FormData</code></a> object.</dd>
+</dl>
+</div>
+    */
+  void send(Blob data);
+
+
+  /**
+    * <p>Sends the request. If the request is asynchronous (which is the default), this method returns as soon as the request is sent. If the request is synchronous, this method doesn't return until the response has arrived.</p>
+<div class="note"><strong>Note:</strong> Any event listeners you wish to set must be set before calling <code>send()</code>.</div>
+
+<div id="section_11"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>body</code></dt> <dd>This may be an <code>nsIDocument</code>, <code>nsIInputStream</code>, or a string (an <code>nsISupportsString</code> if called from native code) that is used to populate the body of a POST request. Starting with Gecko 1.9.2, you may also specify an DOM<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ , and starting with Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ you may also specify a <a title="en/XMLHttpRequest/FormData" rel="internal" href="https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData"><code>FormData</code></a> object.</dd>
+</dl>
+</div>
+    */
+  void send(Document data);
+
+
+  /**
+    * <p>Sends the request. If the request is asynchronous (which is the default), this method returns as soon as the request is sent. If the request is synchronous, this method doesn't return until the response has arrived.</p>
+<div class="note"><strong>Note:</strong> Any event listeners you wish to set must be set before calling <code>send()</code>.</div>
+
+<div id="section_11"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>body</code></dt> <dd>This may be an <code>nsIDocument</code>, <code>nsIInputStream</code>, or a string (an <code>nsISupportsString</code> if called from native code) that is used to populate the body of a POST request. Starting with Gecko 1.9.2, you may also specify an DOM<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ , and starting with Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ you may also specify a <a title="en/XMLHttpRequest/FormData" rel="internal" href="https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData"><code>FormData</code></a> object.</dd>
+</dl>
+</div>
+    */
+  void send(String data);
+
+
+  /**
+    * <p>Sends the request. If the request is asynchronous (which is the default), this method returns as soon as the request is sent. If the request is synchronous, this method doesn't return until the response has arrived.</p>
+<div class="note"><strong>Note:</strong> Any event listeners you wish to set must be set before calling <code>send()</code>.</div>
+
+<div id="section_11"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>body</code></dt> <dd>This may be an <code>nsIDocument</code>, <code>nsIInputStream</code>, or a string (an <code>nsISupportsString</code> if called from native code) that is used to populate the body of a POST request. Starting with Gecko 1.9.2, you may also specify an DOM<code><a rel="custom" href="https://developer.mozilla.org/en/DOM/File">File</a></code>
+ , and starting with Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
+ you may also specify a <a title="en/XMLHttpRequest/FormData" rel="internal" href="https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData"><code>FormData</code></a> object.</dd>
+</dl>
+</div>
+    */
+  void send(FormData data);
+
+
+  /**
+    * <p>Sets the value of an HTTP request header.You must call <a class="internal" title="/en/XMLHttpRequest#open()" rel="internal" href="https://developer.mozilla.org/en/nsIXMLHttpRequest#open()"><code>open()</code></a>before using this method.</p>
+
+<div id="section_15"><span id="Parameters_5"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>header</code></dt> <dd>The name of the header whose value is to be set.</dd> <dt><code>value</code></dt> <dd>The value to set as the body of the header.</dd>
+</dl>
+</div>
+    */
+  void setRequestHeader(String header, String value);
+}
diff --git a/elemental/src/elemental/xml/XMLHttpRequestException.java b/elemental/src/elemental/xml/XMLHttpRequestException.java
new file mode 100644
index 0000000..3a8655b
--- /dev/null
+++ b/elemental/src/elemental/xml/XMLHttpRequestException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xml;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface XMLHttpRequestException {
+
+    static final int ABORT_ERR = 102;
+
+    static final int NETWORK_ERR = 101;
+
+  int getCode();
+
+  String getMessage();
+
+  String getName();
+}
diff --git a/elemental/src/elemental/xml/XMLHttpRequestUpload.java b/elemental/src/elemental/xml/XMLHttpRequestUpload.java
new file mode 100644
index 0000000..21231c0
--- /dev/null
+++ b/elemental/src/elemental/xml/XMLHttpRequestUpload.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xml;
+import elemental.events.EventListener;
+import elemental.events.EventTarget;
+import elemental.events.Event;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface XMLHttpRequestUpload extends EventTarget {
+
+  EventListener getOnabort();
+
+  void setOnabort(EventListener arg);
+
+  EventListener getOnerror();
+
+  void setOnerror(EventListener arg);
+
+  EventListener getOnload();
+
+  void setOnload(EventListener arg);
+
+  EventListener getOnloadend();
+
+  void setOnloadend(EventListener arg);
+
+  EventListener getOnloadstart();
+
+  void setOnloadstart(EventListener arg);
+
+  EventListener getOnprogress();
+
+  void setOnprogress(EventListener arg);
+
+  EventRemover addEventListener(String type, EventListener listener);
+
+  EventRemover addEventListener(String type, EventListener listener, boolean useCapture);
+
+  boolean dispatchEvent(Event evt);
+
+  void removeEventListener(String type, EventListener listener);
+
+  void removeEventListener(String type, EventListener listener, boolean useCapture);
+}
diff --git a/elemental/src/elemental/xml/XSLTProcessor.java b/elemental/src/elemental/xml/XSLTProcessor.java
new file mode 100644
index 0000000..980309c
--- /dev/null
+++ b/elemental/src/elemental/xml/XSLTProcessor.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xml;
+import elemental.dom.Node;
+import elemental.dom.DocumentFragment;
+import elemental.dom.Document;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <p>XSLTProcesor is an object providing an interface to XSLT engine in Mozilla. It is available to unprivileged JavaScript.</p>
+<ul> <li><a title="en/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations" rel="internal" href="https://developer.mozilla.org/en/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations">Using the Mozilla JavaScript interface to XSL Transformations</a></li> <li><a title="en/The_XSLT//JavaScript_Interface_in_Gecko" rel="internal" href="https://developer.mozilla.org/en/The_XSLT%2F%2FJavaScript_Interface_in_Gecko">The XSLT/JavaScript Interface in Gecko</a></li>
+</ul>
+  */
+public interface XSLTProcessor {
+
+  void clearParameters();
+
+  String getParameter(String namespaceURI, String localName);
+
+  void importStylesheet(Node stylesheet);
+
+  void removeParameter(String namespaceURI, String localName);
+
+  void reset();
+
+  void setParameter(String namespaceURI, String localName, String value);
+
+  Document transformToDocument(Node source);
+
+  DocumentFragment transformToFragment(Node source, Document docVal);
+}
diff --git a/elemental/src/elemental/xpath/DOMParser.java b/elemental/src/elemental/xpath/DOMParser.java
new file mode 100644
index 0000000..4ff47e6
--- /dev/null
+++ b/elemental/src/elemental/xpath/DOMParser.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xpath;
+import elemental.dom.Document;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * This page redirects to a page that no longer exists <a rel="internal" class="new" href="https://developer.mozilla.org/en/Document_Object_Model_(DOM)/DOMParser">en/Document_Object_Model_(DOM)/DOMParser</a>.
+  */
+public interface DOMParser {
+
+  Document parseFromString(String str, String contentType);
+}
diff --git a/elemental/src/elemental/xpath/XMLSerializer.java b/elemental/src/elemental/xpath/XMLSerializer.java
new file mode 100644
index 0000000..5a6fdae
--- /dev/null
+++ b/elemental/src/elemental/xpath/XMLSerializer.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xpath;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div dir="ltr" id="result_box">XMLSerializer can be used to convert DOM subtree or DOM document into text. XMLSerializer is available to unprivileged scripts.</div>
+<p><code> </code></p>
+<div class="note">
+<div dir="ltr">XMLSerializer is mainly useful for applications and extensions based on the Mozilla platform. While it is available for web pages, it's not part of any standard and level of support in other browsers unknown.</div>
+<div id="result_box" dir="ltr">&nbsp;</div>
+</div>
+  */
+public interface XMLSerializer {
+
+
+  /**
+    * <div dir="ltr" id="serializeToString" class="">
+&nbsp;&nbsp;&nbsp;&nbsp; Returns the serialized subtree of a string.
+<dt></dt>
+</div>
+<div dir="ltr" id="serializeToStream"><strong>serializeToStream </strong></div>
+<div dir="ltr">&nbsp;&nbsp;&nbsp;&nbsp; The subtree rooted by the specified element is serialized to a byte stream using the character set specified.&nbsp;&nbsp;&nbsp;&nbsp;</div>
+<div dir="ltr" id="Example"><span>Example</span></div>
+
+          <pre name="code" class="js">var s = new XMLSerializer();
+ var d = document;
+ var str = s.serializeToString(d);
+ alert(str);</pre>
+        
+
+          <pre name="code" class="js">var s = new XMLSerializer();
+ var stream = {
+   close : function()
+   {
+     alert("Stream closed");
+   },
+   flush : function()
+   {
+   },
+   write : function(string, count)
+   {
+     alert("'" + string + "'\n bytes count: " + count + "");
+   }
+ };
+ s.serializeToStream(document, stream, "UTF-8");</pre>
+    */
+  String serializeToString(Node node);
+}
diff --git a/elemental/src/elemental/xpath/XPathEvaluator.java b/elemental/src/elemental/xpath/XPathEvaluator.java
new file mode 100644
index 0000000..0fb010c
--- /dev/null
+++ b/elemental/src/elemental/xpath/XPathEvaluator.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xpath;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * <div><div>
+
+<a rel="custom" href="http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/xpath/nsIDOMXPathEvaluator.idl"><code>dom/interfaces/xpath/nsIDOMXPathEvaluator.idl</code></a><span><a rel="internal" href="https://developer.mozilla.org/en/Interfaces/About_Scriptable_Interfaces" title="en/Interfaces/About_Scriptable_Interfaces">Scriptable</a></span></div><span>This interface is used to evaluate XPath expressions against a DOM node.</span><div>Inherits from: <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsISupports">nsISupports</a></code>
+<span>Last changed in Gecko 1.7 
+</span></div></div>
+<p></p>
+<p>Implemented by: <code>@mozilla.org/dom/xpath-evaluator;1</code>. To create an instance, use:</p>
+<pre class="eval">var domXPathEvaluator = Components.classes["@mozilla.org/dom/xpath-evaluator;1"]
+                        .createInstance(Components.interfaces.nsIDOMXPathEvaluator);
+</pre>
+  */
+public interface XPathEvaluator {
+
+
+  /**
+    * <p>Creates an <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathExpression">nsIDOMXPathExpression</a></code>
+ which can then be used for (repeated) evaluations.</p>
+<div class="geckoVersionNote">
+<p>
+</p><div class="geckoVersionHeading">Gecko 1.9 note<div>(Firefox 3)
+</div></div>
+<p></p>
+<p>Prior to Gecko 1.9, you could call this method on documents other than the one you planned to run the XPath against; starting with Gecko 1.9, however, you must call it on the same document.</p>
+</div>
+
+<div id="section_4"><span id="Parameters"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>expression</code></dt> <dd>A string representing the XPath to be created.</dd> <dt><code>resolver</code></dt> <dd>A name space resolver created by , or a user defined name space resolver. Read more on <a title="en/Introduction to using XPath in JavaScript#Implementing a User Defined Namespace Resolver" rel="internal" href="https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript#Implementing_a_User_Defined_Namespace_Resolver">Implementing a User Defined Namespace Resolver</a> if you wish to take the latter approach.</dd>
+</dl>
+</div><div id="section_5"><span id="Return_value"></span><h6 class="editable">Return value</h6>
+<p>An XPath expression, as an <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathExpression">nsIDOMXPathExpression</a></code>
+ object.</p>
+</div>
+    */
+  XPathExpression createExpression(String expression, XPathNSResolver resolver);
+
+
+  /**
+    * <p>Creates an <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathExpression">nsIDOMXPathExpression</a></code>
+ which resolves name spaces with respect to the definitions in scope for a specified node. It is used to resolve prefixes within the XPath itself, so that they can be matched with the document. <code>null</code> is common for HTML documents or when no name space prefixes are used.</p>
+
+<div id="section_7"><span id="Parameters_2"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>nodeResolver</code></dt> <dd>The node to be used as a context for name space resolution.</dd>
+</dl>
+</div><div id="section_8"><span id="Return_value_2"></span><h6 class="editable">Return value</h6>
+<p>A name space resolver.</p>
+</div>
+    */
+  XPathNSResolver createNSResolver(Node nodeResolver);
+
+
+  /**
+    * <p>Evaluate the specified XPath expression.</p>
+
+<div id="section_10"><span id="Parameters_3"></span><h6 class="editable">Parameters</h6>
+<dl> <dt><code>expression</code></dt> <dd>A string representing the XPath to be evaluated.</dd> <dt><code>contextNode</code></dt> <dd>A DOM Node to evaluate the XPath expression against. To evaluate against a whole document, use the <code><a rel="custom" href="https://developer.mozilla.org/en/DOM/document.documentElement">document.documentElement</a></code>
+.</dd> <dt><code>resolver</code></dt> <dd>A name space resolver created by , or a user defined name space resolver. Read more on <a title="en/Introduction to using XPath in JavaScript#Implementing a User Defined Namespace Resolver" rel="internal" href="https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript#Implementing_a_User_Defined_Namespace_Resolver">Implementing a User Defined Namespace Resolver</a> if you wish to take the latter approach.</dd> <dt><code>type</code></dt> <dd>A number that corresponds to one of the type constants of <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIXPathResult&amp;ident=nsIXPathResult" class="new">nsIXPathResult</a></code>
+.</dd> <dt><code>result</code></dt> <dd>An existing <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIXPathResult&amp;ident=nsIXPathResult" class="new">nsIXPathResult</a></code>
+ to use for the result. Using <code>null</code> will create a new <code><a rel="internal" href="https://developer.mozilla.org/Article_not_found?uri=en/XPCOM_Interface_Reference/nsIXPathResult&amp;ident=nsIXPathResult" class="new">nsIXPathResult</a></code>
+.</dd>
+</dl>
+</div><div id="section_11"><span id="Return_value_3"></span><h6 class="editable">Return value</h6>
+<p>An XPath result.</p>
+</div>
+    */
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult);
+}
diff --git a/elemental/src/elemental/xpath/XPathException.java b/elemental/src/elemental/xpath/XPathException.java
new file mode 100644
index 0000000..9176622
--- /dev/null
+++ b/elemental/src/elemental/xpath/XPathException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xpath;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface XPathException {
+
+    static final int INVALID_EXPRESSION_ERR = 51;
+
+    static final int TYPE_ERR = 52;
+
+  int getCode();
+
+  String getMessage();
+
+  String getName();
+}
diff --git a/elemental/src/elemental/xpath/XPathExpression.java b/elemental/src/elemental/xpath/XPathExpression.java
new file mode 100644
index 0000000..09b0e2e
--- /dev/null
+++ b/elemental/src/elemental/xpath/XPathExpression.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xpath;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * An XPathExpression is a compiled XPath query returned from <a rel="internal" href="https://developer.mozilla.org/en/DOM/document.createExpression" title="en/DOM/document.createExpression">document.createExpression()</a>. It has a method <code>evaluate()</code> which can be used to execute the compiled XPath.
+
+  */
+public interface XPathExpression {
+
+  XPathResult evaluate(Node contextNode, int type, XPathResult inResult);
+}
diff --git a/elemental/src/elemental/xpath/XPathNSResolver.java b/elemental/src/elemental/xpath/XPathNSResolver.java
new file mode 100644
index 0000000..b9afe41
--- /dev/null
+++ b/elemental/src/elemental/xpath/XPathNSResolver.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xpath;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * 
+  */
+public interface XPathNSResolver {
+
+  String lookupNamespaceURI(String prefix);
+}
diff --git a/elemental/src/elemental/xpath/XPathResult.java b/elemental/src/elemental/xpath/XPathResult.java
new file mode 100644
index 0000000..180ed77
--- /dev/null
+++ b/elemental/src/elemental/xpath/XPathResult.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.xpath;
+import elemental.dom.Node;
+
+import elemental.events.*;
+import elemental.util.*;
+import elemental.dom.*;
+import elemental.html.*;
+import elemental.css.*;
+import elemental.stylesheets.*;
+
+import java.util.Date;
+
+/**
+  * Refer to <code><a rel="custom" href="https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIDOMXPathResult">nsIDOMXPathResult</a></code>
+ for more detail.
+  */
+public interface XPathResult {
+
+  /**
+    * A result set containing whatever type naturally results from evaluation of the expression. Note that if the result is a node-set then UNORDERED_NODE_ITERATOR_TYPE is always the resulting type.
+
+    */
+
+    static final int ANY_TYPE = 0;
+
+  /**
+    * A result node-set containing any single node that matches the expression. The node is not necessarily the first node in the document that matches the expression.
+
+    */
+
+    static final int ANY_UNORDERED_NODE_TYPE = 8;
+
+  /**
+    * A result containing a single boolean value. This is useful for example, in an XPath expression using the <code>not()</code> function.
+
+    */
+
+    static final int BOOLEAN_TYPE = 3;
+
+  /**
+    * A result node-set containing the first node in the document that matches the expression.
+
+    */
+
+    static final int FIRST_ORDERED_NODE_TYPE = 9;
+
+  /**
+    * A result containing a single number. This is useful for example, in an XPath expression using the <code>count()</code> function.
+
+    */
+
+    static final int NUMBER_TYPE = 1;
+
+  /**
+    * A result node-set containing all the nodes matching the expression. The nodes in the result set are in the same order that they appear in the document.
+
+    */
+
+    static final int ORDERED_NODE_ITERATOR_TYPE = 5;
+
+  /**
+    * A result node-set containing snapshots of all the nodes matching the expression. The nodes in the result set are in the same order that they appear in the document.
+
+    */
+
+    static final int ORDERED_NODE_SNAPSHOT_TYPE = 7;
+
+  /**
+    * A result containing a single string.
+
+    */
+
+    static final int STRING_TYPE = 2;
+
+  /**
+    * A result node-set containing all the nodes matching the expression. The nodes may not necessarily be in the same order that they appear in the document.
+
+    */
+
+    static final int UNORDERED_NODE_ITERATOR_TYPE = 4;
+
+  /**
+    * A result node-set containing snapshots of all the nodes matching the expression. The nodes may not necessarily be in the same order that they appear in the document.
+
+    */
+
+    static final int UNORDERED_NODE_SNAPSHOT_TYPE = 6;
+
+
+  /**
+    * readonly boolean
+    */
+  boolean isBooleanValue();
+
+
+  /**
+    * readonly boolean
+    */
+  boolean isInvalidIteratorState();
+
+
+  /**
+    * readonly float
+    */
+  double getNumberValue();
+
+
+  /**
+    * readonly integer (short)
+    */
+  int getResultType();
+
+
+  /**
+    * readonly Node
+    */
+  Node getSingleNodeValue();
+
+
+  /**
+    * readonly Integer
+    */
+  int getSnapshotLength();
+
+
+  /**
+    * readonly String
+    */
+  String getStringValue();
+
+  Node iterateNext();
+
+  Node snapshotItem(int index);
+}
diff --git a/elemental/tests/elemental/AllTests.java b/elemental/tests/elemental/AllTests.java
new file mode 100644
index 0000000..ea7790d
--- /dev/null
+++ b/elemental/tests/elemental/AllTests.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import elemental.client.BrowserTest;
+import elemental.events.EventTargetTest;
+import elemental.html.DocumentTest;
+import elemental.html.ElementTest;
+import elemental.html.WindowTest;
+import elemental.js.testing.MockClockTest;
+import elemental.js.util.ArrayTests;
+import elemental.js.util.JsGlobalsTests;
+import elemental.js.util.MapFromIntTests;
+import elemental.js.util.MapFromStringTests;
+import elemental.js.util.StringUtilTests;
+import elemental.json.JsonUtilTest;
+import elemental.util.TimerTest;
+
+/**
+ * Here lie all my tests.
+ */
+public class AllTests {
+  public static Test suite() {
+    final TestSuite suite = new TestSuite();
+
+    // client
+    suite.addTestSuite(BrowserTest.class);
+
+    // events
+    suite.addTestSuite(EventTargetTest.class);
+
+    // html
+    suite.addTestSuite(DocumentTest.class);
+    suite.addTestSuite(ElementTest.class);
+    suite.addTestSuite(WindowTest.class);
+
+    //json
+    suite.addTestSuite(JsonUtilTest.class);
+
+    // util
+    suite.addTestSuite(TimerTest.class);
+
+    // js.testing
+    suite.addTestSuite(MockClockTest.class);
+
+    // js.util
+    suite.addTestSuite(ArrayTests.class);
+    suite.addTestSuite(JsGlobalsTests.class);
+    suite.addTestSuite(MapFromStringTests.class);
+    suite.addTestSuite(MapFromIntTests.class);
+    suite.addTestSuite(StringUtilTests.class);
+
+    return suite;
+  }
+}
diff --git a/elemental/tests/elemental/client/BrowserTest.java b/elemental/tests/elemental/client/BrowserTest.java
new file mode 100644
index 0000000..d70a3a7
--- /dev/null
+++ b/elemental/tests/elemental/client/BrowserTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.client;
+
+import com.google.gwt.junit.DoNotRunWith;
+import com.google.gwt.junit.Platform;
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Tests for {@link Browser}.
+ */
+@DoNotRunWith(Platform.HtmlUnitUnknown)
+public class BrowserTest extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  /**
+   * Tests the encode/decodeURI pass through correctly to the browser. This is
+   * not intended to be an exhaustive test of the actual behavior (on the
+   * assumption it's correct in the browser).
+   */
+  public void testEncodeDecodeURI() {
+    String uri = "~!@#$%^&*(){}[]=:/,;?+'\"\\";
+    String encodedURI = Browser.encodeURI(uri);
+    assertEquals("~!@#$%25%5E&*()%7B%7D%5B%5D=:/,;?+'%22%5C", encodedURI);
+    String decodedURI = Browser.decodeURI(encodedURI);
+    assertEquals(uri, decodedURI);
+  }
+
+  /**
+   * Tests the encode/decodeURIComponent pass through correctly to the browser.
+   * This is not intended to be an exhaustive test of the actual behavior (on
+   * the assumption it's correct in the browser).
+   */
+  public void testEncodeDecodeURIComponent() {
+    String uri = "~!@#$%^&*(){}[]=:/,;?+'\"\\";
+    String encodedURI = Browser.encodeURIComponent(uri);
+    assertEquals("~!%40%23%24%25%5E%26*()%7B%7D%5B%5D%3D%3A%2F%2C%3B%3F%2B'%22%5C", encodedURI);
+    String decodedURI = Browser.decodeURIComponent(encodedURI);
+    assertEquals(uri, decodedURI);
+  }
+}
diff --git a/elemental/tests/elemental/events/EventTargetTest.java b/elemental/tests/elemental/events/EventTargetTest.java
new file mode 100644
index 0000000..383285a
--- /dev/null
+++ b/elemental/tests/elemental/events/EventTargetTest.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.events;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
+import com.google.gwt.junit.client.GWTTestCase;
+
+import elemental.client.Browser;
+import elemental.html.ButtonElement;
+import elemental.html.Document;
+import elemental.html.Element;
+import elemental.html.TestUtils;
+
+/**
+ * Tests for {@link EventTarget}.
+ */
+public class EventTargetTest extends GWTTestCase {
+
+  private static class ListenerDidFire implements EventListener {
+    private boolean didFire;
+    public boolean didFire() {
+      return didFire;
+    }
+    
+    @Override
+    public void handleEvent(Event evt) {
+      didFire = true;
+    }    
+  }
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  /**
+   * Tests that addEventListener() correctly adds a listener.
+   */
+  public void testAddEventListener() {
+    final Element body = Browser.getDocument().getBody();
+
+    final ListenerDidFire a = new ListenerDidFire();
+    final ListenerDidFire b = new ListenerDidFire();
+    
+    // Ensure that addEventListener works.
+    body.addEventListener("click", a, false);
+    // Ensure that setOnClick also works.
+    body.setOnClick(b);
+    
+    assertEquals(b, body.getOnClick());
+
+    TestUtils.click(body);
+    
+    assertTrue(a.didFire());
+    assertTrue(b.didFire());
+  }
+  
+  /**
+   * Tests that removeEventListener() correctly removes the listener, so that no
+   * events are fired afterwards.
+   */
+  @SuppressWarnings("deprecation")
+  public void testRemoveEventListener() {
+    final Element body = Browser.getDocument().getBody();
+
+    final ListenerDidFire listener = new ListenerDidFire();
+    
+    // Ensure that EventRemover works.
+    body.addEventListener("click", listener, false).remove();
+    TestUtils.click(body);
+    assertFalse(listener.didFire());
+    
+    // Ensure that removeEventListener works.
+    body.addEventListener("click", listener, false);
+    body.removeEventListener("click", listener, false);
+    TestUtils.click(body);
+    assertFalse(listener.didFire());
+    
+    // Ensure that onclick = null works.
+    body.setOnClick(listener);
+    body.setOnClick(null);
+    TestUtils.click(body);    
+    assertFalse(listener.didFire());    
+  }
+  
+  /**
+   * Tests that the {@link UncaughtExceptionHandler} gets called correctly when
+   * events are fired from a subinterface of {@link EventTarget}.
+   */
+  public void testUncaughtException() {
+    // Create a button with an event handler that will throw an exception.
+    Document doc = Browser.getDocument();
+    ButtonElement btn = doc.createButtonElement();
+    doc.getBody().appendChild(btn);
+
+    btn.addEventListener(Event.CLICK, new EventListener() {
+      @Override
+      public void handleEvent(Event evt) {
+        throw new RuntimeException("w00t!");
+      }
+    }, false);
+
+    // Setup the UncaughtExceptionHandler.
+    final Throwable[] ex = new Throwable[1];
+    GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+      @Override
+      public void onUncaughtException(Throwable e) {
+        ex[0] = e;
+      }
+    });
+
+    // Click it and make sure the exception got caught.
+    TestUtils.click(btn);
+    assertNotNull(ex[0]);
+    assertEquals("w00t!", ex[0].getMessage());
+
+    // Clean up.
+    GWT.setUncaughtExceptionHandler(null);
+    doc.getBody().removeChild(btn);
+  }
+}
diff --git a/elemental/tests/elemental/html/DocumentTest.java b/elemental/tests/elemental/html/DocumentTest.java
new file mode 100644
index 0000000..d29adb2
--- /dev/null
+++ b/elemental/tests/elemental/html/DocumentTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package elemental.html;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import static elemental.client.Browser.getWindow;
+
+/**
+ * Tests {@link Document}.
+ */
+public class DocumentTest extends GWTTestCase {
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  /**
+   * Tests {@link Document#write}.
+   */
+  public void testWrite() {
+    final Window window = getWindow().open();
+    final Document document = window.getDocument();
+    document.write("<body>drink and drink and drink AND FIGHT</body>");
+    assertTrue(document.getBody().getTextContent().indexOf("drink and drink and drink AND FIGHT") != -1);
+  }
+}
diff --git a/elemental/tests/elemental/html/ElementTest.java b/elemental/tests/elemental/html/ElementTest.java
new file mode 100644
index 0000000..0297c10
--- /dev/null
+++ b/elemental/tests/elemental/html/ElementTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import static elemental.client.Browser.getDocument;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
+import com.google.gwt.junit.client.GWTTestCase;
+
+import elemental.client.Browser;
+import elemental.events.Event;
+import elemental.events.EventListener;
+
+/**
+ * Tests for HTMLElement.
+ */
+public class ElementTest extends GWTTestCase {
+
+  private Element btn;
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  /**
+   * Tests that addEventListener() actually fires events.
+   */
+  public void testEventListener() {
+    final boolean[] clicked = new boolean[1];
+    btn.addEventListener("click", new EventListener() {
+      @Override
+      public void handleEvent(Event evt) {
+        clicked[0] = true;
+      }
+    }, false);
+
+    TestUtils.click(btn);
+    assertTrue(clicked[0]);
+  }
+  
+  /**
+   * Tests {@link Element#hasClassName(String)}.
+   */
+  public void testHasClassName() {
+    final Element e = btn;
+    e.setClassName("jimmy crack corn");
+    assertTrue(e.hasClassName("jimmy"));
+    assertTrue(e.hasClassName("crack"));
+    assertTrue(e.hasClassName("corn"));
+    assertFalse(e.hasClassName("jim"));
+    assertFalse(e.hasClassName("popcorn"));   
+
+    e.setClassName("turtles");
+    assertTrue(e.hasClassName("turtles"));
+  }
+
+  /**
+   * Tests that setting Element.onclick actually fires events.
+   */
+  public void testOnClick() {
+    final boolean[] clicked = new boolean[1];
+    EventListener listener = new EventListener() {
+      @Override
+      public void handleEvent(Event evt) {
+        clicked[0] = true;
+      }
+    };
+    btn.setOnClick(listener);
+
+    TestUtils.click(btn);
+    assertTrue(clicked[0]);
+    assertEquals(listener, btn.getOnClick());
+  }
+
+  /**
+   * Tests that the {@link UncaughtExceptionHandler} gets called correctly when
+   * events are fired from {@link Element#setOnClick(EventListener)}.
+   */
+  public void testUncaughtException() {
+    // Create a button with an event handler that will throw an exception.
+    Document doc = Browser.getDocument();
+    ButtonElement btn = doc.createButtonElement();
+    doc.getBody().appendChild(btn);
+
+    btn.setOnClick(new EventListener() {
+      @Override
+      public void handleEvent(Event evt) {
+        throw new RuntimeException("w00t!");
+      }
+    });
+
+    // Setup the UncaughtExceptionHandler.
+    final Throwable[] ex = new Throwable[1];
+    GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+      @Override
+      public void onUncaughtException(Throwable e) {
+        ex[0] = e;
+      }
+    });
+
+    // Click it and make sure the exception got caught.
+    TestUtils.click(btn);
+    assertNotNull(ex[0]);
+    assertEquals("w00t!", ex[0].getMessage());
+
+    // Clean up.
+    GWT.setUncaughtExceptionHandler(null);
+    doc.getBody().removeChild(btn);
+  }
+
+  @Override
+  protected void gwtSetUp() throws Exception {
+    btn = getDocument().createElement("button");
+    getDocument().getBody().appendChild(btn);
+  }
+
+  @Override
+  protected void gwtTearDown() throws Exception {
+    getDocument().getBody().removeChild(btn);
+  }
+}
diff --git a/elemental/tests/elemental/html/TestUtils.java b/elemental/tests/elemental/html/TestUtils.java
new file mode 100644
index 0000000..4fcd6e8
--- /dev/null
+++ b/elemental/tests/elemental/html/TestUtils.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import static elemental.client.Browser.getDocument;
+
+import elemental.events.EventTarget;
+import elemental.events.MouseEvent;
+
+/**
+ * Utilities for simplifying DOM tests.
+ */
+public class TestUtils {
+
+  /**
+   * Fires a left-click event on the given target (typically a DOM node).
+   */
+  public static void click(EventTarget target) {
+    MouseEvent evt = (MouseEvent) getDocument().createEvent(
+        Document.Event.MOUSE);
+    evt.initMouseEvent("click", true, true, null, 0, 0, 0, 0, 0, false, false,
+        false, false, MouseEvent.Button.PRIMARY, null);
+    target.dispatchEvent(evt);
+  }
+}
diff --git a/elemental/tests/elemental/html/WindowTest.java b/elemental/tests/elemental/html/WindowTest.java
new file mode 100644
index 0000000..8f393fc
--- /dev/null
+++ b/elemental/tests/elemental/html/WindowTest.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.html;
+
+import static elemental.client.Browser.getDocument;
+import static elemental.client.Browser.getWindow;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
+import com.google.gwt.junit.client.GWTTestCase;
+
+import elemental.events.Event;
+import elemental.events.EventListener;
+
+/**
+ * Tests for Window.
+ */
+public class WindowTest extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  /**
+   * Tests Window.addEventListener() catches events from the body.
+   */
+  public void testEventListener() {
+    final boolean[] clicked = new boolean[1];
+    getWindow().addEventListener("click", new EventListener() {
+      @Override
+      public void handleEvent(Event evt) {
+        clicked[0] = true;
+      }
+    }, false);
+    TestUtils.click(getDocument().getBody());
+    assertTrue(clicked[0]);
+  }
+
+  /**
+   * Tests Window.getSelection().
+   * TODO(knorton): Expand this into a more complete test.
+   */
+  public void testGetSelection() {
+    final Window window = getWindow();
+    final DOMSelection selection = window.getSelection();
+    assertNotNull(selection);
+  }
+
+  /**
+   * Tests that Window.open() and Window.clearOpener().
+   */
+  public void testOpener() {
+    final Window window = getWindow();
+    final Window proxy = window.open("about:blank");
+    assertNotNull(proxy.getOpener());
+    proxy.clearOpener();
+    assertNull(proxy.getOpener());
+    proxy.close();
+  }
+
+  /**
+   * Tests that Window.setTimeout() works.
+   */
+  public void testTimeout() {
+    delayTestFinish(1000);
+    getWindow().setTimeout(new Window.TimerCallback() {
+      @Override
+      public void fire() {
+        finishTest();        
+      }
+    }, 500);
+  }
+
+  /**
+   * Tests that Window.setInterval() works repeatedly.
+   */
+  public void testInterval() {
+    final int[] handle = new int[1];
+    Window.TimerCallback listener = new Window.TimerCallback() {
+      int count;
+      @Override
+      public void fire() {
+        // Make sure we see at least two events.
+        ++count;
+        if (count >= 2) {
+          getWindow().clearInterval(handle[0]);
+          finishTest();
+        }
+      }
+    };
+
+    delayTestFinish(1000);
+    handle[0] = getWindow().setInterval(listener, 100);
+  }
+
+  /**
+   * Tests that the {@link UncaughtExceptionHandler} gets called correctly when
+   * setTimeout() and setInterval() throw exceptions.
+   */
+  public void testUncaughtException() {
+    // Setup an UncaughtExceptionHandler to catch exceptions from setTimeout()
+    // and setInterval().
+    final Throwable[] ex = new Throwable[2];
+    GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+      int count;
+      @Override
+      public void onUncaughtException(Throwable e) {
+        ex[count++] = e;
+      }
+    });
+
+    // Set a timeout and an interval, both of which will throw a RuntimException.
+    getWindow().setTimeout(new Window.TimerCallback() {
+      @Override
+      public void fire() {
+        throw new RuntimeException("w00t!");
+      }
+    }, 1);
+
+    final int[] intervalHandle = new int[1];
+    intervalHandle[0] = getWindow().setInterval(new Window.TimerCallback() {
+      @Override
+      public void fire() {
+        // We only want this to happen once, so clear the interval timer on the
+        // first fire.
+        getWindow().clearInterval(intervalHandle[0]);
+        throw new RuntimeException("w00t!");
+      }
+    }, 1);
+
+    // Wait for the test to finish asynchronously, and setup another timer to
+    // check that the exceptions got caught (this is kind of ugly, but there's
+    // no way around it if we want to test the "real" timer implementation as
+    // opposed to a mock implementation.
+    delayTestFinish(5000);
+    getWindow().setTimeout(new Window.TimerCallback() {
+      @Override
+      public void fire() {
+        // Assert that exceptions got caught.
+        assertNotNull(ex[0]);
+        assertNotNull(ex[1]);
+        assertEquals("w00t!", ex[0].getMessage());
+        assertEquals("w00t!", ex[1].getMessage());
+
+        // Clean up and finish.
+        GWT.setUncaughtExceptionHandler(null);
+        finishTest();
+      }
+    }, 500);
+  } 
+}
diff --git a/elemental/tests/elemental/js/testing/MockClockTest.java b/elemental/tests/elemental/js/testing/MockClockTest.java
new file mode 100644
index 0000000..a19623d
--- /dev/null
+++ b/elemental/tests/elemental/js/testing/MockClockTest.java
@@ -0,0 +1,94 @@
+// Copyright 2010 Google Inc. All Rights Reserved.
+package elemental.js.testing;
+
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.user.client.Timer;
+
+/**
+ * Tests for {@link MockClock}
+ */
+public class MockClockTest extends GWTTestCase {
+
+  public void testClearTimeout() {
+    MockClock.run(new Runnable() {
+      public void run() {
+        TestTimer t = new TestTimer();
+        t.schedule(100);
+        t.cancel();
+        MockClock.tick(101);
+        assertFalse(t.hasRun);
+      }
+    });
+  }
+
+  public void testGetCurrentTime() {
+    MockClock.reset();
+    assertEquals(0.0, MockClock.getCurrentTime());
+  }
+
+  public void testGetTimeoutsMade() throws Exception {
+    MockClock.run(new Runnable() {
+      public void run() {
+        TestTimer t = new TestTimer();
+        assertEquals(0, MockClock.getTimeoutsMade());
+        t.schedule(100);
+        MockClock.tick(101);
+        assertEquals(1, MockClock.getTimeoutsMade());
+      }
+    });
+  }
+
+  public void testRun() {
+    MockClock.run(new Runnable() {
+      public void run() {
+        TestTimer t = new TestTimer();
+        t.schedule(100);
+        MockClock.tick(101);
+        assertTrue(t.hasRun);
+      }
+    });
+  }
+
+  public void testSetTimeoutDelay() {
+    MockClock.run(new Runnable() {
+      public void run() {
+        MockClock.setTimeoutDelay(30);
+        TestTimer t = new TestTimer() {
+          @Override
+          public void run() {
+            super.run();
+            assertTrue(MockClock.getCurrentTime() >= 130);
+          }
+        };
+        assertEquals(0, MockClock.getTimeoutsMade());
+        t.schedule(100);
+        assertEquals(1, MockClock.getTimeoutsMade());
+        MockClock.tick(100);
+        assertFalse(t.hasRun);
+        MockClock.tick(30);
+        assertTrue(t.hasRun);
+      }
+    });
+  }
+
+  public void testTick() {
+    MockClock.reset();
+    MockClock.tick(1234.0);
+    assertEquals(1234.0, MockClock.getCurrentTime());
+  }
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  private static class TestTimer extends Timer {
+
+    private boolean hasRun;
+
+    @Override
+    public void run() {
+      hasRun = true;
+    }
+  }
+}
diff --git a/elemental/tests/elemental/js/util/ArrayTests.java b/elemental/tests/elemental/js/util/ArrayTests.java
new file mode 100644
index 0000000..13a778f
--- /dev/null
+++ b/elemental/tests/elemental/js/util/ArrayTests.java
@@ -0,0 +1,689 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import static elemental.js.util.TestUtils.assertSamelitude;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfBoolean;
+import elemental.util.ArrayOfInt;
+import elemental.util.ArrayOfNumber;
+import elemental.util.ArrayOfString;
+import elemental.util.CanCompare;
+import elemental.util.CanCompareInt;
+import elemental.util.CanCompareNumber;
+import elemental.util.CanCompareString;
+import elemental.util.Collections;
+
+/**
+ * Tests for {@link ArrayOf}, {@link ArrayOfBoolean}, {@link ArrayOfInt},
+ * {@link ArrayOfString} and {@link ArrayOfNumber}.
+ *
+ */
+public class ArrayTests extends GWTTestCase {
+  private static ArrayOfBoolean arrayFrom(boolean... items) {
+    final ArrayOfBoolean array = Collections.arrayOfBoolean();
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+    return array;
+  }
+
+  private static ArrayOfNumber arrayFrom(double... items) {
+    final ArrayOfNumber array = Collections.arrayOfNumber();
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+    return array;
+  }
+
+  private static ArrayOfInt arrayFrom(int... items) {
+    final ArrayOfInt array = Collections.arrayOfInt();
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+    return array;
+  }
+
+  private static ArrayOfString arrayFrom(String... items) {
+    final ArrayOfString array = Collections.arrayOfString();
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+    return array;
+  }
+
+  @SuppressWarnings("unchecked")
+  private static <T> ArrayOf<T> arrayFrom(T... items) {
+    final ArrayOf<T> array = (ArrayOf<T>) Collections.arrayOf(Object.class);
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+    return array;
+  }
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  /**
+   * Tests {@link ArrayOf}.
+   */
+  public void testArrays() {
+    // This is our test subject.
+    final ArrayOf<TestItem> array = Collections.arrayOf(TestItem.class);
+
+    // These are items to put in him.
+    final TestItem[] items = new TestItem[] {new TestItem(0), new TestItem(1), new TestItem(2)};
+
+    // Let's put the items in him.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+
+    // Are the items in the right places?
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = items.length; i < n; ++i) {
+      assertEquals(items[i], array.get(i));
+    }
+
+    // These are some more items to put in him.
+    final TestItem[] newItems = new TestItem[] {new TestItem(3), new TestItem(4), new TestItem(5)};
+
+    // Put all these items in where the others were.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.set(i, newItems[i]);
+      assertEquals(newItems[i], array.get(i));
+    }
+
+    // Shift our test subject to squeeze out the first item.
+    assertEquals(newItems[0], array.shift());
+    assertEquals(newItems.length - 1, array.length());
+
+    // Then unshift.
+    array.unshift(newItems[0]);
+    assertEquals(newItems[0], array.get(0));
+    assertEquals(newItems.length, array.length());
+
+    // Now join them together in harmony.
+    assertEquals("item3$item4$item5", array.join("$"));
+
+    for (int i = 0, n = items.length; i < n; ++i) {
+      assertEquals(i, array.indexOf(newItems[i]));
+      assertTrue(array.contains(newItems[i]));
+    }
+
+    final TestItem imposter = new TestItem(100);
+    assertEquals(-1, array.indexOf(imposter));
+    assertFalse(array.contains(imposter));
+
+    final TestItem[] itemsA = new TestItem[] {new TestItem(12), new TestItem(13)};
+    final TestItem[] itemsB = new TestItem[] {new TestItem(14), new TestItem(15)};
+    final ArrayOf<TestItem> a = arrayFrom(itemsA);
+    final ArrayOf<TestItem> b = arrayFrom(itemsB);
+    assertSamelitude(new TestItem[] {itemsA[0], itemsA[1], itemsB[0], itemsB[1]}, a.concat(b));
+    assertSamelitude(itemsA, a);
+    assertSamelitude(itemsB, b);
+  }
+
+  /**
+   * Tests {@link ArrayOfBoolean}.
+   */
+  public void testArraysOfBooleans() {
+    // This is our test subject.
+    final ArrayOfBoolean array = Collections.arrayOfBoolean();
+
+    // These are items to put in him.
+    final boolean[] items = new boolean[] {true, false, true};
+
+    // Let's put the items in him.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+
+    // Are the items in the right places?
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = items.length; i < n; ++i) {
+      assertEquals(items[i], array.get(i));
+    }
+
+    // These are some more items to put in him.
+    final boolean[] newItems = new boolean[] {false, true, false};
+
+    // Put all these items in where the others were.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.set(i, newItems[i]);
+      assertEquals(newItems[i], array.get(i));
+    }
+
+    // Shift our test subject to squeeze out the first item.
+    assertEquals(newItems[0], array.shift());
+    assertEquals(newItems.length - 1, array.length());
+
+    // Then Unshift.
+    array.unshift(newItems[0]);
+    assertEquals(newItems[0], array.get(0));
+    assertEquals(newItems.length, array.length());
+
+    // Now join them together in harmony.
+    assertEquals("false$true$false", array.join("$"));
+
+    assertEquals(0, array.indexOf(false));
+    assertTrue(array.contains(false));
+    assertEquals(1, array.indexOf(true));
+    assertTrue(array.contains(true));
+
+    final ArrayOfBoolean allTrue = Collections.arrayOfBoolean();
+    allTrue.push(true);
+    allTrue.push(true);
+    allTrue.push(true);
+    assertEquals(-1, allTrue.indexOf(false));
+    assertFalse(allTrue.contains(false));
+
+    final boolean[] itemsA = new boolean[] {true, false};
+    final boolean[] itemsB = new boolean[] {false, true};
+    final ArrayOfBoolean a = arrayFrom(itemsA);
+    final ArrayOfBoolean b = arrayFrom(itemsB);
+    assertSamelitude(new boolean[] {itemsA[0], itemsA[1], itemsB[0], itemsB[1]}, a.concat(b));
+    assertSamelitude(itemsA, a);
+    assertSamelitude(itemsB, b);
+  }
+
+  /**
+   * Tests {@link ArrayOfInt}.
+   */
+  public void testArraysOfInts() {
+    // This is our test subject.
+    final ArrayOfInt array = Collections.arrayOfInt();
+
+    // These are items to put in him.
+    final int[] items = new int[] {0, 1, 2};
+
+    // Let's put the items in him.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+
+    // Are the items in the right places?
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = items.length; i < n; ++i) {
+      assertEquals(items[i], array.get(i));
+    }
+
+    // These are some more items to put in him.
+    final int[] newItems = new int[] {3, 4, 5};
+
+    // Put all these items in where the others were.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.set(i, newItems[i]);
+      assertEquals(newItems[i], array.get(i));
+    }
+
+    // Shift our test subject to squeeze out the first item.
+    assertEquals(newItems[0], array.shift());
+    assertEquals(newItems.length - 1, array.length());
+
+    // Then Unshift.
+    array.unshift(newItems[0]);
+    assertEquals(newItems[0], array.get(0));
+    assertEquals(newItems.length, array.length());
+
+    // Now join them together in harmony.
+    assertEquals("3$4$5", array.join("$"));
+
+    for (int i = 0, n = items.length; i < n; ++i) {
+      assertEquals(i, array.indexOf(newItems[i]));
+      assertTrue(array.contains(newItems[i]));
+    }
+
+    final int imposter = 100;
+    assertEquals(-1, array.indexOf(imposter));
+    assertFalse(array.contains(imposter));
+
+    final int[] itemsA = new int[] {11, 12};
+    final int[] itemsB = new int[] {13, 14};
+    final ArrayOfInt a = arrayFrom(itemsA);
+    final ArrayOfInt b = arrayFrom(itemsB);
+    assertSamelitude(new int[] {itemsA[0], itemsA[1], itemsB[0], itemsB[1]}, a.concat(b));
+    assertSamelitude(itemsA, a);
+    assertSamelitude(itemsB, b);
+  }
+
+  /**
+   * Tests {@link ArrayOfNumber}.
+   */
+  public void testArraysOfNumbers() {
+    // This is our test subject.
+    final ArrayOfNumber array = Collections.arrayOfNumber();
+
+    // These are items to put in him.
+    final double[] items = new double[] {0.0, 1.0, 2.0};
+
+    // Let's put the items in him.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+
+    // Are the items in the right places?
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = items.length; i < n; ++i) {
+      assertEquals(items[i], array.get(i));
+    }
+
+    // These are some more items to put in him.
+    final double[] newItems = new double[] {3.0, 4.0, 5.0};
+
+    // Put all these items in where the others were.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.set(i, newItems[i]);
+      assertEquals(newItems[i], array.get(i));
+    }
+
+    // Shift our test subject to squeeze out the first item.
+    assertEquals(newItems[0], array.shift());
+    assertEquals(newItems.length - 1, array.length());
+
+    // Then Unshift.
+    array.unshift(newItems[0]);
+    assertEquals(newItems[0], array.get(0));
+    assertEquals(newItems.length, array.length());
+
+    // Now join them together in harmony.
+    assertEquals("3$4$5", array.join("$"));
+
+    final double[] itemsA = new double[] {0.01, 0.02};
+    final double[] itemsB = new double[] {0.03, 0.04};
+    final ArrayOfNumber a = arrayFrom(itemsA);
+    final ArrayOfNumber b = arrayFrom(itemsB);
+    assertSamelitude(new double[] {itemsA[0], itemsA[1], itemsB[0], itemsB[1]}, a.concat(b));
+    assertSamelitude(itemsA, a);
+    assertSamelitude(itemsB, b);
+  }
+
+  /**
+   * Tests for {@link ArrayOfString}.
+   */
+  public void testArraysOfStrings() {
+    // This is our test subject.
+    final ArrayOfString array = Collections.arrayOfString();
+
+    // These are items to put in him.
+    final String[] items = new String[] {"zero goats", "one goat", "two goats"};
+
+    // Let's put the items in him.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.push(items[i]);
+    }
+
+    // Are the items in the right places?
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = items.length; i < n; ++i) {
+      assertEquals(items[i], array.get(i));
+    }
+
+    // These are some more items to put in him.
+    final String[] newItems = new String[] {"three goats", "four goats", "SQUIRREL!"};
+
+    // Put all these items in where the others were.
+    for (int i = 0, n = items.length; i < n; ++i) {
+      array.set(i, newItems[i]);
+      assertEquals(newItems[i], array.get(i));
+    }
+
+    // Shift our test subject to squeeze out the first item.
+    assertEquals(newItems[0], array.shift());
+    assertEquals(newItems.length - 1, array.length());
+
+    // Then Unshift.
+    array.unshift(newItems[0]);
+    assertEquals(newItems[0], array.get(0));
+    assertEquals(newItems.length, array.length());
+
+    // Now join them together in harmony.
+    assertEquals("three goats$four goats$SQUIRREL!", array.join("$"));
+
+    for (int i = 0, n = items.length; i < n; ++i) {
+      assertEquals(i, array.indexOf(newItems[i]));
+      assertTrue(array.contains(newItems[i]));
+    }
+
+    final String imposter = "Pajamas?";
+    assertEquals(-1, array.indexOf(imposter));
+    assertFalse(array.contains(imposter));
+
+    final String[] itemsA = new String[] {"atlanta", "eagle"};
+    final String[] itemsB = new String[] {"chaps", "profit"};
+    final ArrayOfString a = arrayFrom(itemsA);
+    final ArrayOfString b = arrayFrom(itemsB);
+    assertSamelitude(new String[] {itemsA[0], itemsA[1], itemsB[0], itemsB[1]}, a.concat(b));
+    assertSamelitude(itemsA, a);
+    assertSamelitude(itemsB, b);
+  }
+
+  /**
+   * Tests {@link ArrayOf#insert(int, Object)}.
+   */
+  public void testInsertingIntoArrays() {
+    final ArrayOf<TestItem> array = Collections.arrayOf(TestItem.class);
+
+    final TestItem a = new TestItem(0);
+    array.insert(0, a);
+    assertSamelitude(new TestItem[] {a}, array);
+
+    final TestItem b = new TestItem(1);
+    array.insert(0, b);
+    assertSamelitude(new TestItem[] {b, a}, array);
+
+    final TestItem c = new TestItem(2);
+    array.insert(100, c);
+    assertSamelitude(new TestItem[] {b, a, c}, array);
+
+    final TestItem d = new TestItem(3);
+    array.insert(-1, d);
+    assertSamelitude(new TestItem[] {b, a, d, c}, array);
+  }
+
+  /**
+   * Tests {@link ArrayOfBoolean#insert(int, boolean)}.
+   */
+  public void testInsertingIntoArraysOfBooleans() {
+    final ArrayOfBoolean array = Collections.arrayOfBoolean();
+
+    array.insert(0, true);
+    assertSamelitude(new boolean[] {true}, array);
+
+    array.insert(0, false);
+    assertSamelitude(new boolean[] {false, true}, array);
+
+    array.insert(100, false);
+    assertSamelitude(new boolean[] {false, true, false}, array);
+
+    array.insert(-1, true);
+    assertSamelitude(new boolean[] {false, true, true, false}, array);
+  }
+
+  /**
+   * Tests {@link ArrayOfInt#insert(int, int)}.
+   */
+  public void testInsertingIntoArraysOfInts() {
+    final ArrayOfInt array = Collections.arrayOfInt();
+
+    array.insert(0, 0);
+    assertSamelitude(new int[] {0}, array);
+
+    array.insert(0, 1);
+    assertSamelitude(new int[] {1, 0}, array);
+
+    array.insert(100, 2);
+    assertSamelitude(new int[] {1, 0, 2}, array);
+
+    array.insert(-1, 3);
+    assertSamelitude(new int[] {1, 0, 3, 2}, array);
+  }
+
+  /**
+   * Tests {@link ArrayOfNumber#insert(int, double)}.
+   */
+  public void testInsertingIntoArraysOfNumbers() {
+    final ArrayOfNumber array = Collections.arrayOfNumber();
+
+    array.insert(0, 0.1);
+    assertSamelitude(new double[] {0.1}, array);
+
+    array.insert(0, 0.2);
+    assertSamelitude(new double[] {0.2, 0.1}, array);
+
+    array.insert(100, 0.3);
+    assertSamelitude(new double[] {0.2, 0.1, 0.3}, array);
+
+    array.insert(-1, 0.4);
+    assertSamelitude(new double[] {0.2, 0.1, 0.4, 0.3}, array);
+  }
+
+  /**
+   * Tests {@link ArrayOfString#insert(int, String)}.
+   */
+  public void testInsertingIntoArraysOfStrings() {
+    final ArrayOfString array = Collections.arrayOfString();
+
+    array.insert(0, "beer");
+    assertSamelitude(new String[] {"beer"}, array);
+
+    array.insert(0, "cigars");
+    assertSamelitude(new String[] {"cigars", "beer"}, array);
+
+    array.insert(100, "porn");
+    assertSamelitude(new String[] {"cigars", "beer", "porn"}, array);
+
+    array.insert(-1, "profit");
+    assertSamelitude(new String[] {"cigars", "beer", "profit", "porn"}, array);
+  }
+
+  /**
+   * Tests {@link ArrayOf#sort(CanCompare)}.
+   */
+  public void testSortingOfArrays() {
+    final TestItem[] items =
+        new TestItem[] {new TestItem(0), new TestItem(1), new TestItem(2), new TestItem(3)};
+
+    final ArrayOf<TestItem> array = Collections.arrayOf(TestItem.class);
+    array.push(items[2]);
+    array.push(items[1]);
+    array.push(items[3]);
+    array.push(items[0]);
+
+    array.sort(new CanCompare<TestItem>() {
+      @Override
+      public int compare(TestItem a, TestItem b) {
+        return a.id() - b.id();
+      }
+    });
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = array.length(); i < n; ++i) {
+      assertEquals(items[i], array.get(i));
+    }
+  }
+
+  /**
+   * Tests {@link ArrayOfInt#sort()} and
+   * {@link ArrayOfInt#sort(CanCompareInt)}.
+   */
+  public void testSortingOfArraysOfInts() {
+    final int[] items = new int[] {0, 1, 2, 3};
+    final ArrayOfInt array = Collections.arrayOfInt();
+    array.push(items[2]);
+    array.push(items[1]);
+    array.push(items[0]);
+    array.push(items[3]);
+
+    array.sort();
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = array.length(); i < n; ++i) {
+      assertEquals(items[i], array.get(i));
+    }
+
+    array.sort(new CanCompareInt() {
+      @Override
+      public int compare(int a, int b) {
+        return b - a;
+      }
+    });
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = array.length(); i < n; ++i) {
+      assertEquals(items[n - 1 - i], array.get(i));
+    }
+  }
+
+  /**
+   * Tests {@link ArrayOfNumber#sort()} and
+   * {@link ArrayOfNumber#sort(CanCompareNumber)}.
+   */
+  public void testSortingOfArraysOfNumbers() {
+    final double[] items = new double[] {0.0, 0.1, 0.2, 0.3};
+    final ArrayOfNumber array = Collections.arrayOfNumber();
+    array.push(items[2]);
+    array.push(items[1]);
+    array.push(items[3]);
+    array.push(items[0]);
+
+    array.sort();
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = array.length(); i < n; ++i) {
+      assertEquals(items[i], array.get(i), 0.01);
+    }
+
+    array.sort(new CanCompareNumber() {
+      @Override
+      public int compare(double a, double b) {
+        return (a > b) ? -1 : (a < b) ? 1 : 0;
+      }
+    });
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = array.length(); i < n; ++i) {
+      assertEquals(items[n - 1 - i], array.get(i), 0.01);
+    }
+  }
+
+  /**
+   * Tests {@link ArrayOfString#sort()} and
+   * {@link ArrayOfString#sort(CanCompareString)}.
+   */
+  public void testSortingOfArraysOfStrings() {
+    final String[] items = new String[] {"aaa", "aab", "baa", "bab"};
+    final ArrayOfString array = Collections.arrayOfString();
+    array.push(items[2]);
+    array.push(items[1]);
+    array.push(items[3]);
+    array.push(items[0]);
+
+    array.sort();
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = array.length(); i < n; ++i) {
+      assertEquals(items[i], array.get(i));
+    }
+
+    array.sort(new CanCompareString() {
+      @Override
+      public native int compare(String a, String b) /*-{
+    return (a > b) ? -1 : (a < b) ? 1 : 0;
+  }-*/;
+    });
+    assertEquals(items.length, array.length());
+    for (int i = 0, n = array.length(); i < n; ++i) {
+      assertEquals(items[n - 1 - i], array.get(i));
+    }
+  }
+
+  /**
+   * Tests {@link ArrayOf#splice(int, int)}.
+   */
+  public void testSplicingOfArrays() {
+    final TestItem[] items = new TestItem[] {
+        new TestItem(0), new TestItem(1), new TestItem(2), new TestItem(3), new TestItem(4)};
+
+    final ArrayOf<TestItem> a = arrayFrom(items);
+    assertSamelitude(items, a.splice(0, items.length));
+    assertSamelitude(new TestItem[] {}, a);
+
+    final ArrayOf<TestItem> b = arrayFrom(items);
+    assertSamelitude(new TestItem[] {}, b.splice(0, 0));
+    assertSamelitude(items, b);
+
+    final ArrayOf<TestItem> c = arrayFrom(items);
+    assertSamelitude(new TestItem[] {items[0], items[1]}, c.splice(0, 2));
+    assertSamelitude(new TestItem[] {items[2], items[3], items[4]}, c);
+  }
+
+  /**
+   * Tests {@link ArrayOfBoolean#splice(int, int)}.
+   */
+  public void testSplicingOfArraysOfBooleans() {
+    final boolean[] items = new boolean[] {true, false, true, false, true};
+
+    final ArrayOfBoolean a = arrayFrom(items);
+    assertSamelitude(items, a.splice(0, items.length));
+    assertSamelitude(new boolean[] {}, a);
+
+    final ArrayOfBoolean b = arrayFrom(items);
+    assertSamelitude(new boolean[] {}, b.splice(0, 0));
+    assertSamelitude(items, b);
+
+    final ArrayOfBoolean c = arrayFrom(items);
+    assertSamelitude(new boolean[] {items[0], items[1]}, c.splice(0, 2));
+    assertSamelitude(new boolean[] {items[2], items[3], items[4]}, c);
+  }
+
+  /**
+   * Tests {@link ArrayOfInt#splice(int, int)}.
+   */
+  public void testSplicingOfArraysOfInts() {
+    final int[] items = new int[] {0, 1, 2, 3, 4};
+
+    final ArrayOfInt a = arrayFrom(items);
+    assertSamelitude(items, a.splice(0, items.length));
+    assertSamelitude(new int[] {}, a);
+
+    final ArrayOfInt b = arrayFrom(items);
+    assertSamelitude(new int[] {}, b.splice(0, 0));
+    assertSamelitude(items, b);
+
+    final ArrayOfInt c = arrayFrom(items);
+    assertSamelitude(new int[] {items[0], items[1]}, c.splice(0, 2));
+    assertSamelitude(new int[] {items[2], items[3], items[4]}, c);
+  }
+
+  /**
+   * Tests {@link ArrayOfNumber#splice(int, int)}.
+   */
+  public void testSplicingOfArraysOfNumbers() {
+    final double[] items = new double[] {0.0, 0.01, 0.001, 0.0001, 0.00001};
+
+    final ArrayOfNumber a = arrayFrom(items);
+    assertSamelitude(items, a.splice(0, items.length));
+    assertSamelitude(new double[] {}, a);
+
+    final ArrayOfNumber b = arrayFrom(items);
+    assertSamelitude(new double[] {}, b.splice(0, 0));
+    assertSamelitude(items, b);
+
+    final ArrayOfNumber c = arrayFrom(items);
+    assertSamelitude(new double[] {items[0], items[1]}, c.splice(0, 2));
+    assertSamelitude(new double[] {items[2], items[3], items[4]}, c);
+  }
+
+  /**
+   * Tests {@link ArrayOfString#splice(int, int)}.
+   */
+  public void testSplicingOfArraysOfStrings() {
+    final String[] items =
+        new String[] {"One Gerbil", "Two Gerbil", "Three Gerbil", "Four Gerbil", "Five Gerbil"};
+
+    final ArrayOfString a = arrayFrom(items);
+    assertSamelitude(items, a.splice(0, items.length));
+    assertSamelitude(new String[] {}, a);
+
+    final ArrayOfString b = arrayFrom(items);
+    assertSamelitude(new String[] {}, b.splice(0, 0));
+    assertSamelitude(items, b);
+
+    final ArrayOfString c = arrayFrom(items);
+    assertSamelitude(new String[] {items[0], items[1]}, c.splice(0, 2));
+    assertSamelitude(new String[] {items[2], items[3], items[4]}, c);
+  }
+}
diff --git a/elemental/tests/elemental/js/util/JsGlobalsTests.java b/elemental/tests/elemental/js/util/JsGlobalsTests.java
new file mode 100644
index 0000000..c5f88dc
--- /dev/null
+++ b/elemental/tests/elemental/js/util/JsGlobalsTests.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package elemental.js.util;
+
+import com.google.gwt.junit.client.GWTTestCase;
+import static elemental.js.util.JsGlobals.*;
+
+/**
+ * Tests {@link JsGlobals}.
+ */
+public class JsGlobalsTests extends GWTTestCase {
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  public void testBasicInvocations() {
+    assertEquals("chicken dog", decodeURI("chicken%20dog"));
+    assertEquals("dog chicken", decodeURIComponent("dog%20chicken"));
+    assertEquals("chicken%20dog", encodeURI("chicken dog"));
+    assertEquals("dog%20chicken", encodeURIComponent("dog chicken"));
+    
+    assertEquals(2.032, parseFloat("2.032 raincoats"), 0.0001);
+    assertEquals(10, (int)parseInt("10 dogs"));
+    
+    assertTrue(isFinite(2.0));
+    assertFalse(isFinite(parseFloat("butterbean")));
+    
+    assertFalse(isNaN(2.0));
+    assertTrue(isNaN(parseFloat("greenbean")));
+  }
+}
diff --git a/elemental/tests/elemental/js/util/MapFromIntTests.java b/elemental/tests/elemental/js/util/MapFromIntTests.java
new file mode 100644
index 0000000..abb1661
--- /dev/null
+++ b/elemental/tests/elemental/js/util/MapFromIntTests.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import static elemental.js.util.TestUtils.assertSamelitude;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import elemental.util.Collections;
+import elemental.util.MapFromIntTo;
+import elemental.util.MapFromIntToString;
+
+/**
+ * Tests {@link MapFromIntTo} and {@link MapFromIntToString}.
+ */
+public class MapFromIntTests extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  /**
+   * Tests {@link MapFromIntTo}.
+   */
+  public void testMapsFromInts() {
+    // This is our test subject.
+    final MapFromIntTo<TestItem> map = Collections.mapFromIntTo(TestItem.class);
+
+    // These are his keys.
+    final int[] keys = new int[] {1, 2, 3};
+
+    // These are the values for those keys.
+    final TestItem[] vals = new TestItem[] {new TestItem(0), new TestItem(1), new TestItem(2)};
+
+    // Let's put those values in.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], vals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(vals[i], map.get(keys[i]));
+    }
+
+    // These are some new values.
+    final TestItem[] newVals = new TestItem[] {new TestItem(3), new TestItem(4), new TestItem(5)};
+
+    // Let's update those keys, ok.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], newVals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(newVals[i], map.get(keys[i]));
+    }
+
+    assertSamelitude(keys, map.keys());
+    assertSamelitude(newVals, map.values());
+
+    // Let's remove a key, did it go away?
+    map.remove(keys[0]);
+    assertNull(map.get(keys[0]));
+    assertFalse(map.hasKey(keys[0]));
+  }
+
+  /**
+   * Tests {@link MapFromIntToString}.
+   */
+  public void testMapsFromIntstoStrings() {
+    // This is our test subject.
+    final MapFromIntToString map = Collections.mapFromIntToString();
+
+    // These are his keys.
+    final int[] keys = new int[] {1, 2, 3};
+
+    // These are the values for those keys.
+    final String[] vals = new String[] {"val-0", "val-1", "val-2"};
+
+    // Let's put those values in.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], vals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(vals[i], map.get(keys[i]));
+    }
+
+    // These are some new values.
+    final String[] newVals = new String[] {"val-3", "val-4", "val-5"};
+
+    // Let's update those keys, ok.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], newVals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(newVals[i], map.get(keys[i]));
+    }
+
+    assertSamelitude(keys, map.keys());
+    assertSamelitude(newVals, map.values());
+
+    // Let's remove a key, did it go away?
+    map.remove(keys[0]);
+    assertNull(map.get(keys[0]));
+    assertFalse(map.hasKey(keys[0]));
+  }
+}
diff --git a/elemental/tests/elemental/js/util/MapFromStringTests.java b/elemental/tests/elemental/js/util/MapFromStringTests.java
new file mode 100644
index 0000000..e86a81a
--- /dev/null
+++ b/elemental/tests/elemental/js/util/MapFromStringTests.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import static elemental.js.util.TestUtils.assertSamelitude;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import elemental.util.Collections;
+import elemental.util.MapFromStringTo;
+import elemental.util.MapFromStringToBoolean;
+import elemental.util.MapFromStringToInt;
+import elemental.util.MapFromStringToNumber;
+import elemental.util.MapFromStringToString;
+
+/**
+ * Tests {@link MapFromStringTo}, {@link MapFromStringToBoolean},
+ * {@link MapFromStringToInt}, {@link MapFromStringToNumber} and
+ * {@link MapFromStringToString}.
+ */
+public class MapFromStringTests extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  /**
+   * Tests {@link MapFromStringTo}.
+   */
+  public void testMapsFromString() {
+    // This is our test subject.
+    final MapFromStringTo<TestItem> map =  Collections.mapFromStringTo(TestItem.class);
+
+    // These are his keys.
+    final String[] keys = new String[] {"key-1", "key-2", "key-3"};
+
+    // These are the values for those keys.
+    final TestItem[] vals = new TestItem[] {new TestItem(0), new TestItem(1), new TestItem(2)};
+
+    // Let's put those values in.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], vals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(vals[i], map.get(keys[i]));
+    }
+
+    // These are some new values.
+    final TestItem[] newVals = new TestItem[] {new TestItem(3), new TestItem(4), new TestItem(5)};
+
+    // Let's update those keys, ok.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], newVals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(newVals[i], map.get(keys[i]));
+    }
+
+    assertSamelitude(keys, map.keys());
+    assertSamelitude(newVals, map.values());
+
+    // Let's remove a key, did it go away?
+    map.remove(keys[0]);
+    assertNull(map.get(keys[0]));
+    assertFalse(map.hasKey(keys[0]));
+  }
+
+  /**
+   * Tests {@link MapFromStringToInt}.
+   */
+  public void testMapsFromStringsToInts() {
+    // This is our test subject.
+    final MapFromStringToInt map = Collections.mapFromStringToInt();
+
+    // These are his keys.
+    final String[] keys = new String[] {"key-1", "key-2", "key-3"};
+
+    // These are the values for those keys.
+    final int[] vals = new int[] {0, 1, 2};
+
+    // Let's put those values in.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], vals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(vals[i], map.get(keys[i]));
+    }
+
+    // These are some new values.
+    final int[] newVals = new int[] {3, 4, 5};
+
+    // Let's update those keys, ok.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], newVals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(newVals[i], map.get(keys[i]));
+    }
+
+    assertSamelitude(keys, map.keys());
+    assertSamelitude(newVals, map.values());
+
+    // Let's remove a key, did it go away?
+    map.remove(keys[0]);
+    assertFalse(map.hasKey(keys[0]));
+  }
+
+  /**
+   * Tests {@link MapFromStringToNumber}.
+   */
+  public void testMapsFromStringsToNumbers() {
+    // This is our test subject.
+    final MapFromStringToNumber map = Collections.mapFromStringToNumber();
+
+    // These are his keys.
+    final String[] keys = new String[] {"key-1", "key-2", "key-3"};
+
+    // These are the values for those keys.
+    final double[] vals = new double[] {0.0, 1.0, 2.0};
+
+    // Let's put those values in.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], vals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(vals[i], map.get(keys[i]));
+    }
+
+    // These are some new values.
+    final double[] newVals = new double[] {3.0, 4.0, 5.0};
+
+    // Let's update those keys, ok.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], newVals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(newVals[i], map.get(keys[i]));
+    }
+
+    assertSamelitude(keys, map.keys());
+    assertSamelitude(newVals, map.values());
+
+    // Let's remove a key, did it go away?
+    map.remove(keys[0]);
+    assertFalse(map.hasKey(keys[0]));
+  }
+
+  /**
+   * Tests {@link MapFromStringToString}.
+   */
+  public void testMapsFromStringsToStrings() {
+    // This is our test subject.
+    final MapFromStringToString map = Collections.mapFromStringToString();
+
+    // These are his keys.
+    final String[] keys = new String[] {"key-1", "key-2", "key-3"};
+
+    // These are the values for those keys.
+    final String[] vals = new String[] {"val-0", "val-1", "val-2"};
+
+    // Let's put those values in.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], vals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(vals[i], map.get(keys[i]));
+    }
+
+    // These are some new values.
+    final String[] newVals = new String[] {"val-3", "val-4", "val-5"};
+
+    // Let's update those keys, ok.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], newVals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(newVals[i], map.get(keys[i]));
+    }
+
+    assertSamelitude(keys, map.keys());
+    assertSamelitude(newVals, map.values());
+
+    // Let's remove a key, did it go away?
+    map.remove(keys[0]);
+    assertNull(map.get(keys[0]));
+    assertFalse(map.hasKey(keys[0]));
+  }
+
+  /**
+   * Tests {@link MapFromStringToBoolean}.
+   */
+  public void testsMapFromStringsToBooleans() {
+    // This is our test subject.
+    final MapFromStringToBoolean map = Collections.mapFromStringToBoolean();
+
+    // These are his keys.
+    final String[] keys = new String[] {"key-1", "key-2", "key-3"};
+
+    // These are the values for those keys.
+    final boolean[] vals = new boolean[] {true, false, true};
+
+    // Let's put those values in.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], vals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(vals[i], map.get(keys[i]));
+    }
+
+    // These are some new values.
+    final boolean[] newVals = new boolean[] {false, true, false};
+
+    // Let's update those keys, ok.
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      map.put(keys[i], newVals[i]);
+    }
+
+    // Are they all in the right place?
+    for (int i = 0, n = keys.length; i < n; ++i) {
+      assertTrue(map.hasKey(keys[i]));
+      assertEquals(newVals[i], map.get(keys[i]));
+    }
+
+    assertSamelitude(keys, map.keys());
+    assertSamelitude(newVals, map.values());
+
+    // Let's remove a key, did it go away?
+    map.remove(keys[0]);
+    assertFalse(map.hasKey(keys[0]));
+  }
+}
diff --git a/elemental/tests/elemental/js/util/StringUtilTests.java b/elemental/tests/elemental/js/util/StringUtilTests.java
new file mode 100644
index 0000000..846c5ec
--- /dev/null
+++ b/elemental/tests/elemental/js/util/StringUtilTests.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+import com.google.gwt.junit.client.GWTTestCase;
+import elemental.util.ArrayOfString;
+
+/**
+ * Tests {@link StringUtil}.
+ *
+ */
+public class StringUtilTests extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  private static void assertSame(String[] expected, ArrayOfString result) {
+    assertEquals(expected.length, result.length());
+    for (int i = 0, n = expected.length; i < n; ++i) {
+      assertEquals(expected[i], result.get(i));
+    }
+  }
+
+  /**
+   * Tests {@link StringUtil#split(String, String)} and
+   * {@link StringUtil#split(String, String, int)}.
+   */
+  public void testSplit() {
+    assertSame(
+        new String[] {"abc", "", "", "de", "f", "", ""}, StringUtil.split("abcxxxdexfxx", "x"));
+    assertSame(new String[] {"a", "b", "c", "x", "x", "d", "e", "x", "f", "x"},
+        StringUtil.split("abcxxdexfx", ""));
+    final String booAndFoo = "boo:and:foo";
+    assertSame(new String[] {"boo", "and"}, StringUtil.split(booAndFoo, ":", 2));
+    assertSame(new String[] {"boo", "and", "foo"}, StringUtil.split(booAndFoo, ":", 5));
+    assertSame(new String[] {"boo", "and", "foo"}, StringUtil.split(booAndFoo, ":", -2));
+    assertSame(new String[] {"", ""}, StringUtil.split("/", "/"));
+    assertSame(new String[] {""}, StringUtil.split("", ","));
+  }
+}
diff --git a/elemental/tests/elemental/js/util/TestItem.java b/elemental/tests/elemental/js/util/TestItem.java
new file mode 100644
index 0000000..c4b13d4a
--- /dev/null
+++ b/elemental/tests/elemental/js/util/TestItem.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.js.util;
+
+/**
+ * A simple object for testing collections.
+ */
+public class TestItem {
+  private final int id;
+
+  public TestItem(int id) {
+    this.id = id;
+  }
+
+  public int id() {
+    return id;
+  }
+
+  @Override
+  public String toString() {
+    return "item" + id;
+  }
+}
diff --git a/elemental/tests/elemental/js/util/TestUtils.java b/elemental/tests/elemental/js/util/TestUtils.java
new file mode 100644
index 0000000..0fe5308
--- /dev/null
+++ b/elemental/tests/elemental/js/util/TestUtils.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package elemental.js.util;
+
+import static junit.framework.Assert.assertEquals;
+
+import elemental.util.ArrayOf;
+import elemental.util.ArrayOfBoolean;
+import elemental.util.ArrayOfInt;
+import elemental.util.ArrayOfNumber;
+import elemental.util.ArrayOfString;
+
+/**
+ * Static test utilities for the tests in this package.
+ */
+class TestUtils {
+  static void assertSamelitude(boolean[] expected, ArrayOfBoolean values) {
+    assertEquals(expected.length, values.length());
+    for (int i = 0, n = expected.length; i < n; ++i) {
+      assertEquals(expected[i], values.get(i));
+    }
+  }
+
+  static void assertSamelitude(double[] expected, ArrayOfNumber values) {
+    assertEquals(expected.length, values.length());
+    for (int i = 0, n = expected.length; i < n; ++i) {
+      assertEquals(expected[i], values.get(i));
+    }
+  }
+
+  static void assertSamelitude(int[] expected, ArrayOfInt values) {
+    assertEquals(expected.length, values.length());
+    for (int i = 0, n = expected.length; i < n; ++i) {
+      assertEquals(expected[i], values.get(i));
+    }
+  }
+
+  static void assertSamelitude(String[] expected, ArrayOfString values) {
+    assertEquals(expected.length, values.length());
+    for (int i = 0, n = expected.length; i < n; ++i) {
+      assertEquals(expected[i], values.get(i));
+    }
+  }
+
+  static void assertSamelitude(TestItem[] expected, ArrayOf<TestItem> values) {
+    assertEquals(expected.length, values.length());
+    for (int i = 0, n = expected.length; i < n; ++i) {
+      assertEquals(expected[i], values.get(i));
+    }
+  }
+
+  private TestUtils() {
+  }
+}
diff --git a/elemental/tests/elemental/json/JsonUtilTest.java b/elemental/tests/elemental/json/JsonUtilTest.java
new file mode 100755
index 0000000..d9e2265
--- /dev/null
+++ b/elemental/tests/elemental/json/JsonUtilTest.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.json;
+
+import com.google.gwt.junit.DoNotRunWith;
+import com.google.gwt.junit.Platform;
+import com.google.gwt.junit.client.GWTTestCase;
+
+import elemental.json.impl.JsonUtil;
+
+/**
+ * Tests for {@link JsonUtil}
+ */
+@DoNotRunWith(Platform.Prod)
+public class JsonUtilTest extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  public void testCoercions() {
+    // test boolean coercions
+    JsonBoolean boolTrue = Json.create(true);
+    JsonBoolean boolFalse = Json.create(false);
+    // true -> 1, false -> 0
+    assertEquals(true, boolTrue.asBoolean());
+    assertEquals(false, boolFalse.asBoolean());
+
+    JsonString trueString = Json.create("true");
+    JsonString falseString = Json.create("");
+    // "" -> false, others true
+    assertEquals(true, trueString.asBoolean());
+    assertEquals(false, falseString.asBoolean());
+
+    // != 0 -> true, otherwise if 0.0 or -0.0 false
+    JsonNumber trueNumber = Json.create(1.0);
+    JsonNumber falseNumber = Json.create(0.0);
+    JsonNumber falseNumber2 = Json.create(-0.0);
+    assertEquals(true, trueNumber.asBoolean());
+    assertEquals(false, falseNumber.asBoolean());
+    assertEquals(false, falseNumber2.asBoolean());
+
+    // array or object is true
+    assertEquals(true, Json.createArray().asBoolean());
+    assertEquals(true, Json.createObject().asBoolean());
+
+    // null is false
+    assertEquals(false, Json.createNull().asBoolean());
+
+    // test number coercions
+    assertEquals(1.0, boolTrue.asNumber());
+    assertEquals(0.0, boolFalse.asNumber());
+
+    assertEquals(42.0, Json.create("42").asNumber());
+    // non numbers are NaN
+    assertTrue(Double.isNaN(trueString.asNumber()));
+    // null is 0
+    assertEquals(0.0, Json.createNull().asNumber());
+    // "" is 0
+    assertEquals(0.0, falseString.asNumber());
+
+    // [] -> 0
+    assertEquals(0.0, Json.createArray().asNumber());
+    // [[42]] -> 42
+    JsonArray nested = Json.createArray();
+    JsonArray outer = Json.createArray();
+    outer.set(0, nested);
+    nested.set(0, 42);
+    assertEquals(42.0, outer.asNumber());
+
+    // [[42, 45]] -> NaN
+    nested.set(1, 45);
+    assertTrue(Double.isNaN(outer.asNumber()));
+
+    // object -> NaN
+    assertTrue(Double.isNaN(Json.createObject().asNumber()));
+
+
+    // test string coercions
+    assertEquals("true", boolTrue.asString());
+    assertEquals("false", boolFalse.asString());
+    assertEquals("true", trueString.asString());
+
+    assertEquals("null", Json.createNull().asString());
+    assertEquals("42", Json.create(42).asString());
+
+    // [[42, 45], [52, 55]] -> "42, 45, 52, 55"
+    JsonArray inner2 = Json.createArray();
+    inner2.set(0, 52);
+    inner2.set(1, 55);
+    outer.set(1, inner2);
+    assertEquals("42, 45, 52, 55", outer.asString());
+
+    // object -> [object Object]
+    assertEquals("[object Object]", Json.createObject().asString());
+  }
+  
+  public void testEscapeControlChars() {
+    String unicodeString = "\u2060Test\ufeffis a test\u17b5";
+    assertEquals("\\u00002060Test\\u0000feffis a test\\u000017b5",
+        JsonUtil.escapeControlChars(unicodeString));
+  }
+
+  public void testIllegalParse() {
+    try {
+      JsonUtil.parse("{ \"a\": new String() }");
+      fail("Expected JsonException to be thrown");
+    } catch (JsonException je) {
+      // Expected
+    }
+  }
+
+  public void testLegalParse() {
+    JsonValue obj = JsonUtil.parse(
+        "{ \"a\":1, \"b\":\"hello\", \"c\": true,"
+            + "\"d\": null, \"e\": [1,2,3,4], \"f\": {} }");
+    assertNotNull(obj);
+  }
+
+  public void testNative() {
+    JsonObject obj = Json.createObject();
+    obj.put("x", 42);
+    Object nativeObj = obj.toNative();
+
+    JsonObject result = nativeMethod(nativeObj);
+    assertEquals(43.0, result.get("y").asNumber());
+  }
+
+  public void testQuote() {
+    String badString = "\bThis\"is\ufeff\ta\\bad\nstring\u2029\u2029";
+    assertEquals("\"\\bThis\\\"is\\u0000feff\\ta\\\\bad\\nstring"
+        + "\\u00002029\\u00002029\"", JsonUtil.quote(badString));
+  }
+
+  public void testStringify() {
+    String json = "{\"a\":1,\"b\":\"hello\",\"c\":true,"
+        + "\"d\":null,\"e\":[1,2,3,4],\"f\":{\"x\":1}}";
+    assertEquals(json, JsonUtil.stringify(JsonUtil.parse(json)));
+  }
+
+  public void testStringifyCycle() {
+    String json = "{\"a\":1,\"b\":\"hello\",\"c\":true,"
+        + "\"d\":null,\"e\":[1,2,3,4],\"f\":{\"x\":1}}";
+    JsonObject obj = JsonUtil.parse(json);
+    obj.put("cycle", obj);
+    try {
+      elemental.json.impl.JsonUtil.stringify(obj);
+      fail("Expected JsonException for object cycle");
+    } catch (JsonException je) {
+    }
+  }
+ 
+  public void testStringifyIndent() {
+    // test string taken from native Chrome window.JSON.stringify
+    String json = "{\n" + "  \"a\": 1,\n" + "  \"b\": \"hello\",\n"
+        + "  \"c\": true,\n" + "  \"d\": null,\n" + "  \"e\": [\n" + "    1,\n"
+        + "    2,\n" + "    3,\n" + "    4\n" + "  ],\n" + "  \"f\": {\n"
+        + "    \"x\": 1\n" + "  }\n" + "}";
+    assertEquals(json, JsonUtil.stringify(JsonUtil.parse(json), 2));
+  }
+
+  public void testStringifyNonCycle() {
+    String json = "{\"a\":1,\"b\":\"hello\",\"c\":true,"
+        + "\"d\":null,\"e\":[1,2,3,4],\"f\":{\"x\":1}}";
+    JsonObject obj = JsonUtil.parse(json);
+    JsonObject obj2 = JsonUtil.parse("{\"x\": 1, \"y\":2}");
+    obj.put("nocycle", obj2);
+    obj.put("nocycle2", obj2);
+    try {
+      JsonUtil.stringify(obj);
+    } catch (JsonException je) {
+      fail("JsonException for object cycle when none exists: " + je);
+    }
+  }
+
+  public void testStringifyOrder() {
+
+    JsonObject obj = Json.instance().createObject();
+    obj.put("x", "hello");
+    obj.put("a", "world");
+    obj.put("2", 21);
+    obj.put("1", 42);
+    // numbers come first, in ascending order, non-numbers in order of assignment
+    assertEquals("{\"1\":42,\"2\":21,\"x\":\"hello\",\"a\":\"world\"}",
+        obj.toJson());
+  }
+
+  public void testStringifySkipKeys() {
+    String expectedJson = "{\"a\":1,\"b\":\"hello\",\"c\":true," 
+        + "\"d\":null,\"e\":[1,2,3,4],\"f\":{\"x\":1}}";
+    String json = "{\"a\":1,\"b\":\"hello\",\"c\":true,"
+        + "\"$H\": 1,"
+        + "\"__gwt_ObjectId\": 1,"
+        + "\"d\":null,\"e\":[1,2,3,4],\"f\":{\"x\":1}}";
+    assertEquals(expectedJson, JsonUtil.stringify(
+        JsonUtil.parse(json)));
+  }
+
+  private native JsonObject nativeMethod(Object o) /*-{
+    o.y = o.x + 1;
+    return o;
+  }-*/;
+}
diff --git a/elemental/tests/elemental/util/TimerTest.java b/elemental/tests/elemental/util/TimerTest.java
new file mode 100644
index 0000000..dc5759a
--- /dev/null
+++ b/elemental/tests/elemental/util/TimerTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package elemental.util;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Tests for {@link Timer}.
+ */
+public class TimerTest extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "elemental.Elemental";
+  }
+
+  /**
+   * Tests that {@link Timer#schedule(int)} works.
+   */
+  public void testTimeout() {
+    new Timer() {
+      @Override
+      public void run() {
+        finishTest();
+      }
+    }.schedule(500);
+
+    delayTestFinish(2000);
+  }
+
+  /**
+   * Tests that {@link Timer#scheduleRepeating(int)} works repeatedly.
+   */
+  public void testInterval() {
+    new Timer() {
+      int count;
+
+      @Override
+      public void run() {
+        // Make sure we see at least two events.
+        ++count;
+        if (count >= 2) {
+          cancel();
+          finishTest();
+        }
+      }
+    }.scheduleRepeating(100);
+
+    delayTestFinish(2000);
+  }
+}
