mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
8471eabd7f
commit
6e39f30075
@ -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()) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user