Changeset 80183 in webkit
- Timestamp:
- Mar 2, 2011 4:40:33 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 22 edited
- 5 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r80181 r80183 1 2011-03-02 David Grogan <dgrogan@chromium.org> 2 3 Reviewed by Jeremy Orlow. 4 5 IndexedDB: fire versionchange events when calling setVersion 6 https://bugs.webkit.org/show_bug.cgi?id=55095 7 8 * storage/indexeddb/set_version_queue-expected.txt: 9 * storage/indexeddb/set_version_queue.html: 10 1 11 2011-03-02 Sheriff Bot <webkit.review.bot@gmail.com> 2 12 -
trunk/LayoutTests/storage/indexeddb/set_version_queue-expected.txt
r79458 r80183 1 An open connection blocks a separate connection's setVersion call 1 4 open connections try to setVersion at the same time. 3 connections eventually close, allowing 1 setVersion call to proceed. 2 2 3 3 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". … … 8 8 IndexedDB.open('set-version-queue') 9 9 IndexedDB.open('set-version-queue') 10 connections[0].setVersion('version 1') 11 connections[1].setVersion('version 2') 12 connections[2].setVersion('version 3') 10 IndexedDB.open('set-version-queue') 11 connections[0].setVersion('version 0') 12 connections[1].setVersion('version 1') 13 connections[2].setVersion('version 2') 14 connections[3].setVersion('version 3') 13 15 16 PASS event.version.length > 0 is true 17 connection[1] received versionChangeEvent: version 0 18 PASS event.version.length > 0 is true 19 connection[2] received versionChangeEvent: version 0 20 PASS event.version.length > 0 is true 21 connection[3] received versionChangeEvent: version 0 22 23 PASS connection[0] got blocked event 24 PASS event.version is "version 0" 25 Close the connection that received the block event: 26 connections[0].close() 27 Close another connection as well, to test 4.7.4-note: 28 connections[3].close() 29 blocked0fired = true 30 31 PASS event.version.length > 0 is true 32 connection[2] received versionChangeEvent: version 1 33 34 PASS connection[1] got blocked event 35 Ensure that this blocked event is in order: 36 PASS blocked0fired is true 37 PASS blocked2fired is false 38 39 PASS event.version.length > 0 is true 40 connection[1] received versionChangeEvent: version 2 41 42 PASS connection[2] got blocked event 43 PASS event.version is "version 2" 14 44 connections[2].close() 15 PASS blocked1fired is true 16 PASS blocked3fired is false 17 connections[0].close() 18 FIXME: The first setVersion shouldn't get fired 19 PASS inSetVersion2 20 FIXME: The third setVersion shouldn't get fired 45 blocked2fired = true 46 47 PASS event.version.length > 0 is true 48 connection[1] received versionChangeEvent: version 3 49 50 PASS connection[3] got blocked event 51 Note: This means that a connection can receive a blocked event after its close() method has been called. Spec is silent on the issue and this is easiest to implement. 52 PASS event.version is "version 3" 53 54 PASS connection[0] got error event 55 PASS event.target.errorCode is 13 56 PASS event.target.webkitErrorMessage.length > 0 is true 57 Connection was closed before set version transaction was created 58 59 PASS connection[2] got error event 60 PASS event.target.errorCode is 13 61 PASS event.target.webkitErrorMessage.length > 0 is true 62 Connection was closed before set version transaction was created 63 64 PASS connection[3] got error event 65 PASS event.target.errorCode is 13 66 PASS event.target.webkitErrorMessage.length > 0 is true 67 Connection was closed before set version transaction was created 68 69 PASS connection[1] got into SetVersion 21 70 PASS successfullyParsed is true 22 71 -
trunk/LayoutTests/storage/indexeddb/set_version_queue.html
r79458 r80183 11 11 <script> 12 12 13 description(" An open connection blocks a separate connection's setVersion call");13 description("4 open connections try to setVersion at the same time. 3 connections eventually close, allowing 1 setVersion call to proceed."); 14 14 if (window.layoutTestController) 15 15 layoutTestController.waitUntilDone(); … … 36 36 { 37 37 connection = event.target.result; 38 connection.onversionchange = generateVersionChangeHandler(); 38 39 connections.push(connection); 39 if (connections.length < 3)40 if (connections.length < 4) 40 41 openDBConnection(); 41 42 else { 42 result = evalAndLog("connections[0].setVersion('version 1')"); 43 result.onerror = unexpectedErrorCallback; 44 result.onsuccess = inSetVersion; 45 result.onblocked = blocked1; 46 result2 = evalAndLog("connections[1].setVersion('version 2')"); 47 result2.onerror = unexpectedErrorCallback; 48 result2.onsuccess = inSetVersion2; 49 result2.onblocked = blocked2; 50 result3 = evalAndLog("connections[2].setVersion('version 3')"); 51 result3.onerror = unexpectedErrorCallback; 52 result3.onsuccess = inSetVersion3; 53 result3.onblocked = blocked3; 43 request = evalAndLog("connections[0].setVersion('version 0')"); 44 request.onerror = function(event){ connectionError(event, 0) }; 45 request.onsuccess = unexpectedSuccessCallback; 46 request.onblocked = blocked0; 47 request1 = evalAndLog("connections[1].setVersion('version 1')"); 48 request1.onerror = unexpectedErrorCallback; 49 request1.onsuccess = inSetVersion1; 50 request1.onblocked = blocked1; 51 request2 = evalAndLog("connections[2].setVersion('version 2')"); 52 request2.onerror = function(event){ connectionError(event, 2) }; 53 request2.onsuccess = unexpectedSuccessCallback; 54 request2.onblocked = blocked2; 55 request3 = evalAndLog("connections[3].setVersion('version 3')"); 56 request3.onerror = function(event){ connectionError(event, 3) }; 57 request3.onsuccess = unexpectedSuccessCallback; 58 request3.onblocked = blocked3; 54 59 debug(""); 55 60 } 56 61 } 57 62 58 blocked1fired = false; 59 blocked3fired = false; 60 function blocked1() 63 function generateVersionChangeHandler() 61 64 { 62 evalAndLog("connections[2].close()"); 63 blocked1fired = true; 65 var connectionNum = connections.length; 66 return function(event) 67 { 68 shouldBeTrue("event.version.length > 0"); 69 debug("connection[" + connectionNum + "] received versionChangeEvent: " + event.version); 70 } 64 71 } 65 72 66 function blocked2() 73 blocked0fired = false; 74 blocked2fired = false; 75 function blocked0(event) 67 76 { 68 shouldBeTrue("blocked1fired"); 69 shouldBeFalse("blocked3fired"); 77 debug(""); 78 testPassed("connection[0] got blocked event"); 79 shouldBeEqualToString("event.version", "version 0"); 80 debug("Close the connection that received the block event:"); 81 evalAndLog("connections[0].close()"); 82 debug("Close another connection as well, to test 4.7.4-note:"); 83 evalAndLog("connections[3].close()"); 84 evalAndLog("blocked0fired = true"); 85 debug(""); 70 86 } 71 87 72 function blocked 3()88 function blocked1(event) 73 89 { 74 evalAndLog("connections[0].close()"); 75 blocked3fired = true; 90 debug("") 91 testPassed("connection[1] got blocked event"); 92 debug("Ensure that this blocked event is in order:"); 93 shouldBeTrue("blocked0fired"); 94 shouldBeFalse("blocked2fired"); 95 debug("") 76 96 } 77 97 78 function inSetVersion()98 function blocked2(event) 79 99 { 80 debug("FIXME: The first setVersion shouldn't get fired"); 100 debug("") 101 testPassed("connection[2] got blocked event"); 102 shouldBeEqualToString("event.version", "version 2"); 103 evalAndLog("connections[2].close()"); 104 evalAndLog("blocked2fired = true"); 105 debug("") 81 106 } 82 107 83 function inSetVersion2()108 function blocked3(event) 84 109 { 85 testPassed("inSetVersion2"); 110 debug("") 111 testPassed("connection[3] got blocked event"); 112 debug("Note: This means that a connection can receive a blocked event after its close() method has been called. Spec is silent on the issue and this is easiest to implement."); 113 shouldBeEqualToString("event.version", "version 3"); 86 114 } 87 115 88 function inSetVersion3()116 function connectionError(event, connectionId) 89 117 { 90 debug("FIXME: The third setVersion shouldn't get fired"); 118 debug("") 119 testPassed("connection[" + connectionId + "] got error event"); 120 shouldBe("event.target.errorCode", "13") 121 if ('webkitIndexedDB' in window) { 122 shouldBe("event.target.webkitErrorMessage.length > 0", "true"); 123 debug(event.target.webkitErrorMessage); 124 } 125 } 126 127 function inSetVersion1(event) 128 { 129 debug("") 130 testPassed("connection[1] got into SetVersion"); 91 131 done(); 92 132 } -
trunk/Source/WebCore/ChangeLog
r80182 r80183 1 2011-03-02 David Grogan <dgrogan@chromium.org> 2 3 Reviewed by Jeremy Orlow. 4 5 IndexedDB: fire versionchange events when calling setVersion 6 https://bugs.webkit.org/show_bug.cgi?id=55095 7 8 * dom/EventNames.h: 9 * storage/IDBDatabase.cpp: 10 (WebCore::IDBDatabase::setVersion): 11 (WebCore::IDBDatabase::close): 12 (WebCore::IDBDatabase::onVersionChange): 13 (WebCore::IDBDatabase::open): 14 (WebCore::IDBDatabase::enqueueEvent): 15 (WebCore::IDBDatabase::dispatchEvent): 16 * storage/IDBDatabase.h: 17 (WebCore::IDBDatabase::dispatchEvent): 18 * storage/IDBDatabase.idl: 19 * storage/IDBDatabaseBackendImpl.cpp: 20 (WebCore::IDBDatabaseBackendImpl::PendingSetVersionCall::create): 21 (WebCore::IDBDatabaseBackendImpl::PendingSetVersionCall::databaseCallbacks): 22 (WebCore::IDBDatabaseBackendImpl::PendingSetVersionCall::PendingSetVersionCall): 23 (WebCore::IDBDatabaseBackendImpl::IDBDatabaseBackendImpl): 24 (WebCore::IDBDatabaseBackendImpl::setVersion): 25 (WebCore::IDBDatabaseBackendImpl::open): 26 (WebCore::IDBDatabaseBackendImpl::close): 27 * storage/IDBDatabaseBackendImpl.h: 28 * storage/IDBDatabaseBackendInterface.h: 29 * storage/IDBDatabaseCallbacks.h: Copied from Source/WebCore/storage/IDBVersionChangeEvent.cpp. 30 (WebCore::IDBDatabaseCallbacks::~IDBDatabaseCallbacks): 31 * storage/IDBFactoryBackendImpl.cpp: 32 (WebCore::IDBFactoryBackendImpl::open): 33 * storage/IDBRequest.cpp: 34 (WebCore::IDBRequest::onSuccess): 35 * storage/IDBVersionChangeEvent.cpp: 36 (WebCore::IDBVersionChangeEvent::create): 37 (WebCore::IDBVersionChangeEvent::IDBVersionChangeEvent): 38 * storage/IDBVersionChangeEvent.h: 39 * storage/IDBVersionChangeRequest.cpp: 40 (WebCore::IDBVersionChangeRequest::onBlocked): 41 1 42 2011-03-02 Alexey Proskuryakov <ap@apple.com> 2 43 -
trunk/Source/WebCore/dom/EventNames.h
r79208 r80183 108 108 macro(unload) \ 109 109 macro(updateready) \ 110 macro(versionchange) \ 110 111 macro(write) \ 111 112 macro(writeend) \ -
trunk/Source/WebCore/storage/IDBDatabase.cpp
r78752 r80183 27 27 #include "IDBDatabase.h" 28 28 29 #include "Document.h" 30 #include "EventQueue.h" 29 31 #include "IDBAny.h" 30 32 #include "IDBDatabaseError.h" 31 33 #include "IDBDatabaseException.h" 34 #include "IDBEventDispatcher.h" 32 35 #include "IDBFactoryBackendInterface.h" 33 36 #include "IDBIndex.h" 34 37 #include "IDBObjectStore.h" 38 #include "IDBVersionChangeEvent.h" 35 39 #include "IDBVersionChangeRequest.h" 36 40 #include "IDBTransaction.h" … … 100 104 { 101 105 RefPtr<IDBVersionChangeRequest> request = IDBVersionChangeRequest::create(context, IDBAny::create(this), version); 102 m_backend->setVersion(version, request, ec);106 m_backend->setVersion(version, request, this, ec); 103 107 return request; 104 108 } … … 138 142 if (m_noNewTransactions) 139 143 return; 144 145 ASSERT(scriptExecutionContext()->isDocument()); 146 EventQueue* eventQueue = static_cast<Document*>(scriptExecutionContext())->eventQueue(); 147 // Remove any pending versionchange events scheduled to fire on this 148 // connection. They would have been scheduled by the backend when another 149 // connection called setVersion, but the frontend connection is being 150 // closed before they could fire. 151 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { 152 bool removed = eventQueue->cancelEvent(m_enqueuedEvents[i].get()); 153 ASSERT_UNUSED(removed, removed); 154 } 155 140 156 m_noNewTransactions = true; 141 m_backend->close(); 157 m_backend->close(this); 158 } 159 160 void IDBDatabase::onVersionChange(const String& version) 161 { 162 enqueueEvent(IDBVersionChangeEvent::create(version, eventNames().versionchangeEvent)); 142 163 } 143 164 … … 152 173 } 153 174 175 void IDBDatabase::open() 176 { 177 m_backend->open(this); 178 } 179 180 void IDBDatabase::enqueueEvent(PassRefPtr<Event> event) 181 { 182 ASSERT(scriptExecutionContext()->isDocument()); 183 EventQueue* eventQueue = static_cast<Document*>(scriptExecutionContext())->eventQueue(); 184 event->setTarget(this); 185 eventQueue->enqueueEvent(event.get()); 186 m_enqueuedEvents.append(event); 187 } 188 189 bool IDBDatabase::dispatchEvent(PassRefPtr<Event> event) 190 { 191 ASSERT(event->type() == eventNames().versionchangeEvent); 192 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) { 193 if (m_enqueuedEvents[i].get() == event.get()) 194 m_enqueuedEvents.remove(i); 195 } 196 return EventTarget::dispatchEvent(event.get()); 197 } 198 154 199 void IDBDatabase::stop() 155 200 { -
trunk/Source/WebCore/storage/IDBDatabase.h
r78752 r80183 33 33 #include "ExceptionCode.h" 34 34 #include "IDBDatabaseBackendInterface.h" 35 #include "IDBDatabaseCallbacks.h" 35 36 #include "IDBObjectStore.h" 36 37 #include "IDBTransaction.h" … … 47 48 class ScriptExecutionContext; 48 49 49 class IDBDatabase : public RefCounted<IDBDatabase>, public EventTarget, public ActiveDOMObject {50 class IDBDatabase : public IDBDatabaseCallbacks, public EventTarget, public ActiveDOMObject { 50 51 public: 51 52 static PassRefPtr<IDBDatabase> create(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendInterface>); … … 72 73 DEFINE_ATTRIBUTE_EVENT_LISTENER(abort); 73 74 DEFINE_ATTRIBUTE_EVENT_LISTENER(error); 75 DEFINE_ATTRIBUTE_EVENT_LISTENER(versionchange); 76 77 // IDBDatabaseCallbacks 78 virtual void onVersionChange(const String& requestedVersion); 74 79 75 80 // ActiveDOMObject … … 81 86 virtual ScriptExecutionContext* scriptExecutionContext() const; 82 87 83 using RefCounted<IDBDatabase>::ref; 84 using RefCounted<IDBDatabase>::deref; 88 89 void open(); 90 void enqueueEvent(PassRefPtr<Event>); 91 bool dispatchEvent(PassRefPtr<Event> event, ExceptionCode& ec) { return EventTarget::dispatchEvent(event, ec); } 92 virtual bool dispatchEvent(PassRefPtr<Event>); 93 94 using RefCounted<IDBDatabaseCallbacks>::ref; 95 using RefCounted<IDBDatabaseCallbacks>::deref; 85 96 86 97 private: … … 100 111 101 112 EventTargetData m_eventTargetData; 113 114 // Keep track of the versionchange events waiting to be fired on this 115 // database so that we can cancel them if the database closes. 116 Vector<RefPtr<Event> > m_enqueuedEvents; 102 117 }; 103 118 -
trunk/Source/WebCore/storage/IDBDatabase.idl
r78752 r80183 36 36 attribute EventListener onabort; 37 37 attribute EventListener onerror; 38 attribute EventListener onversionchange; 38 39 39 40 IDBObjectStore createObjectStore(in DOMString name, in [Optional] OptionsObject options) … … 54 55 in EventListener listener, 55 56 in boolean useCapture); 56 boolean dispatchEvent(in Event evt) 57 boolean dispatchEvent(in Event evt) 57 58 raises(EventException); 58 59 }; -
trunk/Source/WebCore/storage/IDBDatabaseBackendImpl.cpp
r79445 r80183 42 42 class IDBDatabaseBackendImpl::PendingSetVersionCall : public RefCounted<PendingSetVersionCall> { 43 43 public: 44 static PassRefPtr<PendingSetVersionCall> create(const String& version, PassRefPtr<IDBCallbacks> callbacks )44 static PassRefPtr<PendingSetVersionCall> create(const String& version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks) 45 45 { 46 return adoptRef(new PendingSetVersionCall(version, callbacks ));46 return adoptRef(new PendingSetVersionCall(version, callbacks, databaseCallbacks)); 47 47 } 48 48 String version() { return m_version; } 49 49 PassRefPtr<IDBCallbacks> callbacks() { return m_callbacks; } 50 PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks() { return m_databaseCallbacks; } 51 50 52 private: 51 PendingSetVersionCall(const String& version, PassRefPtr<IDBCallbacks> callbacks )53 PendingSetVersionCall(const String& version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks) 52 54 : m_version(version) 53 55 , m_callbacks(callbacks) 56 , m_databaseCallbacks(databaseCallbacks) 54 57 { 55 58 } 56 59 String m_version; 57 60 RefPtr<IDBCallbacks> m_callbacks; 61 RefPtr<IDBDatabaseCallbacks> m_databaseCallbacks; 58 62 }; 59 63 … … 66 70 , m_factory(factory) 67 71 , m_transactionCoordinator(coordinator) 68 , m_openConnectionCount(0)69 72 { 70 73 ASSERT(!m_name.isNull()); … … 160 163 } 161 164 162 void IDBDatabaseBackendImpl::setVersion(const String& version, PassRefPtr<IDBCallbacks> prpCallbacks, ExceptionCode& ec) 163 { 165 void IDBDatabaseBackendImpl::setVersion(const String& version, PassRefPtr<IDBCallbacks> prpCallbacks, PassRefPtr<IDBDatabaseCallbacks> prpDatabaseCallbacks, ExceptionCode& ec) 166 { 167 RefPtr<IDBCallbacks> callbacks = prpCallbacks; 168 RefPtr<IDBDatabaseCallbacks> databaseCallbacks = prpDatabaseCallbacks; 169 if (!m_databaseCallbacksSet.contains(databaseCallbacks)) { 170 callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::ABORT_ERR, "Connection was closed before set version transaction was created")); 171 return; 172 } 173 for (DatabaseCallbacksSet::const_iterator it = m_databaseCallbacksSet.begin(); it != m_databaseCallbacksSet.end(); ++it) { 174 if (*it != databaseCallbacks) 175 (*it)->onVersionChange(version); 176 } 177 if (m_databaseCallbacksSet.size() > 1) { 178 callbacks->onBlocked(); 179 RefPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionCall::create(version, callbacks, databaseCallbacks); 180 m_pendingSetVersionCalls.append(pendingSetVersionCall); 181 return; 182 } 183 184 RefPtr<DOMStringList> objectStoreNames = DOMStringList::create(); 164 185 RefPtr<IDBDatabaseBackendImpl> database = this; 165 RefPtr<IDBCallbacks> callbacks = prpCallbacks;166 167 // FIXME: Only continue if the connection is still open.168 if (m_openConnectionCount > 1) {169 callbacks->onBlocked();170 RefPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionCall::create(version, callbacks);171 m_pendingSetVersionCalls.append(pendingSetVersionCall);172 return;173 }174 175 RefPtr<DOMStringList> objectStoreNames = DOMStringList::create();176 186 RefPtr<IDBTransactionBackendInterface> transaction = IDBTransactionBackendImpl::create(objectStoreNames.get(), IDBTransaction::VERSION_CHANGE, this); 177 187 if (!transaction->scheduleTask(createCallbackTask(&IDBDatabaseBackendImpl::setVersionInternal, database, version, callbacks, transaction), … … 207 217 } 208 218 209 void IDBDatabaseBackendImpl::open() 210 { 211 m_openConnectionCount++; 212 } 213 214 void IDBDatabaseBackendImpl::close() 215 { 216 m_openConnectionCount--; 217 ASSERT(m_openConnectionCount >= 0); 218 if (m_openConnectionCount > 1) 219 void IDBDatabaseBackendImpl::open(PassRefPtr<IDBDatabaseCallbacks> callbacks) 220 { 221 m_databaseCallbacksSet.add(RefPtr<IDBDatabaseCallbacks>(callbacks)); 222 } 223 224 void IDBDatabaseBackendImpl::close(PassRefPtr<IDBDatabaseCallbacks> prpCallbacks) 225 { 226 RefPtr<IDBDatabaseCallbacks> callbacks = prpCallbacks; 227 ASSERT(m_databaseCallbacksSet.contains(callbacks)); 228 m_databaseCallbacksSet.remove(callbacks); 229 if (m_databaseCallbacksSet.size() > 1) 219 230 return; 220 231 … … 222 233 ExceptionCode ec = 0; 223 234 RefPtr<PendingSetVersionCall> pendingSetVersionCall = m_pendingSetVersionCalls.takeFirst(); 224 setVersion(pendingSetVersionCall->version(), pendingSetVersionCall->callbacks(), ec);235 setVersion(pendingSetVersionCall->version(), pendingSetVersionCall->callbacks(), pendingSetVersionCall->databaseCallbacks(), ec); 225 236 ASSERT(!ec); 226 237 } -
trunk/Source/WebCore/storage/IDBDatabaseBackendImpl.h
r79426 r80183 31 31 #include <wtf/Deque.h> 32 32 #include <wtf/HashMap.h> 33 #include <wtf/ text/StringHash.h>33 #include <wtf/ListHashSet.h> 34 34 35 35 #if ENABLE(INDEXED_DATABASE) … … 38 38 39 39 class IDBBackingStore; 40 class IDBDatabase; 40 41 class IDBFactoryBackendImpl; 41 42 class IDBObjectStoreBackendImpl; … … 55 56 static const int64_t InvalidId = 0; 56 57 int64_t id() const { return m_id; } 57 void open( );58 void open(PassRefPtr<IDBDatabaseCallbacks>); 58 59 59 60 virtual String name() const { return m_name; } … … 63 64 virtual PassRefPtr<IDBObjectStoreBackendInterface> createObjectStore(const String& name, const String& keyPath, bool autoIncrement, IDBTransactionBackendInterface*, ExceptionCode&); 64 65 virtual void deleteObjectStore(const String& name, IDBTransactionBackendInterface*, ExceptionCode&); 65 virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>, ExceptionCode&);66 virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBDatabaseCallbacks>, ExceptionCode&); 66 67 virtual PassRefPtr<IDBTransactionBackendInterface> transaction(DOMStringList* objectStoreNames, unsigned short mode, ExceptionCode&); 67 virtual void close( );68 virtual void close(PassRefPtr<IDBDatabaseCallbacks>); 68 69 69 70 PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name); … … 98 99 RefPtr<IDBTransactionCoordinator> m_transactionCoordinator; 99 100 100 int m_openConnectionCount;101 102 101 class PendingSetVersionCall; 103 102 Deque<RefPtr<PendingSetVersionCall> > m_pendingSetVersionCalls; 103 104 typedef ListHashSet<RefPtr<IDBDatabaseCallbacks> > DatabaseCallbacksSet; 105 DatabaseCallbacksSet m_databaseCallbacksSet; 104 106 }; 105 107 -
trunk/Source/WebCore/storage/IDBDatabaseBackendInterface.h
r78752 r80183 39 39 class Frame; 40 40 class IDBCallbacks; 41 class IDBDatabaseCallbacks; 41 42 class IDBObjectStoreBackendInterface; 42 43 class IDBTransactionBackendInterface; … … 56 57 virtual PassRefPtr<IDBObjectStoreBackendInterface> createObjectStore(const String& name, const String& keyPath, bool autoIncrement, IDBTransactionBackendInterface*, ExceptionCode&) = 0; 57 58 virtual void deleteObjectStore(const String& name, IDBTransactionBackendInterface*, ExceptionCode&) = 0; 58 virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>, ExceptionCode&) = 0;59 virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBDatabaseCallbacks>, ExceptionCode&) = 0; 59 60 virtual PassRefPtr<IDBTransactionBackendInterface> transaction(DOMStringList* storeNames, unsigned short mode, ExceptionCode&) = 0; 60 virtual void close() = 0; 61 virtual void close(PassRefPtr<IDBDatabaseCallbacks>) = 0; 62 63 virtual void open(PassRefPtr<IDBDatabaseCallbacks>) = 0; 61 64 }; 62 65 -
trunk/Source/WebCore/storage/IDBDatabaseCallbacks.h
r80182 r80183 24 24 */ 25 25 26 #i nclude "config.h"27 # include "IDBVersionChangeEvent.h"26 #ifndef IDBDatabaseCallbacks_h 27 #define IDBDatabaseCallbacks_h 28 28 29 29 #if ENABLE(INDEXED_DATABASE) 30 30 31 #include " EventNames.h"32 #include "IDBAny.h"31 #include "PlatformString.h" 32 #include <wtf/RefCounted.h> 33 33 34 34 namespace WebCore { 35 35 36 PassRefPtr<IDBVersionChangeEvent> IDBVersionChangeEvent::create(const String& version) 37 { 38 return adoptRef(new IDBVersionChangeEvent(version)); 39 } 36 class IDBDatabaseCallbacks : public RefCounted<IDBDatabaseCallbacks> { 37 public: 38 virtual ~IDBDatabaseCallbacks() { } 40 39 41 IDBVersionChangeEvent::IDBVersionChangeEvent(const String& version) 42 : Event(eventNames().blockedEvent, false /*canBubble*/, false /*cancelable*/) 43 , m_version(version) 44 { 45 } 46 47 IDBVersionChangeEvent::~IDBVersionChangeEvent() 48 { 49 } 50 51 String IDBVersionChangeEvent::version() 52 { 53 return m_version; 54 } 40 virtual void onVersionChange(const String& version) = 0; 41 }; 55 42 56 43 } // namespace WebCore 57 44 58 45 #endif 46 47 #endif // IDBDatabaseCallbacks_h -
trunk/Source/WebCore/storage/IDBFactoryBackendImpl.cpp
r79445 r80183 76 76 IDBDatabaseBackendMap::iterator it = m_databaseBackendMap.find(uniqueIdentifier); 77 77 if (it != m_databaseBackendMap.end()) { 78 it->second->open();79 78 callbacks->onSuccess(it->second); 80 79 return; … … 96 95 97 96 RefPtr<IDBDatabaseBackendImpl> databaseBackend = IDBDatabaseBackendImpl::create(name, backingStore.get(), m_transactionCoordinator.get(), this, uniqueIdentifier); 98 databaseBackend->open();99 97 callbacks->onSuccess(databaseBackend.get()); 100 98 m_databaseBackendMap.set(uniqueIdentifier, databaseBackend.get()); -
trunk/Source/WebCore/storage/IDBRequest.cpp
r80171 r80183 200 200 { 201 201 ASSERT(!m_errorCode && m_errorMessage.isNull() && !m_result); 202 m_result = IDBAny::create(IDBDatabase::create(scriptExecutionContext(), backend)); 202 RefPtr<IDBDatabase> idbDatabase = IDBDatabase::create(scriptExecutionContext(), backend); 203 idbDatabase->open(); 204 205 m_result = IDBAny::create(idbDatabase.release()); 203 206 enqueueEvent(createSuccessEvent()); 204 207 } -
trunk/Source/WebCore/storage/IDBVersionChangeEvent.cpp
r78752 r80183 34 34 namespace WebCore { 35 35 36 PassRefPtr<IDBVersionChangeEvent> IDBVersionChangeEvent::create(const String& version )36 PassRefPtr<IDBVersionChangeEvent> IDBVersionChangeEvent::create(const String& version, const AtomicString& eventType) 37 37 { 38 return adoptRef(new IDBVersionChangeEvent(version ));38 return adoptRef(new IDBVersionChangeEvent(version, eventType)); 39 39 } 40 40 41 IDBVersionChangeEvent::IDBVersionChangeEvent(const String& version )42 : Event(event Names().blockedEvent, false /*canBubble*/, false /*cancelable*/)41 IDBVersionChangeEvent::IDBVersionChangeEvent(const String& version, const AtomicString& eventType) 42 : Event(eventType, false /*canBubble*/, false /*cancelable*/) 43 43 , m_version(version) 44 44 { -
trunk/Source/WebCore/storage/IDBVersionChangeEvent.h
r78752 r80183 40 40 class IDBVersionChangeEvent : public Event { 41 41 public: 42 static PassRefPtr<IDBVersionChangeEvent> create(const String& version );42 static PassRefPtr<IDBVersionChangeEvent> create(const String& version, const AtomicString& eventType); 43 43 // FIXME: Need to allow creation of these events from JS. 44 44 virtual ~IDBVersionChangeEvent(); … … 49 49 50 50 private: 51 IDBVersionChangeEvent(const String& version );51 IDBVersionChangeEvent(const String& version, const AtomicString& eventType); 52 52 53 53 String m_version; -
trunk/Source/WebCore/storage/IDBVersionChangeRequest.cpp
r78752 r80183 52 52 { 53 53 ASSERT(!m_errorCode && m_errorMessage.isNull() && !m_result); 54 enqueueEvent(IDBVersionChangeEvent::create(m_version ));54 enqueueEvent(IDBVersionChangeEvent::create(m_version, eventNames().blockedEvent)); 55 55 } 56 56 -
trunk/Source/WebKit/chromium/ChangeLog
r80181 r80183 1 2011-03-02 David Grogan <dgrogan@chromium.org> 2 3 Reviewed by Jeremy Orlow. 4 5 IndexedDB: fire versionchange events when calling setVersion 6 https://bugs.webkit.org/show_bug.cgi?id=55095 7 8 * WebKit.gyp: 9 * src/IDBDatabaseCallbacksProxy.cpp: Copied from Source/WebCore/storage/IDBVersionChangeEvent.h. 10 (WebCore::IDBDatabaseCallbacksProxy::create): 11 (WebCore::IDBDatabaseCallbacksProxy::IDBDatabaseCallbacksProxy): 12 (WebCore::IDBDatabaseCallbacksProxy::~IDBDatabaseCallbacksProxy): 13 (WebCore::IDBDatabaseCallbacksProxy::onVersionChange): 14 * src/IDBDatabaseCallbacksProxy.h: Copied from Source/WebCore/storage/IDBVersionChangeEvent.h. 15 * src/IDBDatabaseProxy.cpp: 16 (WebCore::IDBDatabaseProxy::setVersion): 17 (WebCore::IDBDatabaseProxy::close): 18 (WebCore::IDBDatabaseProxy::open): 19 * src/IDBDatabaseProxy.h: 20 * src/WebIDBDatabaseCallbacksImpl.cpp: Copied from Source/WebCore/storage/IDBVersionChangeEvent.cpp. 21 (WebCore::WebIDBDatabaseCallbacksImpl::WebIDBDatabaseCallbacksImpl): 22 (WebCore::WebIDBDatabaseCallbacksImpl::~WebIDBDatabaseCallbacksImpl): 23 (WebCore::WebIDBDatabaseCallbacksImpl::onVersionChange): 24 * src/WebIDBDatabaseCallbacksImpl.h: Copied from Source/WebCore/storage/IDBVersionChangeEvent.h. 25 * src/WebIDBDatabaseImpl.cpp: 26 (WebKit::WebIDBDatabaseImpl::setVersion): 27 (WebKit::WebIDBDatabaseImpl::close): 28 (WebKit::WebIDBDatabaseImpl::open): 29 * src/WebIDBDatabaseImpl.h: 30 1 31 2011-03-02 Sheriff Bot <webkit.review.bot@gmail.com> 2 32 -
trunk/Source/WebKit/chromium/WebKit.gyp
r80087 r80183 363 363 'src/IDBCursorBackendProxy.cpp', 364 364 'src/IDBCursorBackendProxy.h', 365 'src/IDBDatabaseCallbacksProxy.cpp', 366 'src/IDBDatabaseCallbacksProxy.h', 365 367 'src/IDBDatabaseProxy.cpp', 366 368 'src/IDBDatabaseProxy.h', … … 479 481 'src/WebIDBCursorImpl.cpp', 480 482 'src/WebIDBCursorImpl.h', 483 'src/WebIDBDatabaseCallbacksImpl.cpp', 484 'src/WebIDBDatabaseCallbacksImpl.h', 481 485 'src/WebIDBDatabaseError.cpp', 482 486 'src/WebIDBDatabaseImpl.cpp', -
trunk/Source/WebKit/chromium/src/IDBDatabaseCallbacksProxy.cpp
r80182 r80183 24 24 */ 25 25 26 #i fndef IDBVersionChangeEvent_h27 # define IDBVersionChangeEvent_h26 #include "config.h" 27 #include "IDBDatabaseCallbacksProxy.h" 28 28 29 29 #if ENABLE(INDEXED_DATABASE) 30 30 31 #include "Event.h" 32 #include "PlatformString.h" 33 #include <wtf/PassRefPtr.h> 34 #include <wtf/RefPtr.h> 31 #include "WebIDBDatabaseCallbacks.h" 35 32 36 33 namespace WebCore { 37 34 38 class IDBAny; 35 PassRefPtr<IDBDatabaseCallbacksProxy> IDBDatabaseCallbacksProxy::create(PassOwnPtr<WebKit::WebIDBDatabaseCallbacks> callbacks) 36 { 37 return adoptRef(new IDBDatabaseCallbacksProxy(callbacks)); 38 } 39 39 40 class IDBVersionChangeEvent : public Event { 41 public: 42 static PassRefPtr<IDBVersionChangeEvent> create(const String& version); 43 // FIXME: Need to allow creation of these events from JS. 44 virtual ~IDBVersionChangeEvent(); 40 IDBDatabaseCallbacksProxy::IDBDatabaseCallbacksProxy(PassOwnPtr<WebKit::WebIDBDatabaseCallbacks> callbacks) 41 : m_callbacks(callbacks) 42 { 43 } 45 44 46 virtual bool isIDBVersionChangeEvent() const { return true; } 45 IDBDatabaseCallbacksProxy::~IDBDatabaseCallbacksProxy() 46 { 47 } 47 48 48 virtual String version(); 49 50 private: 51 IDBVersionChangeEvent(const String& version); 52 53 String m_version; 54 }; 49 void IDBDatabaseCallbacksProxy::onVersionChange(const String& requestedVersion) 50 { 51 m_callbacks->onVersionChange(requestedVersion); 52 } 55 53 56 54 } // namespace WebCore 57 55 58 56 #endif // ENABLE(INDEXED_DATABASE) 59 60 #endif // IDBVersionChangeEvent_h -
trunk/Source/WebKit/chromium/src/IDBDatabaseCallbacksProxy.h
r80182 r80183 24 24 */ 25 25 26 #ifndef IDBVersionChangeEvent_h 27 #define IDBVersionChangeEvent_h 26 #ifndef IDBDatabaseCallbacksProxy_h 27 #define IDBDatabaseCallbacksProxy_h 28 29 #include "IDBDatabaseCallbacks.h" 28 30 29 31 #if ENABLE(INDEXED_DATABASE) 30 32 31 #include "Event.h" 32 #include "PlatformString.h" 33 #include <wtf/PassRefPtr.h> 34 #include <wtf/RefPtr.h> 33 #include <wtf/PassOwnPtr.h> 34 35 namespace WebKit { class WebIDBDatabaseCallbacks; } 35 36 36 37 namespace WebCore { 37 38 38 class IDBAny; 39 class IDBDatabaseCallbacksProxy : public IDBDatabaseCallbacks { 40 public: 41 static PassRefPtr<IDBDatabaseCallbacksProxy> create(PassOwnPtr<WebKit::WebIDBDatabaseCallbacks>); 42 virtual ~IDBDatabaseCallbacksProxy(); 39 43 40 class IDBVersionChangeEvent : public Event { 41 public: 42 static PassRefPtr<IDBVersionChangeEvent> create(const String& version); 43 // FIXME: Need to allow creation of these events from JS. 44 virtual ~IDBVersionChangeEvent(); 45 46 virtual bool isIDBVersionChangeEvent() const { return true; } 47 48 virtual String version(); 44 virtual void onVersionChange(const String& requestedVersion); 49 45 50 46 private: 51 IDB VersionChangeEvent(const String& version);47 IDBDatabaseCallbacksProxy(PassOwnPtr<WebKit::WebIDBDatabaseCallbacks>); 52 48 53 String m_version;49 OwnPtr<WebKit::WebIDBDatabaseCallbacks> m_callbacks; 54 50 }; 55 51 56 52 } // namespace WebCore 57 53 58 #endif // ENABLE(INDEXED_DATABASE)54 #endif 59 55 60 #endif // IDB VersionChangeEvent_h56 #endif // IDBDatabaseCallbacksProxy_h -
trunk/Source/WebKit/chromium/src/IDBDatabaseProxy.cpp
r77647 r80183 29 29 #include "DOMStringList.h" 30 30 #include "IDBCallbacks.h" 31 #include "IDBDatabaseCallbacks.h" 31 32 #include "IDBObjectStoreProxy.h" 32 33 #include "IDBTransactionBackendProxy.h" … … 35 36 #include "WebIDBCallbacksImpl.h" 36 37 #include "WebIDBDatabase.h" 38 #include "WebIDBDatabaseCallbacksImpl.h" 37 39 #include "WebIDBDatabaseError.h" 38 40 #include "WebIDBObjectStore.h" … … 91 93 } 92 94 93 void IDBDatabaseProxy::setVersion(const String& version, PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec)95 void IDBDatabaseProxy::setVersion(const String& version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks, ExceptionCode& ec) 94 96 { 95 97 m_webIDBDatabase->setVersion(version, new WebIDBCallbacksImpl(callbacks), ec); … … 107 109 } 108 110 109 void IDBDatabaseProxy::close( )111 void IDBDatabaseProxy::close(PassRefPtr<IDBDatabaseCallbacks>) 110 112 { 111 113 m_webIDBDatabase->close(); 114 } 115 116 void IDBDatabaseProxy::open(PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks) 117 { 118 m_webIDBDatabase->open(new WebIDBDatabaseCallbacksImpl(databaseCallbacks)); 112 119 } 113 120 -
trunk/Source/WebKit/chromium/src/IDBDatabaseProxy.h
r77647 r80183 49 49 virtual PassRefPtr<IDBObjectStoreBackendInterface> createObjectStore(const String& name, const String& keyPath, bool autoIncrement, IDBTransactionBackendInterface*, ExceptionCode&); 50 50 virtual void deleteObjectStore(const String& name, IDBTransactionBackendInterface*, ExceptionCode&); 51 virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>, ExceptionCode&);51 virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBDatabaseCallbacks>, ExceptionCode&); 52 52 virtual PassRefPtr<IDBTransactionBackendInterface> transaction(DOMStringList* storeNames, unsigned short mode, ExceptionCode&); 53 virtual void close(); 53 virtual void close(PassRefPtr<IDBDatabaseCallbacks>); 54 55 virtual void open(PassRefPtr<IDBDatabaseCallbacks>); 54 56 55 57 private: -
trunk/Source/WebKit/chromium/src/WebIDBDatabaseCallbacksImpl.cpp
r80182 r80183 25 25 26 26 #include "config.h" 27 #include " IDBVersionChangeEvent.h"27 #include "WebIDBDatabaseCallbacksImpl.h" 28 28 29 29 #if ENABLE(INDEXED_DATABASE) 30 30 31 #include " EventNames.h"32 #include " IDBAny.h"31 #include "IDBDatabaseCallbacks.h" 32 #include "WebString.h" 33 33 34 34 namespace WebCore { 35 35 36 PassRefPtr<IDBVersionChangeEvent> IDBVersionChangeEvent::create(const String& version) 37 { 38 return adoptRef(new IDBVersionChangeEvent(version)); 39 } 40 41 IDBVersionChangeEvent::IDBVersionChangeEvent(const String& version) 42 : Event(eventNames().blockedEvent, false /*canBubble*/, false /*cancelable*/) 43 , m_version(version) 36 WebIDBDatabaseCallbacksImpl::WebIDBDatabaseCallbacksImpl(PassRefPtr<IDBDatabaseCallbacks> callbacks) 37 : m_callbacks(callbacks) 44 38 { 45 39 } 46 40 47 IDBVersionChangeEvent::~IDBVersionChangeEvent()41 WebIDBDatabaseCallbacksImpl::~WebIDBDatabaseCallbacksImpl() 48 42 { 49 43 } 50 44 51 String IDBVersionChangeEvent::version()45 void WebIDBDatabaseCallbacksImpl::onVersionChange(const WebKit::WebString& version) 52 46 { 53 return m_version;47 m_callbacks->onVersionChange(version); 54 48 } 55 49 56 50 } // namespace WebCore 57 51 58 #endif 52 #endif // ENABLE(INDEXED_DATABASE) -
trunk/Source/WebKit/chromium/src/WebIDBDatabaseCallbacksImpl.h
r80182 r80183 24 24 */ 25 25 26 #ifndef IDBVersionChangeEvent_h27 #define IDBVersionChangeEvent_h26 #ifndef WebIDBDatabaseCallbacksImpl_h 27 #define WebIDBDatabaseCallbacksImpl_h 28 28 29 29 #if ENABLE(INDEXED_DATABASE) 30 30 31 #include "Event.h" 32 #include "PlatformString.h" 31 #include "WebDOMStringList.h" 32 #include "WebIDBDatabaseCallbacks.h" 33 #include "WebString.h" 33 34 #include <wtf/PassRefPtr.h> 34 35 #include <wtf/RefPtr.h> … … 36 37 namespace WebCore { 37 38 38 class IDB Any;39 class IDBDatabaseCallbacks; 39 40 40 class IDBVersionChangeEvent : public Event{41 class WebIDBDatabaseCallbacksImpl : public WebKit::WebIDBDatabaseCallbacks { 41 42 public: 42 static PassRefPtr<IDBVersionChangeEvent> create(const String& version); 43 // FIXME: Need to allow creation of these events from JS. 44 virtual ~IDBVersionChangeEvent(); 43 WebIDBDatabaseCallbacksImpl(PassRefPtr<IDBDatabaseCallbacks>); 44 virtual ~WebIDBDatabaseCallbacksImpl(); 45 45 46 virtual bool isIDBVersionChangeEvent() const { return true; } 47 48 virtual String version(); 46 virtual void onVersionChange(const WebKit::WebString& version); 49 47 50 48 private: 51 IDBVersionChangeEvent(const String& version); 52 53 String m_version; 49 RefPtr<IDBDatabaseCallbacks> m_callbacks; 54 50 }; 55 51 56 52 } // namespace WebCore 57 53 58 #endif // ENABLE(INDEXED_DATABASE)54 #endif 59 55 60 #endif // IDBVersionChangeEvent_h56 #endif // WebIDBDatabaseCallbacksImpl_h -
trunk/Source/WebKit/chromium/src/WebIDBDatabaseImpl.cpp
r77647 r80183 30 30 #include "IDBCallbacksProxy.h" 31 31 #include "IDBDatabaseBackendInterface.h" 32 #include "IDBDatabaseCallbacksProxy.h" 32 33 #include "IDBTransactionBackendInterface.h" 33 34 #include "WebIDBCallbacks.h" 35 #include "WebIDBDatabaseCallbacks.h" 34 36 #include "WebIDBObjectStoreImpl.h" 35 37 #include "WebIDBTransactionImpl.h" … … 82 84 void WebIDBDatabaseImpl::setVersion(const WebString& version, WebIDBCallbacks* callbacks, WebExceptionCode& ec) 83 85 { 84 m_databaseBackend->setVersion(version, IDBCallbacksProxy::create(callbacks), ec);86 m_databaseBackend->setVersion(version, IDBCallbacksProxy::create(callbacks), m_databaseCallbacks, ec); 85 87 } 86 88 … … 98 100 void WebIDBDatabaseImpl::close() 99 101 { 100 m_databaseBackend->close(); 102 // Use the callbacks that ::open gave us so that the backend in 103 // multi-process chromium knows which database connection is closing. 104 ASSERT(m_databaseCallbacks); 105 m_databaseBackend->close(m_databaseCallbacks); 106 } 107 108 void WebIDBDatabaseImpl::open(WebIDBDatabaseCallbacks* callbacks) 109 { 110 ASSERT(!m_databaseCallbacks); 111 m_databaseCallbacks = IDBDatabaseCallbacksProxy::create(callbacks); 112 m_databaseBackend->open(m_databaseCallbacks); 101 113 } 102 114 -
trunk/Source/WebKit/chromium/src/WebIDBDatabaseImpl.h
r77647 r80183 33 33 #include <wtf/RefPtr.h> 34 34 35 namespace WebCore { class IDBDatabaseBackendInterface; } 35 namespace WebCore { 36 class IDBDatabaseBackendInterface; 37 class IDBDatabaseCallbacksProxy; 38 } 36 39 37 40 namespace WebKit { 38 41 42 class WebIDBDatabaseCallbacks; 39 43 class WebIDBObjectStore; 40 44 class WebIDBTransaction; … … 52 56 virtual WebIDBObjectStore* createObjectStore(const WebString& name, const WebString& keyPath, bool autoIncrement, const WebIDBTransaction&, WebExceptionCode&); 53 57 virtual void deleteObjectStore(const WebString& name, const WebIDBTransaction&, WebExceptionCode&); 54 virtual void setVersion(const WebString& version, WebIDBCallbacks* callbacks, WebExceptionCode&);58 virtual void setVersion(const WebString& version, WebIDBCallbacks*, WebExceptionCode&); 55 59 virtual WebIDBTransaction* transaction(const WebDOMStringList& names, unsigned short mode, WebExceptionCode&); 56 60 virtual void close(); 57 61 62 virtual void open(WebIDBDatabaseCallbacks*); 63 58 64 private: 59 65 WTF::RefPtr<WebCore::IDBDatabaseBackendInterface> m_databaseBackend; 66 WTF::RefPtr<WebCore::IDBDatabaseCallbacksProxy> m_databaseCallbacks; 60 67 }; 61 68
Note: See TracChangeset
for help on using the changeset viewer.