10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/* 20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2008 Apple Inc. All Rights Reserved. 30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without 50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions 60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * are met: 70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 1. Redistributions of source code must retain the above copyright 80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer. 90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer in the 110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * documentation and/or other materials provided with the distribution. 120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */ 250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "config.h" 270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "StorageAreaImpl.h" 280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(DOM_STORAGE) 300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ExceptionCode.h" 320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Frame.h" 33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Page.h" 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Settings.h" 350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "StorageAreaSync.h" 36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "StorageEventDispatcher.h" 370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "StorageMap.h" 380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "StorageSyncManager.h" 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore { 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochStorageAreaImpl::~StorageAreaImpl() 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 44231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(isMainThread()); 450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monseninline StorageAreaImpl::StorageAreaImpl(StorageType storageType, PassRefPtr<SecurityOrigin> origin, PassRefPtr<StorageSyncManager> syncManager, unsigned quota) 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch : m_storageType(storageType) 490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_securityOrigin(origin) 50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_storageMap(StorageMap::create(quota)) 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_storageSyncManager(syncManager) 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NDEBUG 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_isShutdown(false) 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(isMainThread()); 570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(m_securityOrigin); 580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(m_storageMap); 5906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 6006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 6106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenPassRefPtr<StorageAreaImpl> StorageAreaImpl::create(StorageType storageType, PassRefPtr<SecurityOrigin> origin, PassRefPtr<StorageSyncManager> syncManager, unsigned quota) 6206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 6306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen RefPtr<StorageAreaImpl> area = adoptRef(new StorageAreaImpl(storageType, origin, syncManager, quota)); 640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // FIXME: If there's no backing storage for LocalStorage, the default WebKit behavior should be that of private browsing, 6606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // not silently ignoring it. https://bugs.webkit.org/show_bug.cgi?id=25894 6706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (area->m_storageSyncManager) { 6806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen area->m_storageAreaSync = StorageAreaSync::create(area->m_storageSyncManager, area.get(), area->m_securityOrigin->databaseIdentifier()); 6906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(area->m_storageAreaSync); 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 7106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 7206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return area.release(); 730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<StorageAreaImpl> StorageAreaImpl::copy() 760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return adoptRef(new StorageAreaImpl(this)); 790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochStorageAreaImpl::StorageAreaImpl(StorageAreaImpl* area) 820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch : m_storageType(area->m_storageType) 830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_securityOrigin(area->m_securityOrigin) 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_storageMap(area->m_storageMap) 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_storageSyncManager(area->m_storageSyncManager) 860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NDEBUG 870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_isShutdown(area->m_isShutdown) 880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(isMainThread()); 910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(m_securityOrigin); 920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(m_storageMap); 930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic bool privateBrowsingEnabled(Frame* frame) 970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 981d7cc17ccbeabb654e416c598e2631ff691166caBen Murdoch#if PLATFORM(ANDROID) 991d7cc17ccbeabb654e416c598e2631ff691166caBen Murdoch if (!frame) 1001d7cc17ccbeabb654e416c598e2631ff691166caBen Murdoch return false; 1011d7cc17ccbeabb654e416c598e2631ff691166caBen Murdoch#endif 1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if PLATFORM(CHROMIUM) 1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // The frame pointer can be NULL in Chromium since this call is made in a different 1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // process from where the Frame object exists. Luckily, private browseing is 1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // implemented differently in Chromium, so it'd never return true anyway. 1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!frame); 1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 109e1a85ac486988522a54d0711accd2e0ebbbe86cfBen Murdoch return frame->page() && frame->page()->settings()->privateBrowsingEnabled(); 1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochunsigned StorageAreaImpl::length() const 1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block blockUntilImportComplete(); 117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return m_storageMap->length(); 1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString StorageAreaImpl::key(unsigned index) const 1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch blockUntilImportComplete(); 125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return m_storageMap->key(index); 1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString StorageAreaImpl::getItem(const String& key) const 1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch blockUntilImportComplete(); 1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return m_storageMap->getItem(key); 1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 137d0825bca7fe65beaee391d30da42e937db621564Steve BlockString StorageAreaImpl::setItem(const String& key, const String& value, ExceptionCode& ec, Frame* frame) 1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!value.isNull()); 1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch blockUntilImportComplete(); 1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (privateBrowsingEnabled(frame)) { 1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ec = QUOTA_EXCEEDED_ERR; 145d0825bca7fe65beaee391d30da42e937db621564Steve Block return String(); 1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch String oldValue; 149231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool quotaException; 150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<StorageMap> newMap = m_storageMap->setItem(key, value, oldValue, quotaException); 151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (newMap) 152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_storageMap = newMap.release(); 153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 154231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (quotaException) { 155231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ec = QUOTA_EXCEEDED_ERR; 156d0825bca7fe65beaee391d30da42e937db621564Steve Block return oldValue; 157231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (oldValue == value) 160d0825bca7fe65beaee391d30da42e937db621564Steve Block return oldValue; 1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_storageAreaSync) 163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_storageAreaSync->scheduleItemForSync(key, value); 164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block StorageEventDispatcher::dispatch(key, oldValue, value, m_storageType, m_securityOrigin.get(), frame); 165d0825bca7fe65beaee391d30da42e937db621564Steve Block return oldValue; 1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 168d0825bca7fe65beaee391d30da42e937db621564Steve BlockString StorageAreaImpl::removeItem(const String& key, Frame* frame) 1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch blockUntilImportComplete(); 1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (privateBrowsingEnabled(frame)) 174d0825bca7fe65beaee391d30da42e937db621564Steve Block return String(); 1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch String oldValue; 1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RefPtr<StorageMap> newMap = m_storageMap->removeItem(key, oldValue); 1780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (newMap) 1790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_storageMap = newMap.release(); 1800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (oldValue.isNull()) 182d0825bca7fe65beaee391d30da42e937db621564Steve Block return oldValue; 183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_storageAreaSync) 185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_storageAreaSync->scheduleItemForSync(key, String()); 186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block StorageEventDispatcher::dispatch(key, oldValue, String(), m_storageType, m_securityOrigin.get(), frame); 187d0825bca7fe65beaee391d30da42e937db621564Steve Block return oldValue; 1880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 190d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool StorageAreaImpl::clear(Frame* frame) 1910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch blockUntilImportComplete(); 1940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (privateBrowsingEnabled(frame)) 196d0825bca7fe65beaee391d30da42e937db621564Steve Block return false; 1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_storageMap->length()) 199d0825bca7fe65beaee391d30da42e937db621564Steve Block return false; 200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block unsigned quota = m_storageMap->quota(); 202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_storageMap = StorageMap::create(quota); 2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (m_storageAreaSync) 2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_storageAreaSync->scheduleClear(); 206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block StorageEventDispatcher::dispatch(String(), String(), String(), m_storageType, m_securityOrigin.get(), frame); 207d0825bca7fe65beaee391d30da42e937db621564Steve Block return true; 2080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool StorageAreaImpl::contains(const String& key) const 2110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 2130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch blockUntilImportComplete(); 2140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return m_storageMap->contains(key); 2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid StorageAreaImpl::importItem(const String& key, const String& value) 2190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!m_isShutdown); 2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_storageMap->importItem(key, value); 2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid StorageAreaImpl::close() 2250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (m_storageAreaSync) 2270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_storageAreaSync->scheduleFinalSync(); 2280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NDEBUG 2300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_isShutdown = true; 2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 2320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2342bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid StorageAreaImpl::clearForOriginDeletion() 2352bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 2362bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!m_isShutdown); 2372bde8e466a4451c7319e3a072d118917957d6554Steve Block blockUntilImportComplete(); 2382bde8e466a4451c7319e3a072d118917957d6554Steve Block 2392bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_storageMap->length()) { 2402bde8e466a4451c7319e3a072d118917957d6554Steve Block unsigned quota = m_storageMap->quota(); 2412bde8e466a4451c7319e3a072d118917957d6554Steve Block m_storageMap = StorageMap::create(quota); 2422bde8e466a4451c7319e3a072d118917957d6554Steve Block } 2432bde8e466a4451c7319e3a072d118917957d6554Steve Block 2442bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_storageAreaSync) { 2452bde8e466a4451c7319e3a072d118917957d6554Steve Block m_storageAreaSync->scheduleClear(); 2462bde8e466a4451c7319e3a072d118917957d6554Steve Block m_storageAreaSync->scheduleCloseDatabase(); 2472bde8e466a4451c7319e3a072d118917957d6554Steve Block } 2482bde8e466a4451c7319e3a072d118917957d6554Steve Block} 2492bde8e466a4451c7319e3a072d118917957d6554Steve Block 2502bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid StorageAreaImpl::sync() 2512bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 2522bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!m_isShutdown); 2532bde8e466a4451c7319e3a072d118917957d6554Steve Block blockUntilImportComplete(); 2542bde8e466a4451c7319e3a072d118917957d6554Steve Block 2552bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_storageAreaSync) 2562bde8e466a4451c7319e3a072d118917957d6554Steve Block m_storageAreaSync->scheduleSync(); 2572bde8e466a4451c7319e3a072d118917957d6554Steve Block} 2582bde8e466a4451c7319e3a072d118917957d6554Steve Block 2590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid StorageAreaImpl::blockUntilImportComplete() const 2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (m_storageAreaSync) 2620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_storageAreaSync->blockUntilImportComplete(); 2630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif // ENABLE(DOM_STORAGE) 268