2011-06-16 Julien Chaffraix <jchaffraix@webkit.org>
authorjchaffraix@webkit.org <jchaffraix@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Jun 2011 16:50:19 +0000 (16:50 +0000)
committerjchaffraix@webkit.org <jchaffraix@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Jun 2011 16:50:19 +0000 (16:50 +0000)
        Reviewed by Darin Adler.

        HTMLTable should cache its 'rows' collection results
        https://bugs.webkit.org/show_bug.cgi?id=62800

        * perf/table-rows-length-caching-expected.txt: Added.
        * perf/table-rows-length-caching.html: Added.
        This test checks that the call to table.rows is CONSTANT once it has
        been populated once (and the DOM is not mutated).
2011-06-16  Julien Chaffraix  <jchaffraix@webkit.org>

        Reviewed by Darin Adler.

        HTMLTable should cache its 'rows' collection results
        https://bugs.webkit.org/show_bug.cgi?id=62800

        Test: perf/table-rows-length-caching.html

        Currently all our HTMLCollection's are recreated on call. This means that
        we don't cache the information about the collection between calls to, for
        example, table.rows.

        This change adds a CollectionCache to HTMLTableElement. It is similar to what
        is done for HTMLFormElement.

        * html/HTMLTableElement.cpp:
        (WebCore::HTMLTableElement::collectionCache): This method does
        lazy initialization of the table's collectionCache.
        * html/HTMLTableElement.h: Added a new member and the previous
        method.

        * html/HTMLTableRowsCollection.cpp:
        (WebCore::HTMLTableRowsCollection::HTMLTableRowsCollection): Pass
        the HTMLTableElement's CollectionCache so that we reuse the cached
        results.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@89035 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/perf/table-rows-length-caching-expected.txt [new file with mode: 0644]
LayoutTests/perf/table-rows-length-caching.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/html/HTMLTableElement.cpp
Source/WebCore/html/HTMLTableElement.h
Source/WebCore/html/HTMLTableRowsCollection.cpp

index 52721c6..a85695d 100644 (file)
@@ -1,3 +1,15 @@
+2011-06-16  Julien Chaffraix  <jchaffraix@webkit.org>
+
+        Reviewed by Darin Adler.
+
+        HTMLTable should cache its 'rows' collection results
+        https://bugs.webkit.org/show_bug.cgi?id=62800
+
+        * perf/table-rows-length-caching-expected.txt: Added.
+        * perf/table-rows-length-caching.html: Added.
+        This test checks that the call to table.rows is CONSTANT once it has
+        been populated once (and the DOM is not mutated).
+
 2011-06-16  Vitaly Repeshko  <vitalyr@chromium.org>
 
         Unreviewed.
diff --git a/LayoutTests/perf/table-rows-length-caching-expected.txt b/LayoutTests/perf/table-rows-length-caching-expected.txt
new file mode 100644 (file)
index 0000000..092b55d
--- /dev/null
@@ -0,0 +1,3 @@
+Tests that check that table.row.length is properly cached
+PASS
+
diff --git a/LayoutTests/perf/table-rows-length-caching.html b/LayoutTests/perf/table-rows-length-caching.html
new file mode 100644 (file)
index 0000000..e134e9b
--- /dev/null
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<body>
+<div id='sandbox'></div>
+<div id="console"></div>
+<script src="../resources/magnitude-perf.js"></script>
+<script>
+
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+var table;
+var sandbox = document.getElementById('sandbox');
+
+// Check that table.rows.length is properly cached.
+
+function setupTableRows(magnitude)
+{
+    if (sandbox.firstChild)
+        sandbox.removeChild(sandbox.firstChild);
+    table = document.createElement('table');
+
+    for (var i = 0; i < magnitude; ++i) {
+        var tr = document.createElement('tr');
+        table.appendChild(tr);
+    }
+    sandbox.appendChild(table);
+
+    // Make sure we have cached the length before testing!
+    table.rows.length;
+}
+
+function testTableRows(magnitude)
+{
+    table.rows.length;
+}
+
+Magnitude.description('Tests that check that table.row.length is properly cached');
+Magnitude.run(setupTableRows, testTableRows, Magnitude.CONSTANT);
+sandbox.removeChild(sandbox.firstChild);
+</script>
+</body>
+</html>
index 627ed4a..f586a19 100644 (file)
@@ -1,3 +1,30 @@
+2011-06-16  Julien Chaffraix  <jchaffraix@webkit.org>
+
+        Reviewed by Darin Adler.
+
+        HTMLTable should cache its 'rows' collection results
+        https://bugs.webkit.org/show_bug.cgi?id=62800
+
+        Test: perf/table-rows-length-caching.html
+
+        Currently all our HTMLCollection's are recreated on call. This means that
+        we don't cache the information about the collection between calls to, for
+        example, table.rows.
+
+        This change adds a CollectionCache to HTMLTableElement. It is similar to what
+        is done for HTMLFormElement.
+
+        * html/HTMLTableElement.cpp:
+        (WebCore::HTMLTableElement::collectionCache): This method does
+        lazy initialization of the table's collectionCache.
+        * html/HTMLTableElement.h: Added a new member and the previous
+        method.
+
+        * html/HTMLTableRowsCollection.cpp:
+        (WebCore::HTMLTableRowsCollection::HTMLTableRowsCollection): Pass
+        the HTMLTableElement's CollectionCache so that we reuse the cached
+        results.
+
 2011-06-16  Sheriff Bot  <webkit.review.bot@gmail.com>
 
         Unreviewed, rolling out r89025.
index e554620..59b063a 100644 (file)
@@ -624,6 +624,14 @@ void HTMLTableElement::addSharedGroupDecls(bool rows, Vector<CSSMutableStyleDecl
     results.append(decl);
 }
 
+CollectionCache* HTMLTableElement::collectionCache() const
+{
+    if (!m_collectionCache)
+        m_collectionCache = adoptPtr(new CollectionCache());
+
+    return m_collectionCache.get();
+}
+
 void HTMLTableElement::attach()
 {
     ASSERT(!attached());
index da3dc30..05e3486 100644 (file)
@@ -68,6 +68,8 @@ public:
     void addSharedCellDecls(Vector<CSSMutableStyleDeclaration*>&);
     void addSharedGroupDecls(bool rows, Vector<CSSMutableStyleDeclaration*>&);
 
+    CollectionCache* collectionCache() const;
+
 private:
     HTMLTableElement(const QualifiedName&, Document*);
 
@@ -100,6 +102,7 @@ private:
 
     unsigned short m_padding;
     RefPtr<CSSMappedAttributeDeclaration> m_paddingDecl;
+    mutable OwnPtr<CollectionCache> m_collectionCache;
 };
 
 } //namespace
index 20143d9..4681a85 100644 (file)
@@ -149,7 +149,7 @@ HTMLTableRowElement* HTMLTableRowsCollection::lastRow(HTMLTableElement* table)
 }
 
 HTMLTableRowsCollection::HTMLTableRowsCollection(PassRefPtr<HTMLTableElement> table)
-    : HTMLCollection(table, OtherCollection, 0)
+    : HTMLCollection(table, OtherCollection, table->collectionCache())
 {
 }