Bug 1644379 - Extract extraction of ErrorResult from IDBResult into a function. r=dom-workers-and-storage-reviewers,asuth

Differential Revision: https://phabricator.services.mozilla.com/D78708
This commit is contained in:
Simon Giesecke 2020-06-30 10:01:20 +00:00
Родитель 5e5ea484e9
Коммит d27dc7b783
5 изменённых файлов: 36 добавлений и 49 удалений

Просмотреть файл

@ -348,11 +348,8 @@ void IDBTypedCursor<CursorType>::Continue(JSContext* const aCx,
Key key;
auto result = key.SetFromJSVal(aCx, aKey);
if (!result.Is(Ok)) {
if (result.Is(Invalid)) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
} else {
aRv = std::move(result.AsException());
}
aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_DATA_ERR>);
return;
}
@ -362,11 +359,8 @@ void IDBTypedCursor<CursorType>::Continue(JSContext* const aCx,
result = key.ToLocaleAwareKey(tmp, GetSourceRef().Locale());
if (!result.Is(Ok)) {
if (result.Is(Invalid)) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
} else {
aRv = std::move(result.AsException());
}
aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_DATA_ERR>);
return;
}
key = tmp;
@ -457,11 +451,8 @@ void IDBTypedCursor<CursorType>::ContinuePrimaryKey(
Key key;
auto result = key.SetFromJSVal(aCx, aKey);
if (!result.Is(Ok)) {
if (result.Is(Invalid)) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
} else {
aRv = std::move(result.AsException());
}
aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_DATA_ERR>);
return;
}
@ -469,11 +460,8 @@ void IDBTypedCursor<CursorType>::ContinuePrimaryKey(
Key tmp;
result = key.ToLocaleAwareKey(tmp, GetSourceRef().Locale());
if (!result.Is(Ok)) {
if (result.Is(Invalid)) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
} else {
aRv = std::move(result.AsException());
}
aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_DATA_ERR>);
return;
}
key = tmp;
@ -487,11 +475,8 @@ void IDBTypedCursor<CursorType>::ContinuePrimaryKey(
Key primaryKey;
result = primaryKey.SetFromJSVal(aCx, aPrimaryKey);
if (!result.Is(Ok)) {
if (result.Is(Invalid)) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
} else {
aRv = std::move(result.AsException());
}
aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_DATA_ERR>);
return;
}

Просмотреть файл

@ -446,21 +446,15 @@ int16_t IDBFactory::Cmp(JSContext* aCx, JS::Handle<JS::Value> aFirst,
Key first, second;
auto result = first.SetFromJSVal(aCx, aFirst);
if (!result.Is(Ok)) {
if (result.Is(Invalid)) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
} else {
aRv = std::move(result.AsException());
}
aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_DATA_ERR>);
return 0;
}
result = second.SetFromJSVal(aCx, aSecond);
if (!result.Is(Ok)) {
if (result.Is(Invalid)) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
} else {
aRv = std::move(result.AsException());
}
aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_DATA_ERR>);
return 0;
}

Просмотреть файл

@ -23,11 +23,8 @@ void GetKeyFromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal, Key& aKey,
ErrorResult& aRv) {
auto result = aKey.SetFromJSVal(aCx, aVal);
if (!result.Is(Ok)) {
if (result.Is(Invalid)) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
} else {
aRv = std::move(result.AsException());
}
aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_DATA_ERR>);
return;
}

Просмотреть файл

@ -67,10 +67,9 @@ IndexUpdateInfo MakeIndexUpdateInfo(const int64_t aIndexID, const Key& aKey,
if (!aLocale.IsEmpty()) {
auto result =
aKey.ToLocaleAwareKey(indexUpdateInfo.localizedValue(), aLocale);
if (result.Is(Invalid)) {
aRv->Throw(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
} else if (result.Is(indexedDB::Exception)) {
*aRv = std::move(result.AsException());
if (!result.Is(Ok)) {
*aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR>);
}
}
return indexUpdateInfo;
@ -675,11 +674,8 @@ void IDBObjectStore::GetAddInfo(JSContext* aCx, ValueWrapper& aValueWrapper,
// Out-of-line keys must be passed in.
auto result = aKey.SetFromJSVal(aCx, aKeyVal);
if (!result.Is(Ok)) {
if (result.Is(Invalid)) {
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_DATA_ERR);
} else {
aRv = std::move(result.AsException());
}
aRv = result.ExtractErrorResult(
InvalidMapsTo<NS_ERROR_DOM_INDEXEDDB_DATA_ERR>);
return;
}
} else if (!isAutoIncrement) {

Просмотреть файл

@ -125,6 +125,16 @@ class IDBResultBase {
ErrorResult& AsException() { return mVariant.template as<ErrorResult>(); }
template <typename... SpecialValueMappers>
ErrorResult ExtractErrorResult(SpecialValueMappers... aSpecialValueMappers) {
return mVariant.match(
[](const ValueType&) -> ErrorResult {
MOZ_CRASH("non-value expected");
},
[](ErrorResult& aException) { return std::move(aException); },
aSpecialValueMappers...);
}
protected:
using VariantType = Variant<ValueType, ErrorResult, SpecialConstant<S>...>;
@ -158,6 +168,11 @@ class MOZ_MUST_USE_TYPE IDBResult<void, S...>
using IDBResult::IDBResultBase::IDBResultBase;
};
template <nsresult E>
ErrorResult InvalidMapsTo(const indexedDB::detail::InvalidType&) {
return ErrorResult{E};
}
} // namespace indexedDB
} // namespace dom
} // namespace mozilla