2011-01-07 Adam Barth <abarth@webkit.org>
[WebKit-https.git] / Source / WebCore / bridge / jsc / BridgeJSC.h
1 /*
2  * Copyright (C) 2003, 2008, 2009 Apple Inc. All rights reserved.
3  * Copyright 2010, The Android Open Source Project
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef BridgeJSC_h
28 #define BridgeJSC_h
29
30 #if USE(JSC)
31
32 #include <runtime/JSString.h>
33 #include <wtf/HashMap.h>
34 #include <wtf/RefCounted.h>
35 #include <wtf/Vector.h>
36
37 namespace JSC  {
38
39 class ArgList;
40 class Identifier;
41 class JSGlobalObject;
42 class PropertyNameArray;
43 class RuntimeMethod;
44
45 namespace Bindings {
46
47 class Instance;
48 class Method;
49 class RootObject;
50 class RuntimeObject;
51
52 typedef Vector<Method*> MethodList;
53
54 class Field {
55 public:
56     virtual JSValue valueFromInstance(ExecState*, const Instance*) const = 0;
57     virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const = 0;
58
59     virtual ~Field() { }
60 };
61
62 class Class : public Noncopyable {
63 public:
64     virtual MethodList methodsNamed(const Identifier&, Instance*) const = 0;
65     virtual Field* fieldNamed(const Identifier&, Instance*) const = 0;
66     virtual JSValue fallbackObject(ExecState*, Instance*, const Identifier&) { return jsUndefined(); }
67
68     virtual ~Class() { }
69 };
70
71 typedef void (*KJSDidExecuteFunctionPtr)(ExecState*, JSObject* rootObject);
72
73 class Instance : public RefCounted<Instance> {
74 public:
75     Instance(PassRefPtr<RootObject>);
76
77     static void setDidExecuteFunction(KJSDidExecuteFunctionPtr func);
78     static KJSDidExecuteFunctionPtr didExecuteFunction();
79
80     // These functions are called before and after the main entry points into
81     // the native implementations.  They can be used to establish and cleanup
82     // any needed state.
83     void begin();
84     void end();
85
86     virtual Class* getClass() const = 0;
87     JSObject* createRuntimeObject(ExecState*);
88     void willInvalidateRuntimeObject(RuntimeObject*);
89     void willDestroyRuntimeObject(RuntimeObject*);
90
91     // Returns false if the value was not set successfully.
92     virtual bool setValueOfUndefinedField(ExecState*, const Identifier&, JSValue) { return false; }
93
94     virtual JSValue getMethod(ExecState* exec, const Identifier& propertyName) = 0;
95     virtual JSValue invokeMethod(ExecState*, RuntimeMethod* method) = 0;
96
97     virtual bool supportsInvokeDefaultMethod() const { return false; }
98     virtual JSValue invokeDefaultMethod(ExecState*) { return jsUndefined(); }
99
100     virtual bool supportsConstruct() const { return false; }
101     virtual JSValue invokeConstruct(ExecState*, const ArgList&) { return JSValue(); }
102
103     virtual void getPropertyNames(ExecState*, PropertyNameArray&) { }
104
105     virtual JSValue defaultValue(ExecState*, PreferredPrimitiveType) const = 0;
106
107     virtual JSValue valueOf(ExecState* exec) const = 0;
108
109     RootObject* rootObject() const;
110
111     virtual ~Instance();
112
113     virtual bool getOwnPropertySlot(JSObject*, ExecState*, const Identifier&, PropertySlot&) { return false; }
114     virtual bool getOwnPropertyDescriptor(JSObject*, ExecState*, const Identifier&, PropertyDescriptor&) { return false; }
115     virtual void put(JSObject*, ExecState*, const Identifier&, JSValue, PutPropertySlot&) { }
116
117 protected:
118     virtual void virtualBegin() { }
119     virtual void virtualEnd() { }
120     virtual RuntimeObject* newRuntimeObject(ExecState*);
121
122     RefPtr<RootObject> m_rootObject;
123
124 private:
125     WeakGCPtr<RuntimeObject> m_runtimeObject;
126 };
127
128 class Array : public Noncopyable {
129 public:
130     Array(PassRefPtr<RootObject>);
131     virtual ~Array();
132
133     virtual void setValueAt(ExecState*, unsigned index, JSValue) const = 0;
134     virtual JSValue valueAt(ExecState*, unsigned index) const = 0;
135     virtual unsigned int getLength() const = 0;
136
137 protected:
138     RefPtr<RootObject> m_rootObject;
139 };
140
141 const char* signatureForParameters(const ArgList&);
142
143 typedef HashMap<RefPtr<StringImpl>, MethodList*> MethodListMap;
144 typedef HashMap<RefPtr<StringImpl>, Method*> MethodMap;
145 typedef HashMap<RefPtr<StringImpl>, Field*> FieldMap;
146
147 } // namespace Bindings
148
149 } // namespace JSC
150
151 #endif // USE(JSC)
152
153 #endif