Replace WTF::move with WTFMove
[WebKit-https.git] / Source / WebCore / storage / Storage.cpp
1 /*
2  * Copyright (C) 2008 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "Storage.h"
28
29 #include "Document.h"
30 #include "ExceptionCode.h"
31 #include "Frame.h"
32 #include "Page.h"
33 #include "SchemeRegistry.h"
34 #include "Settings.h"
35 #include "StorageArea.h"
36 #include <wtf/text/WTFString.h>
37
38 namespace WebCore {
39
40 Ref<Storage> Storage::create(Frame* frame, RefPtr<StorageArea>&& storageArea)
41 {
42     return adoptRef(*new Storage(frame, WTFMove(storageArea)));
43 }
44
45 Storage::Storage(Frame* frame, RefPtr<StorageArea>&& storageArea)
46     : DOMWindowProperty(frame)
47     , m_storageArea(WTFMove(storageArea))
48 {
49     ASSERT(m_frame);
50     ASSERT(m_storageArea);
51
52     m_storageArea->incrementAccessCount();
53 }
54
55 Storage::~Storage()
56 {
57     m_storageArea->decrementAccessCount();
58 }
59
60 unsigned Storage::length(ExceptionCode& ec) const
61 {
62     ec = 0;
63     if (!m_storageArea->canAccessStorage(m_frame)) {
64         ec = SECURITY_ERR;
65         return 0;
66     }
67
68     if (isDisabledByPrivateBrowsing())
69         return 0;
70
71     return m_storageArea->length();
72 }
73
74 String Storage::key(unsigned index, ExceptionCode& ec) const
75 {
76     if (!m_storageArea->canAccessStorage(m_frame)) {
77         ec = SECURITY_ERR;
78         return String();
79     }
80
81     if (isDisabledByPrivateBrowsing())
82         return String();
83
84     return m_storageArea->key(index);
85 }
86
87 String Storage::getItem(const String& key, ExceptionCode& ec) const
88 {
89     if (!m_storageArea->canAccessStorage(m_frame)) {
90         ec = SECURITY_ERR;
91         return String();
92     }
93
94     if (isDisabledByPrivateBrowsing())
95         return String();
96
97     return m_storageArea->item(key);
98 }
99
100 void Storage::setItem(const String& key, const String& value, ExceptionCode& ec)
101 {
102     if (!m_storageArea->canAccessStorage(m_frame)) {
103         ec = SECURITY_ERR;
104         return;
105     }
106
107     if (isDisabledByPrivateBrowsing()) {
108         ec = QUOTA_EXCEEDED_ERR;
109         return;
110     }
111
112     bool quotaException = false;
113     m_storageArea->setItem(m_frame, key, value, quotaException);
114
115     if (quotaException)
116         ec = QUOTA_EXCEEDED_ERR;
117 }
118
119 void Storage::removeItem(const String& key, ExceptionCode& ec)
120 {
121     if (!m_storageArea->canAccessStorage(m_frame)) {
122         ec = SECURITY_ERR;
123         return;
124     }
125
126     if (isDisabledByPrivateBrowsing())
127         return;
128
129     m_storageArea->removeItem(m_frame, key);
130 }
131
132 void Storage::clear(ExceptionCode& ec)
133 {
134     if (!m_storageArea->canAccessStorage(m_frame)) {
135         ec = SECURITY_ERR;
136         return;
137     }
138
139     if (isDisabledByPrivateBrowsing())
140         return;
141
142     m_storageArea->clear(m_frame);
143 }
144
145 bool Storage::contains(const String& key, ExceptionCode& ec) const
146 {
147     if (!m_storageArea->canAccessStorage(m_frame)) {
148         ec = SECURITY_ERR;
149         return false;
150     }
151
152     if (isDisabledByPrivateBrowsing())
153         return false;
154
155     return m_storageArea->contains(key);
156 }
157
158 bool Storage::isDisabledByPrivateBrowsing() const
159 {
160     if (!m_frame->page()->usesEphemeralSession())
161         return false;
162
163     if (m_storageArea->storageType() == LocalStorage) {
164         if (SchemeRegistry::allowsLocalStorageAccessInPrivateBrowsing(m_frame->document()->securityOrigin()->protocol()))
165             return false;
166     }
167
168     return true;
169 }
170
171 } // namespace WebCore