Backout 8886b027527a (bug 718132) for xpcshell failures

This commit is contained in:
Ed Morley 2012-01-23 16:18:14 +00:00
parent 76f009f4a9
commit 25bb1feaa8
22 changed files with 400 additions and 504 deletions

View File

@ -5436,9 +5436,8 @@ public:
}
NS_IMETHOD_(void) NoteScriptChild(PRUint32 langID, void* child)
{
if (langID == nsIProgrammingLanguage::JAVASCRIPT &&
child == mWrapper) {
mFound = true;
if (langID == nsIProgrammingLanguage::JAVASCRIPT) {
mFound = child == mWrapper;
}
}
NS_IMETHOD_(void) NoteXPCOMChild(nsISupports *child)

View File

@ -490,7 +490,6 @@
#include "DOMSVGPointList.h"
#include "DOMSVGTransformList.h"
#include "mozilla/dom/indexedDB/IDBWrapperCache.h"
#include "mozilla/dom/indexedDB/IDBFactory.h"
#include "mozilla/dom/indexedDB/IDBRequest.h"
#include "mozilla/dom/indexedDB/IDBDatabase.h"
@ -502,8 +501,6 @@
#include "mozilla/dom/indexedDB/IDBIndex.h"
#include "nsIIDBDatabaseException.h"
using mozilla::dom::indexedDB::IDBWrapperCache;
#include "nsIDOMMediaQueryList.h"
#include "nsDOMTouchEvent.h"
@ -596,10 +593,6 @@ static const char kDOMStringBundleURL[] =
(DOM_DEFAULT_SCRIPTABLE_FLAGS | \
nsIXPCScriptable::WANT_ADDPROPERTY)
#define IDBEVENTTARGET_SCRIPTABLE_FLAGS \
(EVENTTARGET_SCRIPTABLE_FLAGS | \
nsIXPCScriptable::WANT_POSTCREATE)
#define DOMCLASSINFO_STANDARD_FLAGS \
(nsIClassInfo::MAIN_THREAD_ONLY | nsIClassInfo::DOM_OBJECT)
@ -661,37 +654,6 @@ DOMCI_DATA(DOMConstructor, void)
NS_DEFINE_CHROME_ONLY_CLASSINFO_DATA_WITH_NAME(_class, _class, _helper, \
_flags)
namespace {
class IDBEventTargetSH : public nsEventTargetSH
{
protected:
IDBEventTargetSH(nsDOMClassInfoData* aData) : nsEventTargetSH(aData)
{ }
virtual ~IDBEventTargetSH()
{ }
public:
NS_IMETHOD PreCreate(nsISupports *aNativeObj, JSContext *aCx,
JSObject *aGlobalObj, JSObject **aParentObj);
NS_IMETHOD PostCreate(nsIXPConnectWrappedNative *aQrapper, JSContext *aCx,
JSObject *aObj);
NS_IMETHOD AddProperty(nsIXPConnectWrappedNative *aWrapper, JSContext *aCx,
JSObject *aObj, jsid aId, jsval *aVp, bool *aRetval);
virtual void PreserveWrapper(nsISupports *aNative);
static nsIClassInfo *doCreate(nsDOMClassInfoData *aData)
{
return new IDBEventTargetSH(aData);
}
};
} // anonymous namespace
// This list of NS_DEFINE_CLASSINFO_DATA macros is what gives the DOM
// classes their correct behavior when used through XPConnect. The
// arguments that are passed to NS_DEFINE_CLASSINFO_DATA are
@ -1575,14 +1537,14 @@ static nsDOMClassInfoData sClassInfoData[] = {
NS_DEFINE_CLASSINFO_DATA(IDBFactory, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBRequest, IDBEventTargetSH,
IDBEVENTTARGET_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBDatabase, IDBEventTargetSH,
IDBEVENTTARGET_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBRequest, nsEventTargetSH,
EVENTTARGET_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBDatabase, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBObjectStore, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBTransaction, IDBEventTargetSH,
IDBEVENTTARGET_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBTransaction, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBCursor, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBCursorWithValue, nsDOMGenericSH,
@ -1593,8 +1555,8 @@ static nsDOMClassInfoData sClassInfoData[] = {
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBVersionChangeEvent, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBOpenDBRequest, IDBEventTargetSH,
IDBEVENTTARGET_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBOpenDBRequest, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(IDBDatabaseException, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
@ -7650,46 +7612,6 @@ nsEventTargetSH::PreserveWrapper(nsISupports *aNative)
nsContentUtils::PreserveWrapper(aNative, target);
}
// IDBEventTarget helper
NS_IMETHODIMP
IDBEventTargetSH::PreCreate(nsISupports *aNativeObj, JSContext *aCx,
JSObject *aGlobalObj, JSObject **aParentObj)
{
IDBWrapperCache *target = IDBWrapperCache::FromSupports(aNativeObj);
JSObject *parent = target->GetParentObject();
*aParentObj = parent ? parent : aGlobalObj;
return NS_OK;
}
NS_IMETHODIMP
IDBEventTargetSH::PostCreate(nsIXPConnectWrappedNative *aWrapper,
JSContext *aCx, JSObject *aObj)
{
IDBWrapperCache *target = IDBWrapperCache::FromSupports(aWrapper->Native());
target->OnWrapperCreated();
return NS_OK;
}
NS_IMETHODIMP
IDBEventTargetSH::AddProperty(nsIXPConnectWrappedNative *aWrapper,
JSContext *aCx, JSObject *aObj, jsid aId,
jsval *aVp, bool *aRetval)
{
if (aId == sAddEventListener_id) {
return nsEventTargetSH::AddProperty(aWrapper, aCx, aObj, aId, aVp, aRetval);
}
IDBEventTargetSH::PreserveWrapper(GetNative(aWrapper, aObj));
return NS_OK;
}
void
IDBEventTargetSH::PreserveWrapper(nsISupports *aNative)
{
IDBWrapperCache *target = IDBWrapperCache::FromSupports(aNative);
nsContentUtils::PreserveWrapper(aNative, target);
}
// Element helper

View File

@ -146,11 +146,18 @@ HelperBase::WrapNative(JSContext* aCx,
NS_ASSERTION(aResult, "Null pointer!");
NS_ASSERTION(mRequest, "Null request!");
JSObject* global = mRequest->GetParentObject();
NS_ASSERTION(global, "This should never be null!");
JSObject* obj;
if (mRequest->ScriptContext()) {
obj = mRequest->ScriptContext()->GetNativeGlobal();
}
else {
obj = mRequest->GetWrapper();
}
NS_ENSURE_TRUE(obj, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
nsresult rv =
nsContentUtils::WrapNative(aCx, global, aNative, aResult);
nsContentUtils::WrapNative(aCx, obj, aNative, aResult);
NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
return NS_OK;
@ -281,7 +288,7 @@ AsyncConnectionHelper::Run()
if (NS_SUCCEEDED(rv)) {
bool hasSavepoint = false;
if (mDatabase) {
IndexedDatabaseManager::SetCurrentWindow(mDatabase->GetOwner());
IndexedDatabaseManager::SetCurrentWindow(mDatabase->Owner());
// Make the first savepoint.
if (mTransaction) {

View File

@ -64,7 +64,8 @@ GenerateRequest(IDBCursor* aCursor)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
IDBDatabase* database = aCursor->Transaction()->Database();
return IDBRequest::Create(aCursor, database, aCursor->Transaction());
return IDBRequest::Create(aCursor, database->ScriptContext(),
database->Owner(), aCursor->Transaction());
}
} // anonymous namespace
@ -261,14 +262,11 @@ IDBCursor::CreateCommon(IDBRequest* aRequest,
nsRefPtr<IDBCursor> cursor = new IDBCursor();
IDBDatabase* database = aTransaction->Database();
cursor->mScriptContext = database->GetScriptContext();
cursor->mOwner = database->GetOwner();
cursor->mScriptOwner = database->GetScriptOwner();
cursor->mRequest = aRequest;
cursor->mTransaction = aTransaction;
cursor->mObjectStore = aObjectStore;
cursor->mScriptContext = aTransaction->Database()->ScriptContext();
cursor->mOwner = aTransaction->Database()->Owner();
cursor->mDirection = aDirection;
cursor->mContinueQuery = aContinueQuery;
cursor->mContinueToQuery = aContinueToQuery;
@ -278,8 +276,7 @@ IDBCursor::CreateCommon(IDBRequest* aRequest,
}
IDBCursor::IDBCursor()
: mScriptOwner(nsnull),
mType(OBJECTSTORE),
: mType(OBJECTSTORE),
mDirection(nsIIDBCursor::NEXT),
mCachedKey(JSVAL_VOID),
mCachedPrimaryKey(JSVAL_VOID),
@ -380,10 +377,6 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(IDBCursor)
"Should have a cached primary key");
NS_ASSERTION(tmp->mHaveCachedValue || JSVAL_IS_VOID(tmp->mCachedValue),
"Should have a cached value");
if (tmp->mScriptOwner) {
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(tmp->mScriptOwner,
"mScriptOwner")
}
if (JSVAL_IS_GCTHING(tmp->mCachedKey)) {
void *gcThing = JSVAL_TO_GCTHING(tmp->mCachedKey);
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(gcThing, "mCachedKey")
@ -402,7 +395,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(IDBCursor)
// Don't unlink mObjectStore, mIndex, or mTransaction!
if (tmp->mRooted) {
NS_DROP_JS_OBJECTS(tmp, IDBCursor);
tmp->mScriptOwner = nsnull;
tmp->mCachedKey = JSVAL_VOID;
tmp->mCachedPrimaryKey = JSVAL_VOID;
tmp->mCachedValue = JSVAL_VOID;

View File

@ -154,7 +154,6 @@ protected:
nsCOMPtr<nsIScriptContext> mScriptContext;
nsCOMPtr<nsPIDOMWindow> mOwner;
JSObject* mScriptOwner;
Type mType;
PRUint16 mDirection;

View File

@ -148,7 +148,8 @@ private:
// static
already_AddRefed<IDBDatabase>
IDBDatabase::Create(IDBWrapperCache* aOwnerCache,
IDBDatabase::Create(nsIScriptContext* aScriptContext,
nsPIDOMWindow* aOwner,
already_AddRefed<DatabaseInfo> aDatabaseInfo,
const nsACString& aASCIIOrigin,
FileManager* aFileManager)
@ -161,9 +162,8 @@ IDBDatabase::Create(IDBWrapperCache* aOwnerCache,
nsRefPtr<IDBDatabase> db(new IDBDatabase());
db->mScriptContext = aOwnerCache->GetScriptContext();
db->mOwner = aOwnerCache->GetOwner();
db->mScriptOwner = aOwnerCache->GetScriptOwner();
db->mScriptContext = aScriptContext;
db->mOwner = aOwner;
db->mDatabaseId = databaseInfo->id;
db->mName = databaseInfo->name;
@ -205,8 +205,6 @@ IDBDatabase::~IDBDatabase()
mgr->UnregisterDatabase(this);
}
}
nsContentUtils::ReleaseWrapper(static_cast<nsIDOMEventTarget*>(this), this);
}
void
@ -220,7 +218,7 @@ IDBDatabase::Invalidate()
// When the IndexedDatabaseManager needs to invalidate databases, all it has
// is an origin, so we call back into the manager to cancel any prompts for
// our owner.
IndexedDatabaseManager::CancelPromptsForWindow(GetOwner());
IndexedDatabaseManager::CancelPromptsForWindow(Owner());
mInvalidated = true;
}
@ -282,8 +280,7 @@ void
IDBDatabase::OnUnlink()
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
NS_ASSERTION(!GetOwner() && !GetScriptOwner(),
"Should have been cleared already!");
NS_ASSERTION(!mOwner, "Should have been cleared already!");
// We've been unlinked, at the very least we should be able to prevent further
// transactions from starting and unblock any other SetVersion callers.
@ -301,16 +298,18 @@ IDBDatabase::OnUnlink()
NS_IMPL_CYCLE_COLLECTION_CLASS(IDBDatabase)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBDatabase, IDBWrapperCache)
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(abort)
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(error)
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(versionchange)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBDatabase,
nsDOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnAbortListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnErrorListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnVersionChangeListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBDatabase, IDBWrapperCache)
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(abort)
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(error)
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(versionchange)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBDatabase,
nsDOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnAbortListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnErrorListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnVersionChangeListener)
// Do some cleanup.
tmp->OnUnlink();
@ -319,17 +318,13 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IDBDatabase)
NS_INTERFACE_MAP_ENTRY(nsIIDBDatabase)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(IDBDatabase)
NS_INTERFACE_MAP_END_INHERITING(IDBWrapperCache)
NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
NS_IMPL_ADDREF_INHERITED(IDBDatabase, IDBWrapperCache)
NS_IMPL_RELEASE_INHERITED(IDBDatabase, IDBWrapperCache)
NS_IMPL_ADDREF_INHERITED(IDBDatabase, nsDOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(IDBDatabase, nsDOMEventTargetHelper)
DOMCI_DATA(IDBDatabase, IDBDatabase)
NS_IMPL_EVENT_HANDLER(IDBDatabase, abort);
NS_IMPL_EVENT_HANDLER(IDBDatabase, error);
NS_IMPL_EVENT_HANDLER(IDBDatabase, versionchange);
NS_IMETHODIMP
IDBDatabase::GetName(nsAString& aName)
{
@ -673,6 +668,47 @@ IDBDatabase::Close()
return NS_OK;
}
NS_IMETHODIMP
IDBDatabase::SetOnabort(nsIDOMEventListener* aAbortListener)
{
return RemoveAddEventListener(NS_LITERAL_STRING(ABORT_EVT_STR),
mOnAbortListener, aAbortListener);
}
NS_IMETHODIMP
IDBDatabase::GetOnabort(nsIDOMEventListener** aAbortListener)
{
return GetInnerEventListener(mOnAbortListener, aAbortListener);
}
NS_IMETHODIMP
IDBDatabase::SetOnerror(nsIDOMEventListener* aErrorListener)
{
return RemoveAddEventListener(NS_LITERAL_STRING(ERROR_EVT_STR),
mOnErrorListener, aErrorListener);
}
NS_IMETHODIMP
IDBDatabase::GetOnerror(nsIDOMEventListener** aErrorListener)
{
return GetInnerEventListener(mOnErrorListener, aErrorListener);
}
NS_IMETHODIMP
IDBDatabase::SetOnversionchange(nsIDOMEventListener* aVersionChangeListener)
{
return RemoveAddEventListener(NS_LITERAL_STRING(VERSIONCHANGE_EVT_STR),
mOnVersionChangeListener,
aVersionChangeListener);
}
NS_IMETHODIMP
IDBDatabase::GetOnversionchange(nsIDOMEventListener** aVersionChangeListener)
{
return GetInnerEventListener(mOnVersionChangeListener,
aVersionChangeListener);
}
nsresult
IDBDatabase::PostHandleEvent(nsEventChainPostVisitor& aVisitor)
{

View File

@ -41,12 +41,13 @@
#define mozilla_dom_indexeddb_idbdatabase_h__
#include "mozilla/dom/indexedDB/IndexedDatabase.h"
#include "mozilla/dom/indexedDB/FileManager.h"
#include "nsIDocument.h"
#include "nsIIDBDatabase.h"
#include "mozilla/dom/indexedDB/IDBWrapperCache.h"
#include "mozilla/dom/indexedDB/FileManager.h"
#include "nsCycleCollectionParticipant.h"
#include "nsDOMEventTargetHelper.h"
#include "nsIDocument.h"
class nsIScriptContext;
class nsPIDOMWindow;
@ -60,7 +61,7 @@ class IDBObjectStore;
class IDBTransaction;
class IndexedDatabaseManager;
class IDBDatabase : public IDBWrapperCache,
class IDBDatabase : public nsDOMEventTargetHelper,
public nsIIDBDatabase
{
friend class AsyncConnectionHelper;
@ -70,10 +71,12 @@ public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIIDBDATABASE
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBDatabase, IDBWrapperCache)
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBDatabase,
nsDOMEventTargetHelper)
static already_AddRefed<IDBDatabase>
Create(IDBWrapperCache* aOwnerCache,
Create(nsIScriptContext* aScriptContext,
nsPIDOMWindow* aOwner,
already_AddRefed<DatabaseInfo> aDatabaseInfo,
const nsACString& aASCIIOrigin,
FileManager* aFileManager);
@ -101,6 +104,16 @@ public:
return mFilePath;
}
nsIScriptContext* ScriptContext()
{
return mScriptContext;
}
nsPIDOMWindow* Owner()
{
return mOwner;
}
already_AddRefed<nsIDocument> GetOwnerDocument()
{
if (!mOwner) {
@ -155,9 +168,9 @@ private:
nsRefPtr<FileManager> mFileManager;
// Only touched on the main thread.
NS_DECL_EVENT_HANDLER(abort);
NS_DECL_EVENT_HANDLER(error);
NS_DECL_EVENT_HANDLER(versionchange);
nsRefPtr<nsDOMEventListenerWrapper> mOnAbortListener;
nsRefPtr<nsDOMEventListenerWrapper> mOnErrorListener;
nsRefPtr<nsDOMEventListenerWrapper> mOnVersionChangeListener;
};
END_INDEXEDDB_NAMESPACE

View File

@ -69,6 +69,7 @@
#include "IDBKeyRange.h"
#include "IndexedDatabaseManager.h"
#include "Key.h"
#include "nsIScriptSecurityManager.h"
using namespace mozilla;
@ -90,49 +91,28 @@ struct ObjectStoreInfoMap
} // anonymous namespace
IDBFactory::IDBFactory()
: mOwningObject(nsnull)
{
IDBFactory::NoteUsedByProcessType(XRE_GetProcessType());
}
IDBFactory::~IDBFactory()
{
if (mOwningObject) {
NS_DROP_JS_OBJECTS(this, IDBFactory);
}
}
// static
already_AddRefed<nsIIDBFactory>
IDBFactory::Create(nsPIDOMWindow* aWindow)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
NS_ENSURE_TRUE(aWindow, nsnull);
if (aWindow->IsOuterWindow()) {
if (aWindow && aWindow->IsOuterWindow()) {
aWindow = aWindow->GetCurrentInnerWindow();
NS_ENSURE_TRUE(aWindow, nsnull);
}
nsRefPtr<IDBFactory> factory = new IDBFactory();
factory->mWindow = aWindow;
return factory.forget();
}
// static
already_AddRefed<nsIIDBFactory>
IDBFactory::Create(JSContext* aCx,
JSObject* aOwningObject)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
NS_ASSERTION(aCx, "Null context!");
NS_ASSERTION(aOwningObject, "Null object!");
NS_ASSERTION(JS_GetGlobalForObject(aCx, aOwningObject) == aOwningObject,
"Not a global object!");
if (aWindow) {
factory->mWindow = do_GetWeakReference(aWindow);
NS_ENSURE_TRUE(factory->mWindow, nsnull);
}
nsRefPtr<IDBFactory> factory = new IDBFactory();
factory->mOwningObject = aOwningObject;
return factory.forget();
}
@ -420,36 +400,15 @@ IDBFactory::SetDatabaseMetadata(DatabaseInfo* aDatabaseInfo,
return NS_OK;
}
NS_IMPL_CYCLE_COLLECTION_CLASS(IDBFactory)
NS_IMPL_ADDREF(IDBFactory)
NS_IMPL_RELEASE(IDBFactory)
NS_IMPL_CYCLE_COLLECTING_ADDREF(IDBFactory)
NS_IMPL_CYCLE_COLLECTING_RELEASE(IDBFactory)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(IDBFactory)
NS_INTERFACE_MAP_BEGIN(IDBFactory)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_ENTRY(nsIIDBFactory)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(IDBFactory)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(IDBFactory)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mWindow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(IDBFactory)
if (tmp->mOwningObject) {
tmp->mOwningObject = nsnull;
}
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mWindow)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(IDBFactory)
if (tmp->mOwningObject) {
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(tmp->mOwningObject,
"mOwningObject")
}
NS_IMPL_CYCLE_COLLECTION_TRACE_END
DOMCI_DATA(IDBFactory, IDBFactory)
nsresult
@ -459,7 +418,6 @@ IDBFactory::OpenCommon(const nsAString& aName,
nsIIDBOpenDBRequest** _retval)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
NS_ASSERTION(mWindow || mOwningObject, "Must have one of these!");
if (XRE_GetProcessType() == GeckoProcessType_Content) {
// Force ContentChild to cache the path from the parent, so that
@ -472,19 +430,16 @@ IDBFactory::OpenCommon(const nsAString& aName,
nsCOMPtr<nsPIDOMWindow> window;
nsCOMPtr<nsIScriptGlobalObject> sgo;
nsIScriptContext* context = nsnull;
JSObject* scriptOwner = nsnull;
if (mWindow) {
sgo = do_QueryInterface(mWindow);
window = do_QueryReferent(mWindow);
NS_ENSURE_TRUE(window, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
sgo = do_QueryInterface(window);
NS_ENSURE_TRUE(sgo, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
context = sgo->GetContext();
NS_ENSURE_TRUE(context, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
window = mWindow;
}
else {
scriptOwner = mOwningObject;
}
nsCString origin;
@ -493,7 +448,7 @@ IDBFactory::OpenCommon(const nsAString& aName,
NS_ENSURE_SUCCESS(rv, rv);
nsRefPtr<IDBOpenDBRequest> request =
IDBOpenDBRequest::Create(context, window, scriptOwner);
IDBOpenDBRequest::Create(context, window);
NS_ENSURE_TRUE(request, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
nsRefPtr<OpenDatabaseHelper> openHelper =

View File

@ -45,11 +45,11 @@
#include "mozIStorageConnection.h"
#include "nsIIDBFactory.h"
#include "nsCycleCollectionParticipant.h"
#include "nsIWeakReferenceUtils.h"
#include "nsXULAppAPI.h"
class nsIAtom;
class nsPIDOMWindow;
class nsIAtom;
BEGIN_INDEXEDDB_NAMESPACE
@ -60,17 +60,12 @@ struct ObjectStoreInfo;
class IDBFactory : public nsIIDBFactory
{
typedef nsTArray<nsRefPtr<ObjectStoreInfo> > ObjectStoreInfoArray;
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(IDBFactory)
NS_DECL_ISUPPORTS
NS_DECL_NSIIDBFACTORY
static already_AddRefed<nsIIDBFactory> Create(nsPIDOMWindow* aWindow);
static already_AddRefed<nsIIDBFactory> Create(JSContext* aCx,
JSObject* aOwningObject);
static already_AddRefed<mozIStorageConnection>
GetConnection(const nsAString& aDatabaseFilePath);
@ -101,7 +96,7 @@ public:
private:
IDBFactory();
~IDBFactory();
~IDBFactory() { }
nsresult
OpenCommon(const nsAString& aName,
@ -109,10 +104,7 @@ private:
bool aDeleting,
nsIIDBOpenDBRequest** _retval);
// If this factory lives on a window then mWindow must be non-null. Otherwise
// mOwningObject must be non-null.
nsCOMPtr<nsPIDOMWindow> mWindow;
JSObject* mOwningObject;
nsCOMPtr<nsIWeakReference> mWindow;
};
END_INDEXEDDB_NAMESPACE

View File

@ -294,7 +294,8 @@ GenerateRequest(IDBIndex* aIndex)
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
IDBTransaction* transaction = aIndex->ObjectStore()->Transaction();
IDBDatabase* database = transaction->Database();
return IDBRequest::Create(aIndex, database, transaction);
return IDBRequest::Create(aIndex, database->ScriptContext(),
database->Owner(), transaction);
}
} // anonymous namespace
@ -312,6 +313,9 @@ IDBIndex::Create(IDBObjectStore* aObjectStore,
nsRefPtr<IDBIndex> index = new IDBIndex();
index->mScriptContext = database->ScriptContext();
index->mOwner = database->Owner();
index->mObjectStore = aObjectStore;
index->mId = aIndexInfo->id;
index->mName = aIndexInfo->name;
@ -339,10 +343,14 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(IDBIndex)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(IDBIndex)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mObjectStore)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOwner)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mScriptContext)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(IDBIndex)
// Don't unlink mObjectStore!
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOwner)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mScriptContext)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(IDBIndex)

View File

@ -113,6 +113,9 @@ private:
nsRefPtr<IDBObjectStore> mObjectStore;
nsCOMPtr<nsIScriptContext> mScriptContext;
nsCOMPtr<nsPIDOMWindow> mOwner;
PRInt64 mId;
nsString mName;
nsString mKeyPath;

View File

@ -507,8 +507,8 @@ GenerateRequest(IDBObjectStore* aObjectStore)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
IDBDatabase* database = aObjectStore->Transaction()->Database();
return IDBRequest::Create(aObjectStore, database,
aObjectStore->Transaction());
return IDBRequest::Create(aObjectStore, database->ScriptContext(),
database->Owner(), aObjectStore->Transaction());
}
JSClass gDummyPropClass = {
@ -532,6 +532,9 @@ IDBObjectStore::Create(IDBTransaction* aTransaction,
nsRefPtr<IDBObjectStore> objectStore = new IDBObjectStore();
objectStore->mScriptContext = aTransaction->Database()->ScriptContext();
objectStore->mOwner = aTransaction->Database()->Owner();
objectStore->mTransaction = aTransaction;
objectStore->mName = aStoreInfo->name;
objectStore->mId = aStoreInfo->id;
@ -1373,6 +1376,8 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(IDBObjectStore)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(IDBObjectStore)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(mTransaction,
nsIDOMEventTarget)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOwner)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mScriptContext)
for (PRUint32 i = 0; i < tmp->mCreatedIndexes.Length(); i++) {
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mCreatedIndexes[i]");
@ -1382,6 +1387,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(IDBObjectStore)
// Don't unlink mTransaction!
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOwner)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mScriptContext)
tmp->mCreatedIndexes.Clear();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END

View File

@ -41,14 +41,13 @@
#define mozilla_dom_indexeddb_idbobjectstore_h__
#include "mozilla/dom/indexedDB/IndexedDatabase.h"
#include "mozilla/dom/indexedDB/IDBTransaction.h"
#include "nsIIDBObjectStore.h"
#include "nsIIDBTransaction.h"
#include "nsCycleCollectionParticipant.h"
#include "mozilla/dom/indexedDB/IDBTransaction.h"
class nsIScriptContext;
class nsPIDOMWindow;
@ -205,6 +204,9 @@ protected:
private:
nsRefPtr<IDBTransaction> mTransaction;
nsCOMPtr<nsIScriptContext> mScriptContext;
nsCOMPtr<nsPIDOMWindow> mOwner;
PRInt64 mId;
nsString mName;
nsString mKeyPath;

View File

@ -62,8 +62,8 @@ USING_INDEXEDDB_NAMESPACE
IDBRequest::IDBRequest()
: mResultVal(JSVAL_VOID),
mErrorCode(0),
mHaveResultOrErrorCode(false),
mManuallyRooted(false)
mResultValRooted(false),
mHaveResultOrErrorCode(false)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
}
@ -72,13 +72,19 @@ IDBRequest::~IDBRequest()
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
UnrootResultVal();
if (mResultValRooted) {
// Calling a virtual from the destructor is bad... But we know that we won't
// call a subclass' implementation because mResultValRooted will be set to
// false.
UnrootResultVal();
}
}
// static
already_AddRefed<IDBRequest>
IDBRequest::Create(nsISupports* aSource,
IDBWrapperCache* aOwnerCache,
nsIScriptContext* aScriptContext,
nsPIDOMWindow* aOwner,
IDBTransaction* aTransaction)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
@ -86,9 +92,8 @@ IDBRequest::Create(nsISupports* aSource,
request->mSource = aSource;
request->mTransaction = aTransaction;
request->mScriptContext = aOwnerCache->GetScriptContext();
request->mOwner = aOwnerCache->GetOwner();
request->mScriptOwner = aOwnerCache->GetScriptOwner();
request->mScriptContext = aScriptContext;
request->mOwner = aOwner;
return request.forget();
}
@ -100,7 +105,9 @@ IDBRequest::Reset()
mResultVal = JSVAL_VOID;
mHaveResultOrErrorCode = false;
mErrorCode = 0;
UnrootResultVal();
if (mResultValRooted) {
UnrootResultVal();
}
}
nsresult
@ -108,7 +115,7 @@ IDBRequest::NotifyHelperCompleted(HelperBase* aHelper)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
NS_ASSERTION(!mHaveResultOrErrorCode, "Already called!");
NS_ASSERTION(!PreservingWrapper(), "Already rooted?!");
NS_ASSERTION(!mResultValRooted, "Already rooted?!");
NS_ASSERTION(JSVAL_IS_VOID(mResultVal), "Should be undefined!");
// See if our window is still valid. If not then we're going to pretend that
@ -128,40 +135,45 @@ IDBRequest::NotifyHelperCompleted(HelperBase* aHelper)
}
// Otherwise we need to get the result from the helper.
JSContext* cx;
if (mScriptOwner) {
JSContext* cx = nsnull;
JSObject* obj = nsnull;
if (mScriptContext) {
cx = mScriptContext->GetNativeContext();
NS_ASSERTION(cx, "Failed to get a context!");
obj = mScriptContext->GetNativeGlobal();
NS_ASSERTION(obj, "Failed to get global object!");
}
else {
nsIThreadJSContextStack* cxStack = nsContentUtils::ThreadJSContextStack();
NS_ASSERTION(cxStack, "Failed to get thread context stack!");
if (NS_FAILED(cxStack->GetSafeJSContext(&cx))) {
NS_WARNING("Failed to get safe JSContext!");
rv = NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
mErrorCode = NS_ERROR_GET_CODE(rv);
return rv;
}
}
else {
cx = mScriptContext->GetNativeContext();
NS_ASSERTION(cx, "Failed to get a context!");
}
NS_ENSURE_SUCCESS(cxStack->GetSafeJSContext(&cx),
NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
JSObject* global = GetParentObject();
NS_ASSERTION(global, "This should never be null!");
obj = GetWrapper();
NS_ENSURE_TRUE(obj, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
}
JSAutoRequest ar(cx);
JSAutoEnterCompartment ac;
if (ac.enter(cx, global)) {
if (!ac.enter(cx, obj)) {
rv = NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
}
else {
RootResultVal();
rv = aHelper->GetSuccessResult(cx, &mResultVal);
if (NS_FAILED(rv)) {
if (NS_SUCCEEDED(rv)) {
// Unroot if we don't really need to be rooted.
if (!JSVAL_IS_GCTHING(mResultVal)) {
UnrootResultVal();
}
}
else {
NS_WARNING("GetSuccessResult failed!");
}
}
else {
NS_WARNING("Failed to enter correct compartment!");
rv = NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
}
if (NS_SUCCEEDED(rv)) {
mErrorCode = 0;
@ -177,47 +189,17 @@ IDBRequest::NotifyHelperCompleted(HelperBase* aHelper)
void
IDBRequest::RootResultVal()
{
// We want to use the preserved wrapper to keep our result alive, but we don't
// always get a wrapper right away. Manually root if we don't have a wrapper.
if (!PreservingWrapper() && GetWrapperPreserveColor()) {
NS_ASSERTION(!mManuallyRooted, "Should not be manually rooted here!");
nsContentUtils::PreserveWrapper(static_cast<nsIDOMEventTarget*>(this),
this);
}
else if (!mManuallyRooted) {
NS_HOLD_JS_OBJECTS(this, IDBRequest);
mManuallyRooted = true;
}
NS_ASSERTION(!mResultValRooted, "This should be false!");
NS_HOLD_JS_OBJECTS(this, IDBRequest);
mResultValRooted = true;
}
void
IDBRequest::UnrootResultVal()
{
if (mManuallyRooted) {
NS_ASSERTION(!PreservingWrapper(), "Shouldn't have a wrapper here!");
NS_DROP_JS_OBJECTS(this, IDBRequest);
mManuallyRooted = false;
}
else if (PreservingWrapper()) {
nsContentUtils::ReleaseWrapper(static_cast<nsIDOMEventTarget*>(this), this);
}
}
void
IDBRequest::OnWrapperCreated()
{
NS_ASSERTION(!PreservingWrapper(),
"Shouldn't have had a wrapper before now!");
// Update our rooting strategy to accommodate new wrapper if needed. We have
// to unroot the old way first. This is annoying because XPConnect uses a hash
// table to store these so we could be just fine adding an entry for a second
// time... However nsContentUtils keeps a counter that will get out of sync if
// we do. Safest to just remove the old holder and then add a new one.
if (mManuallyRooted) {
UnrootResultVal();
RootResultVal();
}
NS_ASSERTION(mResultValRooted, "This should be true!");
NS_DROP_JS_OBJECTS(this, IDBRequest);
mResultValRooted = false;
}
NS_IMETHODIMP
@ -280,32 +262,66 @@ IDBRequest::GetErrorCode(PRUint16* aErrorCode)
return NS_OK;
}
NS_IMETHODIMP
IDBRequest::SetOnsuccess(nsIDOMEventListener* aSuccessListener)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return RemoveAddEventListener(NS_LITERAL_STRING(SUCCESS_EVT_STR),
mOnSuccessListener, aSuccessListener);
}
NS_IMETHODIMP
IDBRequest::GetOnsuccess(nsIDOMEventListener** aSuccessListener)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return GetInnerEventListener(mOnSuccessListener, aSuccessListener);
}
NS_IMETHODIMP
IDBRequest::SetOnerror(nsIDOMEventListener* aErrorListener)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return RemoveAddEventListener(NS_LITERAL_STRING(ERROR_EVT_STR),
mOnErrorListener, aErrorListener);
}
NS_IMETHODIMP
IDBRequest::GetOnerror(nsIDOMEventListener** aErrorListener)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return GetInnerEventListener(mOnErrorListener, aErrorListener);
}
NS_IMPL_CYCLE_COLLECTION_CLASS(IDBRequest)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBRequest, IDBWrapperCache)
// Don't need NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS because
// nsDOMEventTargetHelper does it for us.
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(success)
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(error)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBRequest,
nsDOMEventTargetWrapperCache)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnSuccessListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnErrorListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mSource)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(mTransaction,
nsPIDOMEventTarget)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBRequest, IDBWrapperCache)
tmp->mResultVal = JSVAL_VOID;
if (tmp->mManuallyRooted) {
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBRequest,
nsDOMEventTargetWrapperCache)
if (tmp->mResultValRooted) {
tmp->mResultVal = JSVAL_VOID;
tmp->UnrootResultVal();
}
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(success)
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(error)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnSuccessListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnErrorListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mSource)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mTransaction)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(IDBRequest, IDBWrapperCache)
// Don't need NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER because
// nsDOMEventTargetHelper does it for us.
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(IDBRequest,
nsDOMEventTargetWrapperCache)
if (JSVAL_IS_GCTHING(tmp->mResultVal)) {
void *gcThing = JSVAL_TO_GCTHING(tmp->mResultVal);
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(gcThing, "mResultVal")
@ -315,16 +331,13 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IDBRequest)
NS_INTERFACE_MAP_ENTRY(nsIIDBRequest)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(IDBRequest)
NS_INTERFACE_MAP_END_INHERITING(IDBWrapperCache)
NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetWrapperCache)
NS_IMPL_ADDREF_INHERITED(IDBRequest, IDBWrapperCache)
NS_IMPL_RELEASE_INHERITED(IDBRequest, IDBWrapperCache)
NS_IMPL_ADDREF_INHERITED(IDBRequest, nsDOMEventTargetWrapperCache)
NS_IMPL_RELEASE_INHERITED(IDBRequest, nsDOMEventTargetWrapperCache)
DOMCI_DATA(IDBRequest, IDBRequest)
NS_IMPL_EVENT_HANDLER(IDBRequest, success);
NS_IMPL_EVENT_HANDLER(IDBRequest, error);
nsresult
IDBRequest::PreHandleEvent(nsEventChainPreVisitor& aVisitor)
{
@ -339,21 +352,21 @@ IDBOpenDBRequest::~IDBOpenDBRequest()
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
UnrootResultVal();
if (mResultValRooted) {
UnrootResultVal();
}
}
// static
already_AddRefed<IDBOpenDBRequest>
IDBOpenDBRequest::Create(nsIScriptContext* aScriptContext,
nsPIDOMWindow* aOwner,
JSObject* aScriptOwner)
nsPIDOMWindow* aOwner)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
nsRefPtr<IDBOpenDBRequest> request(new IDBOpenDBRequest());
request->mScriptContext = aScriptContext;
request->mOwner = aOwner;
request->mScriptOwner = aScriptOwner;
return request.forget();
}
@ -364,18 +377,37 @@ IDBOpenDBRequest::SetTransaction(IDBTransaction* aTransaction)
mTransaction = aTransaction;
}
void
IDBOpenDBRequest::RootResultVal()
{
NS_ASSERTION(!mResultValRooted, "This should be false!");
NS_HOLD_JS_OBJECTS(this, IDBOpenDBRequest);
mResultValRooted = true;
}
void
IDBOpenDBRequest::UnrootResultVal()
{
NS_ASSERTION(mResultValRooted, "This should be true!");
NS_DROP_JS_OBJECTS(this, IDBOpenDBRequest);
mResultValRooted = false;
}
NS_IMPL_EVENT_HANDLER(IDBOpenDBRequest, blocked)
NS_IMPL_EVENT_HANDLER(IDBOpenDBRequest, upgradeneeded)
NS_IMPL_CYCLE_COLLECTION_CLASS(IDBOpenDBRequest)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBOpenDBRequest,
IDBRequest)
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(upgradeneeded)
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(blocked)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnupgradeneededListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnblockedListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBOpenDBRequest,
IDBRequest)
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(upgradeneeded)
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(blocked)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnupgradeneededListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnblockedListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IDBOpenDBRequest)
@ -387,6 +419,3 @@ NS_IMPL_ADDREF_INHERITED(IDBOpenDBRequest, IDBRequest)
NS_IMPL_RELEASE_INHERITED(IDBOpenDBRequest, IDBRequest)
DOMCI_DATA(IDBOpenDBRequest, IDBOpenDBRequest)
NS_IMPL_EVENT_HANDLER(IDBOpenDBRequest, blocked);
NS_IMPL_EVENT_HANDLER(IDBOpenDBRequest, upgradeneeded);

View File

@ -46,7 +46,8 @@
#include "nsIIDBRequest.h"
#include "nsIIDBOpenDBRequest.h"
#include "mozilla/dom/indexedDB/IDBWrapperCache.h"
#include "nsDOMEventTargetWrapperCache.h"
#include "nsCycleCollectionParticipant.h"
class nsIScriptContext;
class nsPIDOMWindow;
@ -56,18 +57,19 @@ BEGIN_INDEXEDDB_NAMESPACE
class HelperBase;
class IDBTransaction;
class IDBRequest : public IDBWrapperCache,
class IDBRequest : public nsDOMEventTargetWrapperCache,
public nsIIDBRequest
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIIDBREQUEST
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(IDBRequest,
IDBWrapperCache)
nsDOMEventTargetWrapperCache)
static
already_AddRefed<IDBRequest> Create(nsISupports* aSource,
IDBWrapperCache* aOwnerCache,
nsIScriptContext* aScriptContext,
nsPIDOMWindow* aOwner,
IDBTransaction* aTransaction);
// nsIDOMEventTarget
@ -90,10 +92,18 @@ public:
mErrorCode = rv;
}
void RootResultVal();
void UnrootResultVal();
nsIScriptContext* ScriptContext()
{
return mScriptContext;
}
virtual void OnWrapperCreated();
nsPIDOMWindow* Owner()
{
return mOwner;
}
virtual void RootResultVal();
virtual void UnrootResultVal();
protected:
IDBRequest();
@ -102,14 +112,14 @@ protected:
nsCOMPtr<nsISupports> mSource;
nsRefPtr<IDBTransaction> mTransaction;
NS_DECL_EVENT_HANDLER(success);
NS_DECL_EVENT_HANDLER(error);
nsRefPtr<nsDOMEventListenerWrapper> mOnSuccessListener;
nsRefPtr<nsDOMEventListenerWrapper> mOnErrorListener;
jsval mResultVal;
PRUint16 mErrorCode;
bool mResultValRooted;
bool mHaveResultOrErrorCode;
bool mManuallyRooted;
};
class IDBOpenDBRequest : public IDBRequest,
@ -119,30 +129,24 @@ public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSIIDBREQUEST(IDBRequest::)
NS_DECL_NSIIDBOPENDBREQUEST
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBOpenDBRequest, IDBRequest)
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBOpenDBRequest,
IDBRequest)
static
already_AddRefed<IDBOpenDBRequest>
Create(nsIScriptContext* aScriptContext,
nsPIDOMWindow* aOwner,
JSObject* aScriptOwner);
static
already_AddRefed<IDBOpenDBRequest>
Create(IDBWrapperCache* aOwnerCache)
{
return Create(aOwnerCache->GetScriptContext(), aOwnerCache->GetOwner(),
aOwnerCache->GetScriptOwner());
}
nsPIDOMWindow* aOwner);
void SetTransaction(IDBTransaction* aTransaction);
virtual void RootResultVal();
virtual void UnrootResultVal();
protected:
~IDBOpenDBRequest();
// Only touched on the main thread.
NS_DECL_EVENT_HANDLER(blocked);
NS_DECL_EVENT_HANDLER(upgradeneeded);
nsRefPtr<nsDOMEventListenerWrapper> mOnblockedListener;
nsRefPtr<nsDOMEventListenerWrapper> mOnupgradeneededListener;
};
END_INDEXEDDB_NAMESPACE

View File

@ -42,7 +42,6 @@
#include "nsIScriptContext.h"
#include "mozilla/storage.h"
#include "nsContentUtils.h"
#include "nsDOMClassInfoID.h"
#include "nsDOMLists.h"
#include "nsEventDispatcher.h"
@ -117,9 +116,8 @@ IDBTransaction::Create(IDBDatabase* aDatabase,
nsRefPtr<IDBTransaction> transaction = new IDBTransaction();
transaction->mScriptContext = aDatabase->GetScriptContext();
transaction->mOwner = aDatabase->GetOwner();
transaction->mScriptOwner = aDatabase->GetScriptOwner();
transaction->mScriptContext = aDatabase->ScriptContext();
transaction->mOwner = aDatabase->Owner();
transaction->mDatabase = aDatabase;
transaction->mMode = aMode;
@ -186,8 +184,6 @@ IDBTransaction::~IDBTransaction()
NS_ASSERTION(!mConnection, "Should have called CommitOrRollback!");
NS_ASSERTION(!mCreating, "Should have been cleared already!");
NS_ASSERTION(mFiredCompleteOrAbort, "Should have fired event!");
nsContentUtils::ReleaseWrapper(static_cast<nsIDOMEventTarget*>(this), this);
}
void
@ -478,25 +474,27 @@ IDBTransaction::ClearCreatedFileInfos()
NS_IMPL_CYCLE_COLLECTION_CLASS(IDBTransaction)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBTransaction,
IDBWrapperCache)
nsDOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(mDatabase,
nsIDOMEventTarget)
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(error)
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(complete)
NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(abort)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnErrorListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnCompleteListener)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnAbortListener)
for (PRUint32 i = 0; i < tmp->mCreatedObjectStores.Length(); i++) {
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mCreatedObjectStores[i]");
cb.NoteXPCOMChild(static_cast<nsIIDBObjectStore*>(
tmp->mCreatedObjectStores[i].get()));
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBTransaction, IDBWrapperCache)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBTransaction,
nsDOMEventTargetHelper)
// Don't unlink mDatabase!
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(error)
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(complete)
NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(abort)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnErrorListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnCompleteListener)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mOnAbortListener)
tmp->mCreatedObjectStores.Clear();
@ -506,17 +504,13 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IDBTransaction)
NS_INTERFACE_MAP_ENTRY(nsIIDBTransaction)
NS_INTERFACE_MAP_ENTRY(nsIThreadObserver)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(IDBTransaction)
NS_INTERFACE_MAP_END_INHERITING(IDBWrapperCache)
NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
NS_IMPL_ADDREF_INHERITED(IDBTransaction, IDBWrapperCache)
NS_IMPL_RELEASE_INHERITED(IDBTransaction, IDBWrapperCache)
NS_IMPL_ADDREF_INHERITED(IDBTransaction, nsDOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(IDBTransaction, nsDOMEventTargetHelper)
DOMCI_DATA(IDBTransaction, IDBTransaction)
NS_IMPL_EVENT_HANDLER(IDBTransaction, error);
NS_IMPL_EVENT_HANDLER(IDBTransaction, complete);
NS_IMPL_EVENT_HANDLER(IDBTransaction, abort);
NS_IMETHODIMP
IDBTransaction::GetDb(nsIIDBDatabase** aDB)
{
@ -632,6 +626,53 @@ IDBTransaction::Abort()
return NS_OK;
}
NS_IMETHODIMP
IDBTransaction::SetOnerror(nsIDOMEventListener* aErrorListener)
{
return RemoveAddEventListener(NS_LITERAL_STRING(ERROR_EVT_STR),
mOnErrorListener, aErrorListener);
}
NS_IMETHODIMP
IDBTransaction::GetOnerror(nsIDOMEventListener** aErrorListener)
{
return GetInnerEventListener(mOnErrorListener, aErrorListener);
}
NS_IMETHODIMP
IDBTransaction::GetOncomplete(nsIDOMEventListener** aOncomplete)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return GetInnerEventListener(mOnCompleteListener, aOncomplete);
}
NS_IMETHODIMP
IDBTransaction::SetOncomplete(nsIDOMEventListener* aOncomplete)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return RemoveAddEventListener(NS_LITERAL_STRING(COMPLETE_EVT_STR),
mOnCompleteListener, aOncomplete);
}
NS_IMETHODIMP
IDBTransaction::GetOnabort(nsIDOMEventListener** aOnabort)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return GetInnerEventListener(mOnAbortListener, aOnabort);
}
NS_IMETHODIMP
IDBTransaction::SetOnabort(nsIDOMEventListener* aOnabort)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return RemoveAddEventListener(NS_LITERAL_STRING(ABORT_EVT_STR),
mOnAbortListener, aOnabort);
}
nsresult
IDBTransaction::PreHandleEvent(nsEventChainPreVisitor& aVisitor)
{
@ -776,7 +817,7 @@ CommitHelper::Run()
}
if (mConnection) {
IndexedDatabaseManager::SetCurrentWindow(database->GetOwner());
IndexedDatabaseManager::SetCurrentWindow(database->Owner());
if (!mAborted && mUpdateFileRefcountFunction &&
NS_FAILED(mUpdateFileRefcountFunction->UpdateDatabase(mConnection))) {

View File

@ -41,6 +41,8 @@
#define mozilla_dom_indexeddb_idbtransaction_h__
#include "mozilla/dom/indexedDB/IndexedDatabase.h"
#include "mozilla/dom/indexedDB/IDBDatabase.h"
#include "mozilla/dom/indexedDB/FileInfo.h"
#include "mozIStorageConnection.h"
#include "mozIStorageStatement.h"
@ -49,15 +51,14 @@
#include "nsIRunnable.h"
#include "nsIThreadInternal.h"
#include "nsDOMEventTargetHelper.h"
#include "nsCycleCollectionParticipant.h"
#include "nsAutoPtr.h"
#include "nsClassHashtable.h"
#include "nsHashKeys.h"
#include "nsInterfaceHashtable.h"
#include "mozilla/dom/indexedDB/IDBDatabase.h"
#include "mozilla/dom/indexedDB/IDBWrapperCache.h"
#include "mozilla/dom/indexedDB/FileInfo.h"
class nsIThread;
BEGIN_INDEXEDDB_NAMESPACE
@ -77,7 +78,7 @@ public:
virtual nsresult NotifyTransactionComplete(IDBTransaction* aTransaction) = 0;
};
class IDBTransaction : public IDBWrapperCache,
class IDBTransaction : public nsDOMEventTargetHelper,
public nsIIDBTransaction,
public nsIThreadObserver
{
@ -91,7 +92,8 @@ public:
NS_DECL_NSIIDBTRANSACTION
NS_DECL_NSITHREADOBSERVER
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBTransaction, IDBWrapperCache)
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBTransaction,
nsDOMEventTargetHelper)
static already_AddRefed<IDBTransaction>
Create(IDBDatabase* aDatabase,
@ -178,9 +180,9 @@ private:
PRUint32 mCreatedRecursionDepth;
// Only touched on the main thread.
NS_DECL_EVENT_HANDLER(error);
NS_DECL_EVENT_HANDLER(complete);
NS_DECL_EVENT_HANDLER(abort);
nsRefPtr<nsDOMEventListenerWrapper> mOnErrorListener;
nsRefPtr<nsDOMEventListenerWrapper> mOnCompleteListener;
nsRefPtr<nsDOMEventListenerWrapper> mOnAbortListener;
nsInterfaceHashtable<nsCStringHashKey, mozIStorageStatement>
mCachedStatements;

View File

@ -1,38 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 "IDBWrapperCache.h"
USING_INDEXEDDB_NAMESPACE
NS_IMPL_CYCLE_COLLECTION_CLASS(IDBWrapperCache)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBWrapperCache,
nsDOMEventTargetWrapperCache)
// Don't need NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS because
// nsDOMEventTargetHelper does it for us.
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBWrapperCache,
nsDOMEventTargetWrapperCache)
tmp->mScriptOwner = nsnull;
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(IDBWrapperCache,
nsDOMEventTargetWrapperCache)
// Don't need NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER because
// nsDOMEventTargetHelper does it for us.
if (tmp->mScriptOwner) {
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(tmp->mScriptOwner,
"mScriptOwner")
}
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IDBWrapperCache)
NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetWrapperCache)
NS_IMPL_ADDREF_INHERITED(IDBWrapperCache, nsDOMEventTargetWrapperCache)
NS_IMPL_RELEASE_INHERITED(IDBWrapperCache, nsDOMEventTargetWrapperCache)

View File

@ -1,74 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
#ifndef mozilla_dom_indexeddb_idbwrappercache_h__
#define mozilla_dom_indexeddb_idbwrappercache_h__
#include "mozilla/dom/indexedDB/IndexedDatabase.h"
#include "nsDOMEventTargetWrapperCache.h"
BEGIN_INDEXEDDB_NAMESPACE
class IDBWrapperCache : public nsDOMEventTargetWrapperCache
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(
IDBWrapperCache,
nsDOMEventTargetWrapperCache)
JSObject* GetScriptOwner() const
{
return mScriptOwner;
}
nsIScriptContext* GetScriptContext() const
{
return mScriptContext;
}
nsPIDOMWindow* GetOwner() const
{
return mOwner;
}
JSObject* GetParentObject()
{
if (mScriptOwner) {
return mScriptOwner;
}
// Do what nsEventTargetSH::PreCreate does.
nsCOMPtr<nsIScriptGlobalObject> parent;
nsDOMEventTargetWrapperCache::GetParentObject(getter_AddRefs(parent));
return parent ? parent->GetGlobalJSObject() : nsnull;
}
virtual void OnWrapperCreated()
{ }
static IDBWrapperCache* FromSupports(nsISupports* aSupports)
{
return static_cast<IDBWrapperCache*>(
nsDOMEventTargetWrapperCache::FromSupports(aSupports));
}
protected:
IDBWrapperCache()
: mScriptOwner(nsnull)
{ }
virtual ~IDBWrapperCache()
{ }
JSObject* mScriptOwner;
};
END_INDEXEDDB_NAMESPACE
#endif // mozilla_dom_indexeddb_idbwrappercache_h__

View File

@ -505,7 +505,7 @@ IndexedDatabaseManager::AbortCloseDatabasesForWindow(nsPIDOMWindow* aWindow)
for (PRUint32 index = 0; index < liveDatabases.Length(); index++) {
IDBDatabase*& database = liveDatabases[index];
if (database->GetOwner() == aWindow) {
if (database->Owner() == aWindow) {
if (NS_FAILED(database->Close())) {
NS_WARNING("Failed to close database for dying window!");
}
@ -533,7 +533,7 @@ IndexedDatabaseManager::HasOpenTransactions(nsPIDOMWindow* aWindow)
for (PRUint32 index = 0; index < liveDatabases.Length(); index++) {
IDBDatabase*& database = liveDatabases[index];
if (database->GetOwner() == aWindow &&
if (database->Owner() == aWindow &&
pool->HasTransactionsForDatabase(database)) {
return true;
}
@ -1591,26 +1591,26 @@ NS_IMETHODIMP
IndexedDatabaseManager::InitWindowless(const jsval& aObj, JSContext* aCx)
{
NS_ENSURE_TRUE(nsContentUtils::IsCallerChrome(), NS_ERROR_NOT_AVAILABLE);
NS_ENSURE_ARG(!JSVAL_IS_PRIMITIVE(aObj));
// Instantiating this class will register exception providers so even
// in xpcshell we will get typed (dom) exceptions, instead of general
// exceptions.
// in xpcshell we will get typed (dom) exceptions, instead of general exceptions.
nsCOMPtr<nsIDOMScriptObjectFactory> sof(do_GetService(kDOMSOF_CID));
// Defining IDBKeyrange static functions on the global.
if (JSVAL_IS_PRIMITIVE(aObj)) {
return NS_ERROR_INVALID_ARG;
}
nsCOMPtr<nsIIDBFactory> factory = IDBFactory::Create(nsnull);
NS_ASSERTION(factory, "IDBFactory should not be null.");
JSObject* obj = JSVAL_TO_OBJECT(aObj);
JSObject* global = JS_GetGlobalForObject(aCx, obj);
nsCOMPtr<nsIIDBFactory> factory = IDBFactory::Create(aCx, global);
NS_ENSURE_TRUE(factory, NS_ERROR_FAILURE);
jsval mozIndexedDBVal;
nsresult rv = nsContentUtils::WrapNative(aCx, obj, factory, &mozIndexedDBVal);
NS_ENSURE_SUCCESS(rv, rv);
if (!JS_DefineProperty(aCx, obj, "mozIndexedDB", mozIndexedDBVal, nsnull,
nsnull, JSPROP_ENUMERATE)) {
if (!JS_DefineProperty(aCx, obj, "mozIndexedDB", mozIndexedDBVal,
nsnull, nsnull, JSPROP_ENUMERATE)) {
return NS_ERROR_FAILURE;
}

View File

@ -61,17 +61,16 @@ CPPSRCS = \
IDBCursor.cpp \
IDBDatabase.cpp \
IDBEvents.cpp \
IDBFactory.cpp \
IDBIndex.cpp \
IDBKeyRange.cpp \
IDBObjectStore.cpp \
IDBRequest.cpp \
IDBTransaction.cpp \
IDBWrapperCache.cpp \
IDBFactory.cpp \
IndexedDatabaseManager.cpp \
Key.cpp \
OpenDatabaseHelper.cpp \
TransactionThreadPool.cpp \
Key.cpp \
$(NULL)
EXPORTS_mozilla/dom/indexedDB = \
@ -83,7 +82,6 @@ EXPORTS_mozilla/dom/indexedDB = \
IDBObjectStore.h \
IDBRequest.h \
IDBTransaction.h \
IDBWrapperCache.h \
IndexedDatabase.h \
IndexedDatabaseManager.h \
IDBFactory.h \

View File

@ -1611,9 +1611,7 @@ OpenDatabaseHelper::DoDatabaseWork()
NS_ASSERTION(mOpenDBRequest, "This should never be null!");
// This will be null for non-window contexts.
nsPIDOMWindow* window = mOpenDBRequest->GetOwner();
nsPIDOMWindow* window = mOpenDBRequest->Owner();
AutoEnterWindow autoWindow(window);
nsCOMPtr<nsIFile> dbDirectory;
@ -2113,7 +2111,8 @@ OpenDatabaseHelper::EnsureSuccessResult()
dbInfo->nextIndexId = mLastIndexId + 1;
nsRefPtr<IDBDatabase> database =
IDBDatabase::Create(mOpenDBRequest,
IDBDatabase::Create(mOpenDBRequest->ScriptContext(),
mOpenDBRequest->Owner(),
dbInfo.forget(),
mASCIIOrigin,
mFileManager);