WebKit:
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Sep 2004 02:48:37 +0000 (02:48 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Sep 2004 02:48:37 +0000 (02:48 +0000)
        1.  Add class parameter to object allocation function.  This is somewhat redundant, given that
        the allocation function is in the class function vector, but people wanted to use the same
        allocation function for different classes.

        2.  Renamed NPN_Class to NPN_Invoke to match the name in the function vector.

        3.  Add support for a default function on an object.  This is a feature that ActiveX supports,
        and will allow JavaScript code to be written that will look exactly the same for both ActiveX
        plugins and Netscape or WebKit plugins.  There are implementations included for the 'C' and
        'Objective-C' bindings.

        There bugs are covered by

        <rdar://problem/3776343> Support for default functions in the JavaScript bindings
        <rdar://problem/3779186> NPN_Call needs to be renamed to NPN_Invoke
        <rdar://problem/3674754> Need to implement latest npruntime.h

        Reviewed by John.

        * Plugins.subproj/WebNetscapePluginPackage.m:
        (-[WebNetscapePluginPackage load]):
        * Plugins.subproj/WebScriptObject.h:
        * Plugins.subproj/npfunctions.h:
        * Plugins.subproj/npruntime.h:

JavaScriptCore:
        1.  Add class parameter to object allocation function.  This is somewhat redundant, given that
        the allocation function is in the class function vector, but people wanted to use the same
        allocation function for different classes.

        2.  Renamed NPN_Class to NPN_Invoke to match the name in the function vector.

        3.  Add support for a default function on an object.  This is a feature that ActiveX supports,
        and will allow JavaScript code to be written that will look exactly the same for both ActiveX
        plugins and Netscape or WebKit plugins.  There are implementations included for the 'C' and
        'Objective-C' bindings.

        There bugs are covered by

        <rdar://problem/3776343> Support for default functions in the JavaScript bindings
        <rdar://problem/3779186> NPN_Call needs to be renamed to NPN_Invoke
        <rdar://problem/3674754> Need to implement latest npruntime.h

        Reviewed by John.

        * bindings/NP_jsobject.cpp:
        (jsAllocate):
        (NPN_InvokeDefault):
        (NPN_Invoke):
        * bindings/c/c_class.cpp:
        * bindings/c/c_instance.cpp:
        (CInstance::CInstance):
        (CInstance::operator=):
        (CInstance::invokeMethod):
        (CInstance::invokeDefaultMethod):
        * bindings/c/c_instance.h:
        * bindings/c/c_runtime.cpp:
        * bindings/c/c_runtime.h:
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::invokeDefaultMethod):
        * bindings/jni/jni_instance.h:
        * bindings/npruntime.cpp:
        (NPN_CreateObject):
        * bindings/npruntime.h:
        * bindings/objc/WebScriptObject.h:
        * bindings/objc/objc_class.mm:
        (ObjcClass::fallbackObject):
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_instance.mm:
        (ObjcInstance::invokeDefaultMethod):
        * bindings/objc/objc_runtime.h:
        * bindings/objc/objc_runtime.mm:
        (ObjcFallbackObjectImp::ObjcFallbackObjectImp):
        (ObjcFallbackObjectImp::get):
        (ObjcFallbackObjectImp::put):
        (ObjcFallbackObjectImp::canPut):
        (ObjcFallbackObjectImp::implementsCall):
        (ObjcFallbackObjectImp::call):
        (ObjcFallbackObjectImp::hasProperty):
        (ObjcFallbackObjectImp::deleteProperty):
        (ObjcFallbackObjectImp::defaultValue):
        * bindings/runtime.h:
        (KJS::Bindings::Class::fallbackObject):
        (KJS::Bindings::Instance::getValueOfUndefinedField):
        (KJS::Bindings::Instance::setValueOfUndefinedField):
        (KJS::Bindings::Instance::valueOf):
        * bindings/runtime_object.cpp:
        (RuntimeObjectImp::implementsCall):
        (RuntimeObjectImp::call):
        * bindings/runtime_object.h:

WebKitExamples:
Reworked NetscapeMoviePlugIn to better test and illustrate
scripting APIs.

        Reviewed by John.

        * CarbonWeb/MyWebUIAdapter.m:
        (-[MyWebUIAdapter webView:runJavaScriptAlertPanelWithMessage:]):
        (-[MyWebUIAdapter webView:runJavaScriptConfirmPanelWithMessage:]):
        (-[MyWebUIAdapter webView:runJavaScriptTextInputPanelWithPrompt:defaultText:]):
        * CarbonWeb/TWebWindow.cp:
        * NetscapeMoviePlugIn/MovieObject.c: Added.
        (getMovieClass):
        (initializeIdentifiers):
        (movieHasProperty):
        (movieHasMethod):
        (movieGetProperty):
        (movieSetProperty):
        (movieInvoke):
        (movieInvokeDefault):
        (movieInvalidate):
        (movieAllocate):
        (movieDeallocate):
        (LoadMovieFromFile):
        (CreateMovieController):
        (UpdateMovieFrame):
        (PlayMovie):
        (PauseMovie):
        (IsMovieMuted):
        (SetMovieMuted):
        (DestroyMovie):
        (HandleMovieEvent):
        * NetscapeMoviePlugIn/MovieObject.h: Added.
        * NetscapeMoviePlugIn/NetscapeMoviePlugIn.xcode/project.pbxproj:
        * NetscapeMoviePlugIn/PluginObject.c: Added.
        (getPluginClass):
        (initializeIdentifiers):
        (pluginHasProperty):
        (pluginHasMethod):
        (pluginGetProperty):
        (pluginSetProperty):
        (pluginInvoke):
        (pluginInvokeDefault):
        (pluginInvalidate):
        (pluginAllocate):
        (pluginDeallocate):
        * NetscapeMoviePlugIn/PluginObject.h: Added.
        * NetscapeMoviePlugIn/main.c:
        (NP_Initialize):
        (NPP_New):
        (NPP_Destroy):
        (NPP_SetWindow):
        (NPP_StreamAsFile):
        (NPP_HandleEvent):
        (NPP_GetValue):
        (NPP_SetValue):
        * NetscapeMoviePlugIn/movie.h: Added.
        * NetscapeMoviePlugIn/movie.html:
        * makefile:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7565 268f45cc-cd09-0410-ab3c-d52691b4dbfc

25 files changed:
JavaScriptCore/ChangeLog
JavaScriptCore/bindings/NP_jsobject.cpp
JavaScriptCore/bindings/c/c_class.cpp
JavaScriptCore/bindings/c/c_instance.cpp
JavaScriptCore/bindings/c/c_instance.h
JavaScriptCore/bindings/c/c_runtime.cpp
JavaScriptCore/bindings/c/c_runtime.h
JavaScriptCore/bindings/jni/jni_instance.cpp
JavaScriptCore/bindings/jni/jni_instance.h
JavaScriptCore/bindings/npruntime.cpp
JavaScriptCore/bindings/npruntime.h
JavaScriptCore/bindings/objc/WebScriptObject.h
JavaScriptCore/bindings/objc/objc_class.mm
JavaScriptCore/bindings/objc/objc_instance.h
JavaScriptCore/bindings/objc/objc_instance.mm
JavaScriptCore/bindings/objc/objc_runtime.h
JavaScriptCore/bindings/objc/objc_runtime.mm
JavaScriptCore/bindings/runtime.h
JavaScriptCore/bindings/runtime_object.cpp
JavaScriptCore/bindings/runtime_object.h
WebKit/ChangeLog
WebKit/Plugins.subproj/WebNetscapePluginPackage.m
WebKit/Plugins.subproj/WebScriptObject.h
WebKit/Plugins.subproj/npfunctions.h
WebKit/Plugins.subproj/npruntime.h

index 744a4f8cfa774c2a122dfc2e03674c1682df6c03..2a270a219f46042ff7cdcffa2146555e6a3e82e9 100644 (file)
@@ -1,3 +1,70 @@
+2004-09-14  Richard Williamson   <rjw@apple.com>
+
+        1.  Add class parameter to object allocation function.  This is somewhat redundant, given that
+        the allocation function is in the class function vector, but people wanted to use the same
+        allocation function for different classes.
+        
+        2.  Renamed NPN_Class to NPN_Invoke to match the name in the function vector.
+        
+        3.  Add support for a default function on an object.  This is a feature that ActiveX supports,
+        and will allow JavaScript code to be written that will look exactly the same for both ActiveX
+        plugins and Netscape or WebKit plugins.  There are implementations included for the 'C' and
+        'Objective-C' bindings.
+        
+        There bugs are covered by
+        
+        <rdar://problem/3776343> Support for default functions in the JavaScript bindings
+        <rdar://problem/3779186> NPN_Call needs to be renamed to NPN_Invoke
+        <rdar://problem/3674754> Need to implement latest npruntime.h
+
+        Reviewed by John.
+
+        * bindings/NP_jsobject.cpp:
+        (jsAllocate):
+        (NPN_InvokeDefault):
+        (NPN_Invoke):
+        * bindings/c/c_class.cpp:
+        * bindings/c/c_instance.cpp:
+        (CInstance::CInstance):
+        (CInstance::operator=):
+        (CInstance::invokeMethod):
+        (CInstance::invokeDefaultMethod):
+        * bindings/c/c_instance.h:
+        * bindings/c/c_runtime.cpp:
+        * bindings/c/c_runtime.h:
+        * bindings/jni/jni_instance.cpp:
+        (JavaInstance::invokeDefaultMethod):
+        * bindings/jni/jni_instance.h:
+        * bindings/npruntime.cpp:
+        (NPN_CreateObject):
+        * bindings/npruntime.h:
+        * bindings/objc/WebScriptObject.h:
+        * bindings/objc/objc_class.mm:
+        (ObjcClass::fallbackObject):
+        * bindings/objc/objc_instance.h:
+        * bindings/objc/objc_instance.mm:
+        (ObjcInstance::invokeDefaultMethod):
+        * bindings/objc/objc_runtime.h:
+        * bindings/objc/objc_runtime.mm:
+        (ObjcFallbackObjectImp::ObjcFallbackObjectImp):
+        (ObjcFallbackObjectImp::get):
+        (ObjcFallbackObjectImp::put):
+        (ObjcFallbackObjectImp::canPut):
+        (ObjcFallbackObjectImp::implementsCall):
+        (ObjcFallbackObjectImp::call):
+        (ObjcFallbackObjectImp::hasProperty):
+        (ObjcFallbackObjectImp::deleteProperty):
+        (ObjcFallbackObjectImp::defaultValue):
+        * bindings/runtime.h:
+        (KJS::Bindings::Class::fallbackObject):
+        (KJS::Bindings::Instance::getValueOfUndefinedField):
+        (KJS::Bindings::Instance::setValueOfUndefinedField):
+        (KJS::Bindings::Instance::valueOf):
+        * bindings/runtime_object.cpp:
+        (RuntimeObjectImp::implementsCall):
+        (RuntimeObjectImp::call):
+        * bindings/runtime_object.h:
+
 2004-09-13  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Darin.
index 87a64802f296e33aeffa6951720a3a78a950f123..d41c43cd2d4154fbcfba53970ffe6735da439644 100644 (file)
@@ -46,7 +46,7 @@ static KJS::List listFromVariantArgs(KJS::ExecState *exec, const NPVariant *args
     return aList;
 }
 
-static NPObject *jsAllocate(NPP npp)
+static NPObject *jsAllocate(NPP npp, NPClass *aClass)
 {
     return (NPObject *)malloc(sizeof(JavaScriptObject));
 }
@@ -66,6 +66,7 @@ static NPClass _javascriptClass = {
     0,
     0,
     0,
+    0,
     0
 };
 
@@ -96,7 +97,22 @@ NPObject *_NPN_CreateScriptObject (NPP npp, KJS::ObjectImp *imp, KJS::Bindings::
     return (NPObject *)obj;
 }
 
-bool NPN_Call (NPP npp, NPObject *o, NPIdentifier methodName, const NPVariant *args, unsigned argCount, NPVariant *result)
+bool NPN_InvokeDefault (NPP npp, NPObject *o, const NPVariant *args, uint32_t argCount, NPVariant *result)
+{
+    if (o->_class == NPScriptObjectClass) {
+        // No notion of a default function on JS objects.  Just return false, can't handle.
+        return false;
+    }
+    else {
+        if (o->_class->invokeDefault) {
+            return o->_class->invokeDefault (o, args, argCount, result);
+        }
+    }
+    
+    return true;
+}
+
+bool NPN_Invoke (NPP npp, NPObject *o, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result)
 {
     if (o->_class == NPScriptObjectClass) {
         JavaScriptObject *obj = (JavaScriptObject *)o; 
index 59da418d4c4de425956a148cac626dd73ae2ff7a..43c406df0c4a61398602a35d90867dcd45aa85d5 100644 (file)
@@ -23,6 +23,8 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 #include <c_class.h>
+#include <c_instance.h>
+#include <c_runtime.h>
 
 using namespace KJS::Bindings;
 
index 25b10ea93e85c844342a5f05eaf44a75fdda0345..2010bba3d3711af9b4f5d5acc5d4d68c88c076b4 100644 (file)
@@ -44,6 +44,7 @@ using namespace KJS;
 CInstance::CInstance (NPObject *o) 
 {
     _object = NPN_RetainObject (o);
+    _class = 0;
 };
 
 CInstance::~CInstance () 
@@ -56,6 +57,7 @@ CInstance::~CInstance ()
 CInstance::CInstance (const CInstance &other) : Instance() 
 {
     _object = NPN_RetainObject (other._object);
+    _class = 0;
 };
 
 CInstance &CInstance::operator=(const CInstance &other){
@@ -65,6 +67,7 @@ CInstance &CInstance::operator=(const CInstance &other){
     NPObject *_oldObject = _object;
     _object= NPN_RetainObject (other._object);
     NPN_ReleaseObject (_oldObject);
+    _class = 0;
     
     return *this;
 };
@@ -124,12 +127,12 @@ Value CInstance::invokeMethod (KJS::ExecState *exec, const MethodList &methodLis
         NPN_ReleaseVariantValue (&cArgs[i]);
     }
 
+    if (cArgs != localBuffer)
+        free ((void *)cArgs);
+            
     if (!NPVARIANT_IS_VOID(resultVariant)) {
         resultValue = convertNPVariantToValue (exec, &resultVariant);
         
-        if (cArgs != localBuffer)
-            free ((void *)cArgs);
-            
         NPN_ReleaseVariantValue (&resultVariant);
         
         return resultValue;
@@ -139,6 +142,47 @@ Value CInstance::invokeMethod (KJS::ExecState *exec, const MethodList &methodLis
 }
 
 
+Value CInstance::invokeDefaultMethod (KJS::ExecState *exec, const List &args)
+{
+    Value resultValue;
+
+    if (_object->_class->invokeDefault) {     
+        unsigned i, count = args.size();
+        NPVariant *cArgs;
+        NPVariant localBuffer[128];
+        if (count > 128)
+            cArgs = (NPVariant *)malloc (sizeof(NPVariant)*count);
+        else
+            cArgs = localBuffer;
+        
+        for (i = 0; i < count; i++) {
+            convertValueToNPVariant (exec, args.at(i), &cArgs[i]);
+        }
+
+        // Invoke the 'C' method.
+        NPVariant resultVariant;
+        _object->_class->invokeDefault (_object, cArgs, count, &resultVariant);
+
+        for (i = 0; i < count; i++) {
+            NPN_ReleaseVariantValue (&cArgs[i]);
+        }
+
+        if (cArgs != localBuffer)
+            free ((void *)cArgs);
+                
+        if (!NPVARIANT_IS_VOID(resultVariant)) {
+            resultValue = convertNPVariantToValue (exec, &resultVariant);
+            
+            NPN_ReleaseVariantValue (&resultVariant);
+            
+            return resultValue;
+        }
+    }
+    
+    return Undefined();
+}
+
+
 KJS::Value CInstance::defaultValue (KJS::Type hint) const
 {
     if (hint == KJS::StringType) {
index 761593feaa58dba409673a5b528ef5967f474d74..780c58e0aa12d657ed167236878650e9713bfc1f 100644 (file)
@@ -51,14 +51,15 @@ public:
     virtual void begin();
     virtual void end();
     
-    virtual KJS::Value valueOf() const;
-    virtual KJS::Value defaultValue (KJS::Type hint) const;
+    virtual Value valueOf() const;
+    virtual Value defaultValue (KJS::Type hint) const;
 
-    virtual KJS::Value invokeMethod (KJS::ExecState *exec, const MethodList &method, const KJS::List &args);
+    virtual Value invokeMethod (ExecState *exec, const MethodList &method, const List &args);
+    virtual Value invokeDefaultMethod (ExecState *exec, const List &args);
 
-    KJS::Value stringValue() const;
-    KJS::Value numberValue() const;
-    KJS::Value booleanValue() const;
+    Value stringValue() const;
+    Value numberValue() const;
+    Value booleanValue() const;
     
     NPObject *getObject() const { return _object; }
 
index 5bbf51a237bd874445fabc4cf90401d37e3b35a8..65d03b9c58c122f76898848d7a662fdaf93457ed 100644 (file)
@@ -61,4 +61,3 @@ void CField::setValueToInstance(KJS::ExecState *exec, const Instance *inst, cons
 }
 
 // ---------------------- CArray ----------------------
-
index 6c0912e775c7096505aacbb0e8faf43590beed34..7b2d5323dffdaa99c55863d802c65b7c2f58c584 100644 (file)
@@ -39,6 +39,8 @@ class Value;
 namespace Bindings
 {
 
+class CInstance;
+
 class CField : public Field
 {
 public:
@@ -92,6 +94,7 @@ private:
 };
 #endif
 
+
 } // namespace Bindings
 
 } // namespace KJS
index 0ca317f6b2e2d8b4e71a17d839388c2aa6123f72..9fc2550db016f6ed30ad3fa91cca4e791b7edbb4 100644 (file)
@@ -297,6 +297,11 @@ Value JavaInstance::invokeMethod (KJS::ExecState *exec, const MethodList &method
     return resultValue;
 }
 
+KJS::Value JavaInstance::invokeDefaultMethod (KJS::ExecState *exec, const KJS::List &args)
+{
+    return Undefined();
+}
+
 
 KJS::Value JavaInstance::defaultValue (KJS::Type hint) const
 {
index ec324d6aa3cc79091fc4c931108714a63db7e528..a7ff27107b8320a2dbbca6e7735f42dbcfeb78fa 100644 (file)
@@ -90,19 +90,20 @@ public:
     virtual void begin();
     virtual void end();
     
-    virtual KJS::Value valueOf() const;
-    virtual KJS::Value defaultValue (KJS::Type hint) const;
+    virtual Value valueOf() const;
+    virtual Value defaultValue (Type hint) const;
 
-    virtual KJS::Value invokeMethod (KJS::ExecState *exec, const MethodList &method, const KJS::List &args);
+    virtual Value invokeMethod (ExecState *exec, const MethodList &method, const List &args);
+    virtual Value invokeDefaultMethod (ExecState *exec, const List &args);
 
     virtual void setExecutionContext (RootObject *r);
     virtual const RootObject *executionContext() const;
 
     jobject javaInstance() const { return _instance->_instance; }
     
-    KJS::Value stringValue() const;
-    KJS::Value numberValue() const;
-    KJS::Value booleanValue() const;
+    Value stringValue() const;
+    Value numberValue() const;
+    Value booleanValue() const;
         
 private:
     JObjectWrapper *_instance;
index 28511a4b2b37557b826c89e1231c93a2f05d5c14..7fc51774af96d81af73152810d4de0be2e3f8d9b 100644 (file)
@@ -378,7 +378,7 @@ NPObject *NPN_CreateObject (NPP npp, NPClass *aClass)
         NPObject *obj;
         
         if (aClass->allocate != NULL)
-            obj = aClass->allocate (npp);
+            obj = aClass->allocate (npp, aClass);
         else
             obj = (NPObject *)malloc (sizeof(NPObject));
             
index ccc181e91a2bb7f5e34f652fa41382412ce4db8c..c18f4fd24d7da3f77eea8bc0cfc77e8769e6375c 100644 (file)
@@ -235,11 +235,12 @@ int32_t NPN_IntFromIdentifier(NPIdentifier identifier);
     The NPVariant *result argument of these functions (where
     applicable) should be released using NPN_ReleaseVariantValue().
 */
-typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp);
+typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
 typedef void (*NPDeallocateFunctionPtr)(NPObject *obj);
 typedef void (*NPInvalidateFunctionPtr)(NPObject *obj);
 typedef bool (*NPHasMethodFunctionPtr)(NPClass *theClass, NPIdentifier name);
-typedef bool (*NPInvokeFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *args, unsigned argCount, NPVariant *result);
+typedef bool (*NPInvokeFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result);
+typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
 typedef bool (*NPHasPropertyFunctionPtr)(NPClass *theClass, NPIdentifier name);
 typedef bool (*NPGetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, NPVariant *result);
 typedef bool (*NPSetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *value);
@@ -269,6 +270,7 @@ struct NPClass
     NPInvalidateFunctionPtr invalidate;
     NPHasMethodFunctionPtr hasMethod;
     NPInvokeFunctionPtr invoke;
+    NPInvokeDefaultFunctionPtr invokeDefault;
     NPHasPropertyFunctionPtr hasProperty;
     NPGetPropertyFunctionPtr getProperty;
     NPSetPropertyFunctionPtr setProperty;
@@ -314,7 +316,8 @@ void NPN_ReleaseObject (NPObject *obj);
     Calls made from plugin code to script must be made from the thread
     on which the plugin was initialized.
 */
-bool NPN_Call(NPP npp, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
+bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
+bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
 bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script, NPVariant *result);
 bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, NPVariant *result);
 bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, const NPVariant *value);
index fd6ac9032ee8b2657b930557de3859c81c15a2b4..538eb5f9a13322e51c920e397a295da44ba49a02 100644 (file)
 */
 - (id)invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)args;
 
+/*!
+    @method invokeDefaultMethodWithArguments:
+    @param args The args to pass the method.
+    @discussion If a script attempts to invoke a method on an exposed object
+    directory this method will be called.
+*/
+- (id)invokeDefaultMethodWithArguments:(NSArray *)args;
+
 /*!
     @method finalizeForWebScript
     @discussion finalizeForScript is called on objects exposed to the script
index 122139184d2ad00376ce76448707290d00b30f0f..af0a0e678ccacf677ab2de516466229a73c66b4d 100644 (file)
@@ -234,5 +234,5 @@ Field *ObjcClass::fieldNamed(const char *name, Instance *instance) const
 
 KJS::Value ObjcClass::fallbackObject (ExecState *exec, Instance *instance, const Identifier &propertyName)
 {
-    return Object (new FallbackObjectImp(static_cast<ObjcInstance*>(instance), propertyName));
+    return Object (new ObjcFallbackObjectImp(static_cast<ObjcInstance*>(instance), propertyName));
 }
index b00376af03bb8bf2b8b26088d30319ddc7baf7d8..b55a689809098533e9d68ce4d26458af4f6c5ebc 100644 (file)
@@ -53,22 +53,23 @@ public:
     virtual void begin();
     virtual void end();
     
-    virtual KJS::Value valueOf() const;
-    virtual KJS::Value defaultValue (KJS::Type hint) const;
+    virtual Value valueOf() const;
+    virtual Value defaultValue (Type hint) const;
 
-    virtual KJS::Value invokeMethod (KJS::ExecState *exec, const MethodList &method, const KJS::List &args);
+    virtual Value invokeMethod (ExecState *exec, const MethodList &method, const List &args);
+    virtual Value invokeDefaultMethod (ExecState *exec, const List &args);
 
-    virtual void setValueOfField (KJS::ExecState *exec, const Field *aField, const KJS::Value &aValue) const;
-    virtual void setValueOfUndefinedField (KJS::ExecState *exec, const KJS::Identifier &property, const KJS::Value &aValue);
+    virtual void setValueOfField (ExecState *exec, const Field *aField, const Value &aValue) const;
+    virtual void setValueOfUndefinedField (ExecState *exec, const Identifier &property, const Value &aValue);
     
-    virtual Value ObjcInstance::getValueOfField (KJS::ExecState *exec, const Field *aField) const;
-    virtual KJS::Value getValueOfUndefinedField (KJS::ExecState *exec, const KJS::Identifier &property, KJS::Type hint) const;
+    virtual Value ObjcInstance::getValueOfField (ExecState *exec, const Field *aField) const;
+    virtual Value getValueOfUndefinedField (ExecState *exec, const Identifier &property, Type hint) const;
 
     ObjectStructPtr getObject() const { return _instance; }
     
-    KJS::Value stringValue() const;
-    KJS::Value numberValue() const;
-    KJS::Value booleanValue() const;
+    Value stringValue() const;
+    Value numberValue() const;
+    Value booleanValue() const;
     
     void setExecutionContext (RootObject *r) { _root = r; }
     const RootObject *executionContext() const { return _root; }
index 39ed147c2812ae71823ab759cca19b6946b3b44e..2064baa6b3e3c0852bef1ac34d46ba9cf310ed13 100644 (file)
@@ -244,6 +244,59 @@ NS_ENDHANDLER
     return resultValue;
 }
 
+Value ObjcInstance::invokeDefaultMethod (KJS::ExecState *exec, const List &args)
+{
+    Value resultValue;
+    
+NS_DURING
+
+    if (![_instance respondsToSelector:@selector(invokeDefaultMethodWithArguments:)])
+        return Undefined();
+    
+    NSMethodSignature *signature = [_instance methodSignatureForSelector:@selector(invokeDefaultMethodWithArguments:)];
+    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
+    [invocation setSelector:@selector(invokeDefaultMethodWithArguments:)];
+    [invocation setTarget:_instance];
+    unsigned i, count = args.size();
+    
+    // invokeDefaultMethodWithArguments: implementation must return an
+    // object.
+    if (strcmp ([signature methodReturnType], "@") != 0) {
+        OBJC_LOG ("incorrect signature for invokeDefaultMethodWithArguments:, expected object return type");
+        return Undefined();
+    }
+    
+    NSMutableArray *objcArgs = [NSMutableArray array];
+    for (i = 0; i < count; i++) {
+        ObjcValue value = convertValueToObjcValue (exec, args.at(i), ObjcObjectType);
+        [objcArgs addObject:value.objectValue];
+    }
+    [invocation setArgument:&objcArgs atIndex:2];
+    
+    // Invoke the ObjectiveC method.
+    [invocation invoke];
+
+    // Get the return value type, should always be "@" because of
+    // check above.
+    const char *type = [signature methodReturnType];
+    ObjcValueType objcValueType = objcValueTypeForType (type);
+    
+    // Get the return value and convert it to a KJS::Value.  Length
+    // of return value will never exceed the size of a pointer, so we're
+    // OK we 32 here.
+    char buffer[32];
+    [invocation getReturnValue:buffer];
+    resultValue = convertObjcValueToValue (exec, buffer, objcValueType);
+
+NS_HANDLER
+    
+    resultValue = Undefined();
+    
+NS_ENDHANDLER
+
+    return resultValue;
+}
+
 void ObjcInstance::setValueOfField (KJS::ExecState *exec, const Field *aField, const KJS::Value &aValue) const
 {
     aField->setValueToInstance (exec, this, aValue);
index d2af78139749bb4e38a54cfc9a97029fbf2921f8..fd4a81335de1603c0a904e932377fd1fb12b8f45 100644 (file)
@@ -161,11 +161,11 @@ private:
     ObjectStructPtr _array;
 };
 
-class FallbackObjectImp : public KJS::ObjectImp {
+class ObjcFallbackObjectImp : public KJS::ObjectImp {
 public:
-    FallbackObjectImp(ObjectImp *proto);
+    ObjcFallbackObjectImp(ObjectImp *proto);
         
-    FallbackObjectImp(ObjcInstance *i, const KJS::Identifier propertyName);
+    ObjcFallbackObjectImp(ObjcInstance *i, const KJS::Identifier propertyName);
 
     const ClassInfo *classInfo() const { return &info; }
 
index 0b867f71364d6482a521d78ba2413a306708aa8d..155a7a78a7d5901f246c0e40a65c5f5accebae5b 100644 (file)
@@ -253,42 +253,42 @@ unsigned int ObjcArray::getLength() const
 }
 
 
-const ClassInfo FallbackObjectImp::info = {"FallbackObject", 0, 0, 0};
+const ClassInfo ObjcFallbackObjectImp::info = {"ObjcFallbackObject", 0, 0, 0};
 
-FallbackObjectImp::FallbackObjectImp(ObjectImp *proto)
+ObjcFallbackObjectImp::ObjcFallbackObjectImp(ObjectImp *proto)
   : ObjectImp(proto)
 {
     _instance = 0;
 }
 
-FallbackObjectImp::FallbackObjectImp(ObjcInstance *i, const KJS::Identifier propertyName) : ObjectImp ((ObjectImp *)0)
+ObjcFallbackObjectImp::ObjcFallbackObjectImp(ObjcInstance *i, const KJS::Identifier propertyName) : ObjectImp ((ObjectImp *)0)
 {
     _instance = i;
     _item = propertyName;
 }
 
-Value FallbackObjectImp::get(ExecState *exec, const Identifier &propertyName) const
+Value ObjcFallbackObjectImp::get(ExecState *exec, const Identifier &propertyName) const
 {
     return Undefined();
 }
 
-void FallbackObjectImp::put(ExecState *exec, const Identifier &propertyName,
+void ObjcFallbackObjectImp::put(ExecState *exec, const Identifier &propertyName,
                  const Value &value, int attr)
 {
 }
 
-bool FallbackObjectImp::canPut(ExecState *exec, const Identifier &propertyName) const
+bool ObjcFallbackObjectImp::canPut(ExecState *exec, const Identifier &propertyName) const
 {
     return false;
 }
 
 
-bool FallbackObjectImp::implementsCall() const
+bool ObjcFallbackObjectImp::implementsCall() const
 {
     return true;
 }
 
-Value FallbackObjectImp::call(ExecState *exec, Object &thisObj, const List &args)
+Value ObjcFallbackObjectImp::call(ExecState *exec, Object &thisObj, const List &args)
 {
     Value result = Undefined();
     
@@ -317,19 +317,19 @@ Value FallbackObjectImp::call(ExecState *exec, Object &thisObj, const List &args
     return result;
 }
 
-bool FallbackObjectImp::hasProperty(ExecState *exec,
+bool ObjcFallbackObjectImp::hasProperty(ExecState *exec,
                          const Identifier &propertyName) const
 {
     return false;
 }
 
-bool FallbackObjectImp::deleteProperty(ExecState *exec,
+bool ObjcFallbackObjectImp::deleteProperty(ExecState *exec,
                             const Identifier &propertyName)
 {
     return false;
 }
 
-Value FallbackObjectImp::defaultValue(ExecState *exec, Type hint) const
+Value ObjcFallbackObjectImp::defaultValue(ExecState *exec, Type hint) const
 {
     return _instance->getValueOfUndefinedField(exec, _item, hint);
 }
index 56d4160c97e1409fe50a56dcf033f4e30bf6f935..9aa1dc153dac75b57bc05b38f240d66431ac43a5 100644 (file)
@@ -68,8 +68,8 @@ public:
     virtual const char *name() const = 0;
     virtual RuntimeType type() const = 0;
 
-    virtual KJS::Value valueFromInstance(KJS::ExecState *exec, const Instance *instance) const = 0;
-    virtual void setValueToInstance(KJS::ExecState *exec, const Instance *instance, const KJS::Value &aValue) const = 0;
+    virtual KJS::Value valueFromInstance(ExecState *exec, const Instance *instance) const = 0;
+    virtual void setValueToInstance(ExecState *exec, const Instance *instance, const Value &aValue) const = 0;
 
     virtual ~Field() {};
 };
@@ -117,12 +117,12 @@ public:
     
     virtual Field *fieldNamed(const char *name, Instance *instance) const = 0;
 
-    virtual Value fallbackObject(KJS::ExecState *exec, Bindings::Instance *instance, const KJS::Identifier &propertyName) { return Undefined(); }
+    virtual Value fallbackObject(ExecState *exec, Bindings::Instance *instance, const Identifier &propertyName) { return Undefined(); }
     
     virtual ~Class() {};
 };
 
-typedef void (*KJSDidExecuteFunctionPtr)(KJS::ExecState *exec, KJS::ObjectImp *rootObject);
+typedef void (*KJSDidExecuteFunctionPtr)(ExecState *exec, ObjectImp *rootObject);
 
 class Instance
 {
@@ -148,16 +148,17 @@ public:
     
     virtual Class *getClass() const = 0;
     
-    virtual KJS::Value getValueOfField (KJS::ExecState *exec, const Field *aField) const;
-    virtual KJS::Value getValueOfUndefinedField (KJS::ExecState *exec, const KJS::Identifier &property, KJS::Type hint) const { return Undefined(); };
-    virtual void setValueOfField (KJS::ExecState *exec, const Field *aField, const KJS::Value &aValue) const;
-    virtual void setValueOfUndefinedField (KJS::ExecState *exec, const KJS::Identifier &property, const KJS::Value &aValue) {};
+    virtual Value getValueOfField (ExecState *exec, const Field *aField) const;
+    virtual Value getValueOfUndefinedField (ExecState *exec, const Identifier &property, Type hint) const { return Undefined(); };
+    virtual void setValueOfField (ExecState *exec, const Field *aField, const Value &aValue) const;
+    virtual void setValueOfUndefinedField (ExecState *exec, const Identifier &property, const Value &aValue) {};
     
-    virtual KJS::Value invokeMethod (KJS::ExecState *exec, const MethodList &method, const KJS::List &args) = 0;
+    virtual Value invokeMethod (ExecState *exec, const MethodList &method, const List &args) = 0;
+    virtual Value invokeDefaultMethod (ExecState *exec, const List &args) = 0;
     
-    virtual KJS::Value defaultValue (KJS::Type hint) const = 0;
+    virtual Value defaultValue (Type hint) const = 0;
     
-    virtual KJS::Value valueOf() const { return KJS::String(getClass()->name()); };
+    virtual Value valueOf() const { return String(getClass()->name()); };
     
     virtual void setExecutionContext (RootObject *r) = 0;
     virtual const RootObject *executionContext () const = 0;
@@ -170,8 +171,8 @@ private:
 class Array
 {
 public:
-    virtual void setValueAt(KJS::ExecState *exec, unsigned int index, const KJS::Value &aValue) const = 0;
-    virtual KJS::Value valueAt(KJS::ExecState *exec, unsigned int index) const = 0;
+    virtual void setValueAt(ExecState *exec, unsigned int index, const Value &aValue) const = 0;
+    virtual Value valueAt(ExecState *exec, unsigned int index) const = 0;
     virtual unsigned int getLength() const = 0;
     virtual ~Array() {};
 };
index 8d8c359283ec67bd6d376abd7c07411356e541ec..08385c972e1e25172a5c4c1e2947eaa72cb48959 100644 (file)
@@ -163,3 +163,20 @@ Value RuntimeObjectImp::defaultValue(ExecState *exec, Type hint) const
     return aValue;
 }
     
+bool RuntimeObjectImp::implementsCall() const
+{
+    // Only true for default functions.
+    return true;
+}
+
+Value RuntimeObjectImp::call(ExecState *exec, Object &thisObj, const List &args)
+{
+    instance->begin();
+
+    Value aValue = getInternalInstance()->invokeDefaultMethod(exec, args);
+    
+    instance->end();
+    
+    return aValue;
+}
+
index 9fdcd021d5b4a8b235f722ba634a7e3b4ca704e1..cd06816812d1409f3774564a0b5627e88ed2d633 100644 (file)
@@ -59,6 +59,9 @@ public:
     void setInternalInstance (Bindings::Instance *i) { instance = i; }
     Bindings::Instance *getInternalInstance() const { return instance; }
 
+    virtual bool implementsCall() const;
+    virtual Value call(ExecState *exec, Object &thisObj, const List &args);
+
 private:
     
     static const ClassInfo info;
index 6f96aae3d267f86d56011ab5f11b0334a401f633..0497407f6b8721558d0da1a1c3dd2747c710e6d6 100644 (file)
@@ -1,3 +1,30 @@
+2004-09-14  Richard Williamson   <rjw@apple.com>
+
+        1.  Add class parameter to object allocation function.  This is somewhat redundant, given that
+        the allocation function is in the class function vector, but people wanted to use the same
+        allocation function for different classes.
+        
+        2.  Renamed NPN_Class to NPN_Invoke to match the name in the function vector.
+        
+        3.  Add support for a default function on an object.  This is a feature that ActiveX supports,
+        and will allow JavaScript code to be written that will look exactly the same for both ActiveX
+        plugins and Netscape or WebKit plugins.  There are implementations included for the 'C' and
+        'Objective-C' bindings.
+        
+        There bugs are covered by
+        
+        <rdar://problem/3776343> Support for default functions in the JavaScript bindings
+        <rdar://problem/3779186> NPN_Call needs to be renamed to NPN_Invoke
+        <rdar://problem/3674754> Need to implement latest npruntime.h
+
+        Reviewed by John.
+
+        * Plugins.subproj/WebNetscapePluginPackage.m:
+        (-[WebNetscapePluginPackage load]):
+        * Plugins.subproj/WebScriptObject.h:
+        * Plugins.subproj/npfunctions.h:
+        * Plugins.subproj/npruntime.h:
+
 2004-09-13  Richard Williamson   <rjw@apple.com>
 
         D'oh.  How many times can I screw up a simple fix!
index 32de6abc1843291a52cbd8abee628d6891a9c5dd..dce9aa950da950e6aab2f84147b8837ea75488d0 100644 (file)
@@ -457,7 +457,8 @@ static TransitionVector tVectorForFunctionPointer(FunctionPointer);
         browserFuncs.createobject = (NPN_CreateObjectProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_CreateObject);
         browserFuncs.retainobject = (NPN_RetainObjectProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_RetainObject);
         browserFuncs.releaseobject = (NPN_ReleaseObjectProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_ReleaseObject);
-        browserFuncs.call = (NPN_CallProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_Call);
+        browserFuncs.invoke = (NPN_InvokeProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_Invoke);
+        browserFuncs.invokeDefault = (NPN_InvokeDefaultProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_InvokeDefault);
         browserFuncs.evaluate = (NPN_EvaluateProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_Evaluate);
         browserFuncs.getproperty = (NPN_GetPropertyProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetProperty);
         browserFuncs.setproperty = (NPN_SetPropertyProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_SetProperty);
@@ -551,7 +552,8 @@ static TransitionVector tVectorForFunctionPointer(FunctionPointer);
         browserFuncs.createobject = NPN_CreateObject;
         browserFuncs.retainobject = NPN_RetainObject;
         browserFuncs.releaseobject = NPN_ReleaseObject;
-        browserFuncs.call = NPN_Call;
+        browserFuncs.invoke = NPN_Invoke;
+        browserFuncs.invokeDefault = NPN_InvokeDefault;
         browserFuncs.evaluate = NPN_Evaluate;
         browserFuncs.getproperty = NPN_GetProperty;
         browserFuncs.setproperty = NPN_SetProperty;
index fd6ac9032ee8b2657b930557de3859c81c15a2b4..538eb5f9a13322e51c920e397a295da44ba49a02 100644 (file)
 */
 - (id)invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)args;
 
+/*!
+    @method invokeDefaultMethodWithArguments:
+    @param args The args to pass the method.
+    @discussion If a script attempts to invoke a method on an exposed object
+    directory this method will be called.
+*/
+- (id)invokeDefaultMethodWithArguments:(NSArray *)args;
+
 /*!
     @method finalizeForWebScript
     @discussion finalizeForScript is called on objects exposed to the script
index 4af2daacd04ecc9056977ec32a59f6110263813a..d1cd83e04112234540d5db1d5bdcd427939284a0 100644 (file)
@@ -42,7 +42,8 @@ typedef NPUTF8 *(*NPN_UTF8FromIdentifierProcPtr) (NPIdentifier identifier);
 typedef NPObject* (*NPN_CreateObjectProcPtr) (NPP, NPClass *aClass);
 typedef NPObject* (*NPN_RetainObjectProcPtr) (NPObject *obj);
 typedef void (*NPN_ReleaseObjectProcPtr) (NPObject *obj);
-typedef bool (*NPN_CallProcPtr) (NPP npp, NPObject *obj, NPIdentifier methodName, const NPVariant *args, unsigned argCount, NPVariant *result);
+typedef bool (*NPN_InvokeProcPtr) (NPP npp, NPObject *obj, NPIdentifier methodName, const NPVariant *args, unsigned argCount, NPVariant *result);
+typedef bool (*NPN_InvokeDefaultProcPtr) (NPP npp, NPObject *obj, const NPVariant *args, unsigned argCount, NPVariant *result);
 typedef bool (*NPN_EvaluateProcPtr) (NPP npp, NPObject *obj, NPString *script, NPVariant *result);
 typedef bool (*NPN_GetPropertyProcPtr) (NPP npp, NPObject *obj, NPIdentifier  propertyName, NPVariant *result);
 typedef bool (*NPN_SetPropertyProcPtr) (NPP npp, NPObject *obj, NPIdentifier  propertyName, const NPVariant *value);
@@ -104,7 +105,8 @@ typedef struct _NPNetscapeFuncs {
     NPN_CreateObjectProcPtr createobject;
     NPN_RetainObjectProcPtr retainobject;
     NPN_ReleaseObjectProcPtr releaseobject;
-    NPN_CallProcPtr call;
+    NPN_InvokeProcPtr invoke;
+    NPN_InvokeDefaultProcPtr invokeDefault;
     NPN_EvaluateProcPtr evaluate;
     NPN_GetPropertyProcPtr getproperty;
     NPN_SetPropertyProcPtr setproperty;
index ccc181e91a2bb7f5e34f652fa41382412ce4db8c..c18f4fd24d7da3f77eea8bc0cfc77e8769e6375c 100644 (file)
@@ -235,11 +235,12 @@ int32_t NPN_IntFromIdentifier(NPIdentifier identifier);
     The NPVariant *result argument of these functions (where
     applicable) should be released using NPN_ReleaseVariantValue().
 */
-typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp);
+typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
 typedef void (*NPDeallocateFunctionPtr)(NPObject *obj);
 typedef void (*NPInvalidateFunctionPtr)(NPObject *obj);
 typedef bool (*NPHasMethodFunctionPtr)(NPClass *theClass, NPIdentifier name);
-typedef bool (*NPInvokeFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *args, unsigned argCount, NPVariant *result);
+typedef bool (*NPInvokeFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result);
+typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
 typedef bool (*NPHasPropertyFunctionPtr)(NPClass *theClass, NPIdentifier name);
 typedef bool (*NPGetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, NPVariant *result);
 typedef bool (*NPSetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *value);
@@ -269,6 +270,7 @@ struct NPClass
     NPInvalidateFunctionPtr invalidate;
     NPHasMethodFunctionPtr hasMethod;
     NPInvokeFunctionPtr invoke;
+    NPInvokeDefaultFunctionPtr invokeDefault;
     NPHasPropertyFunctionPtr hasProperty;
     NPGetPropertyFunctionPtr getProperty;
     NPSetPropertyFunctionPtr setProperty;
@@ -314,7 +316,8 @@ void NPN_ReleaseObject (NPObject *obj);
     Calls made from plugin code to script must be made from the thread
     on which the plugin was initialized.
 */
-bool NPN_Call(NPP npp, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
+bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
+bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
 bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script, NPVariant *result);
 bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, NPVariant *result);
 bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, const NPVariant *value);