- 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;