Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 119 | 119 |
| 120 IDBAny* IDBCursor::source() const | 120 IDBAny* IDBCursor::source() const |
| 121 { | 121 { |
| 122 return m_source.get(); | 122 return m_source.get(); |
| 123 } | 123 } |
| 124 | 124 |
| 125 PassRefPtr<IDBRequest> IDBCursor::update(ScriptState* state, ScriptValue& value, ExceptionState& es) | 125 PassRefPtr<IDBRequest> IDBCursor::update(ScriptState* state, ScriptValue& value, ExceptionState& es) |
| 126 { | 126 { |
| 127 IDB_TRACE("IDBCursor::update"); | 127 IDB_TRACE("IDBCursor::update"); |
| 128 | 128 |
| 129 if (!m_gotValue || isKeyCursor() || isDeleted()) { | 129 if (!m_gotValue) { |
| 130 es.throwDOMException(InvalidStateError); | 130 es.throwDOMException(InvalidStateError, IDBDatabase::notGotValueMessage) ; |
|
arv (Not doing code reviews)
2013/07/12 17:43:08
maybe didntGetValueErrorMessage or noValueErrorMes
jsbell
2013/07/12 17:53:14
Yeah, that was contorted. I went with "noValueErro
| |
| 131 return 0; | |
| 132 } | |
| 133 if (isKeyCursor()) { | |
| 134 es.throwDOMException(InvalidStateError, IDBDatabase::isKeyCursorMessage) ; | |
|
arv (Not doing code reviews)
2013/07/12 17:43:08
Can we name these *ErrorMessage?
jsbell
2013/07/12 17:53:14
Done (while you were typing this, actually!)
| |
| 135 return 0; | |
| 136 } | |
| 137 if (isDeleted()) { | |
| 138 es.throwDOMException(InvalidStateError, IDBDatabase::sourceDeletedMessag e); | |
| 139 return 0; | |
| 140 } | |
| 141 if (m_transaction->isFinished()) { | |
| 142 es.throwDOMException(TransactionInactiveError, IDBDatabase::transactionF inishedMessage); | |
| 131 return 0; | 143 return 0; |
| 132 } | 144 } |
| 133 if (!m_transaction->isActive()) { | 145 if (!m_transaction->isActive()) { |
| 134 es.throwDOMException(TransactionInactiveError); | 146 es.throwDOMException(TransactionInactiveError); |
| 135 return 0; | 147 return 0; |
| 136 } | 148 } |
| 137 if (m_transaction->isReadOnly()) { | 149 if (m_transaction->isReadOnly()) { |
| 138 es.throwDOMException(ReadOnlyError); | 150 es.throwDOMException(ReadOnlyError); |
| 139 return 0; | 151 return 0; |
| 140 } | 152 } |
| 141 | 153 |
| 142 RefPtr<IDBObjectStore> objectStore = effectiveObjectStore(); | 154 RefPtr<IDBObjectStore> objectStore = effectiveObjectStore(); |
| 143 const IDBKeyPath& keyPath = objectStore->metadata().keyPath; | 155 const IDBKeyPath& keyPath = objectStore->metadata().keyPath; |
| 144 const bool usesInLineKeys = !keyPath.isNull(); | 156 const bool usesInLineKeys = !keyPath.isNull(); |
| 145 if (usesInLineKeys) { | 157 if (usesInLineKeys) { |
| 146 RefPtr<IDBKey> keyPathKey = createIDBKeyFromScriptValueAndKeyPath(m_requ est->requestState(), value, keyPath); | 158 RefPtr<IDBKey> keyPathKey = createIDBKeyFromScriptValueAndKeyPath(m_requ est->requestState(), value, keyPath); |
| 147 if (!keyPathKey || !keyPathKey->isEqual(m_currentPrimaryKey.get())) { | 159 if (!keyPathKey || !keyPathKey->isEqual(m_currentPrimaryKey.get())) { |
| 148 es.throwDOMException(DataError); | 160 es.throwDOMException(DataError, "The effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter resu lts in a different value than the cursor's effective key."); |
| 149 return 0; | 161 return 0; |
| 150 } | 162 } |
| 151 } | 163 } |
| 152 | 164 |
| 153 return objectStore->put(IDBDatabaseBackendInterface::CursorUpdate, IDBAny::c reate(this), state, value, m_currentPrimaryKey, es); | 165 return objectStore->put(IDBDatabaseBackendInterface::CursorUpdate, IDBAny::c reate(this), state, value, m_currentPrimaryKey, es); |
| 154 } | 166 } |
| 155 | 167 |
| 156 void IDBCursor::advance(unsigned long count, ExceptionState& es) | 168 void IDBCursor::advance(unsigned long count, ExceptionState& es) |
| 157 { | 169 { |
| 158 IDB_TRACE("IDBCursor::advance"); | 170 IDB_TRACE("IDBCursor::advance"); |
| 159 if (!m_gotValue || isDeleted()) { | 171 if (!m_gotValue) { |
| 160 es.throwDOMException(InvalidStateError); | 172 es.throwDOMException(InvalidStateError, IDBDatabase::notGotValueMessage) ; |
| 173 return; | |
| 174 } | |
| 175 if (isDeleted()) { | |
| 176 es.throwDOMException(InvalidStateError, IDBDatabase::sourceDeletedMessag e); | |
| 161 return; | 177 return; |
| 162 } | 178 } |
| 163 | 179 |
| 180 if (m_transaction->isFinished()) { | |
| 181 es.throwDOMException(TransactionInactiveError, IDBDatabase::transactionF inishedMessage); | |
| 182 return; | |
| 183 } | |
| 164 if (!m_transaction->isActive()) { | 184 if (!m_transaction->isActive()) { |
| 165 es.throwDOMException(TransactionInactiveError); | 185 es.throwDOMException(TransactionInactiveError); |
| 166 return; | 186 return; |
| 167 } | 187 } |
| 168 | 188 |
| 169 if (!count) { | 189 if (!count) { |
| 170 es.throwTypeError(); | 190 es.throwTypeError(); |
| 171 return; | 191 return; |
| 172 } | 192 } |
| 173 | 193 |
| 174 m_request->setPendingCursor(this); | 194 m_request->setPendingCursor(this); |
| 175 m_gotValue = false; | 195 m_gotValue = false; |
| 176 m_backend->advance(count, m_request); | 196 m_backend->advance(count, m_request); |
| 177 } | 197 } |
| 178 | 198 |
| 179 void IDBCursor::continueFunction(ScriptExecutionContext* context, const ScriptVa lue& keyValue, ExceptionState& es) | 199 void IDBCursor::continueFunction(ScriptExecutionContext* context, const ScriptVa lue& keyValue, ExceptionState& es) |
| 180 { | 200 { |
| 181 DOMRequestState requestState(context); | 201 DOMRequestState requestState(context); |
| 182 RefPtr<IDBKey> key = keyValue.isUndefined() ? 0 : scriptValueToIDBKey(&reque stState, keyValue); | 202 RefPtr<IDBKey> key = keyValue.isUndefined() ? 0 : scriptValueToIDBKey(&reque stState, keyValue); |
| 183 continueFunction(key.release(), es); | 203 continueFunction(key.release(), es); |
| 184 } | 204 } |
| 185 | 205 |
| 186 void IDBCursor::continueFunction(PassRefPtr<IDBKey> key, ExceptionState& es) | 206 void IDBCursor::continueFunction(PassRefPtr<IDBKey> key, ExceptionState& es) |
| 187 { | 207 { |
| 188 IDB_TRACE("IDBCursor::continue"); | 208 IDB_TRACE("IDBCursor::continue"); |
| 189 if (key && !key->isValid()) { | 209 if (key && !key->isValid()) { |
| 190 es.throwDOMException(DataError); | 210 es.throwDOMException(DataError, IDBDatabase::notValidKeyMessage); |
| 191 return; | 211 return; |
| 192 } | 212 } |
| 193 | 213 |
| 214 if (m_transaction->isFinished()) { | |
| 215 es.throwDOMException(TransactionInactiveError, IDBDatabase::transactionF inishedMessage); | |
| 216 return; | |
| 217 } | |
| 194 if (!m_transaction->isActive()) { | 218 if (!m_transaction->isActive()) { |
| 195 es.throwDOMException(TransactionInactiveError); | 219 es.throwDOMException(TransactionInactiveError); |
| 196 return; | 220 return; |
| 197 } | 221 } |
| 198 | 222 |
| 199 if (!m_gotValue || isDeleted()) { | 223 if (!m_gotValue) { |
| 200 es.throwDOMException(InvalidStateError); | 224 es.throwDOMException(InvalidStateError, IDBDatabase::notGotValueMessage) ; |
| 201 return; | 225 return; |
| 202 } | 226 } |
| 203 | 227 |
| 228 if (isDeleted()) { | |
| 229 es.throwDOMException(InvalidStateError, IDBDatabase::sourceDeletedMessag e); | |
| 230 return; | |
| 231 } | |
| 232 | |
| 204 if (key) { | 233 if (key) { |
| 205 ASSERT(m_currentKey); | 234 ASSERT(m_currentKey); |
| 206 if (m_direction == IndexedDB::CursorNext || m_direction == IndexedDB::Cu rsorNextNoDuplicate) { | 235 if (m_direction == IndexedDB::CursorNext || m_direction == IndexedDB::Cu rsorNextNoDuplicate) { |
| 207 if (!m_currentKey->isLessThan(key.get())) { | 236 if (!m_currentKey->isLessThan(key.get())) { |
| 208 es.throwDOMException(DataError); | 237 es.throwDOMException(DataError, "The parameter is less than or e qual to this cursor's position."); |
| 209 return; | 238 return; |
| 210 } | 239 } |
| 211 } else { | 240 } else { |
| 212 if (!key->isLessThan(m_currentKey.get())) { | 241 if (!key->isLessThan(m_currentKey.get())) { |
| 213 es.throwDOMException(DataError); | 242 es.throwDOMException(DataError, "The parameter is greater than o r equal to this cursor's position."); |
| 214 return; | 243 return; |
| 215 } | 244 } |
| 216 } | 245 } |
| 217 } | 246 } |
| 218 | 247 |
| 219 // FIXME: We're not using the context from when continue was called, which m eans the callback | 248 // FIXME: We're not using the context from when continue was called, which m eans the callback |
| 220 // will be on the original context openCursor was called on. Is this right? | 249 // will be on the original context openCursor was called on. Is this right? |
| 221 m_request->setPendingCursor(this); | 250 m_request->setPendingCursor(this); |
| 222 m_gotValue = false; | 251 m_gotValue = false; |
| 223 m_backend->continueFunction(key, m_request); | 252 m_backend->continueFunction(key, m_request); |
| 224 } | 253 } |
| 225 | 254 |
| 226 PassRefPtr<IDBRequest> IDBCursor::deleteFunction(ScriptExecutionContext* context , ExceptionState& es) | 255 PassRefPtr<IDBRequest> IDBCursor::deleteFunction(ScriptExecutionContext* context , ExceptionState& es) |
| 227 { | 256 { |
| 228 IDB_TRACE("IDBCursor::delete"); | 257 IDB_TRACE("IDBCursor::delete"); |
| 258 if (m_transaction->isFinished()) { | |
| 259 es.throwDOMException(TransactionInactiveError, IDBDatabase::transactionF inishedMessage); | |
| 260 return 0; | |
| 261 } | |
| 229 if (!m_transaction->isActive()) { | 262 if (!m_transaction->isActive()) { |
| 230 es.throwDOMException(TransactionInactiveError); | 263 es.throwDOMException(TransactionInactiveError); |
| 231 return 0; | 264 return 0; |
| 232 } | 265 } |
| 233 if (m_transaction->isReadOnly()) { | 266 if (m_transaction->isReadOnly()) { |
| 234 es.throwDOMException(ReadOnlyError); | 267 es.throwDOMException(ReadOnlyError); |
| 235 return 0; | 268 return 0; |
| 236 } | 269 } |
| 237 | 270 |
| 238 if (!m_gotValue || isKeyCursor() || isDeleted()) { | 271 if (!m_gotValue) { |
| 239 es.throwDOMException(InvalidStateError); | 272 es.throwDOMException(InvalidStateError, IDBDatabase::notGotValueMessage) ; |
| 273 return 0; | |
| 274 } | |
| 275 if (isKeyCursor()) { | |
| 276 es.throwDOMException(InvalidStateError, IDBDatabase::isKeyCursorMessage) ; | |
| 277 return 0; | |
| 278 } | |
| 279 if (isDeleted()) { | |
| 280 es.throwDOMException(InvalidStateError, IDBDatabase::sourceDeletedMessag e); | |
| 240 return 0; | 281 return 0; |
| 241 } | 282 } |
| 242 | 283 |
| 243 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::only(m_currentPrimaryKey, es); | 284 RefPtr<IDBKeyRange> keyRange = IDBKeyRange::only(m_currentPrimaryKey, es); |
| 244 ASSERT(!es); | 285 ASSERT(!es); |
| 245 | 286 |
| 246 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this ), m_transaction.get()); | 287 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this ), m_transaction.get()); |
| 247 m_transaction->backendDB()->deleteRange(m_transaction->id(), effectiveObject Store()->id(), keyRange, request); | 288 m_transaction->backendDB()->deleteRange(m_transaction->id(), effectiveObject Store()->id(), keyRange, request); |
| 248 return request.release(); | 289 return request.release(); |
| 249 } | 290 } |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 333 case IndexedDB::CursorPrevNoDuplicate: | 374 case IndexedDB::CursorPrevNoDuplicate: |
| 334 return IDBCursor::directionPrevUnique(); | 375 return IDBCursor::directionPrevUnique(); |
| 335 | 376 |
| 336 default: | 377 default: |
| 337 ASSERT_NOT_REACHED(); | 378 ASSERT_NOT_REACHED(); |
| 338 return IDBCursor::directionNext(); | 379 return IDBCursor::directionNext(); |
| 339 } | 380 } |
| 340 } | 381 } |
| 341 | 382 |
| 342 } // namespace WebCore | 383 } // namespace WebCore |
| OLD | NEW |