[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