1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "IDBWrapperCache.h"
8 : #include "nsContentUtils.h"
9 :
10 : USING_INDEXEDDB_NAMESPACE
11 :
12 1464 : NS_IMPL_CYCLE_COLLECTION_CLASS(IDBWrapperCache)
13 :
14 612 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(IDBWrapperCache,
15 : nsDOMEventTargetHelper)
16 : // Don't need NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS because
17 : // nsDOMEventTargetHelper does it for us.
18 612 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
19 :
20 611 : NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(IDBWrapperCache,
21 : nsDOMEventTargetHelper)
22 611 : if (tmp->mScriptOwner) {
23 611 : NS_DROP_JS_OBJECTS(tmp, IDBWrapperCache);
24 611 : tmp->mScriptOwner = nsnull;
25 : }
26 611 : NS_IMPL_CYCLE_COLLECTION_UNLINK_END
27 :
28 6221 : NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(IDBWrapperCache,
29 : nsDOMEventTargetHelper)
30 : // Don't need NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER because
31 : // nsDOMEventTargetHelper does it for us.
32 6221 : if (tmp->mScriptOwner) {
33 6221 : NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(tmp->mScriptOwner,
34 : "mScriptOwner")
35 : }
36 6221 : NS_IMPL_CYCLE_COLLECTION_TRACE_END
37 :
38 105076 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IDBWrapperCache)
39 105076 : NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
40 :
41 154266 : NS_IMPL_ADDREF_INHERITED(IDBWrapperCache, nsDOMEventTargetHelper)
42 154266 : NS_IMPL_RELEASE_INHERITED(IDBWrapperCache, nsDOMEventTargetHelper)
43 :
44 6158 : IDBWrapperCache::~IDBWrapperCache()
45 : {
46 3079 : if (mScriptOwner) {
47 2468 : NS_DROP_JS_OBJECTS(this, IDBWrapperCache);
48 : }
49 6158 : }
50 :
51 : bool
52 3079 : IDBWrapperCache::SetScriptOwner(JSObject* aScriptOwner)
53 : {
54 3079 : if (!aScriptOwner) {
55 0 : NS_ASSERTION(!mScriptOwner,
56 : "Don't null out existing owner, we need to call "
57 : "DropJSObjects!");
58 :
59 0 : return true;
60 : }
61 :
62 3079 : mScriptOwner = aScriptOwner;
63 :
64 3079 : nsISupports* thisSupports = NS_CYCLE_COLLECTION_UPCAST(this, IDBWrapperCache);
65 : nsXPCOMCycleCollectionParticipant* participant;
66 3079 : CallQueryInterface(this, &participant);
67 3079 : nsresult rv = nsContentUtils::HoldJSObjects(thisSupports, participant);
68 3079 : if (NS_FAILED(rv)) {
69 0 : NS_WARNING("nsContentUtils::HoldJSObjects failed.");
70 0 : mScriptOwner = nsnull;
71 0 : return false;
72 : }
73 :
74 3079 : return true;
75 4392 : }
|