gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Gnash-commit] gnash ChangeLog server/asobj/ContextMenu.cpp te...


From: Sandro Santilli
Subject: Re: [Gnash-commit] gnash ChangeLog server/asobj/ContextMenu.cpp te...
Date: Thu, 8 Mar 2007 10:50:35 +0100

Just a note on this commit (for Martin, but not only).

You will note that this is yet another flavor of an ActionScript class.
This version doesn't conform with what's output by gen-asclass.sh.
The only difference is with layout of functions. In this commit all
functions but the entry-point required for the dynamic load of the
class (contextmenu_class_init) are class methods. This approach provides
a better access control and cleaner C++ design. Also, functions to get the
exported interface and attach it to an object have a name that doesn't include
the name of the class in them (a minor thing but that can help when copy&pasting
around).

I think the important thing to document and get right is just the
external interfaces, which is the <whatever>_class_init, the class constructor
properly calling as_object() and passing it the exported interface, the
ensure<whatever> dynamic checker for the 'this_ptr' and use of fn_call by
the actual ActionScript functions.

--strk;


On Wed, Mar 07, 2007 at 10:47:53PM +0000, Sandro Santilli wrote:
> CVSROOT:      /sources/gnash
> Module name:  gnash
> Changes by:   Sandro Santilli <strk>  07/03/07 22:47:53
> 
> Modified files:
>       .              : ChangeLog 
>       server/asobj   : ContextMenu.cpp 
>       testsuite/actionscript.all: ContextMenu.as 
> 
> Log message:
>               * server/asobj/ContextMenu.cpp: Some more stubs.
>               * testsuite/actionscript.all/ContextMenu.as: Some more tests.
> 
> CVSWeb URLs:
> http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2571&r2=1.2572
> http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/ContextMenu.cpp?cvsroot=gnash&r1=1.7&r2=1.8
> http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/ContextMenu.as?cvsroot=gnash&r1=1.8&r2=1.9
> 
> Patches:
> Index: ChangeLog
> ===================================================================
> RCS file: /sources/gnash/gnash/ChangeLog,v
> retrieving revision 1.2571
> retrieving revision 1.2572
> diff -u -b -r1.2571 -r1.2572
> --- ChangeLog 7 Mar 2007 19:46:46 -0000       1.2571
> +++ ChangeLog 7 Mar 2007 22:47:52 -0000       1.2572
> @@ -1,5 +1,7 @@
>  2007-03-07 Sandro Santilli <address@hidden>
>  
> +     * server/asobj/ContextMenu.cpp: Some more stubs.
> +     * testsuite/actionscript.all/ContextMenu.as: Some more tests.
>       * server/as_value.cpp (to_bool) don't choke
>         when converting a movieclip value to a boolean.
>       * testsuite/actionscript.all/Boolean.as:
> 
> Index: server/asobj/ContextMenu.cpp
> ===================================================================
> RCS file: /sources/gnash/gnash/server/asobj/ContextMenu.cpp,v
> retrieving revision 1.7
> retrieving revision 1.8
> diff -u -b -r1.7 -r1.8
> --- server/asobj/ContextMenu.cpp      4 Mar 2007 01:39:01 -0000       1.7
> +++ server/asobj/ContextMenu.cpp      7 Mar 2007 22:47:53 -0000       1.8
> @@ -26,76 +26,157 @@
>  #include "fn_call.h"
>  #include "smart_ptr.h" // for boost intrusive_ptr
>  #include "builtin_function.h" // need builtin_function
> +#include "GnashException.h"
>  
>  namespace gnash {
>  
> -void contextmenu_copy(const fn_call& fn);
> -void contextmenu_hidebuiltinitems(const fn_call& fn);
> -void contextmenu_ctor(const fn_call& fn);
> -
> -static void
> -attachContextMenuInterface(as_object& o)
> -{
> -     o.init_member("copy", new builtin_function(contextmenu_copy));
> -     o.init_member("hideBuiltInItems", new 
> builtin_function(contextmenu_hidebuiltinitems));
> -}
> -
> -static as_object*
> -getContextMenuInterface()
> -{
> -     static boost::intrusive_ptr<as_object> o;
> -     if ( ! o )
> -     {
> -             o = new as_object();
> -             attachContextMenuInterface(*o);
> -     }
> -     return o.get();
> -}
> -
> -class contextmenu_as_object: public as_object
> +class ContextMenu: public as_object
>  {
>  
>  public:
>  
> -     contextmenu_as_object()
> +     ContextMenu()
>               :
> -             as_object(getContextMenuInterface())
> +             as_object(getExportedInterface())
>       {}
>  
> +     ContextMenu(const as_value& callback)
> +             :
> +             as_object(getExportedInterface())
> +     {
> +             setCallback(callback);
> +     }
> +
> +     ContextMenu(as_function* callback)
> +             :
> +             as_object(getExportedInterface())
> +     {
> +             setCallback(callback);
> +     }
> +
> +     static void registerConstructor(as_object& global);
> +
>       // override from as_object ?
>       //const char* get_text_value() const { return "ContextMenu"; }
>  
>       // override from as_object ?
>       //double get_numeric_value() const { return 0; }
> +
> +private:
> +
> +     /// Get the callback to call when user invokes the context menu.
> +     //
> +     /// If NULL, no action will be taken on select.
> +     ///
> +     as_function* getCallback() 
> +     {
> +             as_value tmp;
> +             if (  get_member("onSelect", &tmp) )
> +                     return tmp.to_as_function();
> +             else return NULL;
> +     }
> +
> +     /// Set the callback to call when user invokes the context menu.
> +     //
> +     /// @param callback
> +     ///     The function to call. If the value is not a function, no
> +     ///     action will be taken on select.
> +     ///
> +     void setCallback(const as_value& callback)
> +     {
> +             set_member("onSelect", callback);
> +     }
> +
> +     static ContextMenu* ensureContextMenu(as_object* obj)
> +     {
> +             ContextMenu* ret = dynamic_cast<ContextMenu*>(obj);
> +             if ( ! ret )
> +             {
> +                     throw ActionException("builtin method or gettersetter 
> for ContextMenu objects called against non-ContextMenu instance");
> +             }
> +             return ret;
> +     }
> +
> +     /// Attach the exported interface of this ActionScript class
> +     /// to the given object.
> +     static void attachExportedInterface(as_object& o);
> +
> +     /// Get the ContextMenu.prototype ActionScript object
> +     static as_object* getExportedInterface();
> +
> +     static void ctor_method(const fn_call& fn);
> +
> +     static void hideBuiltInItems_method(const fn_call& fn);
> +
> +     static void copy_method(const fn_call& fn);
>  };
>  
> -void contextmenu_copy(const fn_call& /*fn*/) {
> -    log_warning("%s: unimplemented \n", __FUNCTION__);
> +/* static private */
> +void
> +ContextMenu::attachExportedInterface(as_object& o)
> +{
> +     o.init_member("copy", new builtin_function(ContextMenu::copy_method));
> +     o.init_member("hideBuiltInItems", new 
> builtin_function(ContextMenu::hideBuiltInItems_method));
>  }
> -void contextmenu_hidebuiltinitems(const fn_call& /*fn*/) {
> -    log_warning("%s: unimplemented \n", __FUNCTION__);
> +
> +/* static private */
> +as_object*
> +ContextMenu::getExportedInterface()
> +{
> +     static boost::intrusive_ptr<as_object> o;
> +     if ( ! o )
> +     {
> +             o = new as_object();
> +             attachExportedInterface(*o);
> +     }
> +     return o.get();
>  }
>  
> +
> +/* static private */
>  void
> -contextmenu_ctor(const fn_call& fn)
> +ContextMenu::copy_method(const fn_call& fn)
>  {
> -     boost::intrusive_ptr<as_object> obj = new contextmenu_as_object;
> +     ContextMenu* ptr = ensureContextMenu(fn.this_ptr);
> +     UNUSED(ptr);
> +     log_warning("%s: unimplemented", __FUNCTION__);
> +}
> +
> +/* static private */
> +void
> +ContextMenu::hideBuiltInItems_method(const fn_call& fn)
> +{
> +     ContextMenu* ptr = ensureContextMenu(fn.this_ptr);
> +     UNUSED(ptr);
> +     log_warning("%s: unimplemented", __FUNCTION__);
> +}
> +
> +/* static private */
> +void
> +ContextMenu::ctor_method(const fn_call& fn)
> +{
> +     boost::intrusive_ptr<as_object> obj;
> +     if ( fn.nargs > 0 )
> +                     obj = new ContextMenu(fn.arg(0));
> +     else
> +             obj = new ContextMenu();
>       
>       fn.result->set_as_object(obj.get()); // will keep alive
>  }
>  
> -// extern (used by Global.cpp)
> -void contextmenu_class_init(as_object& global)
> +/* static public */
> +void
> +ContextMenu::registerConstructor(as_object& global)
>  {
>       // This is going to be the global ContextMenu "class"/"function"
>       static boost::intrusive_ptr<builtin_function> cl;
>  
>       if ( cl == NULL )
>       {
> -             cl=new builtin_function(&contextmenu_ctor, 
> getContextMenuInterface());
> +             cl=new builtin_function(ContextMenu::ctor_method, 
> ContextMenu::getExportedInterface());
>               // replicate all interface to class, to be able to access
>               // all methods as static functions
> -             attachContextMenuInterface(*cl);
> +             ContextMenu::attachExportedInterface(*cl);
>                    
>       }
>  
> @@ -104,6 +185,12 @@
>  
>  }
>  
> +// extern (used by Global.cpp)
> +void contextmenu_class_init(as_object& global)
> +{
> +     ContextMenu::registerConstructor(global);
> +}
> +
>  
>  } // end of gnash namespace
>  
> 
> Index: testsuite/actionscript.all/ContextMenu.as
> ===================================================================
> RCS file: /sources/gnash/gnash/testsuite/actionscript.all/ContextMenu.as,v
> retrieving revision 1.8
> retrieving revision 1.9
> diff -u -b -r1.8 -r1.9
> --- testsuite/actionscript.all/ContextMenu.as 11 Jan 2007 12:15:03 -0000      
> 1.8
> +++ testsuite/actionscript.all/ContextMenu.as 7 Mar 2007 22:47:53 -0000       
> 1.9
> @@ -1,5 +1,5 @@
>  // 
> -//   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
> +//   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
>  //
>  // This program is free software; you can redistribute it and/or modify
>  // it under the terms of the GNU General Public License as published by
> @@ -20,17 +20,13 @@
>  // compile this test case with Ming makeswf, and then
>  // execute it like this gnash -1 -r 0 -v out.swf
>  
> -rcsid="$Id: ContextMenu.as,v 1.8 2007/01/11 12:15:03 strk Exp $";
> +rcsid="$Id: ContextMenu.as,v 1.9 2007/03/07 22:47:53 strk Exp $";
>  
>  #include "check.as"
>  
>  #if OUTPUT_VERSION < 7
>  
> -// there was no ContextMenu before SWF7, still
> -// it seems the player allows instantiating one (?)
> -xcheck_equals(typeof(ContextMenu), 'function');
> -var contextmenuObj = new ContextMenu;
> -xcheck_equals (typeof(contextmenuObj), 'object');
> +note("You can't rely on availability of ContextMenu class with an SWF < 7");
>  
>  #else // OUTPUT_VERSION >= 7
>  
> @@ -44,7 +40,40 @@
>  
>  // test the ContextMenu::copy method
>  check_equals (typeof(contextmenuObj.copy), 'function');
> +
>  // test the ContextMenu::hideBuiltinItems method
>  check_equals (typeof(contextmenuObj.hideBuiltInItems), 'function');
>  
> +// test existance of ContextMenu::builtInItems object
> +xcheck_equals (typeof(contextmenuObj.builtInItems), 'object');
> +check ( ! contextmenuObj.builtInItems instanceOf Array );
> +check_equals (typeof(contextmenuObj.builtInItems.length), 'undefined');
> +
> +// test existance of ContextMenu::customItems object
> +xcheck_equals (typeof(contextmenuObj.customItems), 'object');
> +check ( ! contextmenuObj.builtInItems instanceOf Array );
> +xcheck_equals (typeof(contextmenuObj.customItems.length), 'number');
> +
> +// test existance of ContextMenu::onSelect object
> +check_equals (typeof(contextmenuObj.onSelect), 'undefined');
> +
> +//----------------------------------------------
> +// Test onSelect
> +//----------------------------------------------
> +
> +function callback() { }
> +var contextMenuObj2 = new ContextMenu(callback);
> +check_equals(typeof(contextMenuObj2.onSelect), 'function');
> +check_equals(contextMenuObj2.onSelect, callback);
> +function callback2() { }
> +contextMenuObj2.onSelect = callback2;
> +check_equals(typeof(contextMenuObj2.onSelect), 'function');
> +check_equals(contextMenuObj2.onSelect, callback2);
> +contextMenuObj2.onSelect = null;
> +check_equals(typeof(contextMenuObj2.onSelect), 'null');
> +contextMenuObj2.onSelect = undefined;
> +check_equals(typeof(contextMenuObj2.onSelect), 'undefined');
> +contextMenuObj2.onSelect = 4;
> +check_equals(typeof(contextMenuObj2.onSelect), 'number');
> +
>  #endif
> 
> 
> _______________________________________________
> Gnash-commit mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/gnash-commit

-- 

 ()   ASCII Ribbon Campaign
 /\   Keep it simple! 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]