Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBKeyRange.cpp
1 /*
2  * Copyright (C) 2010 Google 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "IDBKeyRange.h"
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBBindingUtilities.h"
32 #include "IDBKey.h"
33 #include "IDBKeyData.h"
34 #include "ScriptExecutionContext.h"
35 #include <runtime/JSCJSValue.h>
36
37
38 namespace WebCore {
39 using namespace JSC;
40
41 Ref<IDBKeyRange> IDBKeyRange::create(RefPtr<IDBKey>&& lower, RefPtr<IDBKey>&& upper, bool isLowerOpen, bool isUpperOpen)
42 {
43     return adoptRef(*new IDBKeyRange(WTFMove(lower), WTFMove(upper), isLowerOpen, isUpperOpen));
44 }
45
46 Ref<IDBKeyRange> IDBKeyRange::create(RefPtr<IDBKey>&& key)
47 {
48     auto upper = key;
49     return create(WTFMove(key), WTFMove(upper), false, false);
50 }
51
52 IDBKeyRange::IDBKeyRange(RefPtr<IDBKey>&& lower, RefPtr<IDBKey>&& upper, bool isLowerOpen, bool isUpperOpen)
53     : m_lower(WTFMove(lower))
54     , m_upper(WTFMove(upper))
55     , m_isLowerOpen(isLowerOpen)
56     , m_isUpperOpen(isUpperOpen)
57 {
58 }
59
60 IDBKeyRange::~IDBKeyRange() = default;
61
62 ExceptionOr<Ref<IDBKeyRange>> IDBKeyRange::only(RefPtr<IDBKey>&& key)
63 {
64     if (!key || !key->isValid())
65         return Exception { DataError };
66
67     return create(WTFMove(key));
68 }
69
70 ExceptionOr<Ref<IDBKeyRange>> IDBKeyRange::only(ExecState& state, JSValue keyValue)
71 {
72     return only(scriptValueToIDBKey(state, keyValue));
73 }
74
75 ExceptionOr<Ref<IDBKeyRange>> IDBKeyRange::lowerBound(ExecState& state, JSValue boundValue, bool open)
76 {
77     auto bound = scriptValueToIDBKey(state, boundValue);
78     if (!bound->isValid())
79         return Exception { DataError };
80
81     return create(WTFMove(bound), nullptr, open, true);
82 }
83
84 ExceptionOr<Ref<IDBKeyRange>> IDBKeyRange::upperBound(ExecState& state, JSValue boundValue, bool open)
85 {
86     auto bound = scriptValueToIDBKey(state, boundValue);
87     if (!bound->isValid())
88         return Exception { DataError };
89
90     return create(nullptr, WTFMove(bound), true, open);
91 }
92
93 ExceptionOr<Ref<IDBKeyRange>> IDBKeyRange::bound(ExecState& state, JSValue lowerValue, JSValue upperValue, bool lowerOpen, bool upperOpen)
94 {
95     auto lower = scriptValueToIDBKey(state, lowerValue);
96     auto upper = scriptValueToIDBKey(state, upperValue);
97
98     if (!lower->isValid() || !upper->isValid())
99         return Exception { DataError };
100     if (upper->isLessThan(lower.get()))
101         return Exception { DataError };
102     if (upper->isEqual(lower.get()) && (lowerOpen || upperOpen))
103         return Exception { DataError };
104
105     return create(WTFMove(lower), WTFMove(upper), lowerOpen, upperOpen);
106 }
107
108 bool IDBKeyRange::isOnlyKey() const
109 {
110     return m_lower && m_upper && !m_isLowerOpen && !m_isUpperOpen && m_lower->isEqual(*m_upper);
111 }
112
113 ExceptionOr<bool> IDBKeyRange::includes(JSC::ExecState& state, JSC::JSValue keyValue)
114 {
115     auto key = scriptValueToIDBKey(state, keyValue);
116     if (!key->isValid())
117         return Exception { DataError, "Failed to execute 'includes' on 'IDBKeyRange': The passed-in value is not a valid IndexedDB key." };
118
119     if (m_lower) {
120         int compare = m_lower->compare(key.get());
121
122         if (compare > 0)
123             return false;
124         if (m_isLowerOpen && !compare)
125             return false;
126     }
127
128     if (m_upper) {
129         int compare = m_upper->compare(key.get());
130
131         if (compare < 0)
132             return false;
133         if (m_isUpperOpen && !compare)
134             return false;
135     }
136
137     return true;
138 }
139
140 } // namespace WebCore
141
142 #endif // ENABLE(INDEXED_DATABASE)