Bug 1544750 - Part 1: Refactor some IndexedDB code to use ErrorResult r=asuth

This is mostly laying the groundwork for further refactoring.

Differential Revision: https://phabricator.services.mozilla.com/D27666

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Yaron Tausky 2019-04-26 16:53:59 +00:00
parent 8471eabd7f
commit 6e39f30075
10 changed files with 157 additions and 143 deletions

View File

@ -22984,11 +22984,13 @@ CreateIndexOp::UpdateIndexDataValuesFunction::OnFunctionCall(
const int64_t& objectStoreId = mOp->mObjectStoreId;
AutoTArray<IndexUpdateInfo, 32> updateInfos;
rv = IDBObjectStore::DeserializeIndexValueToUpdateInfos(
ErrorResult errorResult;
IDBObjectStore::DeserializeIndexValueToUpdateInfos(
metadata.id(), metadata.keyPath(), metadata.unique(),
metadata.multiEntry(), metadata.locale(), cloneInfo, updateInfos);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
metadata.multiEntry(), metadata.locale(), cloneInfo, updateInfos,
errorResult);
if (NS_WARN_IF(errorResult.Failed())) {
return errorResult.StealNSResult();
}
if (updateInfos.IsEmpty()) {

View File

@ -381,7 +381,7 @@ void IDBCursor::Continue(JSContext* aCx, JS::Handle<JS::Value> aKey,
}
Key key;
aRv = key.SetFromJSVal(aCx, aKey);
key.SetFromJSVal(aCx, aKey, aRv);
if (aRv.Failed()) {
return;
}
@ -479,7 +479,7 @@ void IDBCursor::ContinuePrimaryKey(JSContext* aCx, JS::Handle<JS::Value> aKey,
}
Key key;
aRv = key.SetFromJSVal(aCx, aKey);
key.SetFromJSVal(aCx, aKey, aRv);
if (aRv.Failed()) {
return;
}
@ -501,7 +501,7 @@ void IDBCursor::ContinuePrimaryKey(JSContext* aCx, JS::Handle<JS::Value> aKey,
}
Key primaryKey;
aRv = primaryKey.SetFromJSVal(aCx, aPrimaryKey);
primaryKey.SetFromJSVal(aCx, aPrimaryKey, aRv);
if (aRv.Failed()) {
return;
}

View File

@ -501,15 +501,13 @@ already_AddRefed<IDBOpenDBRequest> IDBFactory::DeleteDatabase(
int16_t IDBFactory::Cmp(JSContext* aCx, JS::Handle<JS::Value> aFirst,
JS::Handle<JS::Value> aSecond, ErrorResult& aRv) {
Key first, second;
nsresult rv = first.SetFromJSVal(aCx, aFirst);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
first.SetFromJSVal(aCx, aFirst, aRv);
if (aRv.Failed()) {
return 0;
}
rv = second.SetFromJSVal(aCx, aSecond);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
second.SetFromJSVal(aCx, aSecond, aRv);
if (aRv.Failed()) {
return 0;
}

View File

@ -287,7 +287,7 @@ already_AddRefed<IDBRequest> IDBIndex::GetInternal(bool aKeyOnly,
}
RefPtr<IDBKeyRange> keyRange;
aRv = IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange));
IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
@ -360,7 +360,7 @@ already_AddRefed<IDBRequest> IDBIndex::GetAllInternal(
}
RefPtr<IDBKeyRange> keyRange;
aRv = IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange));
IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
@ -436,7 +436,7 @@ already_AddRefed<IDBRequest> IDBIndex::OpenCursorInternal(
}
RefPtr<IDBKeyRange> keyRange;
aRv = IDBKeyRange::FromJSVal(aCx, aRange, getter_AddRefs(keyRange));
IDBKeyRange::FromJSVal(aCx, aRange, getter_AddRefs(keyRange), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
@ -529,7 +529,7 @@ already_AddRefed<IDBRequest> IDBIndex::Count(JSContext* aCx,
}
RefPtr<IDBKeyRange> keyRange;
aRv = IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange));
IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange), aRv);
if (aRv.Failed()) {
return nullptr;
}

View File

@ -19,19 +19,16 @@ using namespace mozilla::dom::indexedDB;
namespace {
nsresult GetKeyFromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal,
Key& aKey) {
nsresult rv = aKey.SetFromJSVal(aCx, aVal);
if (NS_FAILED(rv)) {
MOZ_ASSERT(NS_ERROR_GET_MODULE(rv) == NS_ERROR_MODULE_DOM_INDEXEDDB);
return rv;
void GetKeyFromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal, Key& aKey,
ErrorResult& aRv) {
aKey.SetFromJSVal(aCx, aVal, aRv);
if (aRv.Failed()) {
return;
}
if (aKey.IsUnset()) {
return NS_ERROR_DOM_INDEXEDDB_DATA_ERR;
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
}
return NS_OK;
}
} // namespace
@ -62,8 +59,8 @@ IDBLocaleAwareKeyRange::IDBLocaleAwareKeyRange(nsISupports* aGlobal,
IDBLocaleAwareKeyRange::~IDBLocaleAwareKeyRange() { DropJSObjects(); }
// static
nsresult IDBKeyRange::FromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal,
IDBKeyRange** aKeyRange) {
void IDBKeyRange::FromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal,
IDBKeyRange** aKeyRange, ErrorResult& aRv) {
MOZ_ASSERT_IF(!aCx, aVal.isUndefined());
RefPtr<IDBKeyRange> keyRange;
@ -71,7 +68,7 @@ nsresult IDBKeyRange::FromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal,
if (aVal.isNullOrUndefined()) {
// undefined and null returns no IDBKeyRange.
keyRange.forget(aKeyRange);
return NS_OK;
return;
}
JS::Rooted<JSObject*> obj(aCx, aVal.isObject() ? &aVal.toObject() : nullptr);
@ -80,18 +77,15 @@ nsresult IDBKeyRange::FromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal,
if (obj && NS_SUCCEEDED(UNWRAP_OBJECT(IDBKeyRange, obj, keyRange))) {
MOZ_ASSERT(keyRange);
keyRange.forget(aKeyRange);
return NS_OK;
return;
}
// A valid key returns an 'only' IDBKeyRange.
keyRange = new IDBKeyRange(nullptr, false, false, true);
nsresult rv = GetKeyFromJSVal(aCx, aVal, keyRange->Lower());
if (NS_FAILED(rv)) {
return rv;
GetKeyFromJSVal(aCx, aVal, keyRange->Lower(), aRv);
if (!aRv.Failed()) {
keyRange.forget(aKeyRange);
}
keyRange.forget(aKeyRange);
return NS_OK;
}
// static
@ -276,7 +270,7 @@ void IDBKeyRange::GetUpper(JSContext* aCx, JS::MutableHandle<JS::Value> aResult,
bool IDBKeyRange::Includes(JSContext* aCx, JS::Handle<JS::Value> aValue,
ErrorResult& aRv) const {
Key key;
aRv = GetKeyFromJSVal(aCx, aValue, key);
GetKeyFromJSVal(aCx, aValue, key, aRv);
if (aRv.Failed()) {
return false;
}
@ -324,7 +318,7 @@ already_AddRefed<IDBKeyRange> IDBKeyRange::Only(const GlobalObject& aGlobal,
RefPtr<IDBKeyRange> keyRange =
new IDBKeyRange(aGlobal.GetAsSupports(), false, false, true);
aRv = GetKeyFromJSVal(aGlobal.Context(), aValue, keyRange->Lower());
GetKeyFromJSVal(aGlobal.Context(), aValue, keyRange->Lower(), aRv);
if (aRv.Failed()) {
return nullptr;
}
@ -339,7 +333,7 @@ already_AddRefed<IDBKeyRange> IDBKeyRange::LowerBound(
RefPtr<IDBKeyRange> keyRange =
new IDBKeyRange(aGlobal.GetAsSupports(), aOpen, true, false);
aRv = GetKeyFromJSVal(aGlobal.Context(), aValue, keyRange->Lower());
GetKeyFromJSVal(aGlobal.Context(), aValue, keyRange->Lower(), aRv);
if (aRv.Failed()) {
return nullptr;
}
@ -354,7 +348,7 @@ already_AddRefed<IDBKeyRange> IDBKeyRange::UpperBound(
RefPtr<IDBKeyRange> keyRange =
new IDBKeyRange(aGlobal.GetAsSupports(), true, aOpen, false);
aRv = GetKeyFromJSVal(aGlobal.Context(), aValue, keyRange->Upper());
GetKeyFromJSVal(aGlobal.Context(), aValue, keyRange->Upper(), aRv);
if (aRv.Failed()) {
return nullptr;
}
@ -372,12 +366,12 @@ already_AddRefed<IDBKeyRange> IDBKeyRange::Bound(const GlobalObject& aGlobal,
RefPtr<IDBKeyRange> keyRange =
new IDBKeyRange(aGlobal.GetAsSupports(), aLowerOpen, aUpperOpen, false);
aRv = GetKeyFromJSVal(aGlobal.Context(), aLower, keyRange->Lower());
GetKeyFromJSVal(aGlobal.Context(), aLower, keyRange->Lower(), aRv);
if (aRv.Failed()) {
return nullptr;
}
aRv = GetKeyFromJSVal(aGlobal.Context(), aUpper, keyRange->Upper());
GetKeyFromJSVal(aGlobal.Context(), aUpper, keyRange->Upper(), aRv);
if (aRv.Failed()) {
return nullptr;
}
@ -399,12 +393,12 @@ already_AddRefed<IDBLocaleAwareKeyRange> IDBLocaleAwareKeyRange::Bound(
RefPtr<IDBLocaleAwareKeyRange> keyRange = new IDBLocaleAwareKeyRange(
aGlobal.GetAsSupports(), aLowerOpen, aUpperOpen, false);
aRv = GetKeyFromJSVal(aGlobal.Context(), aLower, keyRange->Lower());
GetKeyFromJSVal(aGlobal.Context(), aLower, keyRange->Lower(), aRv);
if (aRv.Failed()) {
return nullptr;
}
aRv = GetKeyFromJSVal(aGlobal.Context(), aUpper, keyRange->Upper());
GetKeyFromJSVal(aGlobal.Context(), aUpper, keyRange->Upper(), aRv);
if (aRv.Failed()) {
return nullptr;
}

View File

@ -51,8 +51,8 @@ class IDBKeyRange : public nsISupports {
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(IDBKeyRange)
// aCx is allowed to be null, but only if aVal.isUndefined().
static nsresult FromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal,
IDBKeyRange** aKeyRange);
static void FromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal,
IDBKeyRange** aKeyRange, ErrorResult& aRv);
static already_AddRefed<IDBKeyRange> FromSerialized(
const indexedDB::SerializedKeyRange& aKeyRange);

View File

@ -923,68 +923,73 @@ already_AddRefed<IDBObjectStore> IDBObjectStore::Create(
}
// static
nsresult IDBObjectStore::AppendIndexUpdateInfo(
void IDBObjectStore::AppendIndexUpdateInfo(
int64_t aIndexID, const KeyPath& aKeyPath, bool aUnique, bool aMultiEntry,
const nsCString& aLocale, JSContext* aCx, JS::Handle<JS::Value> aVal,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray) {
nsresult rv;
nsTArray<IndexUpdateInfo>& aUpdateInfoArray, ErrorResult& aRv) {
const bool localeAware = !aLocale.IsEmpty();
if (!aMultiEntry) {
Key key;
rv = aKeyPath.ExtractKey(aCx, aVal, key);
aRv = aKeyPath.ExtractKey(aCx, aVal, key);
// If an index's keyPath doesn't match an object, we ignore that object.
if (rv == NS_ERROR_DOM_INDEXEDDB_DATA_ERR || key.IsUnset()) {
return NS_OK;
if (aRv.ErrorCodeIs(NS_ERROR_DOM_INDEXEDDB_DATA_ERR) || key.IsUnset()) {
aRv.SuppressException();
return;
}
if (NS_FAILED(rv)) {
return rv;
if (aRv.Failed()) {
return;
}
IndexUpdateInfo* updateInfo = aUpdateInfoArray.AppendElement();
updateInfo->indexId() = aIndexID;
updateInfo->value() = key;
if (localeAware) {
rv = key.ToLocaleBasedKey(updateInfo->localizedValue(), aLocale);
if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
aRv = key.ToLocaleBasedKey(updateInfo->localizedValue(), aLocale);
if (NS_WARN_IF(aRv.Failed())) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
return;
}
}
return NS_OK;
return;
}
JS::Rooted<JS::Value> val(aCx);
if (NS_FAILED(aKeyPath.ExtractKeyAsJSVal(aCx, aVal, val.address()))) {
return NS_OK;
return;
}
bool isArray;
if (!JS_IsArrayObject(aCx, val, &isArray)) {
IDB_REPORT_INTERNAL_ERR();
return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
return;
}
if (isArray) {
JS::Rooted<JSObject*> array(aCx, &val.toObject());
uint32_t arrayLength;
if (NS_WARN_IF(!JS_GetArrayLength(aCx, array, &arrayLength))) {
IDB_REPORT_INTERNAL_ERR();
return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
return;
}
for (uint32_t arrayIndex = 0; arrayIndex < arrayLength; arrayIndex++) {
JS::Rooted<JS::Value> arrayItem(aCx);
if (NS_WARN_IF(!JS_GetElement(aCx, array, arrayIndex, &arrayItem))) {
IDB_REPORT_INTERNAL_ERR();
return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
return;
}
Key value;
if (NS_FAILED(value.SetFromJSVal(aCx, arrayItem)) || value.IsUnset()) {
value.SetFromJSVal(aCx, arrayItem, aRv);
if (aRv.Failed() || value.IsUnset()) {
// Not a value we can do anything with, ignore it.
aRv.SuppressException();
continue;
}
@ -992,31 +997,33 @@ nsresult IDBObjectStore::AppendIndexUpdateInfo(
updateInfo->indexId() = aIndexID;
updateInfo->value() = value;
if (localeAware) {
rv = value.ToLocaleBasedKey(updateInfo->localizedValue(), aLocale);
if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
aRv = value.ToLocaleBasedKey(updateInfo->localizedValue(), aLocale);
if (NS_WARN_IF(aRv.Failed())) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
return;
}
}
}
} else {
Key value;
if (NS_FAILED(value.SetFromJSVal(aCx, val)) || value.IsUnset()) {
value.SetFromJSVal(aCx, val, aRv);
if (aRv.Failed() || value.IsUnset()) {
// Not a value we can do anything with, ignore it.
return NS_OK;
aRv.SuppressException();
return;
}
IndexUpdateInfo* updateInfo = aUpdateInfoArray.AppendElement();
updateInfo->indexId() = aIndexID;
updateInfo->value() = value;
if (localeAware) {
rv = value.ToLocaleBasedKey(updateInfo->localizedValue(), aLocale);
if (NS_WARN_IF(NS_FAILED(rv))) {
return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
aRv = value.ToLocaleBasedKey(updateInfo->localizedValue(), aLocale);
if (NS_WARN_IF(aRv.Failed())) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
return;
}
}
}
return NS_OK;
}
// static
@ -1134,7 +1141,7 @@ class DeserializeIndexValueHelper final : public Runnable {
mUpdateInfoArray(aUpdateInfoArray),
mStatus(NS_ERROR_FAILURE) {}
nsresult DispatchAndWait() {
void DispatchAndWait(ErrorResult& aRv) {
// We don't need to go to the main-thread and use the sandbox. Let's create
// the updateInfo data here.
if (!mCloneReadInfo.mData.Size()) {
@ -1144,9 +1151,10 @@ class DeserializeIndexValueHelper final : public Runnable {
JS::Rooted<JS::Value> value(jsapi.cx());
value.setUndefined();
return IDBObjectStore::AppendIndexUpdateInfo(
mIndexID, mKeyPath, mUnique, mMultiEntry, mLocale, jsapi.cx(), value,
mUpdateInfoArray);
IDBObjectStore::AppendIndexUpdateInfo(mIndexID, mKeyPath, mUnique,
mMultiEntry, mLocale, jsapi.cx(),
value, mUpdateInfoArray, aRv);
return;
}
// The operation will continue on the main-thread.
@ -1156,13 +1164,15 @@ class DeserializeIndexValueHelper final : public Runnable {
MonitorAutoLock lock(mMonitor);
RefPtr<Runnable> self = this;
nsresult rv = SystemGroup::Dispatch(TaskCategory::Other, self.forget());
const nsresult rv =
SystemGroup::Dispatch(TaskCategory::Other, self.forget());
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
aRv.Throw(rv);
return;
}
lock.Wait();
return mStatus;
aRv = mStatus;
}
NS_IMETHOD
@ -1182,17 +1192,18 @@ class DeserializeIndexValueHelper final : public Runnable {
JSAutoRealm ar(cx, global);
JS::Rooted<JS::Value> value(cx);
nsresult rv = DeserializeIndexValue(cx, &value);
const nsresult rv = DeserializeIndexValue(cx, &value);
if (NS_WARN_IF(NS_FAILED(rv))) {
OperationCompleted(rv);
return NS_OK;
}
rv = IDBObjectStore::AppendIndexUpdateInfo(mIndexID, mKeyPath, mUnique,
mMultiEntry, mLocale, cx, value,
mUpdateInfoArray);
if (NS_WARN_IF(NS_FAILED(rv))) {
OperationCompleted(rv);
ErrorResult errorResult;
IDBObjectStore::AppendIndexUpdateInfo(mIndexID, mKeyPath, mUnique,
mMultiEntry, mLocale, cx, value,
mUpdateInfoArray, errorResult);
if (NS_WARN_IF(errorResult.Failed())) {
OperationCompleted(errorResult.StealNSResult());
return NS_OK;
}
@ -1358,16 +1369,16 @@ class DeserializeUpgradeValueHelper final : public Runnable {
} // namespace
// static
nsresult IDBObjectStore::DeserializeIndexValueToUpdateInfos(
void IDBObjectStore::DeserializeIndexValueToUpdateInfos(
int64_t aIndexID, const KeyPath& aKeyPath, bool aUnique, bool aMultiEntry,
const nsCString& aLocale, StructuredCloneReadInfo& aCloneReadInfo,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray) {
nsTArray<IndexUpdateInfo>& aUpdateInfoArray, ErrorResult& aRv) {
MOZ_ASSERT(!NS_IsMainThread());
RefPtr<DeserializeIndexValueHelper> helper = new DeserializeIndexValueHelper(
aIndexID, aKeyPath, aUnique, aMultiEntry, aLocale, aCloneReadInfo,
aUpdateInfoArray);
return helper->DispatchAndWait();
helper->DispatchAndWait(aRv);
}
// static
@ -1389,47 +1400,51 @@ void IDBObjectStore::AssertIsOnOwningThread() const {
#endif // DEBUG
nsresult IDBObjectStore::GetAddInfo(
JSContext* aCx, ValueWrapper& aValueWrapper, JS::Handle<JS::Value> aKeyVal,
StructuredCloneWriteInfo& aCloneWriteInfo, Key& aKey,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray) {
void IDBObjectStore::GetAddInfo(JSContext* aCx, ValueWrapper& aValueWrapper,
JS::Handle<JS::Value> aKeyVal,
StructuredCloneWriteInfo& aCloneWriteInfo,
Key& aKey,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray,
ErrorResult& aRv) {
// Return DATA_ERR if a key was passed in and this objectStore uses inline
// keys.
if (!aKeyVal.isUndefined() && HasValidKeyPath()) {
return NS_ERROR_DOM_INDEXEDDB_DATA_ERR;
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
return;
}
bool isAutoIncrement = AutoIncrement();
nsresult rv;
if (!HasValidKeyPath()) {
// Out-of-line keys must be passed in.
rv = aKey.SetFromJSVal(aCx, aKeyVal);
if (NS_FAILED(rv)) {
return rv;
aKey.SetFromJSVal(aCx, aKeyVal, aRv);
if (aRv.Failed()) {
return;
}
} else if (!isAutoIncrement) {
if (!aValueWrapper.Clone(aCx)) {
return NS_ERROR_DOM_DATA_CLONE_ERR;
aRv.Throw(NS_ERROR_DOM_DATA_CLONE_ERR);
return;
}
rv = GetKeyPath().ExtractKey(aCx, aValueWrapper.Value(), aKey);
if (NS_FAILED(rv)) {
return rv;
aRv = GetKeyPath().ExtractKey(aCx, aValueWrapper.Value(), aKey);
if (aRv.Failed()) {
return;
}
}
// Return DATA_ERR if no key was specified this isn't an autoIncrement
// objectStore.
if (aKey.IsUnset() && !isAutoIncrement) {
return NS_ERROR_DOM_INDEXEDDB_DATA_ERR;
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
return;
}
// Figure out indexes and the index values to update here.
if (mSpec->indexes().Length() && !aValueWrapper.Clone(aCx)) {
return NS_ERROR_DOM_DATA_CLONE_ERR;
aRv.Throw(NS_ERROR_DOM_DATA_CLONE_ERR);
return;
}
{
@ -1441,34 +1456,33 @@ nsresult IDBObjectStore::GetAddInfo(
for (uint32_t idxIndex = 0; idxIndex < idxCount; idxIndex++) {
const IndexMetadata& metadata = indexes[idxIndex];
rv = AppendIndexUpdateInfo(metadata.id(), metadata.keyPath(),
metadata.unique(), metadata.multiEntry(),
metadata.locale(), aCx, aValueWrapper.Value(),
aUpdateInfoArray);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
AppendIndexUpdateInfo(metadata.id(), metadata.keyPath(),
metadata.unique(), metadata.multiEntry(),
metadata.locale(), aCx, aValueWrapper.Value(),
aUpdateInfoArray, aRv);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
}
}
if (isAutoIncrement && HasValidKeyPath()) {
if (!aValueWrapper.Clone(aCx)) {
return NS_ERROR_DOM_DATA_CLONE_ERR;
aRv.Throw(NS_ERROR_DOM_DATA_CLONE_ERR);
return;
}
GetAddInfoClosure data(aCloneWriteInfo, aValueWrapper.Value());
MOZ_ASSERT(aKey.IsUnset());
rv = GetKeyPath().ExtractOrCreateKey(aCx, aValueWrapper.Value(), aKey,
&GetAddInfoCallback, &data);
aRv = GetKeyPath().ExtractOrCreateKey(aCx, aValueWrapper.Value(), aKey,
&GetAddInfoCallback, &data);
} else {
GetAddInfoClosure data(aCloneWriteInfo, aValueWrapper.Value());
rv = GetAddInfoCallback(aCx, &data);
aRv = GetAddInfoCallback(aCx, &data);
}
return rv;
}
already_AddRefed<IDBRequest> IDBObjectStore::AddOrPut(
@ -1497,7 +1511,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::AddOrPut(
StructuredCloneWriteInfo cloneWriteInfo(mTransaction->Database());
nsTArray<IndexUpdateInfo> updateInfo;
aRv = GetAddInfo(aCx, aValueWrapper, aKey, cloneWriteInfo, key, updateInfo);
GetAddInfo(aCx, aValueWrapper, aKey, cloneWriteInfo, key, updateInfo, aRv);
if (aRv.Failed()) {
return nullptr;
}
@ -1682,7 +1696,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::GetAllInternal(
}
RefPtr<IDBKeyRange> keyRange;
aRv = IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange));
IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
@ -1929,7 +1943,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::GetInternal(
}
RefPtr<IDBKeyRange> keyRange;
aRv = IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange));
IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange), aRv);
if (aRv.Failed()) {
return nullptr;
}
@ -1991,7 +2005,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::DeleteInternal(
}
RefPtr<IDBKeyRange> keyRange;
aRv = IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange));
IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange), aRv);
if (NS_WARN_IF((aRv.Failed()))) {
return nullptr;
}
@ -2218,7 +2232,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::Count(JSContext* aCx,
}
RefPtr<IDBKeyRange> keyRange;
aRv = IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange));
IDBKeyRange::FromJSVal(aCx, aKey, getter_AddRefs(keyRange), aRv);
if (aRv.Failed()) {
return nullptr;
}
@ -2267,7 +2281,7 @@ already_AddRefed<IDBRequest> IDBObjectStore::OpenCursorInternal(
}
RefPtr<IDBKeyRange> keyRange;
aRv = IDBKeyRange::FromJSVal(aCx, aRange, getter_AddRefs(keyRange));
IDBKeyRange::FromJSVal(aCx, aRange, getter_AddRefs(keyRange), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}

View File

@ -94,15 +94,17 @@ class IDBObjectStore final : public nsISupports, public nsWrapperCache {
static already_AddRefed<IDBObjectStore> Create(IDBTransaction* aTransaction,
const ObjectStoreSpec& aSpec);
static nsresult AppendIndexUpdateInfo(
int64_t aIndexID, const KeyPath& aKeyPath, bool aUnique, bool aMultiEntry,
const nsCString& aLocale, JSContext* aCx, JS::Handle<JS::Value> aObject,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray);
static void AppendIndexUpdateInfo(int64_t aIndexID, const KeyPath& aKeyPath,
bool aUnique, bool aMultiEntry,
const nsCString& aLocale, JSContext* aCx,
JS::Handle<JS::Value> aVal,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray,
ErrorResult& aRv);
static nsresult DeserializeIndexValueToUpdateInfos(
static void DeserializeIndexValueToUpdateInfos(
int64_t aIndexID, const KeyPath& aKeyPath, bool aUnique, bool aMultiEntry,
const nsCString& aLocale, StructuredCloneReadInfo& aCloneInfo,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray);
const nsCString& aLocale, StructuredCloneReadInfo& aCloneReadInfo,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray, ErrorResult& aRv);
static void ClearCloneReadInfo(StructuredCloneReadInfo& aReadInfo);
@ -287,10 +289,11 @@ class IDBObjectStore final : public nsISupports, public nsWrapperCache {
~IDBObjectStore();
nsresult GetAddInfo(JSContext* aCx, ValueWrapper& aValueWrapper,
JS::Handle<JS::Value> aKeyVal,
StructuredCloneWriteInfo& aCloneWriteInfo, Key& aKey,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray);
void GetAddInfo(JSContext* aCx, ValueWrapper& aValueWrapper,
JS::Handle<JS::Value> aKeyVal,
StructuredCloneWriteInfo& aCloneWriteInfo, Key& aKey,
nsTArray<IndexUpdateInfo>& aUpdateInfoArray,
ErrorResult& aRv);
already_AddRefed<IDBRequest> AddOrPut(JSContext* aCx,
ValueWrapper& aValueWrapper,

View File

@ -760,22 +760,21 @@ nsresult Key::SetFromValueArray(mozIStorageValueArray* aValues,
return SetFromSource(aValues, aIndex);
}
nsresult Key::SetFromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal) {
void Key::SetFromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal,
ErrorResult& aRv) {
mBuffer.Truncate();
if (aVal.isNull() || aVal.isUndefined()) {
Unset();
return NS_OK;
return;
}
nsresult rv = EncodeJSVal(aCx, aVal, 0);
if (NS_FAILED(rv)) {
aRv = EncodeJSVal(aCx, aVal, 0);
if (aRv.Failed()) {
Unset();
return rv;
return;
}
TrimBuffer();
return NS_OK;
}
nsresult Key::ToJSVal(JSContext* aCx, JS::MutableHandle<JS::Value> aVal) const {

View File

@ -21,6 +21,9 @@ struct ParamTraits;
} // namespace IPC
namespace mozilla {
class ErrorResult;
namespace dom {
namespace indexedDB {
@ -142,7 +145,8 @@ class Key {
TrimBuffer();
}
nsresult SetFromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal);
void SetFromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal,
ErrorResult& aRv);
nsresult ToJSVal(JSContext* aCx, JS::MutableHandle<JS::Value> aVal) const;