[Webkit-unassigned] [Bug 55095] IndexedDB: fire versionchange events when calling setVersion
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Wed Mar 2 12:16:57 PST 2011
https://bugs.webkit.org/show_bug.cgi?id=55095
--- Comment #18 from David Grogan <dgrogan at chromium.org> 2011-03-02 12:16:58 PST ---
(From update of attachment 84351)
View in context: https://bugs.webkit.org/attachment.cgi?id=84351&action=review
>> Source/WebCore/storage/IDBDatabase.cpp:145
>> + EventQueue* eventQueue = static_cast<Document*>(scriptExecutionContext())->eventQueue();
>
> assert it's a document before static casting (IsDocument())
done
>> Source/WebCore/storage/IDBDatabase.cpp:146
>> + for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) {
>
> Is this really necessary? What's the worst case without it?
A closed database would get a versionchange event, forbidden by the note in step 4 here:
http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#dfn-steps-for-running-a-version_change-transaction
I can remove it if you think it adds too much ugliness.
>> Source/WebCore/storage/IDBDatabaseBackendImpl.cpp:170
>> + callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::NOT_ALLOWED_ERR, "Connection was closed before set version transaction was created"));
>
> Did we agree on NOT_ALLOWED_ERR? ABORT_ERR might make more sense?
>
> Is this possible? Seems like it wouldn't be and that we should be blocking it in the frontend. If so, just do an assert. If not, why isn't it?
I just used NOT_ALLOWED_ERR as a placeholder, figuring I'd get back to it or you'd bring it up if there was something better. ABORT_ERR is better, changing.
This is possible and happens in the layout test. I don't think we can easily check for it in the frontend but could be mistaken. It happens because a setVersion _transaction_ isn't created until the setversion call no longer blocked. E.g.:
connection1.open
connection2.open
connection1.setversion
connection2.setversion
function onConnection1Blocked() {
connection2.close();
}
... bunch of stuff ...
connection1.close() // only now does connection2's pendingSetVersionCall get serviced and potentially turned into a setVersion transaction.
I think this is also consistent with the every-request-should-get-an-error-or-success-call idea.
>> Source/WebCore/storage/IDBDatabaseBackendImpl.cpp:173
>> + for (DatabaseCallbacksSet::const_iterator it = m_databaseCallbacksSet.begin(); it != m_databaseCallbacksSet.end(); ++it) {
>
> Are we supposed to send this even when nothing's blocked?
If nothing's blocked then m_databaseCallbacksSet.size() will be 1 and the control flow will not get passed the if statement on the line below, so nothing will be sent.
>> Source/WebCore/storage/IDBDatabaseBackendImpl.cpp:234
>> RefPtr<PendingSetVersionCall> pendingSetVersionCall = m_pendingSetVersionCalls.takeFirst();
>
> Can you update the code I just landed to use takeFirst (in EventQueue). That seems better.
Compiler error. Turns out takeFirst is only defined for WTF::Deque, not WTF::ListHashSet.
>> Source/WebKit/chromium/src/IDBDatabaseProxy.cpp:95
>> +void IDBDatabaseProxy::setVersion(const String& version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> dbcallbacks, ExceptionCode& ec)
>
> databaseCallbacks (don't abbreviate and camelCase)
>
> here and elsewhere
done
>> Source/WebKit/chromium/src/WebIDBDatabaseImpl.cpp:102
>> + // Use the callbacks that ::open gave us to ensure that the backend in
>
> ASSERT they're not null before passing in. (The only time we wouldn't assert is if we were about to do something that'd _crash_ if it was null.)
Added ASSERT.
Why wouldn't we assert if a null would cause a crash?
--
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
More information about the webkit-unassigned
mailing list