| /* | |
| * Copyright 2007 Google Inc. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not | |
| * use this file except in compliance with the License. You may obtain a copy of | |
| * the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |
| * License for the specific language governing permissions and limitations under | |
| * the License. | |
| */ | |
| #include "DispWrapper.h" | |
| #include "FunctionObject.h" | |
| using namespace KJS; | |
| const ClassInfo DispWrapper::info = {"DispWrapper", 0, 0, 0}; | |
| JSValue *DispWrapper::getter(ExecState* exec, JSObject* thisObj, | |
| const Identifier& propertyName, const PropertySlot& slot) | |
| { | |
| TRACE("ENTER DispWrapper::getter"); | |
| if (propertyName.ustring() == "toString") { | |
| return new ToStringFunction(); | |
| } | |
| if (thisObj->classInfo() == &DispWrapper::info) { | |
| DispWrapper* dispWrap = static_cast<DispWrapper*>(thisObj); | |
| jobject dispObj = dispWrap->dispObj; | |
| jstring jpropName = gEnv->NewString((const jchar*)propertyName.data(), | |
| propertyName.size()); | |
| if (!jpropName || gEnv->ExceptionCheck()) { | |
| gEnv->ExceptionClear(); | |
| return jsUndefined(); | |
| } | |
| jint result = gEnv->CallIntMethod(dispObj, gGetFieldMeth, jpropName); | |
| if (!result || gEnv->ExceptionCheck()) { | |
| gEnv->ExceptionClear(); | |
| return jsUndefined(); | |
| } | |
| TRACE("SUCCESS DispWrapper::getter"); | |
| return (JSValue*)result; | |
| } | |
| return jsUndefined(); | |
| } | |
| /* | |
| * Construct a JavaScript wrapper around a WebKitDispatchAdapter object. | |
| * | |
| * dispObj a GlobalRef to the Java object to wrap | |
| */ | |
| DispWrapper::DispWrapper(jobject dispObj): dispObj(dispObj) { } | |
| /* | |
| * Free GlobalRef on the underlying WebKitDispatchAdapter object. | |
| */ | |
| DispWrapper::~DispWrapper() { | |
| gEnv->DeleteGlobalRef(dispObj); | |
| } | |
| bool DispWrapper::getOwnPropertySlot(ExecState *exec, | |
| const Identifier& propertyName, PropertySlot& slot) | |
| { | |
| slot.setCustom(this, getter); | |
| return true; | |
| } | |
| /* | |
| * Tells JavaScript that we can store properties into this object. | |
| * Note that we do not verify the property exists, so we | |
| * | |
| * exec JS execution state | |
| * proeprtyName the property to be updated | |
| */ | |
| bool DispWrapper::canPut(ExecState *exec, const Identifier &propertyName) | |
| const | |
| { | |
| return true; | |
| } | |
| /* | |
| * Store a value into a field on a Java object. | |
| * | |
| * exec JS execution state | |
| * propertyName the name of the field | |
| * value the JS value to store in the field | |
| * attr unused attributes of the property | |
| * | |
| * Silently catches any Java exceptions in WebKitDispatchAdapter.setField(), | |
| * including undefined fields, so updates to undefined fields in Java objects | |
| * will be silently ignored. TODO: is that the desired behavior? | |
| */ | |
| void DispWrapper::put(ExecState *exec, const Identifier &propertyName, | |
| JSValue *value, int attr) | |
| { | |
| TRACE("ENTER DispWrapper::put"); | |
| jstring jpropName = gEnv->NewString((const jchar*)propertyName.data(), | |
| propertyName.size()); | |
| if (!jpropName || gEnv->ExceptionCheck()) { | |
| gEnv->ExceptionClear(); | |
| return; | |
| } | |
| gwtGCProtect(value); // Java will take ownership of this value | |
| gEnv->CallVoidMethod(dispObj, gSetFieldMeth, jpropName, (jint)value); | |
| if (gEnv->ExceptionCheck()) { | |
| gEnv->ExceptionClear(); | |
| return; | |
| } | |
| TRACE("SUCCESS DispWrapper::put"); | |
| } | |
| /* | |
| * Prevent JavaScript from deleting fields from a Java object. | |
| */ | |
| bool DispWrapper::deleteProperty(ExecState *exec, | |
| const Identifier &propertyName) | |
| { | |
| return false; | |
| } | |
| /* | |
| * Return a string representation of the Java object. | |
| * Calls obj.toString() on the Java object. | |
| * | |
| * exec JS execution state | |
| * hint unused | |
| * | |
| * Returns undefined if toString() failed, or the string returned (which may | |
| * be null). | |
| */ | |
| JSValue *DispWrapper::defaultValue(ExecState *exec, JSType hint) const { | |
| jstring result = (jstring)gEnv->CallObjectMethod(dispObj, gToStringMeth); | |
| if (gEnv->ExceptionCheck()) { | |
| return jsUndefined(); | |
| } else if (!result) { | |
| return jsNull(); | |
| } else { | |
| JStringWrap jresult(gEnv, result); | |
| return jsString(UString((const UChar*)jresult.jstr(), jresult.length())); | |
| } | |
| } | |
| /* | |
| * Tell JavaScript that this object does not implement call functionality. | |
| */ | |
| bool DispWrapper::implementsCall() const { | |
| return false; | |
| } | |
| /* | |
| * Prevent JavaScript from calling the WebKitDispatchAdapter object | |
| * as if it were a function. | |
| */ | |
| JSValue *DispWrapper::callAsFunction(ExecState *, JSObject *, const List &) { | |
| return jsUndefined(); | |
| } |