[WTF] Add makeUnique<T>, which ensures T is fast-allocated, makeUnique / makeUniqueWi...
[WebKit-https.git] / Source / WebKit / NetworkProcess / WebStorage / SessionStorageNamespace.cpp
1 /*
2  * Copyright (C) 2013-2019 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 "SessionStorageNamespace.h"
28
29 #include "StorageArea.h"
30
31 namespace WebKit {
32
33 using namespace WebCore;
34
35 SessionStorageNamespace::SessionStorageNamespace(unsigned quotaInBytes)
36     : m_quotaInBytes(quotaInBytes)
37 {
38     ASSERT(!RunLoop::isMain());
39 }
40
41 SessionStorageNamespace::~SessionStorageNamespace()
42 {
43     ASSERT(!RunLoop::isMain());
44 }
45
46 StorageArea& SessionStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin, Ref<WorkQueue>&& workQueue)
47 {
48     ASSERT(!RunLoop::isMain());
49     return *m_storageAreaMap.ensure(securityOrigin, [&]() mutable {
50         return makeUnique<StorageArea>(nullptr, WTFMove(securityOrigin), m_quotaInBytes, WTFMove(workQueue));
51     }).iterator->value.get();
52 }
53
54 void SessionStorageNamespace::cloneTo(SessionStorageNamespace& newSessionStorageNamespace)
55 {
56     ASSERT(!RunLoop::isMain());
57     ASSERT_UNUSED(newSessionStorageNamespace, newSessionStorageNamespace.isEmpty());
58
59     for (auto& pair : m_storageAreaMap)
60         newSessionStorageNamespace.m_storageAreaMap.add(pair.key, pair.value->clone());
61 }
62
63 Vector<SecurityOriginData> SessionStorageNamespace::origins() const
64 {
65     ASSERT(!RunLoop::isMain());
66     Vector<SecurityOriginData> origins;
67
68     for (const auto& storageArea : m_storageAreaMap.values()) {
69         if (!storageArea->items().isEmpty())
70             origins.append(storageArea->securityOrigin());
71     }
72
73     return origins;
74 }
75
76 void SessionStorageNamespace::clearStorageAreasMatchingOrigin(const SecurityOriginData& securityOrigin)
77 {
78     ASSERT(!RunLoop::isMain());
79     auto originAndStorageArea = m_storageAreaMap.find(securityOrigin);
80     if (originAndStorageArea != m_storageAreaMap.end())
81         originAndStorageArea->value->clear();
82 }
83
84 void SessionStorageNamespace::clearAllStorageAreas()
85 {
86     ASSERT(!RunLoop::isMain());
87     for (auto& storageArea : m_storageAreaMap.values())
88         storageArea->clear();
89 }
90
91 } // namespace WebKit