Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / 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 "modules/indexeddb/IDBKeyRange.h"
28
29 #include "bindings/core/v8/ExceptionState.h"
30 #include "bindings/modules/v8/IDBBindingUtilities.h"
31 #include "core/dom/ExceptionCode.h"
32 #include "modules/indexeddb/IDBDatabase.h"
33
34 namespace blink {
35
36 IDBKeyRange* IDBKeyRange::fromScriptValue(ExecutionContext* context, const ScriptValue& value, ExceptionState& exceptionState)
37 {
38     if (value.isUndefined() || value.isNull())
39         return 0;
40
41     IDBKeyRange* range = scriptValueToIDBKeyRange(toIsolate(context), value);
42     if (range)
43         return range;
44
45     IDBKey* key = scriptValueToIDBKey(toIsolate(context), value);
46     if (!key || !key->isValid()) {
47         exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErrorMessage);
48         return 0;
49     }
50
51     return new IDBKeyRange(key, key, LowerBoundClosed, UpperBoundClosed);
52 }
53
54 IDBKeyRange::IDBKeyRange(IDBKey* lower, IDBKey* upper, LowerBoundType lowerType, UpperBoundType upperType)
55     : m_lower(lower)
56     , m_upper(upper)
57     , m_lowerType(lowerType)
58     , m_upperType(upperType)
59 {
60 }
61
62 void IDBKeyRange::trace(Visitor* visitor)
63 {
64     visitor->trace(m_lower);
65     visitor->trace(m_upper);
66 }
67
68 ScriptValue IDBKeyRange::lowerValue(ScriptState* scriptState) const
69 {
70     return idbKeyToScriptValue(scriptState, m_lower);
71 }
72
73 ScriptValue IDBKeyRange::upperValue(ScriptState* scriptState) const
74 {
75     return idbKeyToScriptValue(scriptState, m_upper);
76 }
77
78 IDBKeyRange* IDBKeyRange::only(IDBKey* key, ExceptionState& exceptionState)
79 {
80     if (!key || !key->isValid()) {
81         exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErrorMessage);
82         return 0;
83     }
84
85     return IDBKeyRange::create(key, key, LowerBoundClosed, UpperBoundClosed);
86 }
87
88 IDBKeyRange* IDBKeyRange::only(ExecutionContext* context, const ScriptValue& keyValue, ExceptionState& exceptionState)
89 {
90     IDBKey* key = scriptValueToIDBKey(toIsolate(context), keyValue);
91     if (!key || !key->isValid()) {
92         exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErrorMessage);
93         return 0;
94     }
95
96     return IDBKeyRange::create(key, key, LowerBoundClosed, UpperBoundClosed);
97 }
98
99 IDBKeyRange* IDBKeyRange::lowerBound(ExecutionContext* context, const ScriptValue& boundValue, bool open, ExceptionState& exceptionState)
100 {
101     IDBKey* bound = scriptValueToIDBKey(toIsolate(context), boundValue);
102     if (!bound || !bound->isValid()) {
103         exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErrorMessage);
104         return 0;
105     }
106
107     return IDBKeyRange::create(bound, 0, open ? LowerBoundOpen : LowerBoundClosed, UpperBoundOpen);
108 }
109
110 IDBKeyRange* IDBKeyRange::upperBound(ExecutionContext* context, const ScriptValue& boundValue, bool open, ExceptionState& exceptionState)
111 {
112     IDBKey* bound = scriptValueToIDBKey(toIsolate(context), boundValue);
113     if (!bound || !bound->isValid()) {
114         exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErrorMessage);
115         return 0;
116     }
117
118     return IDBKeyRange::create(0, bound, LowerBoundOpen, open ? UpperBoundOpen : UpperBoundClosed);
119 }
120
121 IDBKeyRange* IDBKeyRange::bound(ExecutionContext* context, const ScriptValue& lowerValue, const ScriptValue& upperValue, bool lowerOpen, bool upperOpen, ExceptionState& exceptionState)
122 {
123     IDBKey* lower = scriptValueToIDBKey(toIsolate(context), lowerValue);
124     IDBKey* upper = scriptValueToIDBKey(toIsolate(context), upperValue);
125
126     if (!lower || !lower->isValid() || !upper || !upper->isValid()) {
127         exceptionState.throwDOMException(DataError, IDBDatabase::notValidKeyErrorMessage);
128         return 0;
129     }
130     if (upper->isLessThan(lower)) {
131         exceptionState.throwDOMException(DataError, "The lower key is greater than the upper key.");
132         return 0;
133     }
134     if (upper->isEqual(lower) && (lowerOpen || upperOpen)) {
135         exceptionState.throwDOMException(DataError, "The lower key and upper key are equal and one of the bounds is open.");
136         return 0;
137     }
138
139     return IDBKeyRange::create(lower, upper, lowerOpen ? LowerBoundOpen : LowerBoundClosed, upperOpen ? UpperBoundOpen : UpperBoundClosed);
140 }
141
142 } // namespace blink