2014-06-03 18:36:46 +04:00
|
|
|
/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
|
|
|
|
/* vim: set ts=2 et sw=2 tw=80: */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#include "DataStoreRevision.h"
|
|
|
|
|
|
|
|
#include "DataStoreCallbacks.h"
|
|
|
|
#include "DataStoreService.h"
|
|
|
|
#include "mozilla/dom/DataStoreBinding.h"
|
2014-06-11 23:38:55 +04:00
|
|
|
#include "mozilla/dom/ToJSValue.h"
|
2014-09-13 20:12:19 +04:00
|
|
|
#include "mozilla/dom/indexedDB/IDBObjectStore.h"
|
|
|
|
#include "mozilla/dom/indexedDB/IDBRequest.h"
|
2014-06-03 18:36:46 +04:00
|
|
|
#include "nsIDOMEvent.h"
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace dom {
|
|
|
|
|
|
|
|
using namespace indexedDB;
|
|
|
|
|
|
|
|
NS_IMPL_ISUPPORTS(DataStoreRevision, nsIDOMEventListener)
|
|
|
|
|
|
|
|
// Note: this code in it must not assume anything about the compartment cx is
|
|
|
|
// in.
|
|
|
|
nsresult
|
|
|
|
DataStoreRevision::AddRevision(JSContext* aCx,
|
|
|
|
IDBObjectStore* aStore,
|
|
|
|
uint32_t aObjectId,
|
|
|
|
RevisionType aRevisionType,
|
|
|
|
DataStoreRevisionCallback* aCallback)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(aStore);
|
|
|
|
MOZ_ASSERT(aCallback);
|
|
|
|
|
|
|
|
nsRefPtr<DataStoreService> service = DataStoreService::Get();
|
|
|
|
if (!service) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsString id;
|
|
|
|
nsresult rv = service->GenerateUUID(mRevisionID);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
DataStoreRevisionData data;
|
|
|
|
data.mRevisionId = mRevisionID;
|
|
|
|
data.mObjectId = aObjectId;
|
|
|
|
|
|
|
|
switch (aRevisionType) {
|
|
|
|
case RevisionVoid:
|
|
|
|
data.mOperation = NS_LITERAL_STRING("void");
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2014-06-21 09:42:45 +04:00
|
|
|
MOZ_CRASH("This should not happen");
|
2014-06-03 18:36:46 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
JS::Rooted<JS::Value> value(aCx);
|
2014-06-11 23:38:55 +04:00
|
|
|
if (!ToJSValue(aCx, data, &value)) {
|
2014-06-03 18:36:46 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
ErrorResult error;
|
|
|
|
mRequest = aStore->Put(aCx, value, JS::UndefinedHandleValue, error);
|
|
|
|
if (NS_WARN_IF(error.Failed())) {
|
|
|
|
return error.ErrorCode();
|
|
|
|
}
|
|
|
|
|
|
|
|
rv = mRequest->EventTarget::AddEventListener(NS_LITERAL_STRING("success"),
|
|
|
|
this, false);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
mCallback = aCallback;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
DataStoreRevision::HandleEvent(nsIDOMEvent* aEvent)
|
|
|
|
{
|
|
|
|
nsString type;
|
|
|
|
nsresult rv = aEvent->GetType(type);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!type.EqualsASCII("success")) {
|
2014-06-21 09:42:45 +04:00
|
|
|
MOZ_CRASH("This should not happen");
|
2014-06-03 18:36:46 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
mRequest->RemoveEventListener(NS_LITERAL_STRING("success"), this, false);
|
|
|
|
mRequest = nullptr;
|
|
|
|
|
|
|
|
mCallback->Run(mRevisionID);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // dom namespace
|
|
|
|
} // mozilla namespace
|