Changeset 195997 in webkit


Ignore:
Timestamp:
Feb 1, 2016 5:42:54 PM (8 years ago)
Author:
beidson@apple.com
Message:

Modern IDB: Cursors (still) do not keep their opening request alive.
https://bugs.webkit.org/show_bug.cgi?id=153724

Reviewed by Alex Christensen.

No new tests (All existing tests pass without flakiness).

IDBCursors did not properly keep their JS wrappers alive.
Making them ActiveDOMObjects that keep track of how many requests might be in flight fixes this.
This also makes them actually keep their opening-request live via the opaque-root mechanism.

IDBCursorWithValue also needed to opt in to all of these mechanisms.

  • CMakeLists.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • Modules/indexeddb/IDBCursor.h:

(WebCore::IDBCursor::hasPendingActivity): The base IDBCursor always has no pending activity,

to maintain current behavior in LegacyIDB. This weirdness will go away when LegacyIDB does.

  • Modules/indexeddb/IDBCursor.idl:
  • Modules/indexeddb/IDBCursorWithValue.idl:

Track a count for all outstanding requests to keep the cursor alive as an ActiveDOMObject.

  • Modules/indexeddb/client/IDBCursorImpl.cpp:

(WebCore::IDBClient::IDBCursor::IDBCursor):
(WebCore::IDBClient::IDBCursor::update):
(WebCore::IDBClient::IDBCursor::uncheckedIterateCursor):
(WebCore::IDBClient::IDBCursor::deleteFunction):
(WebCore::IDBClient::IDBCursor::activeDOMObjectName):
(WebCore::IDBClient::IDBCursor::canSuspendForDocumentSuspension):
(WebCore::IDBClient::IDBCursor::hasPendingActivity):
(WebCore::IDBClient::IDBCursor::decrementOutstandingRequestCount):

  • Modules/indexeddb/client/IDBCursorImpl.h:

Rework the "delete" family of functions on the object store to allow for returning a modern IDBRequest.
A lot of this can go away when LegacyIDB does.

  • Modules/indexeddb/client/IDBObjectStoreImpl.cpp:

(WebCore::IDBClient::IDBObjectStore::deleteFunction):
(WebCore::IDBClient::IDBObjectStore::doDelete):
(WebCore::IDBClient::IDBObjectStore::modernDelete):

  • Modules/indexeddb/client/IDBObjectStoreImpl.h:
  • Modules/indexeddb/client/IDBRequestImpl.cpp:

(WebCore::IDBClient::IDBRequest::setSource): Setup a ScopeGuard to decrement the cursor's request

count whenever it makes sense to do so.

(WebCore::IDBClient::IDBRequest::dispatchEvent): Clear the ScopeGuard (if it exists) to decrement the count.
(WebCore::IDBClient::IDBRequest::willIterateCursor): Set the ScopeGuard.
(WebCore::IDBClient::IDBRequest::didOpenOrIterateCursor): Clear the ScopeGuard (if it exists) to decrement the count.

  • Modules/indexeddb/client/IDBRequestImpl.h:
  • Modules/indexeddb/server/UniqueIDBDatabase.cpp:

(WebCore::IDBServer::ScopeGuard::ScopeGuard): Deleted.
(WebCore::IDBServer::ScopeGuard::~ScopeGuard): Deleted.
(WebCore::IDBServer::ScopeGuard::enable): Deleted.
(WebCore::IDBServer::ScopeGuard::disable): Deleted.

  • bindings/js/JSIDBCursorWithValueCustom.cpp: Added.

(WebCore::JSIDBCursorWithValue::visitAdditionalChildren):

  • platform/ScopeGuard.h: Added.

(WebCore::ScopeGuard::ScopeGuard):
(WebCore::ScopeGuard::~ScopeGuard):
(WebCore::ScopeGuard::enable):
(WebCore::ScopeGuard::disable):

Location:
trunk/Source/WebCore
Files:
2 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r195954 r195997  
    11871187    bindings/js/JSIDBAnyCustom.cpp
    11881188    bindings/js/JSIDBCursorCustom.cpp
     1189    bindings/js/JSIDBCursorWithValueCustom.cpp
    11891190    bindings/js/JSIDBDatabaseCustom.cpp
    11901191    bindings/js/JSIDBObjectStoreCustom.cpp
  • trunk/Source/WebCore/ChangeLog

    r195992 r195997  
     12016-02-01  Brady Eidson  <beidson@apple.com>
     2
     3        Modern IDB: Cursors (still) do not keep their opening request alive.
     4        https://bugs.webkit.org/show_bug.cgi?id=153724
     5
     6        Reviewed by Alex Christensen.
     7
     8        No new tests (All existing tests pass without flakiness).
     9
     10        IDBCursors did not properly keep their JS wrappers alive.
     11        Making them ActiveDOMObjects that keep track of how many requests might be in flight fixes this.
     12        This also makes them actually keep their opening-request live via the opaque-root mechanism.
     13       
     14        IDBCursorWithValue also needed to opt in to all of these mechanisms.
     15
     16        * CMakeLists.txt:
     17        * WebCore.xcodeproj/project.pbxproj:
     18
     19        * Modules/indexeddb/IDBCursor.h:
     20        (WebCore::IDBCursor::hasPendingActivity): The base IDBCursor always has no pending activity,
     21          to maintain current behavior in LegacyIDB. This weirdness will go away when LegacyIDB does.
     22        * Modules/indexeddb/IDBCursor.idl:
     23        * Modules/indexeddb/IDBCursorWithValue.idl:
     24
     25        Track a count for all outstanding requests to keep the cursor alive as an ActiveDOMObject.
     26        * Modules/indexeddb/client/IDBCursorImpl.cpp:
     27        (WebCore::IDBClient::IDBCursor::IDBCursor):
     28        (WebCore::IDBClient::IDBCursor::update):
     29        (WebCore::IDBClient::IDBCursor::uncheckedIterateCursor):
     30        (WebCore::IDBClient::IDBCursor::deleteFunction):
     31        (WebCore::IDBClient::IDBCursor::activeDOMObjectName):
     32        (WebCore::IDBClient::IDBCursor::canSuspendForDocumentSuspension):
     33        (WebCore::IDBClient::IDBCursor::hasPendingActivity):
     34        (WebCore::IDBClient::IDBCursor::decrementOutstandingRequestCount):
     35        * Modules/indexeddb/client/IDBCursorImpl.h:
     36       
     37        Rework the "delete" family of functions on the object store to allow for returning a modern IDBRequest.
     38        A lot of this can go away when LegacyIDB does.
     39        * Modules/indexeddb/client/IDBObjectStoreImpl.cpp:
     40        (WebCore::IDBClient::IDBObjectStore::deleteFunction):
     41        (WebCore::IDBClient::IDBObjectStore::doDelete):
     42        (WebCore::IDBClient::IDBObjectStore::modernDelete):
     43        * Modules/indexeddb/client/IDBObjectStoreImpl.h:
     44       
     45        * Modules/indexeddb/client/IDBRequestImpl.cpp:
     46        (WebCore::IDBClient::IDBRequest::setSource): Setup a ScopeGuard to decrement the cursor's request
     47          count whenever it makes sense to do so.
     48        (WebCore::IDBClient::IDBRequest::dispatchEvent): Clear the ScopeGuard (if it exists) to decrement the count.
     49        (WebCore::IDBClient::IDBRequest::willIterateCursor): Set the ScopeGuard.
     50        (WebCore::IDBClient::IDBRequest::didOpenOrIterateCursor): Clear the ScopeGuard (if it exists) to decrement the count.
     51        * Modules/indexeddb/client/IDBRequestImpl.h:
     52       
     53        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     54        (WebCore::IDBServer::ScopeGuard::ScopeGuard): Deleted.
     55        (WebCore::IDBServer::ScopeGuard::~ScopeGuard): Deleted.
     56        (WebCore::IDBServer::ScopeGuard::enable): Deleted.
     57        (WebCore::IDBServer::ScopeGuard::disable): Deleted.
     58       
     59        * bindings/js/JSIDBCursorWithValueCustom.cpp: Added.
     60        (WebCore::JSIDBCursorWithValue::visitAdditionalChildren):
     61       
     62        * platform/ScopeGuard.h: Added.
     63        (WebCore::ScopeGuard::ScopeGuard):
     64        (WebCore::ScopeGuard::~ScopeGuard):
     65        (WebCore::ScopeGuard::enable):
     66        (WebCore::ScopeGuard::disable):
     67
    1682016-02-01  Sun-woo Nam  <sunny.nam@samsung.com>
    269
  • trunk/Source/WebCore/Modules/indexeddb/IDBCursor.h

    r194967 r195997  
    7777    virtual bool isModernCursor() const { return false; }
    7878
     79    virtual bool hasPendingActivity() const { return false; }
     80
    7981protected:
    8082    IDBCursor();
  • trunk/Source/WebCore/Modules/indexeddb/IDBCursor.idl

    r194967 r195997  
    2727    Conditional=INDEXED_DATABASE,
    2828    EnabledAtRuntime=IndexedDB,
     29    ActiveDOMObject,
    2930    SkipVTableValidation,
    3031    JSCustomMarkFunction,
  • trunk/Source/WebCore/Modules/indexeddb/IDBCursorWithValue.idl

    r189746 r195997  
    2727    Conditional=INDEXED_DATABASE,
    2828    EnabledAtRuntime=IndexedDB,
     29    ActiveDOMObject,
    2930    SkipVTableValidation,
     31    JSCustomMarkFunction,
    3032] interface IDBCursorWithValue : IDBCursor {
    3133    readonly attribute any value;
  • trunk/Source/WebCore/Modules/indexeddb/client/IDBCursorImpl.cpp

    r194967 r195997  
    4545}
    4646
    47 IDBCursor::IDBCursor(IDBTransaction&, IDBObjectStore& objectStore, const IDBCursorInfo& info)
    48     : m_info(info)
     47IDBCursor::IDBCursor(IDBTransaction& transaction, IDBObjectStore& objectStore, const IDBCursorInfo& info)
     48    : ActiveDOMObject(transaction.scriptExecutionContext())
     49    , m_info(info)
    4950    , m_source(IDBAny::create(objectStore).leakRef())
    5051    , m_objectStore(&objectStore)
    5152{
    52 }
    53 
    54 IDBCursor::IDBCursor(IDBTransaction&, IDBIndex& index, const IDBCursorInfo& info)
    55     : m_info(info)
     53    suspendIfNeeded();
     54}
     55
     56IDBCursor::IDBCursor(IDBTransaction& transaction, IDBIndex& index, const IDBCursorInfo& info)
     57    : ActiveDOMObject(transaction.scriptExecutionContext())
     58    , m_info(info)
    5659    , m_source(IDBAny::create(index).leakRef())
    5760    , m_index(&index)
    5861{
     62    suspendIfNeeded();
    5963}
    6064
     
    164168    ASSERT(request);
    165169    request->setSource(*this);
     170    ++m_outstandingRequestCount;
     171
    166172    return request;
    167173}
     
    282288void IDBCursor::uncheckedIterateCursor(const IDBKeyData& key, unsigned long count)
    283289{
     290    ++m_outstandingRequestCount;
     291
    284292    m_request->willIterateCursor(*this);
    285293    transaction().iterateCursor(*this, key, count);
     
    325333    }
    326334
    327     return effectiveObjectStore().deleteFunction(context, m_deprecatedCurrentPrimaryKey.jsValue(), ec);
     335    auto request = effectiveObjectStore().modernDelete(context, m_deprecatedCurrentPrimaryKey.jsValue(), ec);
     336    if (ec.code)
     337        return nullptr;
     338
     339    ASSERT(request);
     340    request->setSource(*this);
     341    ++m_outstandingRequestCount;
     342
     343    return request;
    328344}
    329345
     
    360376}
    361377
     378const char* IDBCursor::activeDOMObjectName() const
     379{
     380    return "IDBCursor";
     381}
     382
     383bool IDBCursor::canSuspendForDocumentSuspension() const
     384{
     385    return false;
     386}
     387
     388bool IDBCursor::hasPendingActivity() const
     389{
     390    return m_outstandingRequestCount;
     391}
     392
     393void IDBCursor::decrementOutstandingRequestCount()
     394{
     395    ASSERT(m_outstandingRequestCount);
     396    --m_outstandingRequestCount;
     397}
     398
    362399} // namespace IDBClient
    363400} // namespace WebCore
  • trunk/Source/WebCore/Modules/indexeddb/client/IDBCursorImpl.h

    r194967 r195997  
    4343class IDBTransaction;
    4444
    45 class IDBCursor : public WebCore::IDBCursorWithValue {
     45class IDBCursor : public WebCore::IDBCursorWithValue, public ActiveDOMObject {
    4646public:
    4747    static Ref<IDBCursor> create(IDBTransaction&, IDBIndex&, const IDBCursorInfo&);
     
    7575    virtual bool isModernCursor() const override final { return true; }
    7676
     77    void decrementOutstandingRequestCount();
     78
    7779protected:
    7880    IDBCursor(IDBTransaction&, IDBObjectStore&, const IDBCursorInfo&);
     
    8082
    8183private:
     84    // ActiveDOMObject.
     85    virtual const char* activeDOMObjectName() const override final;
     86    virtual bool canSuspendForDocumentSuspension() const override final;
     87    virtual bool hasPendingActivity() const override final;
     88
     89    // Cursors are created with an outstanding iteration request.
     90    unsigned m_outstandingRequestCount { 1 };
     91
    8292    IDBCursorInfo m_info;
    8393    Ref<IDBAny> m_source;
  • trunk/Source/WebCore/Modules/indexeddb/client/IDBObjectStoreImpl.cpp

    r194733 r195997  
    341341}
    342342
    343 
    344343RefPtr<WebCore::IDBRequest> IDBObjectStore::deleteFunction(ScriptExecutionContext* context, IDBKeyRange* keyRange, ExceptionCodeWithMessage& ec)
     344{
     345    return doDelete(context, keyRange, ec);
     346}
     347
     348RefPtr<IDBRequest> IDBObjectStore::doDelete(ScriptExecutionContext* context, IDBKeyRange* keyRange, ExceptionCodeWithMessage& ec)
    345349{
    346350    LOG(IndexedDB, "IDBObjectStore::deleteFunction");
     
    382386RefPtr<WebCore::IDBRequest> IDBObjectStore::deleteFunction(ScriptExecutionContext* context, const Deprecated::ScriptValue& key, ExceptionCodeWithMessage& ec)
    383387{
    384     return deleteFunction(context, key.jsValue(), ec);
    385 }
    386 
    387 RefPtr<WebCore::IDBRequest> IDBObjectStore::deleteFunction(ScriptExecutionContext* context, JSC::JSValue key, ExceptionCodeWithMessage& ec)
     388    return modernDelete(context, key.jsValue(), ec);
     389}
     390
     391RefPtr<IDBRequest> IDBObjectStore::modernDelete(ScriptExecutionContext* context, JSC::JSValue key, ExceptionCodeWithMessage& ec)
    388392{
    389393    DOMRequestState requestState(context);
     
    395399    }
    396400
    397     return deleteFunction(context, &IDBKeyRange::create(idbKey.get()).get(), ec);
     401    return doDelete(context, &IDBKeyRange::create(idbKey.get()).get(), ec);
    398402}
    399403
  • trunk/Source/WebCore/Modules/indexeddb/client/IDBObjectStoreImpl.h

    r193878 r195997  
    8181
    8282    RefPtr<IDBRequest> putForCursorUpdate(JSC::ExecState&, JSC::JSValue, JSC::JSValue key, ExceptionCodeWithMessage&);
    83 
    84     RefPtr<WebCore::IDBRequest> deleteFunction(ScriptExecutionContext*, JSC::JSValue key, ExceptionCodeWithMessage&);
     83    RefPtr<IDBRequest> modernDelete(ScriptExecutionContext*, JSC::JSValue key, ExceptionCodeWithMessage&);
    8584
    8685    void markAsDeleted();
     
    105104    RefPtr<IDBRequest> putOrAdd(JSC::ExecState&, JSC::JSValue, RefPtr<IDBKey>, IndexedDB::ObjectStoreOverwriteMode, InlineKeyCheck, ExceptionCodeWithMessage&);
    106105    RefPtr<WebCore::IDBRequest> doCount(ScriptExecutionContext&, const IDBKeyRangeData&, ExceptionCodeWithMessage&);
     106    RefPtr<IDBRequest> doDelete(ScriptExecutionContext* context, IDBKeyRange* keyRange, ExceptionCodeWithMessage& ec);
    107107
    108108    IDBObjectStoreInfo m_info;
  • trunk/Source/WebCore/Modules/indexeddb/client/IDBRequestImpl.cpp

    r194872 r195997  
    153153void IDBRequest::setSource(IDBCursor& cursor)
    154154{
     155    ASSERT(!m_cursorRequestNotifier);
     156
    155157    m_source = IDBAny::create(cursor);
     158    m_cursorRequestNotifier = std::make_unique<ScopeGuard>([this]() {
     159        ASSERT(m_source->type() == IDBAny::Type::IDBCursor || m_source->type() == IDBAny::Type::IDBCursorWithValue);
     160        m_source->modernIDBCursor()->decrementOutstandingRequestCount();
     161    });
    156162}
    157163
     
    284290    m_hasPendingActivity = false;
    285291
     292    m_cursorRequestNotifier = nullptr;
     293
    286294    bool dontPreventDefault;
    287295    {
     
    365373    ASSERT(!m_pendingCursor);
    366374    ASSERT(&cursor == resultCursor());
     375    ASSERT(!m_cursorRequestNotifier);
    367376
    368377    m_pendingCursor = &cursor;
     
    372381    m_domError = nullptr;
    373382    m_idbError = { };
     383
     384    m_cursorRequestNotifier = std::make_unique<ScopeGuard>([this]() {
     385        m_pendingCursor->decrementOutstandingRequestCount();
     386    });
    374387}
    375388
     
    385398    }
    386399
     400    m_cursorRequestNotifier = nullptr;
    387401    m_pendingCursor = nullptr;
    388402
  • trunk/Source/WebCore/Modules/indexeddb/client/IDBRequestImpl.h

    r194754 r195997  
    3333#include "IDBResourceIdentifier.h"
    3434#include "IDBTransactionImpl.h"
     35#include "ScopeGuard.h"
    3536#include <wtf/RefCounted.h>
    3637
     
    147148
    148149    RefPtr<IDBCursor> m_pendingCursor;
     150
     151    std::unique_ptr<ScopeGuard> m_cursorRequestNotifier;
    149152};
    150153
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp

    r195689 r195997  
    11/*
    2  * Copyright (C) 2015 Apple Inc. All rights reserved.
     2 * Copyright (C) 2015, 2016 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3535#include "IDBTransactionInfo.h"
    3636#include "Logging.h"
     37#include "ScopeGuard.h"
    3738#include "UniqueIDBDatabaseConnection.h"
    3839#include <wtf/MainThread.h>
     
    675676    return *globalObject.get()->globalExec();
    676677}
    677 
    678 class ScopeGuard {
    679 public:
    680     ScopeGuard()
    681     {
    682     }
    683 
    684     ScopeGuard(std::function<void()> function)
    685         : m_function(WTFMove(function))
    686     {
    687     }
    688 
    689     ~ScopeGuard()
    690     {
    691         if (m_function)
    692             m_function();
    693     }
    694 
    695     void enable(std::function<void()> function)
    696     {
    697         m_function = WTFMove(function);
    698     }
    699 
    700     void disable()
    701     {
    702         m_function = nullptr;
    703     }
    704 
    705 private:
    706     std::function<void()> m_function { nullptr };
    707 };
    708678
    709679void UniqueIDBDatabase::performPutOrAdd(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData& keyData, const ThreadSafeDataBuffer& originalRecordValue, IndexedDB::ObjectStoreOverwriteMode overwriteMode)
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r195954 r195997  
    19801980                51405C88190B014400754F94 /* SelectionRectGatherer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51405C86190B014400754F94 /* SelectionRectGatherer.cpp */; };
    19811981                51405C89190B014400754F94 /* SelectionRectGatherer.h in Headers */ = {isa = PBXBuildFile; fileRef = 51405C87190B014400754F94 /* SelectionRectGatherer.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1982                5141298E1C5FD83A0059E714 /* JSIDBCursorWithValueCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5141298D1C5FD7E90059E714 /* JSIDBCursorWithValueCustom.cpp */; };
     1983                514129901C601ACC0059E714 /* ScopeGuard.h in Headers */ = {isa = PBXBuildFile; fileRef = 5141298F1C601A890059E714 /* ScopeGuard.h */; settings = {ATTRIBUTES = (Private, ); }; };
    19821984                5145B1091BC48E2E00E86219 /* IDBResourceIdentifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5145B1071BC4890B00E86219 /* IDBResourceIdentifier.cpp */; };
    19831985                5145B10A1BC48E2E00E86219 /* IDBResourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 5145B1081BC4890B00E86219 /* IDBResourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    94689470                51405C86190B014400754F94 /* SelectionRectGatherer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectionRectGatherer.cpp; sourceTree = "<group>"; };
    94699471                51405C87190B014400754F94 /* SelectionRectGatherer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionRectGatherer.h; sourceTree = "<group>"; };
     9472                5141298D1C5FD7E90059E714 /* JSIDBCursorWithValueCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSIDBCursorWithValueCustom.cpp; sourceTree = "<group>"; };
     9473                5141298F1C601A890059E714 /* ScopeGuard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScopeGuard.h; sourceTree = "<group>"; };
    94709474                5145B1071BC4890B00E86219 /* IDBResourceIdentifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBResourceIdentifier.cpp; sourceTree = "<group>"; };
    94719475                5145B1081BC4890B00E86219 /* IDBResourceIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBResourceIdentifier.h; sourceTree = "<group>"; };
     
    2230522309                                511EF2CC17F0FDF100E4FA16 /* JSIDBAnyCustom.cpp */,
    2230622310                                512BDB4C1C46B0FF006494DF /* JSIDBCursorCustom.cpp */,
     22311                                5141298D1C5FD7E90059E714 /* JSIDBCursorWithValueCustom.cpp */,
    2230722312                                511EF2CD17F0FDF100E4FA16 /* JSIDBDatabaseCustom.cpp */,
    2230822313                                511EF2CE17F0FDF100E4FA16 /* JSIDBObjectStoreCustom.cpp */,
     
    2279522800                                5162C7F211F77EFA00612EFE /* SchemeRegistry.cpp */,
    2279622801                                5162C7F311F77EFB00612EFE /* SchemeRegistry.h */,
     22802                                5141298F1C601A890059E714 /* ScopeGuard.h */,
    2279722803                                BC8AE34C12EA096A00EB3AE6 /* ScrollableArea.cpp */,
    2279822804                                BC8AE34D12EA096A00EB3AE6 /* ScrollableArea.h */,
     
    2564225648                                31C0FF4E0E4CEFDD007D6FE5 /* DOMWebKitTransitionEventInternal.h in Headers */,
    2564325649                                85C7F5E70AAFBAFB004014DD /* DOMWheelEvent.h in Headers */,
     25650                                514129901C601ACC0059E714 /* ScopeGuard.h in Headers */,
    2564425651                                85989DD10ACC8BBD00A0BC51 /* DOMWheelEventInternal.h in Headers */,
    2564525652                                1403B99709EB13AF00797C7F /* DOMWindow.h in Headers */,
     
    3125231259                                1A22464B0CC98DDB00C05240 /* SQLiteStatement.cpp in Sources */,
    3125331260                                1A22464D0CC98DDB00C05240 /* SQLiteTransaction.cpp in Sources */,
     31261                                5141298E1C5FD83A0059E714 /* JSIDBCursorWithValueCustom.cpp in Sources */,
    3125431262                                97BC6A411505F081001B74AC /* SQLResultSet.cpp in Sources */,
    3125531263                                97BC6A441505F081001B74AC /* SQLResultSetRowList.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.