Bug 1030973 - DataStoreService should listen for versionchange events. r=janv

This commit is contained in:
Andrea Marchesini 2014-06-26 14:09:00 +02:00
parent 25c5907a27
commit 02bcc35528
2 changed files with 63 additions and 8 deletions

View File

@ -10,6 +10,7 @@
#include "mozilla/dom/IDBDatabaseBinding.h"
#include "mozilla/dom/IDBFactoryBinding.h"
#include "mozilla/dom/indexedDB/IDBDatabase.h"
#include "mozilla/dom/indexedDB/IDBEvents.h"
#include "mozilla/dom/indexedDB/IDBFactory.h"
#include "mozilla/dom/indexedDB/IDBIndex.h"
#include "mozilla/dom/indexedDB/IDBObjectStore.h"
@ -25,13 +26,59 @@ using namespace mozilla::dom::indexedDB;
namespace mozilla {
namespace dom {
class VersionChangeListener MOZ_FINAL : public nsIDOMEventListener
{
public:
NS_DECL_ISUPPORTS
VersionChangeListener(IDBDatabase* aDatabase)
: mDatabase(aDatabase)
{}
// nsIDOMEventListener
NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent)
{
nsString type;
nsresult rv = aEvent->GetType(type);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
if (!type.EqualsASCII("versionchange")) {
MOZ_ASSUME_UNREACHABLE("This should not happen");
return NS_ERROR_FAILURE;
}
rv = mDatabase->RemoveEventListener(NS_LITERAL_STRING("versionchange"),
this, false);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
#ifdef DEBUG
nsCOMPtr<IDBVersionChangeEvent> event = do_QueryInterface(aEvent);
MOZ_ASSERT(event);
Nullable<uint64_t> version = event->GetNewVersion();
MOZ_ASSERT(version.IsNull());
#endif
return mDatabase->Close();
}
private:
IDBDatabase* mDatabase;
};
NS_IMPL_ISUPPORTS(VersionChangeListener, nsIDOMEventListener)
NS_IMPL_ISUPPORTS(DataStoreDB, nsIDOMEventListener)
DataStoreDB::DataStoreDB(const nsAString& aManifestURL, const nsAString& aName)
: mState(Inactive)
{
mDatabaseName.Assign(aName);
mDatabaseName.AppendASCII("|");
mDatabaseName.Append('|');
mDatabaseName.Append(aManifestURL);
}
@ -204,6 +251,14 @@ DataStoreDB::DatabaseOpened()
return rv;
}
nsRefPtr<VersionChangeListener> listener =
new VersionChangeListener(mDatabase);
rv = mDatabase->EventTarget::AddEventListener(
NS_LITERAL_STRING("versionchange"), listener, false);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsRefPtr<IDBTransaction> txn = mDatabase->Transaction(mObjectStores,
mTransactionMode,
error);

View File

@ -199,9 +199,9 @@ GeneratePermissionName(nsAString& aPermission,
const nsAString& aName,
const nsAString& aManifestURL)
{
aPermission.AssignASCII("indexedDB-chrome-");
aPermission.AssignLiteral("indexedDB-chrome-");
aPermission.Append(aName);
aPermission.AppendASCII("|");
aPermission.Append('|');
aPermission.Append(aManifestURL);
}
@ -252,7 +252,7 @@ ResetPermission(uint32_t aAppId, const nsAString& aOriginURL,
{
nsCString permission;
permission.Append(basePermission);
permission.AppendASCII("-write");
permission.AppendLiteral("-write");
uint32_t perm = nsIPermissionManager::UNKNOWN_ACTION;
rv = pm->TestExactPermissionFromPrincipal(principal, permission.get(),
@ -279,7 +279,7 @@ ResetPermission(uint32_t aAppId, const nsAString& aOriginURL,
{
nsCString permission;
permission.Append(basePermission);
permission.AppendASCII("-read");
permission.AppendLiteral("-read");
uint32_t perm = nsIPermissionManager::UNKNOWN_ACTION;
rv = pm->TestExactPermissionFromPrincipal(principal, permission.get(),
@ -616,9 +616,9 @@ public:
new RevisionAddedEnableStoreCallback(mAppId, mName, mManifestURL);
// If the revision doesn't exist, let's create it.
nsRefPtr<DataStoreRevision> mRevision = new DataStoreRevision();
return mRevision->AddRevision(cx, store, 0, DataStoreRevision::RevisionVoid,
callback);
nsRefPtr<DataStoreRevision> revision = new DataStoreRevision();
return revision->AddRevision(cx, store, 0, DataStoreRevision::RevisionVoid,
callback);
}
private: