d1a6460b854f3bb42c37dbc6dc3a5ac61789a162
[WebKit-https.git] / JavaScriptGlue / JSValueWrapper.cpp
1 //
2 // JSValueWrapper.cpp
3 //
4 #include "JSValueWrapper.h"
5 #include "JavaScriptCore/reference_list.h"
6
7 JSValueWrapper::JSValueWrapper(ValueImp *inValue, ExecState *inExec)
8     : fValue(inValue), fExec(inExec)
9 {
10 }
11
12 JSValueWrapper::~JSValueWrapper()
13 {
14 }
15
16 ValueImp *JSValueWrapper::GetValue()
17 {
18     return fValue;
19 }
20 ExecState* JSValueWrapper::GetExecState() const
21 {
22     return fExec;
23 }
24
25
26 void JSValueWrapper::GetJSObectCallBacks(JSObjectCallBacks& callBacks)
27 {
28     callBacks.dispose = (JSObjectDisposeProcPtr)JSValueWrapper::JSObjectDispose;
29     callBacks.equal = (JSObjectEqualProcPtr)0;
30     callBacks.copyPropertyNames = (JSObjectCopyPropertyNamesProcPtr)JSValueWrapper::JSObjectCopyPropertyNames;
31     callBacks.copyCFValue = (JSObjectCopyCFValueProcPtr)JSValueWrapper::JSObjectCopyCFValue;
32     callBacks.copyProperty = (JSObjectCopyPropertyProcPtr)JSValueWrapper::JSObjectCopyProperty;
33     callBacks.setProperty = (JSObjectSetPropertyProcPtr)JSValueWrapper::JSObjectSetProperty;
34     callBacks.callFunction = (JSObjectCallFunctionProcPtr)JSValueWrapper::JSObjectCallFunction;
35 }
36
37 void JSValueWrapper::JSObjectDispose(void *data)
38 {
39     JSValueWrapper* ptr = (JSValueWrapper*)data;
40     delete ptr;
41 }
42
43
44 CFArrayRef JSValueWrapper::JSObjectCopyPropertyNames(void *data)
45 {
46     JSLock lock;
47
48     CFMutableArrayRef result = 0;
49     JSValueWrapper* ptr = (JSValueWrapper*)data;
50     if (ptr)
51     {
52         ExecState* exec = ptr->GetExecState();
53         ObjectImp *object = ptr->GetValue()->toObject(exec);
54         ReferenceList list = object->propList(exec);
55         ReferenceListIterator iterator = list.begin();
56
57         while (iterator != list.end()) {
58             Identifier name = iterator->getPropertyName(exec);
59             CFStringRef nameStr = IdentifierToCFString(name);
60
61             if (!result)
62             {
63                 result = CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks);
64             }
65             if (result && nameStr)
66             {
67                 CFArrayAppendValue(result, nameStr);
68             }
69             ReleaseCFType(nameStr);
70             iterator++;
71         }
72
73     }
74     return result;
75 }
76
77
78 JSObjectRef JSValueWrapper::JSObjectCopyProperty(void *data, CFStringRef propertyName)
79 {
80     JSLock lock;
81
82     JSObjectRef result = 0;
83     JSValueWrapper* ptr = (JSValueWrapper*)data;
84     if (ptr)
85     {
86         ExecState* exec = ptr->GetExecState();
87         ValueImp *propValue = ptr->GetValue()->toObject(exec)->get(exec, CFStringToIdentifier(propertyName));
88         JSValueWrapper* wrapperValue = new JSValueWrapper(propValue, exec);
89
90         JSObjectCallBacks callBacks;
91         GetJSObectCallBacks(callBacks);
92         result = JSObjectCreateInternal(wrapperValue, &callBacks, JSValueWrapper::JSObjectMark, kJSUserObjectDataTypeJSValueWrapper);
93
94         if (!result)
95         {
96             delete wrapperValue;
97         }
98     }
99     return result;
100 }
101
102 void JSValueWrapper::JSObjectSetProperty(void *data, CFStringRef propertyName, JSObjectRef jsValue)
103 {
104     JSLock lock;
105
106     JSValueWrapper* ptr = (JSValueWrapper*)data;
107     if (ptr)
108     {
109         ExecState* exec = ptr->GetExecState();
110         ValueImp *value = JSObjectKJSValue((JSUserObject*)jsValue);
111         ObjectImp *objValue = ptr->GetValue()->toObject(exec);
112         objValue->put(exec, CFStringToIdentifier(propertyName), value);
113     }
114 }
115
116 JSObjectRef JSValueWrapper::JSObjectCallFunction(void *data, JSObjectRef thisObj, CFArrayRef args)
117 {
118     JSLock lock;
119
120     JSObjectRef result = 0;
121     JSValueWrapper* ptr = (JSValueWrapper*)data;
122     if (ptr)
123     {
124         ExecState* exec = ptr->GetExecState();
125
126         ValueImp *value = JSObjectKJSValue((JSUserObject*)thisObj);
127         ObjectImp *ksjThisObj = value->toObject(exec);
128         ObjectImp *objValue = ptr->GetValue()->toObject(exec);
129
130         List listArgs;
131         CFIndex argCount = args ? CFArrayGetCount(args) : 0;
132         for (CFIndex i = 0; i < argCount; i++)
133         {
134             JSObjectRef jsArg = (JSObjectRef)CFArrayGetValueAtIndex(args, i);
135             ValueImp *kgsArg = JSObjectKJSValue((JSUserObject*)jsArg);
136             listArgs.append(kgsArg);
137         }
138
139         ValueImp *resultValue = objValue->call(exec, ksjThisObj, listArgs);
140         JSValueWrapper* wrapperValue = new JSValueWrapper(resultValue, ptr->GetExecState());
141         JSObjectCallBacks callBacks;
142         GetJSObectCallBacks(callBacks);
143         result = JSObjectCreate(wrapperValue, &callBacks);
144         if (!result)
145         {
146             delete wrapperValue;
147         }
148     }
149     return result;
150 }
151
152 CFTypeRef JSValueWrapper::JSObjectCopyCFValue(void *data)
153 {
154     JSLock lock;
155
156     CFTypeRef result = 0;
157     JSValueWrapper* ptr = (JSValueWrapper*)data;
158     if (ptr)
159     {
160         result = KJSValueToCFType(ptr->fValue, ptr->fExec);
161     }
162     return result;
163 }
164
165 void JSValueWrapper::JSObjectMark(void *data)
166 {
167     JSValueWrapper* ptr = (JSValueWrapper*)data;
168     if (ptr)
169     {
170         ptr->fValue->mark();
171     }
172 }