[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677
rjw
rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 08:16:19 UTC 2009
The following commit has been merged in the debian/unstable branch:
commit 354412395cae8e09ff65b2afa08bafff24b1a9fc
Author: rjw <rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Dec 4 22:33:12 2003 +0000
WebCore:
Added support for named applet access from document node.
Factored creation of KJS::Values from RuntimeObjectImps.
Reviewed by Chris.
* khtml/ecma/kjs_dom.cpp:
(KJS::getDOMNamedNodeMap):
(KJS::getRuntimeObject):
* khtml/ecma/kjs_dom.h:
* khtml/ecma/kjs_html.cpp:
(KJS::HTMLDocument::tryGet):
(KJS::HTMLElement::tryGet):
(KJS::HTMLCollection::tryGet):
JavaScriptCore:
Added support for string conversions.
Changed various JavaString member variables to be inline.
Implemented defaultValue for context relevant type coercion.
Reviewed by Chris.
* bindings/jni/jni_class.cpp:
(JavaClass::JavaClass):
(JavaClass::setClassName):
(JavaClass::classForInstance):
* bindings/jni/jni_class.h:
* bindings/jni/jni_instance.cpp:
(JavaInstance::stringValue):
(JavaInstance::numberValue):
(JavaInstance::booleanValue):
(JavaInstance::invokeMethod):
* bindings/jni/jni_instance.h:
* bindings/jni/jni_runtime.cpp:
(JavaParameter::JavaParameter):
(JavaField::JavaField):
(JavaMethod::JavaMethod):
(appendClassName):
(JavaMethod::signature):
* bindings/jni/jni_runtime.h:
(Bindings::JavaString::JavaString):
(Bindings::JavaString::~JavaString):
(Bindings::JavaString::operator=):
(Bindings::JavaString::characters):
(Bindings::JavaParameter::JavaParameter):
(Bindings::JavaParameter::~JavaParameter):
(Bindings::JavaParameter::operator=):
(Bindings::JavaParameter::type):
(Bindings::JavaField::JavaField):
(Bindings::JavaField::~JavaField):
(Bindings::JavaField::operator=):
(Bindings::JavaField::name):
(Bindings::JavaField::type):
(Bindings::JavaMethod::JavaMethod):
(Bindings::JavaMethod::_commonDelete):
(Bindings::JavaMethod::name):
(Bindings::JavaMethod::returnType):
* bindings/jni/jni_utility.cpp:
(convertValueToJValue):
* bindings/runtime.h:
(Bindings::Instance::valueOf):
* bindings/runtime_method.cpp:
(RuntimeMethodImp::call):
* bindings/runtime_object.cpp:
(RuntimeObjectImp::RuntimeObjectImp):
(RuntimeObjectImp::get):
(RuntimeObjectImp::defaultValue):
* bindings/runtime_object.h:
(KJS::RuntimeObjectImp::classInfo):
Tests:
Added tests passing various parameters type to Java methods.
Reviewed by Chris.
* LiveConnect/Blink/Blink.java:
(Blink):
(Blink.setTextWithString):
(Blink.setTextWithNumberValueUsingByte):
(Blink.setTextWithNumberValueUsingShort):
(Blink.setTextWithNumberValueUsingInt):
(Blink.setTextWithNumberValueUsingLong):
(Blink.setTextWithNumberValueUsingFloat):
(Blink.setTextWithNumberValueUsingDouble):
(Blink.setTextWithNumberValueUsingChar):
(Blink.setTextWithNumberValueUsingBoolean):
* LiveConnect/Blink/Blink.pbproj/project.pbxproj:
* LiveConnect/Blink/test.html:
* PDFBundle/PDFBundle.pbproj/project.pbxproj:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@5696 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog
index 281a123..41edac2 100644
--- a/JavaScriptCore/ChangeLog
+++ b/JavaScriptCore/ChangeLog
@@ -1,3 +1,59 @@
+2003-12-04 Richard Williamson <rjw at apple.com>
+
+ Added support for string conversions.
+ Changed various JavaString member variables to be inline.
+ Implemented defaultValue for context relevant type coercion.
+
+ Reviewed by Chris.
+
+ * bindings/jni/jni_class.cpp:
+ (JavaClass::JavaClass):
+ (JavaClass::setClassName):
+ (JavaClass::classForInstance):
+ * bindings/jni/jni_class.h:
+ * bindings/jni/jni_instance.cpp:
+ (JavaInstance::stringValue):
+ (JavaInstance::numberValue):
+ (JavaInstance::booleanValue):
+ (JavaInstance::invokeMethod):
+ * bindings/jni/jni_instance.h:
+ * bindings/jni/jni_runtime.cpp:
+ (JavaParameter::JavaParameter):
+ (JavaField::JavaField):
+ (JavaMethod::JavaMethod):
+ (appendClassName):
+ (JavaMethod::signature):
+ * bindings/jni/jni_runtime.h:
+ (Bindings::JavaString::JavaString):
+ (Bindings::JavaString::~JavaString):
+ (Bindings::JavaString::operator=):
+ (Bindings::JavaString::characters):
+ (Bindings::JavaParameter::JavaParameter):
+ (Bindings::JavaParameter::~JavaParameter):
+ (Bindings::JavaParameter::operator=):
+ (Bindings::JavaParameter::type):
+ (Bindings::JavaField::JavaField):
+ (Bindings::JavaField::~JavaField):
+ (Bindings::JavaField::operator=):
+ (Bindings::JavaField::name):
+ (Bindings::JavaField::type):
+ (Bindings::JavaMethod::JavaMethod):
+ (Bindings::JavaMethod::_commonDelete):
+ (Bindings::JavaMethod::name):
+ (Bindings::JavaMethod::returnType):
+ * bindings/jni/jni_utility.cpp:
+ (convertValueToJValue):
+ * bindings/runtime.h:
+ (Bindings::Instance::valueOf):
+ * bindings/runtime_method.cpp:
+ (RuntimeMethodImp::call):
+ * bindings/runtime_object.cpp:
+ (RuntimeObjectImp::RuntimeObjectImp):
+ (RuntimeObjectImp::get):
+ (RuntimeObjectImp::defaultValue):
+ * bindings/runtime_object.h:
+ (KJS::RuntimeObjectImp::classInfo):
+
=== Safari-116 ===
2003-12-03 Richard Williamson <rjw at apple.com>
diff --git a/JavaScriptCore/bindings/jni/jni_class.cpp b/JavaScriptCore/bindings/jni/jni_class.cpp
index bfd200c..e0a9f17 100644
--- a/JavaScriptCore/bindings/jni/jni_class.cpp
+++ b/JavaScriptCore/bindings/jni/jni_class.cpp
@@ -87,6 +87,7 @@ JavaClass::JavaClass (const char *className)
JavaClass::JavaClass (jobject aClass)
{
+ _name = 0;
_commonInit (aClass);
}
@@ -113,6 +114,12 @@ JavaClass *JavaClass::classForName (const char *name)
return aClass;
}
+void JavaClass::setClassName (const char *n)
+{
+ free ((void *)_name);
+ _name = strdup(n);
+}
+
JavaClass *JavaClass::classForInstance (jobject instance)
{
_createClassesByNameIfNecessary();
@@ -126,6 +133,7 @@ JavaClass *JavaClass::classForInstance (jobject instance)
JavaClass *aClass = (JavaClass *)CFDictionaryGetValue(classesByName, stringName);
if (aClass == NULL) {
aClass = new JavaClass (classOfInstance);
+ aClass->setClassName(classNameC);
CFDictionaryAddValue (classesByName, stringName, aClass);
}
CFRelease (stringName);
diff --git a/JavaScriptCore/bindings/jni/jni_class.h b/JavaScriptCore/bindings/jni/jni_class.h
index 1f858f7..1932ad5 100644
--- a/JavaScriptCore/bindings/jni/jni_class.h
+++ b/JavaScriptCore/bindings/jni/jni_class.h
@@ -109,6 +109,8 @@ public:
virtual long numConstructors() const { return _numConstructors; };
+ void setClassName(const char *n);
+
private:
const char *_name;
CFDictionaryRef _fields;
diff --git a/JavaScriptCore/bindings/jni/jni_instance.cpp b/JavaScriptCore/bindings/jni/jni_instance.cpp
index cdc01d9..0a8b62f 100644
--- a/JavaScriptCore/bindings/jni/jni_instance.cpp
+++ b/JavaScriptCore/bindings/jni/jni_instance.cpp
@@ -53,6 +53,30 @@ Class *JavaInstance::getClass() const
return JavaClass::classForInstance (_instance->_instance);
}
+KJS::Value JavaInstance::stringValue() const
+{
+ jstring stringValue = (jstring)callJNIObjectMethod (_instance->_instance, "toString", "()Ljava/lang/String;");
+ JNIEnv *env = getJNIEnv();
+ const char *c = getCharactersFromJStringInEnv (env, stringValue);
+ KJS::String v(c);
+ releaseCharactersForJStringInEnv (env, stringValue, c);
+ return v;
+}
+
+KJS::Value JavaInstance::numberValue() const
+{
+ jdouble doubleValue = callJNIDoubleMethod (_instance->_instance, "doubleValue", "()D");
+ KJS::Number v(doubleValue);
+ return v;
+}
+
+KJS::Value JavaInstance::booleanValue() const
+{
+ jboolean booleanValue = callJNIBooleanMethod (_instance->_instance, "booleanValue", "()Z");
+ KJS::Boolean v(booleanValue);
+ return v;
+}
+
Value JavaInstance::invokeMethod (KJS::ExecState *exec, const Method *method, const List &args)
{
const JavaMethod *jMethod = static_cast<const JavaMethod*>(method);
@@ -69,7 +93,6 @@ Value JavaInstance::invokeMethod (KJS::ExecState *exec, const Method *method, co
jArgs = 0;
for (i = 0; i < count; i++) {
- fprintf (stderr, "%s: %d, type %d\n", __PRETTY_FUNCTION__, i, args.at(i).type());
JavaParameter *aParameter = static_cast<JavaParameter *>(jMethod->parameterAt(i));
jArgs[i] = convertValueToJValue (exec, args.at(i), aParameter);
}
diff --git a/JavaScriptCore/bindings/jni/jni_instance.h b/JavaScriptCore/bindings/jni/jni_instance.h
index 0ca9135..b63659e 100644
--- a/JavaScriptCore/bindings/jni/jni_instance.h
+++ b/JavaScriptCore/bindings/jni/jni_instance.h
@@ -82,6 +82,10 @@ public:
return *this;
};
+
+ virtual KJS::Value booleanValue() const;
+ virtual KJS::Value numberValue() const;
+ virtual KJS::Value stringValue() const;
jobject javaInstance() const { return _instance->_instance; }
diff --git a/JavaScriptCore/bindings/jni/jni_runtime.cpp b/JavaScriptCore/bindings/jni/jni_runtime.cpp
index b2b1f98..af7cebb 100644
--- a/JavaScriptCore/bindings/jni/jni_runtime.cpp
+++ b/JavaScriptCore/bindings/jni/jni_runtime.cpp
@@ -37,8 +37,8 @@ using namespace Bindings;
JavaParameter::JavaParameter (JNIEnv *env, jstring type)
{
- _type = new JavaString (env, type);
- _JNIType = primitiveTypeFromClassName (_type->characters());
+ _type = JavaString (env, type);
+ _JNIType = primitiveTypeFromClassName (_type.characters());
};
JavaField::JavaField (JNIEnv *env, jobject aField)
@@ -46,12 +46,12 @@ JavaField::JavaField (JNIEnv *env, jobject aField)
// Get field type
jobject fieldType = callJNIObjectMethod (aField, "getType", "()Ljava/lang/Class;");
jstring fieldTypeName = (jstring)callJNIObjectMethod (fieldType, "toString", "()Ljava/lang/String;");
- _type = new JavaString(env, fieldTypeName);
- _primitiveType = primitiveTypeFromClassName (_type->characters());
+ _type = JavaString(env, fieldTypeName);
+ _primitiveType = primitiveTypeFromClassName (_type.characters());
// Get field name
jstring fieldName = (jstring)callJNIObjectMethod (aField, "getName", "()Ljava/lang/String;");
- _name = new JavaString(env, fieldName);
+ _name = JavaString(env, fieldName);
_field = new JavaInstance(aField);
}
@@ -116,6 +116,16 @@ JavaConstructor::JavaConstructor (JNIEnv *env, jobject aConstructor)
JavaMethod::JavaMethod (JNIEnv *env, jobject aMethod)
{
+ // Get return type
+ jobject returnType = callJNIObjectMethod (aMethod, "getReturnType", "()Ljava/lang/Class;");
+ jstring returnTypeName = (jstring)callJNIObjectMethod (returnType, "getName", "()Ljava/lang/String;");
+ _returnType =JavaString (env, returnTypeName);
+ _JNIReturnType = primitiveTypeFromClassName (_returnType.characters());
+
+ // Get method name
+ jstring methodName = (jstring)callJNIObjectMethod (aMethod, "getName", "()Ljava/lang/String;");
+ _name = JavaString (env, methodName);
+
// Get parameters
jarray jparameters = (jarray)callJNIObjectMethod (aMethod, "getParameterTypes", "()[Ljava/lang/Class;");
_numParameters = env->GetArrayLength (jparameters);
@@ -128,20 +138,29 @@ JavaMethod::JavaMethod (JNIEnv *env, jobject aMethod)
_parameters[i] = JavaParameter(env, parameterName);
}
- // Get return type
- jobject returnType = callJNIObjectMethod (aMethod, "getReturnType", "()Ljava/lang/Class;");
- jstring returnTypeName = (jstring)callJNIObjectMethod (returnType, "getName", "()Ljava/lang/String;");
- _returnType = new JavaString (env, returnTypeName);
- _JNIReturnType = primitiveTypeFromClassName (_returnType->characters());
-
- // Get method name
- jstring methodName = (jstring)callJNIObjectMethod (aMethod, "getName", "()Ljava/lang/String;");
- _name = new JavaString (env, methodName);
// Created lazily.
_signature = 0;
}
+// JNI method signatures use '/' between components of a class name, but
+// we get '.' between components from the reflection API.
+static void appendClassName (UString *aString, const char *className)
+{
+ char *result, *cp = strdup(className);
+
+ result = cp;
+ while (*cp) {
+ if (*cp == '.')
+ *cp = '/';
+ cp++;
+ }
+
+ aString->append(result);
+
+ free (result);
+}
+
const char *JavaMethod::signature() const
{
if (_signature == 0){
@@ -150,14 +169,18 @@ const char *JavaMethod::signature() const
_signature = new UString("(");
for (i = 0; i < _numParameters; i++) {
JavaParameter *aParameter = static_cast<JavaParameter *>(parameterAt(i));
- _signature->append(signatureFromPrimitiveType (aParameter->getJNIType()));
- // FIXME! Add class description for object types.
+ JNIType _JNIType = aParameter->getJNIType();
+ _signature->append(signatureFromPrimitiveType (_JNIType));
+ if (_JNIType == object_type) {
+ appendClassName (_signature, aParameter->type());
+ _signature->append(";");
+ }
}
_signature->append(")");
_signature->append(signatureFromPrimitiveType (_JNIReturnType));
if (_JNIReturnType == object_type) {
- _signature->append(_returnType->characters());
+ appendClassName (_signature, _returnType.characters());
_signature->append(";");
}
}
diff --git a/JavaScriptCore/bindings/jni/jni_runtime.h b/JavaScriptCore/bindings/jni/jni_runtime.h
index de6287d..d9fcac1 100644
--- a/JavaScriptCore/bindings/jni/jni_runtime.h
+++ b/JavaScriptCore/bindings/jni/jni_runtime.h
@@ -42,53 +42,49 @@ namespace Bindings
class JavaString
{
public:
- JavaString () : _env(0), _characters(0), _jString(0) {};
+ JavaString () : _characters(0) {};
- JavaString (JNIEnv *e, jstring s) : _env(e), _jString(s) {
- _characters = getCharactersFromJStringInEnv (_env, s);
+ JavaString (JNIEnv *e, jstring s) {
+ const char *c = getCharactersFromJStringInEnv (e, s);
+ _characters = strdup(c);
+ releaseCharactersForJStringInEnv (e, s, c);
}
~JavaString () {
- releaseCharactersForJStringInEnv (_env, _jString, _characters);
+ free ((void *)_characters);
}
- JavaString(const JavaString &other) : _env(other._env), _jString (other._jString)
+ JavaString(const JavaString &other)
{
- _characters = getCharactersFromJStringInEnv (_env, _jString);
+ _characters = strdup (other._characters);
}
JavaString &operator=(const JavaString &other)
{
if (this == &other)
return *this;
-
- releaseCharactersForJStringInEnv (_env, _jString, _characters);
-
- _env = other._env;
- _jString = other._jString;
- _characters = getCharactersFromJStringInEnv (_env, _jString);
+
+ free ((void *)_characters);
+ _characters = strdup (other._characters);
return *this;
}
- const char *characters() { return _characters; }
+ const char *characters() const { return _characters; }
private:
- JNIEnv *_env;
const char *_characters;
- jstring _jString;
};
class JavaParameter : public Parameter
{
public:
- JavaParameter () : _type (0), _JNIType(invalid_type) {};
+ JavaParameter () : _JNIType(invalid_type) {};
JavaParameter (JNIEnv *env, jstring type);
~JavaParameter() {
- delete _type;
};
JavaParameter(const JavaParameter &other) : Parameter() {
@@ -100,21 +96,19 @@ public:
{
if (this == &other)
return *this;
-
- delete _type;
-
+
_type = other._type;
_JNIType = other._JNIType;
return *this;
}
- virtual RuntimeType type() const { return _type->characters(); }
+ virtual RuntimeType type() const { return _type.characters(); }
JNIType getJNIType() const { return _JNIType; }
private:
- JavaString *_type;
+ JavaString _type;
JNIType _JNIType;
};
@@ -168,11 +162,9 @@ private:
class JavaField : public Field
{
public:
- JavaField() : _name(0), _type(0), _field(0) {};
+ JavaField() : _field(0) {};
JavaField (JNIEnv *env, jobject aField);
~JavaField() {
- delete _name;
- delete _type;
delete _field;
};
@@ -184,8 +176,6 @@ public:
if (this == &other)
return *this;
- delete _name;
- delete _type;
delete _field;
_name = other._name;
@@ -197,12 +187,12 @@ public:
virtual KJS::Value valueFromInstance(const Instance *instance) const;
- virtual const char *name() const { return _name->characters(); }
- virtual RuntimeType type() const { return _type->characters(); }
+ virtual const char *name() const { return _name.characters(); }
+ virtual RuntimeType type() const { return _type.characters(); }
private:
- JavaString *_name;
- JavaString *_type;
+ JavaString _name;
+ JavaString _type;
JNIType _primitiveType;
JavaInstance *_field;
};
@@ -211,13 +201,11 @@ private:
class JavaMethod : public Method
{
public:
- JavaMethod() : Method(), _name(0), _signature(0), _returnType(0) {};
+ JavaMethod() : Method(), _signature(0) {};
JavaMethod (JNIEnv *env, jobject aMethod);
void _commonDelete() {
- delete _name;
- delete _returnType;
delete _signature;
delete [] _parameters;
};
@@ -255,8 +243,8 @@ public:
};
virtual KJS::Value value() const { return KJS::Value(0); }
- virtual const char *name() const { return _name->characters(); };
- virtual RuntimeType returnType() const { return _returnType->characters(); };
+ virtual const char *name() const { return _name.characters(); };
+ virtual RuntimeType returnType() const { return _returnType.characters(); };
virtual Parameter *parameterAt(long i) const { return &_parameters[i]; };
virtual long numParameters() const { return _numParameters; };
@@ -266,9 +254,9 @@ public:
private:
JavaParameter *_parameters;
long _numParameters;
- JavaString *_name;
+ JavaString _name;
mutable KJS::UString *_signature;
- JavaString *_returnType;
+ JavaString _returnType;
JNIType _JNIReturnType;
};
diff --git a/JavaScriptCore/bindings/jni/jni_utility.cpp b/JavaScriptCore/bindings/jni/jni_utility.cpp
index 7bbb016..3f767e4 100644
--- a/JavaScriptCore/bindings/jni/jni_utility.cpp
+++ b/JavaScriptCore/bindings/jni/jni_utility.cpp
@@ -480,13 +480,25 @@ jvalue convertValueToJValue (KJS::ExecState *exec, KJS::Value value, Bindings::J
d = value.toNumber(exec);
switch (aParameter->getJNIType()){
case object_type: {
- KJS::RuntimeObjectImp *imp = static_cast<KJS::RuntimeObjectImp*>(value.imp());
- if (imp) {
- Bindings::JavaInstance *instance = static_cast<Bindings::JavaInstance*>(imp->getInternalInstance());
- result.l = instance->javaInstance();
+ result.l = (jobject)0;
+
+ // First see if we have a Java instance.
+ if (value.type() == KJS::ObjectType){
+ KJS::ObjectImp *objectImp = static_cast<KJS::ObjectImp*>(value.imp());
+ if (strcmp(objectImp->classInfo()->className, "RuntimeObject") == 0) {
+ KJS::RuntimeObjectImp *imp = static_cast<KJS::RuntimeObjectImp *>(value.imp());
+ Bindings::JavaInstance *instance = static_cast<Bindings::JavaInstance*>(imp->getInternalInstance());
+ result.l = instance->javaInstance();
+ }
+ }
+
+ // Now convert value to a string if the target type is a java.lang.string.
+ if (result.l == 0 && strcmp(aParameter->type(), "java.lang.String") == 0) {
+ KJS::UString stringValue = value.toString(exec);
+ JNIEnv *env = getJNIEnv();
+ jobject javaString = env->functions->NewString (env, (const jchar *)stringValue.data(), stringValue.size());
+ result.l = javaString;
}
- else
- result.l = (jobject)0;
}
break;
diff --git a/JavaScriptCore/bindings/runtime.h b/JavaScriptCore/bindings/runtime.h
index 80154bc..03162fd 100644
--- a/JavaScriptCore/bindings/runtime.h
+++ b/JavaScriptCore/bindings/runtime.h
@@ -108,7 +108,12 @@ public:
virtual KJS::Value getValueOfField (const Field *aField) const;
virtual KJS::Value invokeMethod (KJS::ExecState *exec, const Method *method, const KJS::List &args) = 0;
-
+
+ virtual KJS::Value booleanValue() const = 0;
+ virtual KJS::Value numberValue() const = 0;
+ virtual KJS::Value stringValue() const = 0;
+ virtual KJS::Value valueOf() const { return KJS::String(getClass()->name()); };
+
virtual ~Instance() {};
};
diff --git a/JavaScriptCore/bindings/runtime_method.cpp b/JavaScriptCore/bindings/runtime_method.cpp
index aa81114..8435137 100644
--- a/JavaScriptCore/bindings/runtime_method.cpp
+++ b/JavaScriptCore/bindings/runtime_method.cpp
@@ -70,12 +70,10 @@ bool RuntimeMethodImp::implementsCall() const
Value RuntimeMethodImp::call(ExecState *exec, Object &thisObj, const List &args)
{
- fprintf(stderr,"%s: this=%p, %s, object = %p\n", __PRETTY_FUNCTION__, this, method->name(), &thisObj);
-
if (method) {
RuntimeObjectImp *imp = static_cast<RuntimeObjectImp*>(thisObj.imp());
if (imp) {
- imp->getInternalInstance()->invokeMethod(exec, method, args);
+ return imp->getInternalInstance()->invokeMethod(exec, method, args);
}
}
diff --git a/JavaScriptCore/bindings/runtime_object.cpp b/JavaScriptCore/bindings/runtime_object.cpp
index 3778424..20c227e 100644
--- a/JavaScriptCore/bindings/runtime_object.cpp
+++ b/JavaScriptCore/bindings/runtime_object.cpp
@@ -39,18 +39,12 @@
using namespace KJS;
using namespace Bindings;
-const ClassInfo *RuntimeObjectImp::classInfo() const
-{
- return &_classInfo;
-}
+const ClassInfo RuntimeObjectImp::info = {"RuntimeObject", 0, 0, 0};
RuntimeObjectImp::RuntimeObjectImp(ObjectImp *proto)
: ObjectImp(proto)
{
instance = 0;
- _classInfo.className = 0;
- _classInfo.parentClass = 0;
- _classInfo.propHashTable = 0;
}
RuntimeObjectImp::~RuntimeObjectImp()
@@ -63,20 +57,14 @@ RuntimeObjectImp::RuntimeObjectImp(Bindings::Instance *i, bool oi) : ObjectImp (
{
ownsInstance = oi;
instance = i;
- _classInfo.className = 0;
- _classInfo.parentClass = 0;
- _classInfo.propHashTable = 0;
_initializeClassInfoFromInstance();
}
Value RuntimeObjectImp::get(ExecState *exec, const Identifier &propertyName) const
{
- printf ("%s: %p: propertyName %s\n", __PRETTY_FUNCTION__, instance, propertyName.ascii());
- // Get the value of the RuntimeObject's property.
-
+ // See if the instance have a field with the specified name.
Field *aField = instance->getClass()->fieldNamed(propertyName.ascii());
if (aField){
- printf ("%s: found %s(%p), type = %s\n", __PRETTY_FUNCTION__, propertyName.ascii(), aField, aField->type());
return instance->getValueOfField (aField);
}
@@ -84,7 +72,6 @@ Value RuntimeObjectImp::get(ExecState *exec, const Identifier &propertyName) con
// that method.
Method *aMethod = instance->getClass()->methodNamed(propertyName.ascii());
if (aMethod) {
- printf ("%s: found %s(%p)\n", __PRETTY_FUNCTION__, propertyName.ascii(), aMethod);
return Object (new RuntimeMethodImp(exec, propertyName, aMethod));
}
@@ -125,8 +112,23 @@ bool RuntimeObjectImp::deleteProperty(ExecState *exec,
Value RuntimeObjectImp::defaultValue(ExecState *exec, Type hint) const
{
- printf ("%s: NOT YET IMPLEMENTED %p\n", __PRETTY_FUNCTION__, instance);
- return ObjectImp::defaultValue(exec, hint);
+ // Return a string representation of the instance.
+
+ // FIXME: Convert to appropriate type based on hint.
+ // If UnspecifiedType should only convert to string if
+ // native class is a string.
+ // FIXME defaultValue should move to Instance.
+ if (hint == StringType || hint == UnspecifiedType) {
+ return getInternalInstance()->stringValue();
+ }
+ else if (hint == NumberType) {
+ return getInternalInstance()->numberValue();
+ }
+ else if (hint == BooleanType) {
+ return getInternalInstance()->booleanValue();
+ }
+
+ return getInternalInstance()->valueOf();
}
void RuntimeObjectImp::_initializeClassInfoFromInstance()
diff --git a/JavaScriptCore/bindings/runtime_object.h b/JavaScriptCore/bindings/runtime_object.h
index 01725ae..51b392f 100644
--- a/JavaScriptCore/bindings/runtime_object.h
+++ b/JavaScriptCore/bindings/runtime_object.h
@@ -40,7 +40,7 @@ public:
RuntimeObjectImp(Bindings::Instance *i, bool ownsInstance = true);
- const ClassInfo *classInfo() const;
+ const ClassInfo *classInfo() const { return &info; }
virtual Value get(ExecState *exec, const Identifier &propertyName) const;
@@ -64,7 +64,7 @@ public:
private:
void _initializeClassInfoFromInstance();
- ClassInfo _classInfo;
+ static const ClassInfo info;
Bindings::Instance *instance;
bool ownsInstance;
};
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index ff6dc45..6e6b646 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,19 @@
+2003-12-04 Richard Williamson <rjw at apple.com>
+
+ Added support for named applet access from document node.
+ Factored creation of KJS::Values from RuntimeObjectImps.
+
+ Reviewed by Chris.
+
+ * khtml/ecma/kjs_dom.cpp:
+ (KJS::getDOMNamedNodeMap):
+ (KJS::getRuntimeObject):
+ * khtml/ecma/kjs_dom.h:
+ * khtml/ecma/kjs_html.cpp:
+ (KJS::HTMLDocument::tryGet):
+ (KJS::HTMLElement::tryGet):
+ (KJS::HTMLCollection::tryGet):
+
2003-12-04 Darin Adler <darin at apple.com>
Reviewed by John.
diff --git a/WebCore/khtml/ecma/kjs_dom.cpp b/WebCore/khtml/ecma/kjs_dom.cpp
index b19d78c..6612c2f 100644
--- a/WebCore/khtml/ecma/kjs_dom.cpp
+++ b/WebCore/khtml/ecma/kjs_dom.cpp
@@ -39,6 +39,12 @@
#include "kjs_dom.lut.h"
#include "khtmlpart_p.h"
+#include "html_objectimpl.h"
+
+#if APPLE_CHANGES
+#include <JavaScriptCore/runtime_object.h>
+#endif
+
using namespace KJS;
using DOM::DOMException;
@@ -1382,6 +1388,19 @@ Value KJS::getDOMNamedNodeMap(ExecState *exec, const DOM::NamedNodeMap &m)
return Value(cacheDOMObject<DOM::NamedNodeMap, KJS::DOMNamedNodeMap>(exec, m));
}
+Value KJS::getRuntimeObject(ExecState *exec, const DOM::Node &node)
+{
+ DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node);
+ DOM::HTMLAppletElementImpl *appletElement = static_cast<DOM::HTMLAppletElementImpl *>(element.handle());
+
+ if (appletElement->getAppletInstance()) {
+ // The instance is owned by the applet element.
+ RuntimeObjectImp *appletImp = new RuntimeObjectImp(appletElement->getAppletInstance(), false);
+ return Value(appletImp);
+ }
+ return Undefined();
+}
+
Value KJS::getDOMNodeList(ExecState *exec, const DOM::NodeList &l)
{
return Value(cacheDOMObject<DOM::NodeList, KJS::DOMNodeList>(exec, l));
diff --git a/WebCore/khtml/ecma/kjs_dom.h b/WebCore/khtml/ecma/kjs_dom.h
index d57f687..70edc26 100644
--- a/WebCore/khtml/ecma/kjs_dom.h
+++ b/WebCore/khtml/ecma/kjs_dom.h
@@ -255,6 +255,9 @@ namespace KJS {
Value getDOMDocumentNode(ExecState *exec, const DOM::Document &n);
bool checkNodeSecurity(ExecState *exec, const DOM::Node& n);
+#if APPLE_CHANGES
+ Value getRuntimeObject(ExecState *exec, const DOM::Node &n);
+#endif
Value getDOMNode(ExecState *exec, const DOM::Node &n);
Value getDOMNamedNodeMap(ExecState *exec, const DOM::NamedNodeMap &m);
Value getDOMNodeList(ExecState *exec, const DOM::NodeList &l);
diff --git a/WebCore/khtml/ecma/kjs_html.cpp b/WebCore/khtml/ecma/kjs_html.cpp
index de9a815..dce7bc2 100644
--- a/WebCore/khtml/ecma/kjs_html.cpp
+++ b/WebCore/khtml/ecma/kjs_html.cpp
@@ -50,9 +50,6 @@
#include <kdebug.h>
-#if APPLE_CHANGES
-#include <JavaScriptCore/runtime_object.h>
-#endif
using namespace KJS;
@@ -287,6 +284,17 @@ Value KJS::HTMLDocument::tryGet(ExecState *exec, const Identifier &propertyName)
//kdDebug(6070) << "KJS::HTMLDocument::tryGet " << propertyName.qstring() << " not found, returning element" << endl;
// image and form elements with the name p will be looked up last
+#if APPLE_CHANGES
+ // Look for named applets.
+ // FIXME: Factor code that creates RuntimeObjectImp for applet. It's also
+ // located in applets[0].
+ DOM::HTMLCollection applets = doc.applets();
+ DOM::HTMLElement anApplet = applets.namedItem (propertyName.string());
+ if (!anApplet.isNull()) {
+ return getRuntimeObject(exec,anApplet);
+ }
+#endif
+
DOM::HTMLDocumentImpl *docImpl = static_cast<DOM::HTMLDocumentImpl*>(node.handle());
if (!docImpl->haveNamedImageOrForm(propertyName.qstring())) {
return Undefined();
@@ -1112,16 +1120,12 @@ Value KJS::HTMLElement::tryGet(ExecState *exec, const Identifier &propertyName)
}
}
break;
+#if APPLE_CHANGES
case ID_APPLET: {
- DOM::HTMLAppletElementImpl *appletElement = static_cast<DOM::HTMLAppletElementImpl *>(element.handle());
-
- if (appletElement->getAppletInstance()) {
- // The instance is owned by the applet element.
- RuntimeObjectImp valueForApplet(appletElement->getAppletInstance(), false);
- return valueForApplet.get(exec,propertyName);
- }
+ return getRuntimeObject(exec,element);
}
break;
+#endif
default:
break;
}
@@ -2907,14 +2911,7 @@ Value KJS::HTMLCollection::tryGet(ExecState *exec, const Identifier &propertyNam
#if APPLE_CHANGES
if (node.handle()->id() == ID_APPLET) {
- DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node);
- DOM::HTMLAppletElementImpl *appletElement = static_cast<DOM::HTMLAppletElementImpl *>(element.handle());
-
- if (appletElement->getAppletInstance()) {
- // The instance is owned by the applet element.
- RuntimeObjectImp *appletImp = new RuntimeObjectImp(appletElement->getAppletInstance(), false);
- return Value(appletImp);
- }
+ return getRuntimeObject(exec,node);
}
#endif
return getDOMNode(exec,node);
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list