bbfb828072afdee84d6e9e9d5f452e2487f30e4a
[WebKit-https.git] / JavaScriptCore / bindings / runtime_root.h
1 /*
2  * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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. 
24  */
25 #ifndef _RUNTIME_ROOT_H_
26 #define _RUNTIME_ROOT_H_
27
28 #include <JavaScriptCore/interpreter.h>
29 #include <JavaScriptCore/object.h>
30 #include <JavaScriptCore/jni_jsobject.h>
31
32 namespace KJS {
33
34 namespace Bindings {
35
36 class RootObject;
37
38 typedef RootObject *(*FindRootObjectForNativeHandleFunctionPtr)(void *);
39
40 extern CFMutableDictionaryRef findReferenceDictionary(ObjectImp *imp);
41 extern const Bindings::RootObject *rootForImp (ObjectImp *imp);
42 extern const Bindings::RootObject *KJS::Bindings::rootForInterpreter (KJS::Interpreter *interpreter);
43 extern void addNativeReference (const Bindings::RootObject *root, ObjectImp *imp);
44 extern void removeNativeReference (ObjectImp *imp);
45
46 class RootObject
47 {
48 friend class JSObject;
49 public:
50     RootObject (const void *nativeHandle) : _nativeHandle(nativeHandle), _imp(0), _interpreter(0) {}
51     ~RootObject (){
52 #if !USE_CONSERVATIVE_GC
53         _imp->deref();
54 #endif
55 #if USE_CONSERVATIVE_GC | TEST_CONSERVATIVE_GC
56         gcUnprotect(_imp);
57 #endif
58     }
59     
60     void setRootObjectImp (KJS::ObjectImp *i) { 
61         _imp = i;
62 #if !USE_CONSERVATIVE_GC
63         _imp->ref();
64
65 #endif
66 #if USE_CONSERVATIVE_GC | TEST_CONSERVATIVE_GC
67         gcProtect(_imp);
68 #endif
69     }
70     
71     KJS::ObjectImp *rootObjectImp() const { return _imp; }
72     
73     void setInterpreter (KJS::Interpreter *i);
74     KJS::Interpreter *interpreter() const { return _interpreter; }
75
76     void removeAllNativeReferences ();
77
78
79     // Must be called from the thread that will be used to access JavaScript.
80     static void setFindRootObjectForNativeHandleFunction(FindRootObjectForNativeHandleFunctionPtr aFunc);
81     static FindRootObjectForNativeHandleFunctionPtr findRootObjectForNativeHandleFunction() {
82         return _findRootObjectForNativeHandleFunctionPtr;
83     }
84     
85     static CFRunLoopRef runLoop() { return _runLoop; }
86     static CFRunLoopSourceRef performJavaScriptSource() { return _performJavaScriptSource; }
87     
88     static void dispatchToJavaScriptThread(JSObjectCallContext *context);
89     
90     const void *nativeHandle() const { return _nativeHandle; }
91
92 private:
93     const void *_nativeHandle;
94     KJS::ObjectImp *_imp;
95     KJS::Interpreter *_interpreter;
96
97     static FindRootObjectForNativeHandleFunctionPtr _findRootObjectForNativeHandleFunctionPtr;
98     static CFRunLoopRef _runLoop;
99     static CFRunLoopSourceRef _performJavaScriptSource;
100 };
101
102 } // namespace Bindings
103
104 } // namespace KJS
105
106 #endif