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