1/* 2 * Copyright (C) 2011, 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "WebKeyValueStorageManager.h" 28 29#include "APIArray.h" 30#include "LocalStorageDetails.h" 31#include "SecurityOriginData.h" 32#include "WebContext.h" 33#include "WebSecurityOrigin.h" 34#include <wtf/NeverDestroyed.h> 35 36using namespace WebCore; 37 38namespace WebKit { 39 40const char* WebKeyValueStorageManager::supplementName() 41{ 42 return "WebKeyValueStorageManager"; 43} 44 45String WebKeyValueStorageManager::originKey() 46{ 47 static NeverDestroyed<String> key(ASCIILiteral("WebKeyValueStorageManagerStorageDetailsOriginKey")); 48 return key; 49} 50 51String WebKeyValueStorageManager::creationTimeKey() 52{ 53 static NeverDestroyed<String> key(ASCIILiteral("WebKeyValueStorageManagerStorageDetailsCreationTimeKey")); 54 return key; 55} 56 57String WebKeyValueStorageManager::modificationTimeKey() 58{ 59 static NeverDestroyed<String> key(ASCIILiteral("WebKeyValueStorageManagerStorageDetailsModificationTimeKey")); 60 return key; 61} 62 63PassRefPtr<WebKeyValueStorageManager> WebKeyValueStorageManager::create(WebContext* context) 64{ 65 return adoptRef(new WebKeyValueStorageManager(context)); 66} 67 68WebKeyValueStorageManager::WebKeyValueStorageManager(WebContext* context) 69 : WebContextSupplement(context) 70{ 71} 72 73WebKeyValueStorageManager::~WebKeyValueStorageManager() 74{ 75} 76 77// WebContextSupplement 78 79void WebKeyValueStorageManager::refWebContextSupplement() 80{ 81 API::Object::ref(); 82} 83 84void WebKeyValueStorageManager::derefWebContextSupplement() 85{ 86 API::Object::deref(); 87} 88 89static void didGetKeyValueStorageOrigins(const Vector<RefPtr<SecurityOrigin>>& securityOrigins, void* context) 90{ 91 RefPtr<ArrayCallback> callback = adoptRef(static_cast<ArrayCallback*>(context)); 92 93 Vector<RefPtr<API::Object>> webSecurityOrigins; 94 webSecurityOrigins.reserveInitialCapacity(securityOrigins.size()); 95 96 for (unsigned i = 0; i < securityOrigins.size(); ++i) 97 webSecurityOrigins.uncheckedAppend(WebSecurityOrigin::create(securityOrigins[i])); 98 99 callback->performCallbackWithReturnValue(API::Array::create(WTF::move(webSecurityOrigins)).get()); 100} 101 102void WebKeyValueStorageManager::getKeyValueStorageOrigins(std::function<void (API::Array*, CallbackBase::Error)> callbackFunction) 103{ 104 context()->storageManager().getOrigins(RunLoop::main(), ArrayCallback::create(WTF::move(callbackFunction)).leakRef(), didGetKeyValueStorageOrigins); 105} 106 107static void didGetStorageDetailsByOrigin(const Vector<LocalStorageDetails>& storageDetails, void* context) 108{ 109 RefPtr<ArrayCallback> callback = adoptRef(static_cast<ArrayCallback*>(context)); 110 111 Vector<RefPtr<API::Object>> result; 112 result.reserveInitialCapacity(storageDetails.size()); 113 114 for (const LocalStorageDetails& originDetails : storageDetails) { 115 HashMap<String, RefPtr<API::Object>> detailsMap; 116 117 RefPtr<API::Object> origin = WebSecurityOrigin::create(SecurityOrigin::createFromDatabaseIdentifier(originDetails.originIdentifier)); 118 119 detailsMap.set(WebKeyValueStorageManager::originKey(), origin); 120 if (originDetails.creationTime) 121 detailsMap.set(WebKeyValueStorageManager::creationTimeKey(), API::Double::create(originDetails.creationTime)); 122 if (originDetails.modificationTime) 123 detailsMap.set(WebKeyValueStorageManager::modificationTimeKey(), API::Double::create(originDetails.modificationTime)); 124 125 result.uncheckedAppend(ImmutableDictionary::create(WTF::move(detailsMap))); 126 } 127 128 callback->performCallbackWithReturnValue(API::Array::create(WTF::move(result)).get()); 129} 130 131void WebKeyValueStorageManager::getStorageDetailsByOrigin(std::function<void (API::Array*, CallbackBase::Error)> callbackFunction) 132{ 133 context()->storageManager().getStorageDetailsByOrigin(RunLoop::main(), ArrayCallback::create(WTF::move(callbackFunction)).leakRef(), didGetStorageDetailsByOrigin); 134} 135 136void WebKeyValueStorageManager::deleteEntriesForOrigin(WebSecurityOrigin* origin) 137{ 138 context()->storageManager().deleteEntriesForOrigin(origin->securityOrigin()); 139} 140 141void WebKeyValueStorageManager::deleteAllEntries() 142{ 143 context()->storageManager().deleteAllEntries(); 144} 145 146} // namespace WebKit 147