Title: [185480] trunk
Revision
185480
Author
beid...@apple.com
Date
2015-06-11 17:17:32 -0700 (Thu, 11 Jun 2015)

Log Message

IndexedDB onupgradeneeded event has incorrect value for oldVersion.
<rdar://problem/18309792> and https://bugs.webkit.org/show_bug.cgi?id=136888

Reviewed by Sam Weinig.

Source/WebCore:

Test: storage/indexeddb/version-change-event-basic.html

"NoIntVersion" is an internal bookkeeping concept that we never should've been passing to _javascript_.

This cleans up things by:
- Adjusting an old version of "NoIntVersion" to "0" before making the version change callback.
- Removing the VersionNullness parameter from almost everywhere.
- Removing the nullability of the newVersion parameter from the IDL.

* Modules/indexeddb/IDBDatabase.cpp:
(WebCore::IDBDatabase::onVersionChange):
* Modules/indexeddb/IDBDatabase.h:

* Modules/indexeddb/IDBDatabaseBackend.cpp:
(WebCore::IDBDatabaseBackend::runIntVersionChangeTransaction):
(WebCore::IDBDatabaseBackend::deleteDatabase):

* Modules/indexeddb/IDBDatabaseCallbacks.h:
* Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp:
(WebCore::IDBDatabaseCallbacksImpl::onVersionChange):
* Modules/indexeddb/IDBDatabaseCallbacksImpl.h:

* Modules/indexeddb/IDBOpenDBRequest.cpp:
(WebCore::IDBOpenDBRequest::onBlocked):
(WebCore::IDBOpenDBRequest::onUpgradeNeeded):

* Modules/indexeddb/IDBTransactionBackendOperations.cpp:
(WebCore::IDBDatabaseBackend::VersionChangeOperation::perform):

* Modules/indexeddb/IDBVersionChangeEvent.cpp:
(WebCore::IDBVersionChangeEvent::IDBVersionChangeEvent):
* Modules/indexeddb/IDBVersionChangeEvent.h:
(WebCore::IDBVersionChangeEvent::create):
(WebCore::IDBVersionChangeEvent::newVersion):
* Modules/indexeddb/IDBVersionChangeEvent.idl:

LayoutTests:

* storage/indexeddb/version-change-event-basic-expected.txt: Added.
* storage/indexeddb/version-change-event-basic.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (185479 => 185480)


--- trunk/LayoutTests/ChangeLog	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/LayoutTests/ChangeLog	2015-06-12 00:17:32 UTC (rev 185480)
@@ -1,3 +1,13 @@
+2015-06-11  Brady Eidson  <beid...@apple.com>
+
+        IndexedDB onupgradeneeded event has incorrect value for oldVersion.
+        <rdar://problem/18309792> and https://bugs.webkit.org/show_bug.cgi?id=136888
+
+        Reviewed by Sam Weinig.
+
+        * storage/indexeddb/version-change-event-basic-expected.txt: Added.
+        * storage/indexeddb/version-change-event-basic.html: Added.
+
 2015-06-11  Dean Jackson  <d...@apple.com>
 
         Add an appearance keyword for wireless playback / airplay icon

Added: trunk/LayoutTests/storage/indexeddb/version-change-event-basic-expected.txt (0 => 185480)


--- trunk/LayoutTests/storage/indexeddb/version-change-event-basic-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/version-change-event-basic-expected.txt	2015-06-12 00:17:32 UTC (rev 185480)
@@ -0,0 +1,7 @@
+0 version: TypeError: Type error
+Negative version: TypeError: Type error
+String version: TypeError: Type error
+First request: 0 1
+Second request: 0 1
+Third request: 0 2
+

Added: trunk/LayoutTests/storage/indexeddb/version-change-event-basic.html (0 => 185480)


--- trunk/LayoutTests/storage/indexeddb/version-change-event-basic.html	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/version-change-event-basic.html	2015-06-12 00:17:32 UTC (rev 185480)
@@ -0,0 +1,51 @@
+<body>
+<div id="logger"></div>
+<script>
+
+if (window.testRunner) {
+    testRunner.dumpAsText();
+    testRunner.waitUntilDone();
+}
+
+function log(msg) {
+    document.getElementById("logger").innerHTML += msg + "<br>";
+}
+
+var request1 = indexedDB.open("vceb1");
+request1._onupgradeneeded_ = function(e) {
+    log("First request: " + e.oldVersion + " " + e.newVersion);
+}
+
+var request2 = indexedDB.open("vceb2", 1);
+request2._onupgradeneeded_ = function(e) {
+    log("Second request: " + e.oldVersion + " " + e.newVersion);
+}
+
+var request3 = indexedDB.open("vceb3", 2);
+request3._onupgradeneeded_ = function(e) {
+    log("Third request: " + e.oldVersion + " " + e.newVersion);
+    if (window.testRunner)
+        testRunner.notifyDone();
+}
+
+try {
+    var request = indexedDB.open("vceb4", 0);
+} catch (e) {
+    log("0 version: " + e);
+}
+
+try {
+    var request = indexedDB.open("vceb5", -1);
+} catch (e) {
+    log("Negative version: " + e);
+}
+
+try {
+    var request = indexedDB.open("vceb6", "string");
+} catch (e) {
+    log("String version: " + e);
+}
+
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (185479 => 185480)


--- trunk/Source/WebCore/ChangeLog	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/ChangeLog	2015-06-12 00:17:32 UTC (rev 185480)
@@ -1,3 +1,46 @@
+2015-06-11  Brady Eidson  <beid...@apple.com>
+
+        IndexedDB onupgradeneeded event has incorrect value for oldVersion.
+        <rdar://problem/18309792> and https://bugs.webkit.org/show_bug.cgi?id=136888
+
+        Reviewed by Sam Weinig.
+
+        Test: storage/indexeddb/version-change-event-basic.html
+
+        "NoIntVersion" is an internal bookkeeping concept that we never should've been passing to _javascript_.
+        
+        This cleans up things by:
+        - Adjusting an old version of "NoIntVersion" to "0" before making the version change callback.
+        - Removing the VersionNullness parameter from almost everywhere.
+        - Removing the nullability of the newVersion parameter from the IDL.
+
+        * Modules/indexeddb/IDBDatabase.cpp:
+        (WebCore::IDBDatabase::onVersionChange):
+        * Modules/indexeddb/IDBDatabase.h:
+        
+        * Modules/indexeddb/IDBDatabaseBackend.cpp:
+        (WebCore::IDBDatabaseBackend::runIntVersionChangeTransaction):
+        (WebCore::IDBDatabaseBackend::deleteDatabase):
+        
+        * Modules/indexeddb/IDBDatabaseCallbacks.h:
+        * Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp:
+        (WebCore::IDBDatabaseCallbacksImpl::onVersionChange):
+        * Modules/indexeddb/IDBDatabaseCallbacksImpl.h:
+        
+        * Modules/indexeddb/IDBOpenDBRequest.cpp:
+        (WebCore::IDBOpenDBRequest::onBlocked):
+        (WebCore::IDBOpenDBRequest::onUpgradeNeeded):
+        
+        * Modules/indexeddb/IDBTransactionBackendOperations.cpp:
+        (WebCore::IDBDatabaseBackend::VersionChangeOperation::perform):
+        
+        * Modules/indexeddb/IDBVersionChangeEvent.cpp:
+        (WebCore::IDBVersionChangeEvent::IDBVersionChangeEvent):
+        * Modules/indexeddb/IDBVersionChangeEvent.h:
+        (WebCore::IDBVersionChangeEvent::create):
+        (WebCore::IDBVersionChangeEvent::newVersion):
+        * Modules/indexeddb/IDBVersionChangeEvent.idl:
+
 2015-06-11  Matt Rajca  <mra...@apple.com>
 
         Media Session: Add plumbing for media control event delivery.

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp	2015-06-12 00:17:32 UTC (rev 185480)
@@ -325,7 +325,7 @@
     m_isClosed = true;
 }
 
-void IDBDatabase::onVersionChange(uint64_t oldVersion, uint64_t newVersion, IndexedDB::VersionNullness newVersionNullness)
+void IDBDatabase::onVersionChange(uint64_t oldVersion, uint64_t newVersion)
 {
     LOG(StorageAPI, "IDBDatabase::onVersionChange");
     if (m_contextStopped || !scriptExecutionContext())
@@ -334,7 +334,8 @@
     if (m_closePending)
         return;
 
-    enqueueEvent(IDBVersionChangeEvent::create(oldVersion, newVersion, newVersionNullness, eventNames().versionchangeEvent));
+    ASSERT(newVersion != IDBDatabaseMetadata::NoIntVersion && newVersion != IDBDatabaseMetadata::DefaultIntVersion);
+    enqueueEvent(IDBVersionChangeEvent::create(oldVersion, newVersion, eventNames().versionchangeEvent));
 }
 
 void IDBDatabase::enqueueEvent(PassRefPtr<Event> event)

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h	2015-06-12 00:17:32 UTC (rev 185480)
@@ -72,7 +72,7 @@
     void close();
 
     // IDBDatabaseCallbacks
-    virtual void onVersionChange(uint64_t oldVersion, uint64_t newVersion, IndexedDB::VersionNullness newVersionNullness);
+    virtual void onVersionChange(uint64_t oldVersion, uint64_t newVersion);
     virtual void onAbort(int64_t, PassRefPtr<IDBDatabaseError>);
     virtual void onComplete(int64_t);
 

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackend.cpp (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackend.cpp	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackend.cpp	2015-06-12 00:17:32 UTC (rev 185480)
@@ -500,7 +500,7 @@
     for (auto& callback : m_databaseCallbacksSet) {
         // Front end ensures the event is not fired at connections that have closePending set.
         if (callback != databaseCallbacks)
-            callback->onVersionChange(m_metadata.version, requestedVersion, IndexedDB::VersionNullness::Null);
+            callback->onVersionChange(m_metadata.version, requestedVersion);
     }
     // The spec dictates we wait until all the version change events are
     // delivered and then check m_databaseCallbacks.empty() before proceeding
@@ -533,7 +533,7 @@
     if (isDeleteDatabaseBlocked()) {
         for (auto& callback : m_databaseCallbacksSet) {
             // Front end ensures the event is not fired at connections that have closePending set.
-            callback->onVersionChange(m_metadata.version, 0, IndexedDB::VersionNullness::Null);
+            callback->onVersionChange(m_metadata.version, 0);
         }
         // FIXME: Only fire onBlocked if there are open connections after the
         // VersionChangeEvents are received, not just set up to fire.

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacks.h (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacks.h	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacks.h	2015-06-12 00:17:32 UTC (rev 185480)
@@ -42,7 +42,7 @@
     virtual ~IDBDatabaseCallbacks() { }
 
     virtual void onForcedClose() = 0;
-    virtual void onVersionChange(uint64_t oldVersion, uint64_t newVersion, IndexedDB::VersionNullness newVersionNullness) = 0;
+    virtual void onVersionChange(uint64_t oldVersion, uint64_t newVersion) = 0;
 
     virtual void onAbort(int64_t transactionId, PassRefPtr<IDBDatabaseError>) = 0;
     virtual void onComplete(int64_t transactionId) = 0;

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp	2015-06-12 00:17:32 UTC (rev 185480)
@@ -52,10 +52,10 @@
         m_database->forceClose();
 }
 
-void IDBDatabaseCallbacksImpl::onVersionChange(uint64_t oldVersion, uint64_t newVersion, IndexedDB::VersionNullness newVersionNullness)
+void IDBDatabaseCallbacksImpl::onVersionChange(uint64_t oldVersion, uint64_t newVersion)
 {
     if (m_database)
-        m_database->onVersionChange(oldVersion, newVersion, newVersionNullness);
+        m_database->onVersionChange(oldVersion, newVersion);
 }
 
 void IDBDatabaseCallbacksImpl::connect(IDBDatabase* database)

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.h (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.h	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.h	2015-06-12 00:17:32 UTC (rev 185480)
@@ -43,7 +43,7 @@
 
     // IDBDatabaseCallbacks
     virtual void onForcedClose() override;
-    virtual void onVersionChange(uint64_t oldVersion, uint64_t newVersion, IndexedDB::VersionNullness newVersionNullness) override;
+    virtual void onVersionChange(uint64_t oldVersion, uint64_t newVersion) override;
 
     virtual void onAbort(int64_t transactionId, PassRefPtr<IDBDatabaseError>) override;
     virtual void onComplete(int64_t transactionId) override;

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp	2015-06-12 00:17:32 UTC (rev 185480)
@@ -69,7 +69,7 @@
     if (!shouldEnqueueEvent())
         return;
     
-    enqueueEvent(IDBVersionChangeEvent::create(oldVersion, m_version, m_versionNullness, eventNames().blockedEvent));
+    enqueueEvent(IDBVersionChangeEvent::create(oldVersion, m_version, eventNames().blockedEvent));
 }
 
 void IDBOpenDBRequest::onUpgradeNeeded(uint64_t oldVersion, PassRefPtr<IDBDatabaseBackend> prpDatabaseBackend, const IDBDatabaseMetadata& metadata)
@@ -101,7 +101,7 @@
 
     if (m_versionNullness == IndexedDB::VersionNullness::Null)
         m_version = 1;
-    enqueueEvent(IDBVersionChangeEvent::create(oldVersion, m_version, m_versionNullness, eventNames().upgradeneededEvent));
+    enqueueEvent(IDBVersionChangeEvent::create(oldVersion, m_version, eventNames().upgradeneededEvent));
 }
 
 void IDBOpenDBRequest::onSuccess(PassRefPtr<IDBDatabaseBackend> prpBackend, const IDBDatabaseMetadata& metadata)

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendOperations.cpp (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendOperations.cpp	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendOperations.cpp	2015-06-12 00:17:32 UTC (rev 185480)
@@ -238,8 +238,11 @@
     LOG(StorageAPI, "VersionChangeOperation");
 
     uint64_t oldVersion = m_transaction->database().metadata().version;
+    if (oldVersion == IDBDatabaseMetadata::NoIntVersion)
+        oldVersion = 0;
+
     RefPtr<IDBDatabaseBackend::VersionChangeOperation> operation(this);
-    ASSERT(static_cast<uint64_t>(m_version) > oldVersion || oldVersion == IDBDatabaseMetadata::NoIntVersion);
+    ASSERT(static_cast<uint64_t>(m_version) > oldVersion);
 
     std::function<void(PassRefPtr<IDBDatabaseError>)> operationCallback = [oldVersion, operation, this, completionCallback](PassRefPtr<IDBDatabaseError> prpError) {
         RefPtr<IDBDatabaseError> error = prpError;

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBVersionChangeEvent.cpp (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBVersionChangeEvent.cpp	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBVersionChangeEvent.cpp	2015-06-12 00:17:32 UTC (rev 185480)
@@ -30,11 +30,10 @@
 
 namespace WebCore {
 
-IDBVersionChangeEvent::IDBVersionChangeEvent(unsigned long long oldVersion, unsigned long long newVersion, IndexedDB::VersionNullness newVersionNullness, const AtomicString& eventType)
+IDBVersionChangeEvent::IDBVersionChangeEvent(unsigned long long oldVersion, unsigned long long newVersion, const AtomicString& eventType)
     : Event(eventType, false /*canBubble*/, false /*cancelable*/)
     , m_oldVersion(oldVersion)
     , m_newVersion(newVersion)
-    , m_newVersionNullness(newVersionNullness)
 {
 }
 

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBVersionChangeEvent.h (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBVersionChangeEvent.h	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBVersionChangeEvent.h	2015-06-12 00:17:32 UTC (rev 185480)
@@ -38,24 +38,23 @@
 
 class IDBVersionChangeEvent : public Event {
 public:
-    static Ref<IDBVersionChangeEvent> create(unsigned long long oldVersion = 0, unsigned long long newVersion = 0, IndexedDB::VersionNullness newVersionNullness = IndexedDB::VersionNullness::Null, const AtomicString& eventType = AtomicString())
+    static Ref<IDBVersionChangeEvent> create(unsigned long long oldVersion = 0, unsigned long long newVersion = 0, const AtomicString& eventType = AtomicString())
     {
-        return adoptRef(*new IDBVersionChangeEvent(oldVersion, newVersion, newVersionNullness, eventType));
+        return adoptRef(*new IDBVersionChangeEvent(oldVersion, newVersion, eventType));
     }
 
     virtual ~IDBVersionChangeEvent();
 
     virtual unsigned long long oldVersion() { return m_oldVersion; }
-    virtual unsigned long long newVersion(bool& isNull) { isNull = (m_newVersionNullness == IndexedDB::VersionNullness::Null); return m_newVersion; }
+    virtual unsigned long long newVersion() { return m_newVersion; }
 
     virtual EventInterface eventInterface() const;
 
 private:
-    IDBVersionChangeEvent(unsigned long long oldVersion, unsigned long long newVersion, IndexedDB::VersionNullness newVersionNullness, const AtomicString& eventType);
+    IDBVersionChangeEvent(unsigned long long oldVersion, unsigned long long newVersion, const AtomicString& eventType);
 
     unsigned long long m_oldVersion;
     unsigned long long m_newVersion;
-    IndexedDB::VersionNullness m_newVersionNullness;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBVersionChangeEvent.idl (185479 => 185480)


--- trunk/Source/WebCore/Modules/indexeddb/IDBVersionChangeEvent.idl	2015-06-12 00:13:41 UTC (rev 185479)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBVersionChangeEvent.idl	2015-06-12 00:17:32 UTC (rev 185480)
@@ -28,5 +28,5 @@
     EnabledAtRuntime=IndexedDB,
 ] interface IDBVersionChangeEvent : Event {
     readonly attribute unsigned long long oldVersion;
-    readonly attribute unsigned long long? newVersion;
+    readonly attribute unsigned long long newVersion;
 };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to