https://bugs.webkit.org/show_bug.cgi?id=110805.
Reviewed by Geoffrey Garen.
- Changed DatabaseTracker::usageForOrigin() to compute the disk usage
for a specified origin by fetching database sizes from the file system
instead of using cached file size values.
- The OriginQuotaManager and OriginUsageRecord are no longer needed.
Updated build files to reflect this.
- Removed getMaxSizeForDatabase() from DatabaseManager, DatabaseServer,
and AbstractDatabaseServer since it is only needed in the backend.
- DatabaseTracker::getMaxSizeForDatabase() now calls usageForOrigin()
to get the disk usage for its computation.
- The performance difference for this changes is a 1.6% degradation
per additional database whose size needs to be fetched. This is a
worst case estimated based on the disk-stat-speed-test.html benchmark
(attached to bugzilla). The benchmark writes an average of 16 bytes per
transaction. Most real-world transactions will likely write more
content than that. Since disk write IO time will dominate over memory
read time for fetching the file size, the degradation ratio will only
reduce with larger workloads.
No layout test, but there is a quota-test.html attached to bugzilla.
The test is a webpage that can be loaded into multiple tabs to
consuming storage space. While the test is running, we can run a
"du -k; du -k *" on the database directory to verify that the total
disk usage does not far exceed the allowed quota (some small error
is expected). Without this change, each database from each tab may
exceed the quota by that same maginitude of error.
* CMakeLists.txt:
* GNUmakefile.list.am:
* Modules/webdatabase/AbstractDatabaseServer.h:
* Modules/webdatabase/Database.cpp:
* Modules/webdatabase/Database.h:
* Modules/webdatabase/DatabaseBackendBase.cpp:
(WebCore::DatabaseBackendBase::maximumSize):
* Modules/webdatabase/DatabaseManager.cpp:
* Modules/webdatabase/DatabaseManager.h:
* Modules/webdatabase/DatabaseServer.cpp:
* Modules/webdatabase/DatabaseServer.h:
* Modules/webdatabase/DatabaseTracker.cpp:
(WebCore::DatabaseTracker::hasAdequateQuotaForOrigin):
(WebCore::DatabaseTracker::canEstablishDatabase):
(WebCore::DatabaseTracker::retryCanEstablishDatabase):
(WebCore::DatabaseTracker::getMaxSizeForDatabase):
(WebCore::DatabaseTracker::fullPathForDatabaseNoLock):
(WebCore::DatabaseTracker::fullPathForDatabase):
(WebCore::DatabaseTracker::addOpenDatabase):
(WebCore::DatabaseTracker::removeOpenDatabase):
(WebCore::DatabaseTracker::usageForOrigin):
(WebCore::DatabaseTracker::deleteOrigin):
(WebCore::DatabaseTracker::deleteDatabase):
* Modules/webdatabase/DatabaseTracker.h:
* Modules/webdatabase/OriginQuotaManager.cpp: Removed.
* Modules/webdatabase/OriginQuotaManager.h: Removed.
* Modules/webdatabase/OriginUsageRecord.cpp: Removed.
* Modules/webdatabase/OriginUsageRecord.h: Removed.
* Modules/webdatabase/SQLTransactionBackend.cpp:
(WebCore::SQLTransactionBackend::runCurrentStatementAndGetNextState):
* Modules/webdatabase/SQLTransactionBackendSync.cpp:
(WebCore::SQLTransactionBackendSync::executeSQL):
* Modules/webdatabase/SQLTransactionClient.cpp:
* Modules/webdatabase/SQLTransactionClient.h:
* Modules/webdatabase/chromium/SQLTransactionClientChromium.cpp:
* Target.pri:
* WebCore.gyp/WebCore.gyp:
* WebCore.gypi:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.vcxproj/WebCore.vcxproj:
* WebCore.vcxproj/WebCore.vcxproj.filters:
* WebCore.xcodeproj/project.pbxproj:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@144006
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
Modules/webdatabase/DatabaseTask.cpp
Modules/webdatabase/DatabaseThread.cpp
Modules/webdatabase/DatabaseTracker.cpp
- Modules/webdatabase/OriginQuotaManager.cpp
- Modules/webdatabase/OriginUsageRecord.cpp
Modules/webdatabase/SQLException.cpp
Modules/webdatabase/SQLResultSet.cpp
Modules/webdatabase/SQLResultSetRowList.cpp
+2013-02-25 Mark Lam <mark.lam@apple.com>
+
+ Need a more robust WebSQL disk usage computation.
+ https://bugs.webkit.org/show_bug.cgi?id=110805.
+
+ Reviewed by Geoffrey Garen.
+
+ - Changed DatabaseTracker::usageForOrigin() to compute the disk usage
+ for a specified origin by fetching database sizes from the file system
+ instead of using cached file size values.
+
+ - The OriginQuotaManager and OriginUsageRecord are no longer needed.
+ Updated build files to reflect this.
+
+ - Removed getMaxSizeForDatabase() from DatabaseManager, DatabaseServer,
+ and AbstractDatabaseServer since it is only needed in the backend.
+
+ - DatabaseTracker::getMaxSizeForDatabase() now calls usageForOrigin()
+ to get the disk usage for its computation.
+
+ - The performance difference for this changes is a 1.6% degradation
+ per additional database whose size needs to be fetched. This is a
+ worst case estimated based on the disk-stat-speed-test.html benchmark
+ (attached to bugzilla). The benchmark writes an average of 16 bytes per
+ transaction. Most real-world transactions will likely write more
+ content than that. Since disk write IO time will dominate over memory
+ read time for fetching the file size, the degradation ratio will only
+ reduce with larger workloads.
+
+ No layout test, but there is a quota-test.html attached to bugzilla.
+ The test is a webpage that can be loaded into multiple tabs to
+ consuming storage space. While the test is running, we can run a
+ "du -k; du -k *" on the database directory to verify that the total
+ disk usage does not far exceed the allowed quota (some small error
+ is expected). Without this change, each database from each tab may
+ exceed the quota by that same maginitude of error.
+
+ * CMakeLists.txt:
+ * GNUmakefile.list.am:
+ * Modules/webdatabase/AbstractDatabaseServer.h:
+ * Modules/webdatabase/Database.cpp:
+ * Modules/webdatabase/Database.h:
+ * Modules/webdatabase/DatabaseBackendBase.cpp:
+ (WebCore::DatabaseBackendBase::maximumSize):
+ * Modules/webdatabase/DatabaseManager.cpp:
+ * Modules/webdatabase/DatabaseManager.h:
+ * Modules/webdatabase/DatabaseServer.cpp:
+ * Modules/webdatabase/DatabaseServer.h:
+ * Modules/webdatabase/DatabaseTracker.cpp:
+ (WebCore::DatabaseTracker::hasAdequateQuotaForOrigin):
+ (WebCore::DatabaseTracker::canEstablishDatabase):
+ (WebCore::DatabaseTracker::retryCanEstablishDatabase):
+ (WebCore::DatabaseTracker::getMaxSizeForDatabase):
+ (WebCore::DatabaseTracker::fullPathForDatabaseNoLock):
+ (WebCore::DatabaseTracker::fullPathForDatabase):
+ (WebCore::DatabaseTracker::addOpenDatabase):
+ (WebCore::DatabaseTracker::removeOpenDatabase):
+ (WebCore::DatabaseTracker::usageForOrigin):
+ (WebCore::DatabaseTracker::deleteOrigin):
+ (WebCore::DatabaseTracker::deleteDatabase):
+ * Modules/webdatabase/DatabaseTracker.h:
+ * Modules/webdatabase/OriginQuotaManager.cpp: Removed.
+ * Modules/webdatabase/OriginQuotaManager.h: Removed.
+ * Modules/webdatabase/OriginUsageRecord.cpp: Removed.
+ * Modules/webdatabase/OriginUsageRecord.h: Removed.
+ * Modules/webdatabase/SQLTransactionBackend.cpp:
+ (WebCore::SQLTransactionBackend::runCurrentStatementAndGetNextState):
+ * Modules/webdatabase/SQLTransactionBackendSync.cpp:
+ (WebCore::SQLTransactionBackendSync::executeSQL):
+ * Modules/webdatabase/SQLTransactionClient.cpp:
+ * Modules/webdatabase/SQLTransactionClient.h:
+ * Modules/webdatabase/chromium/SQLTransactionClientChromium.cpp:
+ * Target.pri:
+ * WebCore.gyp/WebCore.gyp:
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.vcxproj/WebCore.vcxproj:
+ * WebCore.vcxproj/WebCore.vcxproj.filters:
+ * WebCore.xcodeproj/project.pbxproj:
+
2013-02-25 Bruno de Oliveira Abinader <bruno.abinader@basyskom.com>
[texmap] Rename TextureMapperGL::ClipStack::init to reset
Source/WebCore/Modules/webdatabase/DatabaseThread.h \
Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp \
Source/WebCore/Modules/webdatabase/DatabaseTracker.h \
- Source/WebCore/Modules/webdatabase/OriginQuotaManager.cpp \
- Source/WebCore/Modules/webdatabase/OriginQuotaManager.h \
- Source/WebCore/Modules/webdatabase/OriginUsageRecord.cpp \
- Source/WebCore/Modules/webdatabase/OriginUsageRecord.h \
Source/WebCore/Modules/webdatabase/SQLCallbackWrapper.h \
Source/WebCore/Modules/webdatabase/SQLError.h \
Source/WebCore/Modules/webdatabase/SQLException.cpp \
virtual void interruptAllDatabasesForContext(const DatabaseBackendContext*) = 0;
- virtual unsigned long long getMaxSizeForDatabase(const DatabaseBackendBase*) = 0;
-
protected:
AbstractDatabaseServer() { }
virtual ~AbstractDatabaseServer() { }
}
}
-unsigned long long Database::maximumSize() const
-{
- return DatabaseManager::manager().getMaxSizeForDatabase(this);
-}
-
void Database::changeVersion(const String& oldVersion, const String& newVersion,
PassRefPtr<SQLTransactionCallback> callback, PassRefPtr<SQLTransactionErrorCallback> errorCallback,
PassRefPtr<VoidCallback> successCallback)
virtual void closeImmediately();
- unsigned long long databaseSize() const;
- unsigned long long maximumSize() const;
-
void scheduleTransactionCallback(SQLTransaction*);
private:
unsigned long long DatabaseBackendBase::maximumSize() const
{
- return DatabaseManager::manager().getMaxSizeForDatabase(this);
+ return DatabaseTracker::tracker().getMaxSizeForDatabase(this);
}
void DatabaseBackendBase::incrementalVacuumIfNeeded()
m_server->interruptAllDatabasesForContext(databaseContext->backend().get());
}
-unsigned long long DatabaseManager::getMaxSizeForDatabase(const DatabaseBackendBase* database)
-{
- return m_server->getMaxSizeForDatabase(database);
-}
-
void DatabaseManager::logErrorMessage(ScriptExecutionContext* context, const String& message)
{
context->addConsoleMessage(OtherMessageSource, ErrorMessageLevel, message);
void interruptAllDatabasesForContext(ScriptExecutionContext*);
- unsigned long long getMaxSizeForDatabase(const DatabaseBackendBase*);
-
private:
DatabaseManager();
~DatabaseManager() { }
return database.release();
}
-unsigned long long DatabaseServer::getMaxSizeForDatabase(const DatabaseBackendBase* database)
-{
- return DatabaseTracker::tracker().getMaxSizeForDatabase(database);
-}
-
} // namespace WebCore
#endif // ENABLE(SQL_DATABASE)
virtual void interruptAllDatabasesForContext(const DatabaseBackendContext*);
- virtual unsigned long long getMaxSizeForDatabase(const DatabaseBackendBase*);
-
protected:
virtual PassRefPtr<DatabaseBackendBase> createDatabase(RefPtr<DatabaseBackendContext>&, DatabaseType,
const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize,
#include "DatabaseManager.h"
#include "DatabaseManagerClient.h"
#include "DatabaseThread.h"
+#include "FileSystem.h"
#include "Logging.h"
-#include "OriginQuotaManager.h"
#include "Page.h"
#include "SecurityOrigin.h"
#include "SecurityOriginHash.h"
using namespace std;
-static WebCore::OriginQuotaManager& originQuotaManager()
-{
- DEFINE_STATIC_LOCAL(WebCore::OriginQuotaManager, quotaManager, ());
- return quotaManager;
-}
-
namespace WebCore {
static DatabaseTracker* staticTracker = 0;
bool DatabaseTracker::hasAdequateQuotaForOrigin(SecurityOrigin* origin, unsigned long estimatedSize, DatabaseError& err)
{
- // Since we're imminently opening a database within this context's origin,
- // make sure this origin is being tracked by the OriginQuotaManager
- // by fetching its current usage now. Calling usageForOrigin() has the side
- // effect of initiating tracking by the OriginQuotaManager if the origin is
- // not already tracked.
- unsigned long long usage = usageForOriginNoLock(origin);
+ unsigned long long usage = usageForOrigin(origin);
// If the database will fit, allow its creation.
unsigned long long requirement = usage + max(1UL, estimatedSize);
error = DatabaseError::None;
MutexLocker lockDatabase(m_databaseGuard);
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
SecurityOrigin* origin = context->securityOrigin();
if (isDeletingDatabaseOrOriginFor(origin, name)) {
error = DatabaseError::None;
MutexLocker lockDatabase(m_databaseGuard);
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
SecurityOrigin* origin = context->securityOrigin();
// We have already eliminated other types of errors in canEstablishDatabase().
// The maximum size for a database is the full quota for its origin, minus the current usage within the origin,
// plus the current usage of the given database
MutexLocker lockDatabase(m_databaseGuard);
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
SecurityOrigin* origin = database->securityOrigin();
unsigned long long quota = quotaForOriginNoLock(origin);
- unsigned long long diskUsage = originQuotaManager().diskUsage(origin);
+ unsigned long long diskUsage = usageForOrigin(origin);
unsigned long long databaseFileSize = SQLiteFileSystem::getDatabaseFileSize(database->fileName());
+ ASSERT(databaseFileSize <= diskUsage);
// A previous error may have allowed the origin to exceed its quota, or may
// have allowed this database to exceed our cached estimate of the origin
return maxSize;
}
-void DatabaseTracker::databaseChanged(DatabaseBackendBase* database)
-{
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
- originQuotaManager().markDatabase(database);
-}
-
void DatabaseTracker::interruptAllDatabasesForContext(const DatabaseBackendContext* context)
{
Vector<RefPtr<DatabaseBackendBase> > openDatabases;
String DatabaseTracker::fullPathForDatabaseNoLock(SecurityOrigin* origin, const String& name, bool createIfNotExists)
{
ASSERT(!m_databaseGuard.tryLock());
- ASSERT(!originQuotaManager().tryLock());
String originIdentifier = origin->databaseIdentifier();
String originPath = this->originPath(origin);
// If this origin's quota is being tracked (open handle to a database in this origin), add this new database
// to the quota manager now
String fullFilePath = SQLiteFileSystem::appendDatabaseFileNameToPath(originPath, fileName);
- if (originQuotaManager().tracksOrigin(origin))
- originQuotaManager().addDatabase(origin, name, fullFilePath);
return fullFilePath;
}
String DatabaseTracker::fullPathForDatabase(SecurityOrigin* origin, const String& name, bool createIfNotExists)
{
MutexLocker lockDatabase(m_databaseGuard);
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
-
return fullPathForDatabaseNoLock(origin, name, createIfNotExists).isolatedCopy();
}
databaseSet->add(database);
LOG(StorageAPI, "Added open Database %s (%p)\n", database->stringIdentifier().ascii().data(), database);
-
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
- if (!originQuotaManager().tracksOrigin(database->securityOrigin())) {
- originQuotaManager().trackOrigin(database->securityOrigin());
- originQuotaManager().addDatabase(database->securityOrigin(), database->stringIdentifier(), database->fileName());
- }
}
}
m_openDatabaseMap->remove(database->securityOrigin());
delete nameMap;
-
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
- originQuotaManager().removeOrigin(database->securityOrigin());
}
}
databases->add(*it);
}
-unsigned long long DatabaseTracker::usageForOriginNoLock(SecurityOrigin* origin)
-{
- ASSERT(!originQuotaManager().tryLock());
-
- // Use the OriginQuotaManager mechanism to calculate the usage
- if (originQuotaManager().tracksOrigin(origin))
- return originQuotaManager().diskUsage(origin);
-
- // If the OriginQuotaManager doesn't track this origin already, prime it to do so
- originQuotaManager().trackOrigin(origin);
-
- Vector<String> names;
- databaseNamesForOriginNoLock(origin, names);
-
- for (unsigned i = 0; i < names.size(); ++i)
- originQuotaManager().addDatabase(origin, names[i], fullPathForDatabaseNoLock(origin, names[i], false));
-
- if (!originQuotaManager().tracksOrigin(origin))
- return 0;
-
- // OriginQuotaManager::diskUsage() may result in a disk scan to compute the
- // sum of disk usage of all databases from this specified origin if its
- // cached usage value is determined to be outdated.
- return originQuotaManager().diskUsage(origin);
-}
-
unsigned long long DatabaseTracker::usageForOrigin(SecurityOrigin* origin)
{
- MutexLocker lockDatabase(m_databaseGuard);
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
- return usageForOriginNoLock(origin);
+ String originPath = this->originPath(origin);
+ unsigned long long diskUsage = 0;
+ Vector<String> fileNames = listDirectory(originPath, String("*.db"));
+ Vector<String>::iterator fileName = fileNames.begin();
+ Vector<String>::iterator lastFileName = fileNames.end();
+ for (; fileName != lastFileName; ++fileName) {
+ long long size;
+ getFileSize(*fileName, size);
+ diskUsage += size;
+ }
+ return diskUsage;
}
unsigned long long DatabaseTracker::quotaForOriginNoLock(SecurityOrigin* origin)
RefPtr<SecurityOrigin> originPossiblyLastReference = origin;
m_quotaMap->remove(origin);
- {
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
- originQuotaManager().removeOrigin(origin);
- }
-
// If we removed the last origin, do some additional deletion.
if (m_quotaMap->isEmpty()) {
if (m_database.isOpen())
return false;
}
- {
- Locker<OriginQuotaManager> quotaManagerLocker(originQuotaManager());
- originQuotaManager().removeDatabase(origin, name);
- }
-
if (m_client) {
m_client->dispatchDidModifyOrigin(origin);
m_client->dispatchDidModifyDatabase(origin, name);
void getOpenDatabases(SecurityOrigin*, const String& name, HashSet<RefPtr<DatabaseBackendBase> >* databases);
unsigned long long getMaxSizeForDatabase(const DatabaseBackendBase*);
- void databaseChanged(DatabaseBackendBase*);
void interruptAllDatabasesForContext(const DatabaseBackendContext*);
bool hasEntryForOriginNoLock(SecurityOrigin* origin);
String fullPathForDatabaseNoLock(SecurityOrigin*, const String& name, bool createIfDoesNotExist);
bool databaseNamesForOriginNoLock(SecurityOrigin* origin, Vector<String>& resultVector);
- unsigned long long usageForOriginNoLock(SecurityOrigin* origin);
unsigned long long quotaForOriginNoLock(SecurityOrigin* origin);
String trackerDatabasePath() const;
+++ /dev/null
-/*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "config.h"
-#include "OriginQuotaManager.h"
-
-#if ENABLE(SQL_DATABASE)
-
-#include "DatabaseBackendBase.h"
-#include "OriginUsageRecord.h"
-
-namespace WebCore {
-
-OriginQuotaManager::OriginQuotaManager()
-#ifndef NDEBUG
- : m_usageRecordGuardLocked(false)
-#endif
-{
-}
-
-bool OriginQuotaManager::tryLock()
-{
- bool locked = m_usageRecordGuard.tryLock();
-#ifndef NDEBUG
- if (locked)
- m_usageRecordGuardLocked = true;
- else
- ASSERT(m_usageRecordGuardLocked);
-#endif
- return locked;
-}
-
-void OriginQuotaManager::lock()
-{
- m_usageRecordGuard.lock();
-#ifndef NDEBUG
- m_usageRecordGuardLocked = true;
-#endif
-}
-
-void OriginQuotaManager::unlock()
-{
-#ifndef NDEBUG
- m_usageRecordGuardLocked = false;
-#endif
- m_usageRecordGuard.unlock();
-}
-
-void OriginQuotaManager::trackOrigin(PassRefPtr<SecurityOrigin> origin)
-{
- ASSERT(m_usageRecordGuardLocked);
- ASSERT(!m_usageMap.contains(origin.get()));
-
- m_usageMap.set(origin->isolatedCopy(), new OriginUsageRecord);
-}
-
-bool OriginQuotaManager::tracksOrigin(SecurityOrigin* origin) const
-{
- ASSERT(m_usageRecordGuardLocked);
- return m_usageMap.contains(origin);
-}
-
-void OriginQuotaManager::addDatabase(SecurityOrigin* origin, const String& databaseIdentifier, const String& fullPath)
-{
- ASSERT(m_usageRecordGuardLocked);
-
- OriginUsageRecord* usageRecord = m_usageMap.get(origin);
- ASSERT(usageRecord);
-
- usageRecord->addDatabase(databaseIdentifier.isolatedCopy(), fullPath.isolatedCopy());
-}
-
-void OriginQuotaManager::removeDatabase(SecurityOrigin* origin, const String& databaseIdentifier)
-{
- ASSERT(m_usageRecordGuardLocked);
-
- if (OriginUsageRecord* usageRecord = m_usageMap.get(origin))
- usageRecord->removeDatabase(databaseIdentifier);
-}
-
-void OriginQuotaManager::removeOrigin(SecurityOrigin* origin)
-{
- ASSERT(m_usageRecordGuardLocked);
-
- if (OriginUsageRecord* usageRecord = m_usageMap.get(origin)) {
- m_usageMap.remove(origin);
- delete usageRecord;
- }
-}
-
-void OriginQuotaManager::markDatabase(DatabaseBackendBase* database)
-{
- ASSERT(database);
- ASSERT(m_usageRecordGuardLocked);
- OriginUsageRecord* usageRecord = m_usageMap.get(database->securityOrigin());
- ASSERT(usageRecord);
-
- usageRecord->markDatabase(database->stringIdentifier());
-}
-
-unsigned long long OriginQuotaManager::diskUsage(SecurityOrigin* origin) const
-{
- ASSERT(m_usageRecordGuardLocked);
-
- OriginUsageRecord* usageRecord = m_usageMap.get(origin);
- ASSERT(usageRecord);
-
- return usageRecord->diskUsage();
-}
-
-}
-
-#endif // ENABLE(SQL_DATABASE)
+++ /dev/null
-/*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef OriginQuotaManager_h
-#define OriginQuotaManager_h
-
-#if ENABLE(SQL_DATABASE)
-
-#include "SecurityOriginHash.h"
-#include <wtf/HashMap.h>
-#include <wtf/Threading.h>
-#include <wtf/text/StringHash.h>
-
-namespace WebCore {
-
-class DatabaseBackendBase;
-class OriginUsageRecord;
-class SecurityOrigin;
-
-class OriginQuotaManager {
- WTF_MAKE_NONCOPYABLE(OriginQuotaManager); WTF_MAKE_FAST_ALLOCATED;
-public:
- OriginQuotaManager();
-
- bool tryLock();
- void lock();
- void unlock();
-
- void trackOrigin(PassRefPtr<SecurityOrigin>);
- bool tracksOrigin(SecurityOrigin*) const;
- void addDatabase(SecurityOrigin*, const String& databaseIdentifier, const String& fullPath);
- void removeDatabase(SecurityOrigin*, const String& databaseIdentifier);
- void removeOrigin(SecurityOrigin*);
-
- void markDatabase(DatabaseBackendBase*); // Mark dirtiness of a specific database.
- unsigned long long diskUsage(SecurityOrigin*) const;
-
-private:
- mutable Mutex m_usageRecordGuard;
-#ifndef NDEBUG
- bool m_usageRecordGuardLocked;
-#endif
-
- typedef HashMap<RefPtr<SecurityOrigin>, OriginUsageRecord*> OriginUsageMap;
- OriginUsageMap m_usageMap;
-};
-
-} // namespace WebCore
-
-#endif // ENABLE(SQL_DATABASE)
-
-#endif // OriginQuotaManager_h
+++ /dev/null
-/*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "config.h"
-#include "OriginUsageRecord.h"
-
-#if ENABLE(SQL_DATABASE)
-
-#include "SQLiteFileSystem.h"
-
-namespace WebCore {
-
-OriginUsageRecord::OriginUsageRecord()
- : m_cachedDiskUsageIsValid(false)
-{
-}
-
-void OriginUsageRecord::addDatabase(const String& identifier, const String& fullPath)
-{
- ASSERT(!m_databaseMap.contains(identifier));
- ASSERT_ARG(identifier, identifier.impl()->hasOneRef() || identifier.isEmpty());
- ASSERT_ARG(fullPath, fullPath.impl()->hasOneRef() || fullPath.isEmpty());
-
- m_databaseMap.set(identifier, DatabaseEntry(fullPath));
- m_unknownSet.add(identifier);
-
- m_cachedDiskUsageIsValid = false;
-}
-
-void OriginUsageRecord::removeDatabase(const String& identifier)
-{
- ASSERT(m_databaseMap.contains(identifier));
-
- m_databaseMap.remove(identifier);
- m_unknownSet.remove(identifier);
- m_cachedDiskUsageIsValid = false;
-}
-
-void OriginUsageRecord::markDatabase(const String& identifier)
-{
- ASSERT(m_databaseMap.contains(identifier));
- ASSERT_ARG(identifier, identifier.impl()->hasOneRef() || identifier.isEmpty());
-
- m_unknownSet.add(identifier);
- m_cachedDiskUsageIsValid = false;
-}
-
-unsigned long long OriginUsageRecord::diskUsage()
-{
- // Use the last cached usage value if we have it.
- if (m_cachedDiskUsageIsValid)
- return m_cachedDiskUsage;
-
- // stat() for the sizes known to be dirty.
- HashSet<String>::iterator iUnknown = m_unknownSet.begin();
- HashSet<String>::iterator endUnknown = m_unknownSet.end();
- for (; iUnknown != endUnknown; ++iUnknown) {
- const String& path = m_databaseMap.get(*iUnknown).filename;
- ASSERT(!path.isEmpty());
-
- // When we can't determine the file size, we'll just have to assume the file is missing/inaccessible.
- long long size = SQLiteFileSystem::getDatabaseFileSize(path);
- m_databaseMap.set(*iUnknown, DatabaseEntry(path, size));
- }
- m_unknownSet.clear();
-
- // Recalculate the cached usage value.
- m_cachedDiskUsage = 0;
- HashMap<String, DatabaseEntry>::iterator iDatabase = m_databaseMap.begin();
- HashMap<String, DatabaseEntry>::iterator endDatabase = m_databaseMap.end();
- for (; iDatabase != endDatabase; ++iDatabase)
- m_cachedDiskUsage += iDatabase->value.size;
-
- m_cachedDiskUsageIsValid = true;
- return m_cachedDiskUsage;
-}
-
-}
-
-#endif
+++ /dev/null
-/*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef OriginUsageRecord_h
-#define OriginUsageRecord_h
-
-#if ENABLE(SQL_DATABASE)
-
-#include <wtf/HashMap.h>
-#include <wtf/HashSet.h>
-#include <wtf/text/StringHash.h>
-#include <wtf/text/WTFString.h>
-
-namespace WebCore {
-
-// Objects of this class can be used from multiple threads with external synchronization.
-// String arguments are also supposed to be deeply copied by the caller when necessary.
-class OriginUsageRecord {
- WTF_MAKE_NONCOPYABLE(OriginUsageRecord); WTF_MAKE_FAST_ALLOCATED;
-public:
- OriginUsageRecord();
-
- void addDatabase(const String& identifier, const String& fullPath);
- void removeDatabase(const String& identifier);
- void markDatabase(const String& identifier); // Size may have changed, and will need to be recalculated.
- unsigned long long diskUsage();
-
-private:
- struct DatabaseEntry {
- DatabaseEntry() { }
- DatabaseEntry(const String& filename) : filename(filename) { }
- DatabaseEntry(const String& filename, unsigned long long size) : filename(filename), size(size) { }
- String filename;
- unsigned long long size; // This member remains uninitialized until disk usage is calculated.
- };
- HashMap<String, DatabaseEntry> m_databaseMap;
- HashSet<String> m_unknownSet;
-
- unsigned long long m_cachedDiskUsage;
- bool m_cachedDiskUsageIsValid;
-};
-
-} // namespace WebCore
-
-#endif
-
-#endif
if (m_database->lastActionChangedDatabase()) {
// Flag this transaction as having changed the database for later delegate notification
m_modifiedDatabase = true;
- // Also dirty the size of this database file for calculating quota usage
- m_database->transactionClient()->didExecuteStatement(Database::from(database()));
}
if (m_currentStatementBackend->hasStatementCallback()) {
}
}
- if (m_database->lastActionChangedDatabase()) {
+ if (m_database->lastActionChangedDatabase())
m_modifiedDatabase = true;
- m_transactionClient->didExecuteStatement(database());
- }
return resultSet.release();
}
database->securityOrigin(), database->stringIdentifier());
}
-void SQLTransactionClient::didExecuteStatement(DatabaseBackendBase* database)
-{
- DatabaseTracker::tracker().databaseChanged(database);
-}
-
bool SQLTransactionClient::didExceedQuota(DatabaseBackendBase* database)
{
ASSERT(database->databaseContext()->scriptExecutionContext()->isContextThread());
public:
SQLTransactionClient() { }
void didCommitWriteTransaction(DatabaseBackendBase*);
- void didExecuteStatement(DatabaseBackendBase*);
bool didExceedQuota(DatabaseBackendBase*);
};
WebCore::DatabaseObserver::databaseModified(database);
}
-void SQLTransactionClient::didExecuteStatement(DatabaseBackendBase* database)
-{
- // This method is called after executing every statement that changes the DB.
- // Chromium doesn't need to do anything at that point.
-}
-
bool SQLTransactionClient::didExceedQuota(DatabaseBackendBase* database)
{
// Chromium does not allow users to manually change the quota for an origin (for now, at least).
Modules/webdatabase/DatabaseTask.h \
Modules/webdatabase/DatabaseThread.h \
Modules/webdatabase/DatabaseTracker.h \
- Modules/webdatabase/OriginQuotaManager.h \
- Modules/webdatabase/OriginUsageRecord.h \
Modules/webdatabase/SQLCallbackWrapper.h \
Modules/webdatabase/SQLResultSet.h \
Modules/webdatabase/SQLResultSetRowList.h \
Modules/webdatabase/DatabaseTask.cpp \
Modules/webdatabase/DatabaseThread.cpp \
Modules/webdatabase/DatabaseTracker.cpp \
- Modules/webdatabase/OriginQuotaManager.cpp \
- Modules/webdatabase/OriginUsageRecord.cpp \
Modules/webdatabase/SQLException.cpp \
Modules/webdatabase/SQLResultSet.cpp \
Modules/webdatabase/SQLResultSetRowList.cpp \
['exclude', 'Modules/indexeddb/IDBFactoryBackendInterface\\.cpp$'],
['exclude', 'Modules/webdatabase/DatabaseManagerClient\\.h$'],
['exclude', 'Modules/webdatabase/DatabaseTracker\\.cpp$'],
- ['exclude', 'Modules/webdatabase/OriginQuotaManager\\.(cpp|h)$'],
- ['exclude', 'Modules/webdatabase/OriginUsageRecord\\.(cpp|h)$'],
['exclude', 'Modules/webdatabase/SQLTransactionClient\\.cpp$'],
['exclude', 'inspector/InspectorFrontendClientLocal\\.cpp$'],
['exclude', 'inspector/JavaScript[^/]*\\.cpp$'],
'Modules/webdatabase/DatabaseTracker.cpp',
'Modules/webdatabase/DOMWindowWebDatabase.cpp',
'Modules/webdatabase/DOMWindowWebDatabase.h',
- 'Modules/webdatabase/OriginQuotaManager.cpp',
- 'Modules/webdatabase/OriginQuotaManager.h',
- 'Modules/webdatabase/OriginUsageRecord.cpp',
- 'Modules/webdatabase/OriginUsageRecord.h',
'Modules/webdatabase/SQLCallbackWrapper.h',
'Modules/webdatabase/SQLException.cpp',
'Modules/webdatabase/SQLException.h',
>
</File>
<File
- RelativePath="..\Modules\webdatabase\OriginQuotaManager.cpp"
- >
- </File>
- <File
- RelativePath="..\Modules\webdatabase\OriginQuotaManager.h"
- >
- </File>
- <File
- RelativePath="..\Modules\webdatabase\OriginUsageRecord.cpp"
- >
- </File>
- <File
- RelativePath="..\Modules\webdatabase\OriginUsageRecord.h"
- >
- </File>
- <File
RelativePath="..\Modules\webdatabase\SQLCallbackWrapper.h"
>
</File>
<ClCompile Include="..\Modules\webdatabase\DatabaseThread.cpp" />
<ClCompile Include="..\Modules\webdatabase\DatabaseTracker.cpp" />
<ClCompile Include="..\Modules\webdatabase\DOMWindowWebDatabase.cpp" />
- <ClCompile Include="..\Modules\webdatabase\OriginQuotaManager.cpp" />
- <ClCompile Include="..\Modules\webdatabase\OriginUsageRecord.cpp" />
<ClCompile Include="..\Modules\webdatabase\SQLException.cpp" />
<ClCompile Include="..\Modules\webdatabase\SQLResultSet.cpp" />
<ClCompile Include="..\Modules\webdatabase\SQLResultSetRowList.cpp" />
<ClInclude Include="..\Modules\webdatabase\DatabaseThread.h" />
<ClInclude Include="..\Modules\webdatabase\DatabaseTracker.h" />
<ClInclude Include="..\Modules\webdatabase\DOMWindowWebDatabase.h" />
- <ClInclude Include="..\Modules\webdatabase\OriginQuotaManager.h" />
- <ClInclude Include="..\Modules\webdatabase\OriginUsageRecord.h" />
<ClInclude Include="..\Modules\webdatabase\SQLCallbackWrapper.h" />
<ClInclude Include="..\Modules\webdatabase\SQLError.h" />
<ClInclude Include="..\Modules\webdatabase\SQLException.h" />
<ClCompile Include="..\Modules\webdatabase\DOMWindowWebDatabase.cpp">
<Filter>Modules\webdatabase</Filter>
</ClCompile>
- <ClCompile Include="..\Modules\webdatabase\OriginQuotaManager.cpp">
- <Filter>Modules\webdatabase</Filter>
- </ClCompile>
- <ClCompile Include="..\Modules\webdatabase\OriginUsageRecord.cpp">
- <Filter>Modules\webdatabase</Filter>
- </ClCompile>
<ClCompile Include="..\Modules\webdatabase\SQLException.cpp">
<Filter>Modules\webdatabase</Filter>
</ClCompile>
<ClInclude Include="..\Modules\webdatabase\DOMWindowWebDatabase.h">
<Filter>Modules\webdatabase</Filter>
</ClInclude>
- <ClInclude Include="..\Modules\webdatabase\OriginQuotaManager.h">
- <Filter>Modules\webdatabase</Filter>
- </ClInclude>
- <ClInclude Include="..\Modules\webdatabase\OriginUsageRecord.h">
- <Filter>Modules\webdatabase</Filter>
- </ClInclude>
<ClInclude Include="..\Modules\webdatabase\SQLCallbackWrapper.h">
<Filter>Modules\webdatabase</Filter>
</ClInclude>
97BC6A311505F081001B74AC /* DatabaseTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69EF1505F081001B74AC /* DatabaseTracker.cpp */; };
97BC6A321505F081001B74AC /* DatabaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69F01505F081001B74AC /* DatabaseTracker.h */; settings = {ATTRIBUTES = (Private, ); }; };
97BC6A331505F081001B74AC /* DatabaseManagerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69F11505F081001B74AC /* DatabaseManagerClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 97BC6A371505F081001B74AC /* OriginQuotaManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69F51505F081001B74AC /* OriginQuotaManager.cpp */; };
- 97BC6A381505F081001B74AC /* OriginQuotaManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69F61505F081001B74AC /* OriginQuotaManager.h */; };
- 97BC6A391505F081001B74AC /* OriginUsageRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69F71505F081001B74AC /* OriginUsageRecord.cpp */; };
- 97BC6A3A1505F081001B74AC /* OriginUsageRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69F81505F081001B74AC /* OriginUsageRecord.h */; };
97BC6A3B1505F081001B74AC /* SQLCallbackWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69F91505F081001B74AC /* SQLCallbackWrapper.h */; };
97BC6A3C1505F081001B74AC /* SQLError.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69FA1505F081001B74AC /* SQLError.h */; };
97BC6A3E1505F081001B74AC /* SQLException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69FC1505F081001B74AC /* SQLException.cpp */; };
97BC69EF1505F081001B74AC /* DatabaseTracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DatabaseTracker.cpp; path = Modules/webdatabase/DatabaseTracker.cpp; sourceTree = "<group>"; };
97BC69F01505F081001B74AC /* DatabaseTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseTracker.h; path = Modules/webdatabase/DatabaseTracker.h; sourceTree = "<group>"; };
97BC69F11505F081001B74AC /* DatabaseManagerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseManagerClient.h; path = Modules/webdatabase/DatabaseManagerClient.h; sourceTree = "<group>"; };
- 97BC69F51505F081001B74AC /* OriginQuotaManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OriginQuotaManager.cpp; path = Modules/webdatabase/OriginQuotaManager.cpp; sourceTree = "<group>"; };
- 97BC69F61505F081001B74AC /* OriginQuotaManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OriginQuotaManager.h; path = Modules/webdatabase/OriginQuotaManager.h; sourceTree = "<group>"; };
- 97BC69F71505F081001B74AC /* OriginUsageRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OriginUsageRecord.cpp; path = Modules/webdatabase/OriginUsageRecord.cpp; sourceTree = "<group>"; };
- 97BC69F81505F081001B74AC /* OriginUsageRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OriginUsageRecord.h; path = Modules/webdatabase/OriginUsageRecord.h; sourceTree = "<group>"; };
97BC69F91505F081001B74AC /* SQLCallbackWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SQLCallbackWrapper.h; path = Modules/webdatabase/SQLCallbackWrapper.h; sourceTree = "<group>"; };
97BC69FA1505F081001B74AC /* SQLError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SQLError.h; path = Modules/webdatabase/SQLError.h; sourceTree = "<group>"; };
97BC69FB1505F081001B74AC /* SQLError.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = SQLError.idl; path = Modules/webdatabase/SQLError.idl; sourceTree = "<group>"; };
A8CCBB46151F831600AB7CE9 /* DOMWindowWebDatabase.cpp */,
A8CCBB47151F831600AB7CE9 /* DOMWindowWebDatabase.h */,
A8CCBB4E151F835A00AB7CE9 /* DOMWindowWebDatabase.idl */,
- 97BC69F51505F081001B74AC /* OriginQuotaManager.cpp */,
- 97BC69F61505F081001B74AC /* OriginQuotaManager.h */,
- 97BC69F71505F081001B74AC /* OriginUsageRecord.cpp */,
- 97BC69F81505F081001B74AC /* OriginUsageRecord.h */,
97BC69F91505F081001B74AC /* SQLCallbackWrapper.h */,
97BC69FA1505F081001B74AC /* SQLError.h */,
97BC69FB1505F081001B74AC /* SQLError.idl */,
FDA3E95C134A49EF008D4B5A /* OfflineAudioDestinationNode.h in Headers */,
F4EAF4AF10C742B1009100D3 /* OpenTypeSanitizer.h in Headers */,
0014628B103CD1DE000B20DB /* OriginAccessEntry.h in Headers */,
- 97BC6A381505F081001B74AC /* OriginQuotaManager.h in Headers */,
- 97BC6A3A1505F081001B74AC /* OriginUsageRecord.h in Headers */,
FD581FAF1520F91F003A7A75 /* OscillatorNode.h in Headers */,
BC5EB5DD0E81B8DD00B25965 /* OutlineValue.h in Headers */,
1A0D57370A5C77FE007EDD4C /* OverflowEvent.h in Headers */,
FDA3E95B134A49EF008D4B5A /* OfflineAudioDestinationNode.cpp in Sources */,
F4EAF4AE10C742B1009100D3 /* OpenTypeSanitizer.cpp in Sources */,
0014628A103CD1DE000B20DB /* OriginAccessEntry.cpp in Sources */,
- 97BC6A371505F081001B74AC /* OriginQuotaManager.cpp in Sources */,
- 97BC6A391505F081001B74AC /* OriginUsageRecord.cpp in Sources */,
FD581FAE1520F91F003A7A75 /* OscillatorNode.cpp in Sources */,
1A0D57360A5C77FE007EDD4C /* OverflowEvent.cpp in Sources */,
65FEA86909833ADE00BED4AB /* Page.cpp in Sources */,