18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "OriginQuotaManager.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE) 328ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch 3306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "AbstractDatabase.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "OriginUsageRecord.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectOriginQuotaManager::OriginQuotaManager() 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_usageRecordGuardLocked(false) 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool OriginQuotaManager::tryLock() 46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool locked = m_usageRecordGuard.tryLock(); 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef NDEBUG 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (locked) 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_usageRecordGuardLocked = true; 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(m_usageRecordGuardLocked); 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return locked; 55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid OriginQuotaManager::lock() 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_usageRecordGuard.lock(); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_usageRecordGuardLocked = true; 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid OriginQuotaManager::unlock() 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_usageRecordGuardLocked = false; 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_usageRecordGuard.unlock(); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid OriginQuotaManager::trackOrigin(PassRefPtr<SecurityOrigin> origin) 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_usageRecordGuardLocked); 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_usageMap.contains(origin.get())); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_usageMap.set(origin->threadsafeCopy(), new OriginUsageRecord); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool OriginQuotaManager::tracksOrigin(SecurityOrigin* origin) const 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_usageRecordGuardLocked); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_usageMap.contains(origin); 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid OriginQuotaManager::addDatabase(SecurityOrigin* origin, const String& databaseIdentifier, const String& fullPath) 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_usageRecordGuardLocked); 90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OriginUsageRecord* usageRecord = m_usageMap.get(origin); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(usageRecord); 93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block usageRecord->addDatabase(databaseIdentifier.threadsafeCopy(), fullPath.threadsafeCopy()); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid OriginQuotaManager::removeDatabase(SecurityOrigin* origin, const String& databaseIdentifier) 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_usageRecordGuardLocked); 100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 101231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (OriginUsageRecord* usageRecord = m_usageMap.get(origin)) 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project usageRecord->removeDatabase(databaseIdentifier); 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid OriginQuotaManager::removeOrigin(SecurityOrigin* origin) 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_usageRecordGuardLocked); 108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (OriginUsageRecord* usageRecord = m_usageMap.get(origin)) { 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_usageMap.remove(origin); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete usageRecord; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid OriginQuotaManager::markDatabase(AbstractDatabase* database) 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(database); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_usageRecordGuardLocked); 119cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block OriginUsageRecord* usageRecord = m_usageMap.get(database->securityOrigin()); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(usageRecord); 121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project usageRecord->markDatabase(database->stringIdentifier()); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned long long OriginQuotaManager::diskUsage(SecurityOrigin* origin) const 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_usageRecordGuardLocked); 128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OriginUsageRecord* usageRecord = m_usageMap.get(origin); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(usageRecord); 131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return usageRecord->diskUsage(); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1368ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch 1378ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif // ENABLE(DATABASE) 138