2 * Copyright (C) 2004 Apple Computer, Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef RUNTIME_ROOT_H_
27 #define RUNTIME_ROOT_H_
29 #include <CoreFoundation/CoreFoundation.h>
31 #if ENABLE(JAVA_BINDINGS)
32 #include "jni_jsobject.h"
36 #include <wtf/HashSet.h>
37 #include <wtf/Noncopyable.h>
38 #include <wtf/RefCounted.h>
44 class RuntimeObjectImp
;
50 typedef PassRefPtr
<RootObject
> (*CreateRootObjectFunction
)(void* nativeHandle
);
51 typedef HashCountedSet
<JSObject
*> ProtectCountSet
;
53 extern RootObject
* findProtectingRootObject(JSObject
*);
54 extern RootObject
* findRootObject(JSGlobalObject
*);
56 class RootObject
: public RefCounted
<RootObject
> {
57 friend class JavaJSObject
;
62 static PassRefPtr
<RootObject
> create(const void* nativeHandle
, JSGlobalObject
*);
64 bool isValid() { return m_isValid
; }
67 void gcProtect(JSObject
*);
68 void gcUnprotect(JSObject
*);
69 bool gcIsProtected(JSObject
*);
71 const void* nativeHandle() const;
72 JSGlobalObject
* globalObject() const;
74 // Must be called from the thread that will be used to access JavaScript.
75 static void setCreateRootObject(CreateRootObjectFunction
);
76 static CreateRootObjectFunction
createRootObject() {
77 return _createRootObject
;
80 static CFRunLoopRef
runLoop() { return _runLoop
; }
81 static CFRunLoopSourceRef
performJavaScriptSource() { return _performJavaScriptSource
; }
83 #if ENABLE(JAVA_BINDINGS)
84 static void dispatchToJavaScriptThread(JSObjectCallContext
*context
);
87 void addRuntimeObject(RuntimeObjectImp
*);
88 void removeRuntimeObject(RuntimeObjectImp
*);
90 RootObject(const void* nativeHandle
, JSGlobalObject
*);
94 const void* m_nativeHandle
;
95 ProtectedPtr
<JSGlobalObject
> m_globalObject
;
96 ProtectCountSet m_protectCountSet
;
98 HashSet
<RuntimeObjectImp
*> m_runtimeObjects
;
100 static CreateRootObjectFunction _createRootObject
;
101 static CFRunLoopRef _runLoop
;
102 static CFRunLoopSourceRef _performJavaScriptSource
;
105 } // namespace Bindings
109 #endif // RUNTIME_ROOT_H_