Title: [202019] trunk
Revision
202019
Author
[email protected]
Date
2016-06-13 17:34:11 -0700 (Mon, 13 Jun 2016)

Log Message

storage/indexeddb/modern/leaks-1.html leaks the database connection handle.
https://bugs.webkit.org/show_bug.cgi?id=158643

Reviewed by Alex Christensen.

Source/WebCore:

Tested by changes to existing test.

* Modules/indexeddb/IDBDatabase.cpp:
(WebCore::IDBDatabase::hasPendingActivity):

* dom/EventTarget.h:
(WebCore::EventTarget::eventTargetData):
(WebCore::EventTarget::hasEventListeners):

LayoutTests:

* storage/indexeddb/modern/leak-1-expected.txt:
* storage/indexeddb/modern/resources/leak-1.js:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (202018 => 202019)


--- trunk/LayoutTests/ChangeLog	2016-06-14 00:17:44 UTC (rev 202018)
+++ trunk/LayoutTests/ChangeLog	2016-06-14 00:34:11 UTC (rev 202019)
@@ -1,3 +1,13 @@
+2016-06-13  Brady Eidson  <[email protected]>
+
+        storage/indexeddb/modern/leaks-1.html leaks the database connection handle.
+        https://bugs.webkit.org/show_bug.cgi?id=158643
+
+        Reviewed by Alex Christensen.
+
+        * storage/indexeddb/modern/leak-1-expected.txt:
+        * storage/indexeddb/modern/resources/leak-1.js:
+
 2016-06-13  Adam Bergkvist  <[email protected]>
 
         WebRTC: Add test that verifies that RTCPeerConnection.addTrack can reuse an existing RTCRtpSender

Modified: trunk/LayoutTests/storage/indexeddb/modern/leak-1-expected.txt (202018 => 202019)


--- trunk/LayoutTests/storage/indexeddb/modern/leak-1-expected.txt	2016-06-14 00:17:44 UTC (rev 202018)
+++ trunk/LayoutTests/storage/indexeddb/modern/leak-1-expected.txt	2016-06-14 00:34:11 UTC (rev 202019)
@@ -12,6 +12,10 @@
 Observing GC on the transaction and request. 
 PASS txObserver.wasCollected is true
 PASS reqObserver.wasCollected is true
+PASS versionChangeObserver.wasCollected is true
+PASS dbObserver.wasCollected is true
+PASS openRequestObserver.wasCollected is true
+PASS objectStoreObserver.wasCollected is true
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/storage/indexeddb/modern/resources/leak-1.js (202018 => 202019)


--- trunk/LayoutTests/storage/indexeddb/modern/resources/leak-1.js	2016-06-14 00:17:44 UTC (rev 202018)
+++ trunk/LayoutTests/storage/indexeddb/modern/resources/leak-1.js	2016-06-14 00:34:11 UTC (rev 202019)
@@ -19,13 +19,22 @@
 }
 
 var db;
+var versionChangeObserver;
+var dbObserver;
+var openRequestObserver;
+var objectStoreObserver;
 
 function prepareDatabase(event)
 {
     debug("Initial upgrade needed: Old version - " + event.oldVersion + " New version - " + event.newVersion);
 
+    versionChangeObserver = internals.observeGC(event.target.transaction);
+    dbObserver = internals.observeGC(event.target.result);
+    openRequestObserver = internals.observeGC(event.target);
+
     db = event.target.result;
-    db.createObjectStore("foo");
+    objectStoreObserver = internals.observeGC(db.createObjectStore("foo"));
+
     event.target._onsuccess_ = function() {
         testGenerator = testSteps();
         testGenerator.next();
@@ -51,6 +60,7 @@
     
     tx = null;
     req = null;
+    db = null;
     
     // Make sure we are no longer handling any IDB events.
     asyncNext();
@@ -60,6 +70,10 @@
     
     shouldBeTrue("txObserver.wasCollected");
     shouldBeTrue("reqObserver.wasCollected");
+    shouldBeTrue("versionChangeObserver.wasCollected");
+    shouldBeTrue("dbObserver.wasCollected");
+    shouldBeTrue("openRequestObserver.wasCollected");
+    shouldBeTrue("objectStoreObserver.wasCollected");
 
     finishJSTest();
  }

Modified: trunk/Source/WebCore/ChangeLog (202018 => 202019)


--- trunk/Source/WebCore/ChangeLog	2016-06-14 00:17:44 UTC (rev 202018)
+++ trunk/Source/WebCore/ChangeLog	2016-06-14 00:34:11 UTC (rev 202019)
@@ -1,3 +1,20 @@
+2016-06-13  Brady Eidson  <[email protected]>
+
+        storage/indexeddb/modern/leaks-1.html leaks the database connection handle.
+        https://bugs.webkit.org/show_bug.cgi?id=158643
+
+        Reviewed by Alex Christensen.
+
+        Tested by changes to existing test.
+
+        * Modules/indexeddb/IDBDatabase.cpp:
+        (WebCore::IDBDatabase::hasPendingActivity):
+        
+        * dom/EventTarget.h:
+        (WebCore::EventTarget::eventTargetData):
+        (WebCore::EventTarget::hasEventListeners):
+
+
 2016-06-13  Enrica Casucci  <[email protected]>
 
         REGRESSION(r201956): Failure to initialize new internal settings produced random test failures in release.

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp (202018 => 202019)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp	2016-06-14 00:17:44 UTC (rev 202018)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp	2016-06-14 00:34:11 UTC (rev 202019)
@@ -68,7 +68,14 @@
 bool IDBDatabase::hasPendingActivity() const
 {
     ASSERT(currentThread() == originThreadID());
-    return !m_closedInServer;
+
+    if (m_closedInServer)
+        return false;
+
+    if (!m_activeTransactions.isEmpty() || !m_committingTransactions.isEmpty() || !m_abortingTransactions.isEmpty())
+        return true;
+
+    return hasEventListeners(eventNames().abortEvent) || hasEventListeners(eventNames().errorEvent) || hasEventListeners(eventNames().versionchangeEvent);
 }
 
 const String IDBDatabase::name() const

Modified: trunk/Source/WebCore/dom/EventTarget.h (202018 => 202019)


--- trunk/Source/WebCore/dom/EventTarget.h	2016-06-14 00:17:44 UTC (rev 202018)
+++ trunk/Source/WebCore/dom/EventTarget.h	2016-06-14 00:34:11 UTC (rev 202019)
@@ -158,7 +158,7 @@
     EventListener* getAttributeEventListener(const AtomicString& eventType);
 
     bool hasEventListeners() const;
-    bool hasEventListeners(const AtomicString& eventType);
+    bool hasEventListeners(const AtomicString& eventType) const;
     bool hasCapturingEventListeners(const AtomicString& eventType);
     bool hasActiveEventListeners(const AtomicString& eventType) const;
     const EventListenerVector& getEventListeners(const AtomicString& eventType);
@@ -176,6 +176,10 @@
     
     virtual EventTargetData* eventTargetData() = 0;
     virtual EventTargetData& ensureEventTargetData() = 0;
+    const EventTargetData* eventTargetData() const
+    {
+        return const_cast<EventTarget*>(this)->eventTargetData();
+    }
 
 private:
     virtual void refEventTarget() = 0;
@@ -217,9 +221,9 @@
     return !d->eventListenerMap.isEmpty();
 }
 
-inline bool EventTarget::hasEventListeners(const AtomicString& eventType)
+inline bool EventTarget::hasEventListeners(const AtomicString& eventType) const
 {
-    EventTargetData* d = eventTargetData();
+    const EventTargetData* d = eventTargetData();
     if (!d)
         return false;
     return d->eventListenerMap.contains(eventType);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to