Changeset 104865 in webkit


Ignore:
Timestamp:
Jan 12, 2012 3:12:29 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

IndexedDB: Throw exception if IDBCursor.continue() called with key equal to current
https://bugs.webkit.org/show_bug.cgi?id=76100

Source/WebCore:

The fix for https://bugs.webkit.org/show_bug.cgi?id=74213 missed the "or equal" clause
in the spec.

Patch by Joshua Bell <jsbell@chromium.org> on 2012-01-12
Reviewed by Tony Chang.

Test: storage/indexeddb/cursor-continue.html

  • storage/IDBCursorBackendImpl.cpp:

(WebCore::IDBCursorBackendImpl::continueFunction):

LayoutTests:

The previously existing clauses that iterated a cursor over non-unique values
by specifing a key now fail per spec, so they are changed to simply call continue().

Patch by Joshua Bell <jsbell@chromium.org> on 2012-01-12
Reviewed by Tony Chang.

  • storage/indexeddb/cursor-continue-expected.txt:
  • storage/indexeddb/cursor-continue.html:
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r104864 r104865  
     12012-01-12  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: Throw exception if IDBCursor.continue() called with key equal to current
     4        https://bugs.webkit.org/show_bug.cgi?id=76100
     5
     6        The previously existing clauses that iterated a cursor over non-unique values
     7        by specifing a key now fail per spec, so they are changed to simply call continue().
     8
     9        Reviewed by Tony Chang.
     10
     11        * storage/indexeddb/cursor-continue-expected.txt:
     12        * storage/indexeddb/cursor-continue.html:
     13
    1142012-01-12  Jon Lee  <jonlee@apple.com>
    215
  • trunk/LayoutTests/storage/indexeddb/cursor-continue-expected.txt

    r104506 r104865  
    4141event.target.result.continue(3.14159)
    4242PASS event.target.result.primaryKey is 3
    43 event.target.result.continue(3.14159)
     43event.target.result.continue()
    4444PASS event.target.result.primaryKey is 4
    45 event.target.result.continue(3.14159)
     45event.target.result.continue()
    4646PASS event.target.result.primaryKey is 5
    4747event.target.result.continue(12)
     
    4949event.target.result.continue(date)
    5050PASS event.target.result.primaryKey is 9
    51 event.target.result.continue(date)
     51event.target.result.continue()
    5252PASS event.target.result.primaryKey is 10
    53 event.target.result.continue(date)
     53event.target.result.continue()
    5454PASS event.target.result.primaryKey is 11
    5555event.target.result.continue('A bit1')
     
    5959event.target.result.continue('the BIGGEST string')
    6060PASS event.target.result.primaryKey is 17
    61 event.target.result.continue('the BIGGEST string')
     61event.target.result.continue()
    6262PASS event.target.result is null
    6363
     
    6666event.target.result.continue('A bit2')
    6767PASS event.target.result.primaryKey is 15
    68 event.target.result.continue('A bit2')
     68event.target.result.continue()
    6969PASS event.target.result.primaryKey is 14
    7070event.target.result.continue(date)
    7171PASS event.target.result.primaryKey is 10
    72 event.target.result.continue(date)
     72event.target.result.continue()
    7373PASS event.target.result.primaryKey is 9
    7474event.target.result.continue(1)
    7575PASS event.target.result.primaryKey is 2
    76 event.target.result.continue(1)
     76event.target.result.continue()
    7777PASS event.target.result.primaryKey is 1
    78 event.target.result.continue(1)
     78event.target.result.continue()
    7979PASS event.target.result.primaryKey is 0
    8080event.target.result.continue()
     
    8989PASS code is IDBDatabaseException.DATA_ERR
    9090
     91indexObject.openKeyCursor(null, IDBCursor.NEXT)
     92PASS event.target.result.primaryKey is 0
     93event.target.result.continue(3.14159)
     94PASS event.target.result.primaryKey is 3
     95Expecting exception from event.target.result.continue(3.14159)
     96PASS Exception was thrown.
     97PASS code is IDBDatabaseException.DATA_ERR
     98
    9199indexObject.openKeyCursor(null, IDBCursor.PREV)
    92100PASS event.target.result.primaryKey is 17
     
    96104PASS Exception was thrown.
    97105PASS code is IDBDatabaseException.DATA_ERR
     106
     107indexObject.openKeyCursor(null, IDBCursor.PREV)
     108PASS event.target.result.primaryKey is 17
     109event.target.result.continue('A bit2')
     110PASS event.target.result.primaryKey is 15
     111Expecting exception from event.target.result.continue('A bit2')
     112PASS Exception was thrown.
     113PASS code is IDBDatabaseException.DATA_ERR
    98114PASS successfullyParsed is true
    99115
  • trunk/LayoutTests/storage/indexeddb/cursor-continue.html

    r104506 r104865  
    102102    } else if (window.stage == 1) {
    103103        shouldBe("event.target.result.primaryKey", "3");
    104         evalAndLog("event.target.result.continue(3.14159)");
     104        evalAndLog("event.target.result.continue()");
    105105    } else if (window.stage == 2) {
    106106        shouldBe("event.target.result.primaryKey", "4");
    107         evalAndLog("event.target.result.continue(3.14159)");
     107        evalAndLog("event.target.result.continue()");
    108108    } else if (window.stage == 3) {
    109109        shouldBe("event.target.result.primaryKey", "5");
     
    114114    } else if (window.stage == 5) {
    115115        shouldBe("event.target.result.primaryKey", "9");
    116         evalAndLog("event.target.result.continue(date)");
     116        evalAndLog("event.target.result.continue()");
    117117    } else if (window.stage == 6) {
    118118        shouldBe("event.target.result.primaryKey", "10");
    119         evalAndLog("event.target.result.continue(date)");
     119        evalAndLog("event.target.result.continue()");
    120120    } else if (window.stage == 7) {
    121121        shouldBe("event.target.result.primaryKey", "11");
     
    129129    } else if (window.stage == 10) {
    130130        shouldBe("event.target.result.primaryKey", "17");
    131         evalAndLog("event.target.result.continue('the BIGGEST string')");
     131        evalAndLog("event.target.result.continue()");
    132132    } else if (window.stage == 11) {
    133133        shouldBeNull("event.target.result");
     
    156156    } else if (window.stage == 1) {
    157157        shouldBe("event.target.result.primaryKey", "15");
    158         evalAndLog("event.target.result.continue('A bit2')");
     158        evalAndLog("event.target.result.continue()");
    159159    } else if (window.stage == 2) {
    160160        shouldBe("event.target.result.primaryKey", "14");
     
    162162    } else if (window.stage == 3) {
    163163        shouldBe("event.target.result.primaryKey", "10");
    164         evalAndLog("event.target.result.continue(date)");
     164        evalAndLog("event.target.result.continue()");
    165165    } else if (window.stage == 4) {
    166166        shouldBe("event.target.result.primaryKey", "9");
     
    168168    } else if (window.stage == 5) {
    169169        shouldBe("event.target.result.primaryKey", "2");
    170         evalAndLog("event.target.result.continue(1)");
     170        evalAndLog("event.target.result.continue()");
    171171    } else if (window.stage == 6) {
    172172        shouldBe("event.target.result.primaryKey", "1");
    173         evalAndLog("event.target.result.continue(1)");
     173        evalAndLog("event.target.result.continue()");
    174174    } else if (window.stage == 7) {
    175175        shouldBe("event.target.result.primaryKey", "0");
     
    177177    } else if (window.stage == 8) {
    178178        shouldBeNull("event.target.result");
    179         ascendingErrorTest();
     179        ascendingErrorTestLessThan();
    180180        return;
    181181    } else {
     
    185185}
    186186
    187 function ascendingErrorTest()
     187function ascendingErrorTestLessThan()
    188188{
    189189    debug("");
     
    198198            shouldBe("event.target.result.primaryKey", "3");
    199199            evalAndExpectException("event.target.result.continue(1)", "IDBDatabaseException.DATA_ERR");
    200             descendingErrorTest();
    201             return;
    202         } else {
    203            testFailed("Illegal stage.");
    204         }
    205         window.stage++;
    206     };
    207 }
    208 
    209 function descendingErrorTest()
     200            ascendingErrorTestEqual();
     201            return;
     202        } else {
     203           testFailed("Illegal stage.");
     204        }
     205        window.stage++;
     206    };
     207}
     208
     209function ascendingErrorTestEqual()
     210{
     211    debug("");
     212    var request = evalAndLog("indexObject.openKeyCursor(null, IDBCursor.NEXT)");
     213    window.stage = 0;
     214    request.onerror = unexpectedErrorCallback;
     215    request.onsuccess = function() {
     216        if (window.stage === 0) {
     217            shouldBe("event.target.result.primaryKey", "0");
     218            evalAndLog("event.target.result.continue(3.14159)");
     219        } else if (window.stage == 1) {
     220            shouldBe("event.target.result.primaryKey", "3");
     221            evalAndExpectException("event.target.result.continue(3.14159)", "IDBDatabaseException.DATA_ERR");
     222            descendingErrorTestGreaterThan();
     223            return;
     224        } else {
     225           testFailed("Illegal stage.");
     226        }
     227        window.stage++;
     228    };
     229}
     230
     231function descendingErrorTestGreaterThan()
    210232{
    211233    debug("");
     
    220242            shouldBe("event.target.result.primaryKey", "15");
    221243            evalAndExpectException("event.target.result.continue('A bit3')", "IDBDatabaseException.DATA_ERR");
     244            descendingErrorTestEqual();
     245            return;
     246        } else {
     247           testFailed("Illegal stage.");
     248        }
     249        window.stage++;
     250    };
     251}
     252
     253function descendingErrorTestEqual()
     254{
     255    debug("");
     256    var request = evalAndLog("indexObject.openKeyCursor(null, IDBCursor.PREV)");
     257    window.stage = 0;
     258    request.onerror = unexpectedErrorCallback;
     259    request.onsuccess = function() {
     260        if (window.stage == 0) {
     261            shouldBe("event.target.result.primaryKey", "17");
     262            evalAndLog("event.target.result.continue('A bit2')");
     263        } else if (window.stage == 1) {
     264            shouldBe("event.target.result.primaryKey", "15");
     265            evalAndExpectException("event.target.result.continue('A bit2')", "IDBDatabaseException.DATA_ERR");
    222266            done();
    223267            return;
  • trunk/Source/WebCore/ChangeLog

    r104864 r104865  
     12012-01-12  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: Throw exception if IDBCursor.continue() called with key equal to current
     4        https://bugs.webkit.org/show_bug.cgi?id=76100
     5
     6        The fix for https://bugs.webkit.org/show_bug.cgi?id=74213 missed the "or equal" clause
     7        in the spec.
     8
     9        Reviewed by Tony Chang.
     10
     11        Test: storage/indexeddb/cursor-continue.html
     12
     13        * storage/IDBCursorBackendImpl.cpp:
     14        (WebCore::IDBCursorBackendImpl::continueFunction):
     15
    1162012-01-12  Jon Lee  <jonlee@apple.com>
    217
  • trunk/Source/WebCore/storage/IDBCursorBackendImpl.cpp

    r104771 r104865  
    102102        ASSERT(m_cursor->key());
    103103        if (m_direction == IDBCursor::NEXT || m_direction == IDBCursor::NEXT_NO_DUPLICATE) {
    104             if (key->isLessThan(m_cursor->key().get())) {
     104            if (!m_cursor->key()->isLessThan(key.get())) {
    105105                ec = IDBDatabaseException::DATA_ERR;
    106106                return;
    107107            }
    108108        } else {
    109             if (m_cursor->key()->isLessThan(key.get())) {
     109            if (!key->isLessThan(m_cursor->key().get())) {
    110110                ec = IDBDatabaseException::DATA_ERR;
    111111                return;
Note: See TracChangeset for help on using the changeset viewer.