]> source.dussan.org Git - gwtquery.git/commitdiff
Performance: the method element() was called in almost all other gquery methods,...
authorManolo Carrasco <manolo@apache.org>
Thu, 5 May 2011 11:37:46 +0000 (11:37 +0000)
committerManolo Carrasco <manolo@apache.org>
Thu, 5 May 2011 11:37:46 +0000 (11:37 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
gwtquery-core/src/main/java/com/google/gwt/query/client/LazyGQuery.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java

index f4ead7db45ee30f1bed923dca17558fb7173b626..414022bc96815185346c7f80cd8be761b4dba84b 100644 (file)
@@ -158,17 +158,17 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Create a new GQuery given a list of nodes, elements or widgets\r
    */\r
   public static GQuery $(List<?> nodesOrWidgets) {\r
-    JsNodeArray elements = JsNodeArray.create();\r
+    JsNodeArray elms = JsNodeArray.create();\r
     if (nodesOrWidgets != null) {\r
       for (Object o : nodesOrWidgets) {\r
         if (o instanceof Node) {\r
-          elements.addNode((Node) o);\r
+          elms.addNode((Node) o);\r
         } else if (o instanceof Widget) {\r
-          elements.addNode(((Widget) o).getElement());\r
+          elms.addNode(((Widget) o).getElement());\r
         }\r
       }\r
     }\r
-    return new GQuery(elements);\r
+    return new GQuery(elms);\r
   }\r
 \r
   /**\r
@@ -181,8 +181,8 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   /**\r
    * Wrap a GQuery around existing Elements.\r
    */\r
-  public static GQuery $(NodeList<Element> elements) {\r
-    return new GQuery(elements);\r
+  public static GQuery $(NodeList<Element> elms) {\r
+    return new GQuery(elms);\r
   }\r
 \r
   /**\r
@@ -222,13 +222,11 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
       return $();\r
     }\r
     if (selectorOrHtml.trim().charAt(0) == '<') {\r
-      Document doc = ctx instanceof Document ? ctx.<Document> cast()\r
-          : ctx.getOwnerDocument();\r
-      return $(cleanHtmlString(selectorOrHtml, doc));\r
+      return $(cleanHtmlString(selectorOrHtml, getOwnerDocument(ctx)));\r
     }\r
     return new GQuery().select(selectorOrHtml, ctx);\r
   }\r
-\r
+  \r
   /**\r
    * This function accepts a string containing a CSS selector which is then used\r
    * to match a set of elements, or it accepts raw HTML creating a GQuery\r
@@ -398,17 +396,17 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
       return jsArrayToString0(array);\r
     } else {\r
       String result[] = new String[array.length()];\r
-      for (int i = 0; i < result.length; i++) {\r
+      for (int i = 0, l = result.length; i < l; i++) {\r
         result[i] = array.get(i);\r
       }\r
       return result;\r
     }\r
   }\r
 \r
-  private static JsNodeArray copyNodeList(NodeList<? extends Node> n) {\r
+  private static JsNodeArray copyNodeList(NodeList<? extends Node> nodes) {\r
     JsNodeArray res = JsNodeArray.create();\r
-    for (int i = 0; i < n.getLength(); i++) {\r
-      res.addNode(n.getItem(i), i);\r
+    for (int i = 0, l = nodes.getLength(); i < l; i++) {\r
+      res.addNode(nodes.getItem(i), i);\r
     }\r
     return res;\r
   }\r
@@ -425,6 +423,11 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
                        @com.google.gwt.query.client.GQuery::emptyDocument(Lcom/google/gwt/dom/client/Document;)(d);\r
                return d;\r
   }-*/;\r
+  \r
+  private static Document getOwnerDocument(Node n) {\r
+    return n== null || n.getNodeType() == Node.DOCUMENT_NODE ? \r
+        n.<Document> cast() : n.getOwnerDocument();\r
+  }\r
 \r
   private static boolean hasClass(Element e, String clz) {\r
     return e.getClassName().matches("(^|.*\\s)" + clz + "(\\s.*|$)");\r
@@ -468,7 +471,15 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   protected String currentSelector;\r
   protected Node currentContext;\r
 \r
-  private NodeList<Element> elements = JavaScriptObject.createArray().cast();\r
+  /**\r
+   * The nodeList of matched elements, modify this using setArray\r
+   */\r
+  private NodeList<Element> nodeList = JavaScriptObject.createArray().cast();\r
+  \r
+  /**\r
+   * Immutable array of matched elements, modify this using setArray\r
+   */\r
+  private Element[] elements = new Element[0];\r
 \r
   private GQuery previousObject;\r
 \r
@@ -482,29 +493,23 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   }\r
 \r
   private GQuery(Element element) {\r
-    if (element != null) {\r
-      elements = JsNodeArray.create(element);\r
-    }\r
+    this(JsNodeArray.create(element));\r
   }\r
 \r
-  private GQuery(JsNodeArray elements) {\r
-    if (elements != null) {\r
-      this.elements = elements;\r
-    }\r
+  private GQuery(JsNodeArray nodes) {\r
+    this(nodes.<NodeList<Element>>cast());\r
   }\r
 \r
   private GQuery(NodeList<Element> list) {\r
-    if (list != null) {\r
-      elements = list;\r
-    }\r
+    setArray(list);\r
   }\r
-\r
+  \r
   /**\r
    * Add elements to the set of matched elements if they are not included yet.\r
    * It also update the selector appending the new one.\r
    */\r
   public GQuery add(GQuery previousObject) {\r
-    return pushStack(unique(merge(elements, previousObject.elements)), "add",\r
+    return pushStack(unique(merge(nodeList, previousObject.nodeList)), "add",\r
         getSelector() + "," + previousObject.getSelector());\r
   }\r
 \r
@@ -520,7 +525,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Adds the specified classes to each matched element.\r
    */\r
   public GQuery addClass(String... classes) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       for (String clz : classes) {\r
         e.addClassName(clz);\r
       }\r
@@ -789,7 +794,9 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * B.\r
    */\r
   public GQuery appendTo(Node n) {\r
-    $(n).append(this);\r
+    GQuery a = $(n);\r
+    GQuery b = this;\r
+    a.append(b);\r
     return this;\r
   }\r
 \r
@@ -831,7 +838,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Properties("src: 'test.jpg', alt: 'Test Image'"))\r
    */\r
   public GQuery attr(Properties properties) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       for (String name : properties.keys()) {\r
         e.setAttribute(name, properties.getStr(name));\r
       }\r
@@ -853,9 +860,9 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Set a single property to a computed value, on all matched elements.\r
    */\r
   public GQuery attr(String key, Function closure) {\r
-    for (int i = 0; i < elements.getLength(); i++) {\r
-      Element e = elements.getItem(i);\r
-      Object val = closure.f(e.<com.google.gwt.dom.client.Element>cast(), i);\r
+    int i = 0;\r
+    for (Element e : elements) {\r
+      Object val = closure.f(e.<com.google.gwt.dom.client.Element>cast(), i++);\r
       if (val != null) {\r
         e.setAttribute(key, String.valueOf(val));\r
       }\r
@@ -867,7 +874,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Set a single property to a value, on all matched elements.\r
    */\r
   public GQuery attr(String key, String value) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       e.setAttribute(key, value);\r
     }\r
     return this;\r
@@ -954,7 +961,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery children() {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       allNextSiblingElements(e.getFirstChildElement(), result, null, null);\r
     }\r
     return new GQuery(unique(result));\r
@@ -1003,7 +1010,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery clone() {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       result.addNode(e.cloneNode(true));\r
     }\r
     GQuery ret = new GQuery(result);\r
@@ -1110,7 +1117,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
     GQuery pos = selector.matches(POS_REGEX) ? $(selector, context) : null;\r
     JsNodeArray result = JsNodeArray.create();\r
 \r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       Element current = e;\r
       while (current != null && current.getOwnerDocument() != null\r
           && current != context) {\r
@@ -1134,7 +1141,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery contains(String text) {\r
     JsNodeArray array = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if ($(e).text().contains(text)) {\r
         array.addNode(e);\r
       }\r
@@ -1148,12 +1155,12 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery contents() {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if ("iframe".equalsIgnoreCase(e.getTagName())) {\r
         result.addNode(getContentDocument(e));\r
       } else {\r
         NodeList<Node> children = e.getChildNodes();\r
-        for (int i = 0; i < children.getLength(); i++) {\r
+        for (int i = 0, l = children.getLength(); i < l; i++) {\r
           result.addNode(children.getItem(i));\r
         }\r
       }\r
@@ -1187,7 +1194,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * \r
    */\r
   public GQuery css(CssSetter... cssSetter) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       for (CssSetter s : cssSetter) {\r
         s.applyCss(e);\r
       }\r
@@ -1269,7 +1276,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * \r
    */\r
   public GQuery css(String prop, String val) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       styleImpl.setStyleProperty(e, prop, val);\r
     }\r
     return this;\r
@@ -1332,7 +1339,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Stores the value in the named spot with desired return type.\r
    */\r
   public GQuery data(String name, Object value) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       data(e, name, value);\r
     }\r
     return this;\r
@@ -1477,7 +1484,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery delegate(String selector, String eventType, Object data,\r
       Function... handlers) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       $(selector, e).live(eventType, data, handlers);\r
     }\r
 \r
@@ -1561,7 +1568,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   public GQuery delegate(String selector, int eventbits, Object data,\r
       Function... handlers) {\r
 \r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       $(selector, e).live(eventbits, data, handlers);\r
     }\r
 \r
@@ -1649,8 +1656,9 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   public GQuery each(Function... f) {\r
     if (f != null) {\r
       for (Function f1 : f) {\r
-        for (int i = 0; i < elements.getLength(); i++) {\r
-          f1.f(elements.getItem(i).<com.google.gwt.dom.client.Element>cast(), i);\r
+        int i = 0;\r
+        for (Element e : elements) {\r
+          f1.f(e.<com.google.gwt.dom.client.Element>cast(), i++);\r
         }\r
       }\r
     }\r
@@ -1662,11 +1670,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * modify this array, e.g. assign to its elements, or call Arrays.sort()\r
    */\r
   public Element[] elements() {\r
-    Element[] elts = new Element[elements.getLength()];\r
-    for (int i = 0; i < elts.length; i++) {\r
-      elts[i] = elements.getItem(i);\r
-    }\r
-    return elts;\r
+    return elements;\r
   }\r
 \r
   /**\r
@@ -1675,7 +1679,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * whenever you create a new iframe and you want to add dynamic content to it.\r
    */\r
   public GQuery empty() {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if (e.getNodeType() == Element.DOCUMENT_NODE) {\r
         emptyDocument(e.<Document> cast());\r
       } else {\r
@@ -1777,9 +1781,9 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery filter(Predicate filterFn) {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (int i = 0; i < elements.getLength(); i++) {\r
-      Element e = elements.getItem(i);\r
-      if (filterFn.f(e, i)) {\r
+    int i = 0;\r
+    for (Element e : elements) {\r
+      if (filterFn.f(e, i++)) {\r
         result.addNode(e);\r
       }\r
     }\r
@@ -1797,7 +1801,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
     JsNodeArray array = JsNodeArray.create();\r
 \r
     for (String f : filters) {\r
-      for (Element e : elements()) {\r
+      for (Element e : elements) {\r
         boolean ghostParent = false;\r
 \r
         if (e.getParentNode() == null) {\r
@@ -1805,7 +1809,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
           ghostParent = true;\r
         }\r
 \r
-        for (Element c : $(f, e.getParentNode()).elements()) {\r
+        for (Element c : $(f, e.getParentNode()).elements) {\r
           if (c == e) {\r
             array.addNode(c);\r
             break;\r
@@ -1831,8 +1835,8 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   public GQuery find(String... filters) {\r
     JsNodeArray array = JsNodeArray.create();\r
     for (String selector : filters) {\r
-      for (Element e : elements()) {\r
-        for (Element c : $(selector, e).elements()) {\r
+      for (Element e : elements) {\r
+        for (Element c : $(selector, e).elements) {\r
           array.addNode(c);\r
         }\r
       }\r
@@ -1860,7 +1864,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * for a method which returns them as an immutable Java array.\r
    */\r
   public NodeList<Element> get() {\r
-    return elements;\r
+    return nodeList;\r
   }\r
 \r
   /**\r
@@ -1879,12 +1883,12 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * </pre>\r
    */\r
   public Element get(int i) {\r
-    int l = elements.getLength();\r
+    int l = elements.length;\r
     if (i >= 0 && i < l) {\r
-      return elements.getItem(i);\r
+      return elements[i];\r
     }\r
     if (i < 0 && l + i >= 0) {\r
-      return elements.getItem(l + i);\r
+      return elements[l + i];\r
     }\r
     return null;\r
   }\r
@@ -1923,7 +1927,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * elements.\r
    */\r
   public boolean hasClass(String... classes) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       for (String clz : classes) {\r
         if (hasClass(e, clz)) {\r
           return true;\r
@@ -1945,7 +1949,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Set the height of every element in the matched set.\r
    */\r
   public GQuery height(int height) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       e.getStyle().setPropertyPx("height", height);\r
     }\r
     return this;\r
@@ -1963,7 +1967,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Make invisible all matched elements.\r
    */\r
   public GQuery hide() {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       Object old = data(e, "oldDisplay", null);\r
       if (old == null) {\r
         data(e, "oldDisplay", styleImpl.curCSS(e, "display", false));\r
@@ -1997,7 +2001,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Set the innerHTML of every matched element.\r
    */\r
   public GQuery html(String html) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if (e.getNodeType() == Node.DOCUMENT_NODE) {\r
         e = e.<Document> cast().getBody();\r
       }\r
@@ -2024,10 +2028,12 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Find the index of the specified Element.\r
    */\r
   public int index(Element element) {\r
-    for (int i = 0; i < elements.getLength(); i++) {\r
-      if (elements.getItem(i) == element) {\r
+    int i = 0;\r
+    for (Element e : elements) {\r
+      if (e == element) {\r
         return i;\r
       }\r
+      i++;\r
     }\r
     return -1;\r
   }\r
@@ -2061,7 +2067,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * elements.\r
    */\r
   public GQuery insertAfter(GQuery query) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       query.after(e);\r
     }\r
     return this;\r
@@ -2094,7 +2100,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * an element after another if it's not in the page).\r
    */\r
   public GQuery insertBefore(GQuery query) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       query.before(e);\r
     }\r
     return this;\r
@@ -2344,9 +2350,10 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public <W> List<W> map(Function f) {\r
     ArrayList<W> ret = new ArrayList<W>();\r
-    for (int i = 0; i < elements().length; i++) {\r
+    int i = 0;\r
+    for (Element e : elements) {\r
       @SuppressWarnings("unchecked")\r
-      W o = (W)f.f(elements()[i].<com.google.gwt.dom.client.Element>cast(), i);\r
+      W o = (W)f.f(e.<com.google.gwt.dom.client.Element>cast(), i++);\r
       if (o != null) {\r
         ret.add(o);\r
       }\r
@@ -2401,7 +2408,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery next() {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       Element next = e.getNextSiblingElement();\r
       if (next != null) {\r
         result.addNode(next);\r
@@ -2418,7 +2425,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery next(String... selectors) {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       Element next = e.getNextSiblingElement();\r
       if (next != null) {\r
         result.addNode(next);\r
@@ -2433,7 +2440,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery nextAll() {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       allNextSiblingElements(e.getNextSiblingElement(), result, null, null);\r
     }\r
     return pushStack(unique(result), "nextAll", getSelector());\r
@@ -2448,7 +2455,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery nextUntil(String selector) {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       allNextSiblingElements(e.getNextSiblingElement(), result, null, selector);\r
     }\r
     return pushStack(unique(result), "nextUntil", getSelector());\r
@@ -2460,7 +2467,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery not(Element elem) {\r
     JsNodeArray array = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if (e != elem) {\r
         array.addNode(e);\r
       }\r
@@ -2474,7 +2481,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery not(GQuery gq) {\r
     GQuery ret = this;\r
-    for (Element e : gq.elements()) {\r
+    for (Element e : gq.elements) {\r
       ret = ret.not(e);\r
     }\r
     return ret;\r
@@ -2512,7 +2519,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
     if (isEmpty()) {\r
       return $();\r
     }\r
-    Element offParent = JsUtils.or(elements.getItem(0).getOffsetParent(), body);\r
+    Element offParent = JsUtils.or(get(0).getOffsetParent(), body);\r
     while (offParent != null\r
         && !"body".equalsIgnoreCase(offParent.getTagName())\r
         && !"html".equalsIgnoreCase(offParent.getTagName())\r
@@ -2591,7 +2598,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery parent() {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       Element p = e.getParentElement();\r
       if (p != null) {\r
         result.addNode(p);\r
@@ -2633,7 +2640,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery parentsUntil(String selector) {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       Node par = e.getParentNode();\r
       while (par != null && par != document) {\r
         if (selector != null && $(par).is(selector)) {\r
@@ -2767,7 +2774,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery prev() {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       Element next = getPreviousSiblingElement(e);\r
       if (next != null) {\r
         result.addNode(next);\r
@@ -2783,7 +2790,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery prev(String... selectors) {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       Element next = getPreviousSiblingElement(e);\r
       if (next != null) {\r
         result.addNode(next);\r
@@ -2797,7 +2804,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery prevAll() {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       allPreviousSiblingElements(getPreviousSiblingElement(e), result, null);\r
     }\r
     return pushStack(unique(result), "prevAll", getSelector());\r
@@ -2808,7 +2815,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery prevUntil(String selector) {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       allPreviousSiblingElements(getPreviousSiblingElement(e), result, selector);\r
     }\r
     return pushStack(unique(result), "prevUntil", getSelector());\r
@@ -2893,7 +2900,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Remove the named attribute from every element in the matched set.\r
    */\r
   public GQuery removeAttr(String key) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       e.removeAttribute(key);\r
     }\r
     return this;\r
@@ -2903,7 +2910,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Removes the specified classes to each matched element.\r
    */\r
   public GQuery removeClass(String... classes) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       for (String clz : classes) {\r
         e.removeClassName(clz);\r
       }\r
@@ -2915,7 +2922,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Removes named data store from an element.\r
    */\r
   public GQuery removeData(String name) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       removeData(e, name);\r
     }\r
     return this;\r
@@ -2947,12 +2954,10 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
         && parents().filter("body").length() == 0;\r
 \r
     List<Element> newElements = new ArrayList<Element>();\r
-    for (int i = 0; i < target.elements().length; i++) {\r
+    for (int i = 0, l = target.size(); i < l; i++) {\r
       GQuery _this = (i > 0 && mustBeCloned) ? this.clone() : this;\r
       $(target.get(i)).replaceWith(_this);\r
-\r
-      newElements.addAll(Arrays.asList(_this.elements()));\r
-\r
+      newElements.addAll(Arrays.asList(_this.elements));\r
     }\r
     return $(newElements);\r
   }\r
@@ -2986,7 +2991,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    *         from the DOM and not the new element that has replaced it.\r
    */\r
   public GQuery replaceWith(GQuery target) {\r
-    for (Element el : elements()) {\r
+    for (Element el : elements) {\r
       Element nextSibling = el.getNextSiblingElement();\r
 \r
       if (nextSibling != null) {\r
@@ -3008,7 +3013,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    *         from the DOM and not the new element that has replaced it.\r
    */\r
   public GQuery replaceWith(String html) {\r
-    for (Element el : elements()) {\r
+    for (Element el : elements) {\r
       Element nextSibling = el.getNextSiblingElement();\r
 \r
       if (nextSibling != null) {\r
@@ -3040,7 +3045,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Save a set of Css properties of every matched element.\r
    */\r
   public void restoreCssAttrs(String... cssProps) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       for (String a : cssProps) {\r
         styleImpl.setStyleProperty(e, a, (String) data(e, OLD_DATA_PREFIX + a,\r
             null));\r
@@ -3059,7 +3064,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Restore a set of previously saved Css properties in every matched element.\r
    */\r
   public void saveCssAttrs(String... cssProps) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       for (String a : cssProps) {\r
         data(OLD_DATA_PREFIX + a, styleImpl.curCSS(e, a, false));\r
       }\r
@@ -3123,7 +3128,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * This method works for both visible and hidden elements.\r
    */\r
   public GQuery scrollLeft(int left) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if (e == window || e.getNodeName() == null || e == (Node) document) {\r
         Window.scrollTo(left, $(e).scrollTop());\r
       } else {\r
@@ -3171,7 +3176,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * This method works for both visible and hidden elements.\r
    */\r
   public GQuery scrollTop(int top) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if (e == window || e.getNodeName() == null || e == (Node) document) {\r
         Window.scrollTo($(e).scrollLeft(), top);\r
       } else {\r
@@ -3189,8 +3194,15 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Force the current matched set of elements to become the specified array of\r
    * elements.\r
    */\r
-  public GQuery setArray(NodeList<Element> nodes) {\r
-    this.elements = nodes;\r
+  public GQuery setArray(NodeList<Element> list) {\r
+    if (list != null) {\r
+      nodeList = list;\r
+      int l = list.getLength();\r
+      elements = new Element[l];\r
+      for (int i = 0; i < l; i++) {\r
+        elements[i] = list.getItem(i);\r
+      }\r
+    }\r
     return this;\r
   }\r
 \r
@@ -3207,7 +3219,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Make all matched elements visible\r
    */\r
   public GQuery show() {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       styleImpl.setStyleProperty(e, "display", JsUtils.or((String) data(e,\r
           "oldDisplay", null), ""));\r
       // When the display=none is in the stylesheet.\r
@@ -3224,7 +3236,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery siblings() {\r
     JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       allNextSiblingElements(e.getParentElement().getFirstChildElement(),\r
           result, e, null);\r
     }\r
@@ -3243,7 +3255,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Return the number of elements in the matched set.\r
    */\r
   public int size() {\r
-    return elements.getLength();\r
+    return elements.length;\r
   }\r
 \r
   /**\r
@@ -3251,11 +3263,12 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery slice(int start, int end) {\r
     JsNodeArray slice = JsNodeArray.create();\r
-    if (end == -1 || end > elements.getLength()) {\r
-      end = elements.getLength();\r
+    int l = size();\r
+    if (end == -1 || end > l) {\r
+      end = l;\r
     }\r
     for (int i = start; i < end; i++) {\r
-      slice.addNode(elements.getItem(i));\r
+      slice.addNode(get(i));\r
     }\r
     return new GQuery(slice);\r
   }\r
@@ -3330,7 +3343,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public String text() {\r
     String result = "";\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       result += e.getInnerText();\r
     }\r
     return result;\r
@@ -3340,7 +3353,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Set the innerText of every matched element.\r
    */\r
   public GQuery text(String txt) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       e.setInnerText(txt);\r
     }\r
     return this;\r
@@ -3350,7 +3363,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Toggle visibility of elements.\r
    */\r
   public GQuery toggle() {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if ($(e).visible()) {\r
         $(e).hide();\r
       } else {\r
@@ -3365,7 +3378,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Toggle among two or more function calls every other click.\r
    */\r
   public GQuery toggle(final Function... fn) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       $(e).click(new Function() {\r
         int click = 0;\r
 \r
@@ -3383,7 +3396,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * the class's presence.\r
    */\r
   public GQuery toggleClass(String... classes) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       for (String clz : classes) {\r
         if (hasClass(e, clz)) {\r
           e.removeClassName(clz);\r
@@ -3430,7 +3443,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public String toString(boolean pretty) {\r
     String r = "";\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if (window.equals(e)) {\r
         continue;\r
       }\r
@@ -3472,7 +3485,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * {@link #delegate(String, int, Function...)} method\r
    */\r
   public GQuery undelegate(String selector) {\r
-      for (Element e : elements()){\r
+      for (Element e : elements){\r
         $(selector, e).die();\r
       }\r
       \r
@@ -3484,7 +3497,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * {@link #delegate(String, int, Function...)} method\r
    */\r
   public GQuery undelegate(String selector, String eventName) {\r
-      for (Element e : elements()){\r
+      for (Element e : elements){\r
         $(selector, e).die(eventName);\r
       }\r
       \r
@@ -3496,7 +3509,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * {@link #delegate(String, int, Function...)} method\r
    */\r
   public GQuery undelegate(String selector, int eventBit) {\r
-      for (Element e : elements()){\r
+      for (Element e : elements){\r
         $(selector, e).die(eventBit);\r
       }\r
       \r
@@ -3520,7 +3533,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public GQuery unwrap() {\r
 \r
-    for (Element parent : parent().elements()) {\r
+    for (Element parent : parent().elements) {\r
       if (!"body".equalsIgnoreCase(parent.getTagName())) {\r
         GQuery $parent = $(parent);\r
         $parent.replaceWith($parent.children());\r
@@ -3549,14 +3562,14 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * considered.\r
    */\r
   public GQuery val(String... values) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       String name = e.getNodeName();\r
       if ("select".equalsIgnoreCase(name)) {\r
         SelectElement s = SelectElement.as(e);\r
         s.setSelectedIndex(-1);\r
         if (values.length > 1 && s.isMultiple()) {\r
           for (String v : values) {\r
-            for (int i = 0; i < s.getOptions().getLength(); i++) {\r
+            for (int i = 0, l = s.getOptions().getLength(); i < l; i++) {\r
               if (v.equals(s.getOptions().getItem(i).getValue())) {\r
                 s.getOptions().getItem(i).setSelected(true);\r
               }\r
@@ -3613,7 +3626,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
         SelectElement se = SelectElement.as(e);\r
         if (se.isMultiple()) {\r
           JsArrayString result = JsArrayString.createArray().cast();\r
-          for (int i = 0 ; i< se.getOptions().getLength(); i++){\r
+          for (int i = 0, l = se.getOptions().getLength(); i < l; i++){\r
             OptionElement oe = se.getOptions().getItem(i);\r
             if (oe.isSelected()) {\r
               result.set(result.length(), oe.getValue());\r
@@ -3626,7 +3639,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
       } else if (e.getNodeName().equalsIgnoreCase("input")) {\r
         InputElement ie = InputElement.as(e);\r
         if ("radio".equalsIgnoreCase(ie.getType())) {\r
-          for (Element e2 : elements()) {\r
+          for (Element e2 : elements) {\r
             if ("input".equalsIgnoreCase(e2.getNodeName())) {\r
               InputElement ie2 = InputElement.as(e2);\r
               if ("radio".equalsIgnoreCase(ie2.getType()) && ie2.isChecked()\r
@@ -3672,7 +3685,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * if there isn't any.\r
    */\r
   public <W extends Widget> W widget(int n) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       @SuppressWarnings("unchecked")\r
       W w = (W) getAssociatedWidget(e);\r
       if (w != null) {\r
@@ -3690,7 +3703,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    */\r
   public List<Widget> widgets() {\r
     List<Widget> widgets = new ArrayList<Widget>();\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       Widget w = getAssociatedWidget(e);\r
       if (w != null) {\r
         widgets.add(w);\r
@@ -3736,7 +3749,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * Set the width of every matched element.\r
    */\r
   public GQuery width(int width) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       e.getStyle().setPropertyPx("width", width);\r
     }\r
     return this;\r
@@ -3765,7 +3778,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * else.\r
    */\r
   public GQuery wrap(GQuery query) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       $(e).wrapAll(query);\r
     }\r
     return this;\r
@@ -3815,10 +3828,10 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   public GQuery wrapAll(GQuery query) {\r
     if (!isEmpty()) {\r
       GQuery wrap = query.clone();\r
-      if (elements.getItem(0).getParentNode() != null) {\r
-        wrap.insertBefore(elements.getItem(0));\r
+      if (get(0).getParentNode() != null) {\r
+        wrap.insertBefore(get(0));\r
       }\r
-      for (Element e : wrap.elements()) {\r
+      for (Element e : wrap.elements) {\r
         Node n = e;\r
         while (n.getFirstChild() != null\r
             && n.getFirstChild().getNodeType() == Node.ELEMENT_NODE) {\r
@@ -3869,7 +3882,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * that element that will enwrap everything else.\r
    */\r
   public GQuery wrapInner(GQuery query) {\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       $(e).contents().wrapAll(query);\r
     }\r
     return this;\r
@@ -3902,8 +3915,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * <code> filter</code> parameter allows to filter the matched set to remove.\r
    */\r
   protected GQuery remove(String filter, boolean clean) {\r
-\r
-    for (Element e : elements()) {\r
+    for (Element e : elements) {\r
       if (filter == null || $(e).filter(filter).length() == 1) {\r
         if (clean) {\r
           // clean data linked to the children\r
@@ -3919,7 +3931,6 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
         }\r
       }\r
     }\r
-\r
     return this;\r
   }\r
 \r
@@ -3969,20 +3980,24 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   }\r
 \r
   private GQuery domManip(GQuery g, int func, Element... elms) {\r
+    int size = g.size();\r
     JsNodeArray newNodes = JsNodeArray.create();\r
     if (elms.length == 0) {\r
-      elms = elements();\r
+      elms = elements;\r
     }\r
-    for (Element e : elms) {\r
-      // e.getOwnerDocument();\r
+    for (int i = 0, l = elms.length; i < l;i ++) {\r
+      Element e = elms[i];\r
       if (e.getNodeType() == Node.DOCUMENT_NODE) {\r
-        e = e.<Document> cast().getBody();\r
+        e = e.<Document>cast().getBody();\r
       }\r
-      for (int j = 0; j < g.size(); j++) {\r
+      for (int j = 0; j < size; j++) {\r
         // Widget w = getAssociatedWidget(g.get(j));\r
         // GqUi.detachWidget(w);\r
+        \r
         Node n = g.get(j);\r
-        if (g.size() > 1) {\r
+        // If an element selected is inserted elsewhere, it will be moved into the target (not cloned).\r
+        // If there is more than one target element, however, cloned copies of the inserted element will be created for each target after the first\r
+        if (size > 1 || i > 0) {\r
           n = n.cloneNode(true);\r
         }\r
         switch (func) {\r
@@ -4001,20 +4016,21 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
             break;\r
         }\r
         EventsListener.rebind(n.<Element> cast());\r
+        \r
         // GqUi.attachWidget(w);\r
       }\r
     }\r
-    if (newNodes.size() > g.size()) {\r
+    if (newNodes.size() > g.get().getLength()) {\r
       g.setArray(newNodes);\r
     }\r
     return this;\r
   }\r
 \r
+  // TODO: this should be handled by the other domManip method\r
   private GQuery domManip(String htmlString, int func) {\r
     JsMap<Document, GQuery> cache = JsMap.createObject().cast();\r
-    for (Element e : elements()) {\r
-      Document d = e.getNodeType() == Node.DOCUMENT_NODE ? e.<Document> cast()\r
-          : e.getOwnerDocument();\r
+    for (Element e : elements) {\r
+      Document d = getOwnerDocument(e);\r
       GQuery g = cache.get(d);\r
       if (g == null) {\r
         g = cleanHtmlString(htmlString, d);\r
@@ -4034,7 +4050,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
 \r
   private JsNodeArray merge(NodeList<Element> first, NodeList<Element> second) {\r
     JsNodeArray res = copyNodeList(first);\r
-    for (int i = 0; i < second.getLength(); i++) {\r
+    for (int i = 0, l = second.getLength(); i < l; i++) {\r
       res.addNode(second.getItem(i));\r
     }\r
     return res;\r
index 30d0701f49b43ed46a5a77bacf2bddb0fbeaf27e..c8cc0d0a253d5973d106c6dbea66d02fe01ae1a2 100644 (file)
@@ -1839,7 +1839,7 @@ public interface LazyGQuery<T> extends LazyBase<T>{
    * Force the current matched set of elements to become the specified array of
    * elements.
    */
-  LazyGQuery<T> setArray(NodeList<Element> nodes);
+  LazyGQuery<T> setArray(NodeList<Element> list);
 
   void setPreviousObject(GQuery previousObject);
 
index 4f359f7e3f17d28df645b897e0f1e6379fc3d116..f1d7790d907ef30da8f2319c1b2d5303152f0563 100644 (file)
@@ -80,7 +80,7 @@ public class GQueryCoreTest extends GWTTestCase {
   }
 
   public void gwtSetUp() {
-    if (e == null) {
+    if (e == null || DOM.getElementById("core-tst") == null) {
       testPanel = new HTML();
       RootPanel.get().add(testPanel);
       e = testPanel.getElement();
@@ -462,7 +462,25 @@ public class GQueryCoreTest extends GWTTestCase {
     assertEquals(1, g2.size());
     assertEquals(expected, g2.toString());
   }
+  
+  public void testAppendTo() {
+    String txt = "<h2>Greetings</h2><div class='container'><div class='inner'>Hello</div><div class='inner'>Goodbye</div></div>";
+    String expected = "<h2>Greetings</h2><div class='container'><div class='inner'>Hello<p>Test</p></div><div class='inner'>Goodbye<p>Test</p></div></div>";
+    $(e).html(txt);
+    $("<p>Test</p>").appendTo(".inner");
+    assertHtmlEquals(expected, $(e).html());
+    
+    expected = "<div class='container'><div class='inner'>Hello</div><div class='inner'>Goodbye</div><h2>Greetings</h2></div>";
+    $(e).html(txt);
+    $("h2", e).appendTo($(".container"));
+    assertHtmlEquals(expected, $(e).html());
 
+    expected = "<div class='container'><div class='inner'>Hello<h2>Greetings</h2></div><div class='inner'>Goodbye<h2>Greetings</h2></div><h2>Greetings</h2></div><h2>Greetings</h2>";
+    $(e).html(txt);
+    $("h2", e).appendTo($("div"));
+    assertHtmlEquals(expected, $(e).html());
+  }
+  
   public void testOpacity() {
     $(e).html(
         "<p id='id1' style='opacity: 0.6; filter: alpha(opacity=60)'>Content 1</p>");
@@ -1502,4 +1520,5 @@ public class GQueryCoreTest extends GWTTestCase {
 
     label.removeFromParent();
   }
+
 }