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