Title: [149693] trunk/Source
Revision
149693
Author
ander...@apple.com
Date
2013-05-07 14:52:50 -0700 (Tue, 07 May 2013)

Log Message

Add and remove databases and origins from the database tracker
https://bugs.webkit.org/show_bug.cgi?id=115752

Reviewed by Andreas Kling.

Source/WebCore:

Add symbols needed by WebKit2.

* WebCore.exp.in:

Source/WebKit2:

* UIProcess/Storage/LocalStorageDatabase.cpp:
(WebKit::LocalStorageDatabase::LocalStorageDatabase):
Rename m_databaseFilename to m_databasePath.

(WebKit::LocalStorageDatabase::tryToOpenDatabase):
Rename m_databaseFilename to m_databasePath.

* UIProcess/Storage/LocalStorageDatabase.h:
Rename m_databaseFilename to m_databasePath.

* UIProcess/Storage/LocalStorageDatabaseTracker.cpp:
(WebKit::LocalStorageDatabaseTracker::databasePath):
Rename databaseFilename to databasePath.

(WebKit::LocalStorageDatabaseTracker::didOpenDatabaseWithOrigin):
Call addDatabaseWithOriginIdentifier.

(WebKit::LocalStorageDatabaseTracker::deleteEmptyDatabaseWithOrigin):
Call removeDatabaseWithOriginIdentifier.

(WebKit::LocalStorageDatabaseTracker::trackerDatabasePath):
Call databasePath instead of databaseFile.

(WebKit::LocalStorageDatabaseTracker::openTrackerDatabase):
Bail if the database is already open.

(WebKit::LocalStorageDatabaseTracker::updateTrackerDatabaseFromLocalStorageDatabaseFiles):
Call addDatabaseWithOriginIdentifier if this is an origin we don't know about.

(WebKit::LocalStorageDatabaseTracker::addDatabaseWithOriginIdentifier):
Add the database to the Origins table.

(WebKit::LocalStorageDatabaseTracker::removeDatabaseWithOriginIdentifier):
remove the database from the Origins table and delete it.

(WebKit::LocalStorageDatabaseTracker::pathForDatabaseWithOriginIdentifier):
Helper function that looks up a database path given its identifier.

* UIProcess/Storage/LocalStorageDatabaseTracker.h:
Rename databaseFile to databasePath.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (149692 => 149693)


--- trunk/Source/WebCore/ChangeLog	2013-05-07 21:26:56 UTC (rev 149692)
+++ trunk/Source/WebCore/ChangeLog	2013-05-07 21:52:50 UTC (rev 149693)
@@ -1,3 +1,14 @@
+2013-05-07  Anders Carlsson  <ander...@apple.com>
+
+        Add and remove databases and origins from the database tracker
+        https://bugs.webkit.org/show_bug.cgi?id=115752
+
+        Reviewed by Andreas Kling.
+
+        Add symbols needed by WebKit2.
+
+        * WebCore.exp.in:
+
 2013-05-07  Beth Dakin  <bda...@apple.com>
 
         Still possible to fire paint-related LayoutMilestones before CA has committed the 

Modified: trunk/Source/WebCore/WebCore.exp.in (149692 => 149693)


--- trunk/Source/WebCore/WebCore.exp.in	2013-05-07 21:26:56 UTC (rev 149692)
+++ trunk/Source/WebCore/WebCore.exp.in	2013-05-07 21:52:50 UTC (rev 149693)
@@ -470,6 +470,7 @@
 __ZN7WebCore15ResourceRequest24setHTTPPipeliningEnabledEb
 __ZN7WebCore15SQLiteStatement12getColumnIntEi
 __ZN7WebCore15SQLiteStatement13getColumnTextEi
+__ZN7WebCore15SQLiteStatement14executeCommandEv
 __ZN7WebCore15SQLiteStatement21getColumnBlobAsStringEi
 __ZN7WebCore15SQLiteStatement22isColumnDeclaredAsBlobEi
 __ZN7WebCore15SQLiteStatement4stepEv
@@ -680,6 +681,7 @@
 __ZN7WebCore20UserGestureIndicator7s_stateE
 __ZN7WebCore20UserGestureIndicatorC1ENS_26ProcessingUserGestureStateE
 __ZN7WebCore20UserGestureIndicatorD1Ev
+__ZN7WebCore20deleteEmptyDirectoryERKN3WTF6StringE
 __ZN7WebCore20makeRGBA32FromFloatsEffff
 __ZN7WebCore20protocolIsJavaScriptERKN3WTF6StringE
 __ZN7WebCore20toUInt32EnforceRangeEPN3JSC9ExecStateENS0_7JSValueE

Modified: trunk/Source/WebKit2/ChangeLog (149692 => 149693)


--- trunk/Source/WebKit2/ChangeLog	2013-05-07 21:26:56 UTC (rev 149692)
+++ trunk/Source/WebKit2/ChangeLog	2013-05-07 21:52:50 UTC (rev 149693)
@@ -1,5 +1,53 @@
 2013-05-07  Anders Carlsson  <ander...@apple.com>
 
+        Add and remove databases and origins from the database tracker
+        https://bugs.webkit.org/show_bug.cgi?id=115752
+
+        Reviewed by Andreas Kling.
+
+        * UIProcess/Storage/LocalStorageDatabase.cpp:
+        (WebKit::LocalStorageDatabase::LocalStorageDatabase):
+        Rename m_databaseFilename to m_databasePath.
+
+        (WebKit::LocalStorageDatabase::tryToOpenDatabase):
+        Rename m_databaseFilename to m_databasePath.
+
+        * UIProcess/Storage/LocalStorageDatabase.h:
+        Rename m_databaseFilename to m_databasePath.
+
+        * UIProcess/Storage/LocalStorageDatabaseTracker.cpp:
+        (WebKit::LocalStorageDatabaseTracker::databasePath):
+        Rename databaseFilename to databasePath.
+
+        (WebKit::LocalStorageDatabaseTracker::didOpenDatabaseWithOrigin):
+        Call addDatabaseWithOriginIdentifier.
+
+        (WebKit::LocalStorageDatabaseTracker::deleteEmptyDatabaseWithOrigin):
+        Call removeDatabaseWithOriginIdentifier.
+
+        (WebKit::LocalStorageDatabaseTracker::trackerDatabasePath):
+        Call databasePath instead of databaseFile.
+
+        (WebKit::LocalStorageDatabaseTracker::openTrackerDatabase):
+        Bail if the database is already open.
+
+        (WebKit::LocalStorageDatabaseTracker::updateTrackerDatabaseFromLocalStorageDatabaseFiles):
+        Call addDatabaseWithOriginIdentifier if this is an origin we don't know about.
+
+        (WebKit::LocalStorageDatabaseTracker::addDatabaseWithOriginIdentifier):
+        Add the database to the Origins table.
+
+        (WebKit::LocalStorageDatabaseTracker::removeDatabaseWithOriginIdentifier):
+        remove the database from the Origins table and delete it.
+
+        (WebKit::LocalStorageDatabaseTracker::pathForDatabaseWithOriginIdentifier):
+        Helper function that looks up a database path given its identifier.
+        
+        * UIProcess/Storage/LocalStorageDatabaseTracker.h:
+        Rename databaseFile to databasePath.
+
+2013-05-07  Anders Carlsson  <ander...@apple.com>
+
         The storage database tracker should know when databases come and go
         https://bugs.webkit.org/show_bug.cgi?id=115748
 

Modified: trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabase.cpp (149692 => 149693)


--- trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabase.cpp	2013-05-07 21:26:56 UTC (rev 149692)
+++ trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabase.cpp	2013-05-07 21:52:50 UTC (rev 149693)
@@ -54,7 +54,7 @@
     : m_queue(queue)
     , m_tracker(tracker)
     , m_securityOrigin(securityOrigin)
-    , m_databaseFilename(m_tracker->databaseFilename(m_securityOrigin.get()))
+    , m_databasePath(m_tracker->databasePath(m_securityOrigin.get()))
     , m_failedToOpenDatabase(false)
     , m_didImportItems(false)
     , m_isClosed(false)
@@ -83,16 +83,16 @@
 
 bool LocalStorageDatabase::tryToOpenDatabase(DatabaseOpeningStrategy openingStrategy)
 {
-    if (!fileExists(m_databaseFilename) && openingStrategy == SkipIfNonExistent)
+    if (!fileExists(m_databasePath) && openingStrategy == SkipIfNonExistent)
         return true;
 
-    if (m_databaseFilename.isEmpty()) {
+    if (m_databasePath.isEmpty()) {
         LOG_ERROR("Filename for local storage database is empty - cannot open for persistent storage");
         return false;
     }
 
-    if (!m_database.open(m_databaseFilename)) {
-        LOG_ERROR("Failed to open database file %s for local storage", m_databaseFilename.utf8().data());
+    if (!m_database.open(m_databasePath)) {
+        LOG_ERROR("Failed to open database file %s for local storage", m_databasePath.utf8().data());
         return false;
     }
 

Modified: trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabase.h (149692 => 149693)


--- trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabase.h	2013-05-07 21:26:56 UTC (rev 149692)
+++ trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabase.h	2013-05-07 21:52:50 UTC (rev 149693)
@@ -82,7 +82,7 @@
     RefPtr<LocalStorageDatabaseTracker> m_tracker;
     RefPtr<WebCore::SecurityOrigin> m_securityOrigin;
 
-    String m_databaseFilename;
+    String m_databasePath;
     WebCore::SQLiteDatabase m_database;
     bool m_failedToOpenDatabase;
     bool m_didImportItems;

Modified: trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabaseTracker.cpp (149692 => 149693)


--- trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabaseTracker.cpp	2013-05-07 21:26:56 UTC (rev 149692)
+++ trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabaseTracker.cpp	2013-05-07 21:52:50 UTC (rev 149693)
@@ -55,17 +55,19 @@
     m_queue->dispatch(bind(&LocalStorageDatabaseTracker::setLocalStorageDirectoryInternal, this, localStorageDirectory.isolatedCopy()));
 }
 
-String LocalStorageDatabaseTracker::databaseFilename(SecurityOrigin* securityOrigin) const
+String LocalStorageDatabaseTracker::databasePath(SecurityOrigin* securityOrigin) const
 {
-    return databaseFilename(securityOrigin->databaseIdentifier() + ".localstorage");
+    return databasePath(securityOrigin->databaseIdentifier() + ".localstorage");
 }
 
-void LocalStorageDatabaseTracker::didOpenDatabaseWithOrigin(WebCore::SecurityOrigin*)
+void LocalStorageDatabaseTracker::didOpenDatabaseWithOrigin(SecurityOrigin* securityOrigin)
 {
+    addDatabaseWithOriginIdentifier(securityOrigin->databaseIdentifier(), databasePath(securityOrigin));
 }
 
-void LocalStorageDatabaseTracker::deleteEmptyDatabaseWithOrigin(WebCore::SecurityOrigin*)
+void LocalStorageDatabaseTracker::deleteEmptyDatabaseWithOrigin(SecurityOrigin* securityOrigin)
 {
+    removeDatabaseWithOriginIdentifier(securityOrigin->databaseIdentifier());
 }
 
 void LocalStorageDatabaseTracker::setLocalStorageDirectoryInternal(const String& localStorageDirectory)
@@ -79,7 +81,7 @@
     m_queue->dispatch(bind(&LocalStorageDatabaseTracker::importOriginIdentifiers, this));
 }
 
-String LocalStorageDatabaseTracker::databaseFilename(const String& filename) const
+String LocalStorageDatabaseTracker::databasePath(const String& filename) const
 {
     if (!makeAllDirectories(m_localStorageDirectory)) {
         LOG_ERROR("Unabled to create LocalStorage database path %s", m_localStorageDirectory.utf8().data());
@@ -91,11 +93,14 @@
 
 String LocalStorageDatabaseTracker::trackerDatabasePath() const
 {
-    return databaseFilename("StorageTracker.db");
+    return databasePath("StorageTracker.db");
 }
 
 void LocalStorageDatabaseTracker::openTrackerDatabase(DatabaseOpeningStrategy openingStrategy)
 {
+    if (m_database.isOpen())
+        return;
+
     String databasePath = trackerDatabasePath();
 
     if (!fileExists(databasePath) && openingStrategy == SkipIfNonExistent)
@@ -159,7 +164,9 @@
 
         String originIdentifier = filename.substring(0, filename.length() - strlen(".localstorage"));
 
-        // FIXME: Insert the origin and database pair.
+        if (!m_origins.contains(originIdentifier))
+            addDatabaseWithOriginIdentifier(originIdentifier, path);
+
         originsFromLocalStorageDatabaseFiles.add(originIdentifier);
     }
 
@@ -168,9 +175,85 @@
         if (origins.contains(originIdentifier))
             continue;
 
-        // This origin doesn't have a database file, delete it from the database.
-        // FIXME: Do this.
+        removeDatabaseWithOriginIdentifier(originIdentifier);
     }
 }
 
+void LocalStorageDatabaseTracker::addDatabaseWithOriginIdentifier(const String& originIdentifier, const String& databasePath)
+{
+    openTrackerDatabase(CreateIfNonExistent);
+    if (!m_database.isOpen())
+        return;
+
+    SQLiteStatement statement(m_database, "INSERT INTO Origins VALUES (?, ?)");
+    if (statement.prepare() != SQLResultOk) {
+        LOG_ERROR("Unable to establish origin '%s' in the tracker", originIdentifier.utf8().data());
+        return;
+    }
+
+    statement.bindText(1, originIdentifier);
+    statement.bindText(2, databasePath);
+
+    if (statement.step() != SQLResultDone)
+        LOG_ERROR("Unable to establish origin '%s' in the tracker", originIdentifier.utf8().data());
+
+    m_origins.add(originIdentifier);
+
+    // FIXME: Tell clients that the origin was added.
+}
+
+void LocalStorageDatabaseTracker::removeDatabaseWithOriginIdentifier(const String& originIdentifier)
+{
+    openTrackerDatabase(SkipIfNonExistent);
+    if (!m_database.isOpen())
+        return;
+
+    String path = pathForDatabaseWithOriginIdentifier(originIdentifier);
+    if (path.isEmpty())
+        return;
+
+    SQLiteStatement deleteStatement(m_database, "DELETE FROM Origins where origin=?");
+    if (deleteStatement.prepare() != SQLResultOk) {
+        LOG_ERROR("Unable to prepare deletion of origin '%s'", originIdentifier.ascii().data());
+        return;
+    }
+    deleteStatement.bindText(1, originIdentifier);
+    if (!deleteStatement.executeCommand()) {
+        LOG_ERROR("Unable to execute deletion of origin '%s'", originIdentifier.ascii().data());
+        return;
+    }
+
+    deleteFile(path);
+
+    m_origins.remove(originIdentifier);
+    if (m_origins.isEmpty()) {
+        // There are no origins left, go ahead and delete the tracker database.
+        m_database.close();
+        deleteFile(trackerDatabasePath());
+        deleteEmptyDirectory(m_localStorageDirectory);
+    }
+
+    // FIXME: Tell clients that the origin was removed.
+}
+
+String LocalStorageDatabaseTracker::pathForDatabaseWithOriginIdentifier(const String& originIdentifier)
+{
+    if (!m_database.isOpen())
+        return String();
+
+    SQLiteStatement pathStatement(m_database, "SELECT path FROM Origins WHERE origin=?");
+    if (pathStatement.prepare() != SQLResultOk) {
+        LOG_ERROR("Unable to prepare selection of path for origin '%s'", originIdentifier.utf8().data());
+        return String();
+    }
+
+    pathStatement.bindText(1, originIdentifier);
+
+    int result = pathStatement.step();
+    if (result != SQLResultRow)
+        return String();
+
+    return pathStatement.getColumnText(0);
+}
+
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabaseTracker.h (149692 => 149693)


--- trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabaseTracker.h	2013-05-07 21:26:56 UTC (rev 149692)
+++ trunk/Source/WebKit2/UIProcess/Storage/LocalStorageDatabaseTracker.h	2013-05-07 21:52:50 UTC (rev 149693)
@@ -48,7 +48,7 @@
     ~LocalStorageDatabaseTracker();
 
     void setLocalStorageDirectory(const String&);
-    String databaseFilename(WebCore::SecurityOrigin*) const;
+    String databasePath(WebCore::SecurityOrigin*) const;
 
     void didOpenDatabaseWithOrigin(WebCore::SecurityOrigin*);
     void deleteEmptyDatabaseWithOrigin(WebCore::SecurityOrigin*);
@@ -58,7 +58,7 @@
 
     void setLocalStorageDirectoryInternal(const String&);
 
-    String databaseFilename(const String&) const;
+    String databasePath(const String& filename) const;
     String trackerDatabasePath() const;
 
     enum DatabaseOpeningStrategy {
@@ -70,6 +70,10 @@
     void importOriginIdentifiers();
     void updateTrackerDatabaseFromLocalStorageDatabaseFiles();
 
+    void addDatabaseWithOriginIdentifier(const String& originIdentifier, const String& databasePath);
+    void removeDatabaseWithOriginIdentifier(const String& originIdentifier);
+    String pathForDatabaseWithOriginIdentifier(const String& originIdentifier);
+
     RefPtr<WorkQueue> m_queue;
     String m_localStorageDirectory;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to