CVSROOT: /sources/gnash Module name: gnash Changes by: Sandro Santilli <strk> 07/12/26 12:35:14
Modified files: . : ChangeLog server : character.h movie_instance.cpp sprite_instance.cpp sprite_instance.h testsuite/actionscript.all: MovieClip.as MovieClipLoader.as Log message: Implement MovieClip._lockroot. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5260&r2=1.5261 http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.h?cvsroot=gnash&r1=1.118&r2=1.119 http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_instance.cpp?cvsroot=gnash&r1=1.22&r2=1.23 http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.421&r2=1.422 http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.161&r2=1.162 http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/MovieClip.as?cvsroot=gnash&r1=1.110&r2=1.111 http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/MovieClipLoader.as?cvsroot=gnash&r1=1.10&r2=1.11 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.5260 retrieving revision 1.5261 diff -u -b -r1.5260 -r1.5261 --- ChangeLog 26 Dec 2007 10:43:51 -0000 1.5260 +++ ChangeLog 26 Dec 2007 12:35:12 -0000 1.5261 @@ -1,5 +1,12 @@ 2007-12-26 Sandro Santilli <[EMAIL PROTECTED]> + * server/: movie_instance.cpp, sprite_instance.{cpp,h}: + Implement _lockroot + * testsuite/actionscript.all/: MovieClip.as, MovieClipLoader.as: + Update expected results. + +2007-12-26 Sandro Santilli <[EMAIL PROTECTED]> + * testsuite/swfdec/gen_run_swfdec_testsuite.sh: skip tests requiring user interaction (see task #7556). * testsuite/actionscript.all/MovieClip.as: add test for _lockroot Index: server/character.h =================================================================== RCS file: /sources/gnash/gnash/server/character.h,v retrieving revision 1.118 retrieving revision 1.119 diff -u -b -r1.118 -r1.119 --- server/character.h 23 Dec 2007 22:29:56 -0000 1.118 +++ server/character.h 26 Dec 2007 12:35:13 -0000 1.119 @@ -19,7 +19,7 @@ // // -/* $Id: character.h,v 1.118 2007/12/23 22:29:56 strk Exp $ */ +/* $Id: character.h,v 1.119 2007/12/26 12:35:13 strk Exp $ */ #ifndef GNASH_CHARACTER_H #define GNASH_CHARACTER_H @@ -723,12 +723,14 @@ else return false; } - /// Return the "relative" root of this character + /// Return the relative or absolute root of this character // /// The "relative" is the movie_instance created by /// the same SWF definition that contained the /// definition of this character. /// + /// The "absolute" is top of parent's tree. + /// /// TODO: what about programmatically created characters ? /// which would their "relative" root be ? /// Index: server/movie_instance.cpp =================================================================== RCS file: /sources/gnash/gnash/server/movie_instance.cpp,v retrieving revision 1.22 retrieving revision 1.23 diff -u -b -r1.22 -r1.23 --- server/movie_instance.cpp 19 Dec 2007 20:40:31 -0000 1.22 +++ server/movie_instance.cpp 26 Dec 2007 12:35:13 -0000 1.23 @@ -51,8 +51,6 @@ //GNASH_REPORT_FUNCTION; - assert ( get_root()->get_root() == this ); - //_def->stopLoader(); // Load first frame (1-based index) @@ -75,8 +73,6 @@ { //GNASH_REPORT_FUNCTION; - assert ( get_root()->get_root() == this ); - //_def->stopLoader(); // Load next frame if available (+2 as m_current_frame is 0-based) Index: server/sprite_instance.cpp =================================================================== RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v retrieving revision 1.421 retrieving revision 1.422 diff -u -b -r1.421 -r1.422 --- server/sprite_instance.cpp 26 Dec 2007 08:04:59 -0000 1.421 +++ server/sprite_instance.cpp 26 Dec 2007 12:35:13 -0000 1.422 @@ -1536,6 +1536,9 @@ o.init_member("getSWFVersion", new builtin_function(sprite_getSWFVersion)); o.init_member("enabled", true); // see MovieClip.as testcase + gettersetter = new builtin_function(&sprite_instance::lockroot_getset, NULL); + o.init_property("_lockroot", *gettersetter, *gettersetter); // see MovieClip.as testcase + if ( target_version < 6 ) return; // SWF6 or higher @@ -1789,6 +1792,9 @@ m_has_mouse_event(false), _text_variables(), m_sound_stream_id(-1), + _userCxform(), + _droptarget(), + _lockroot(false), m_def(def) { assert(m_def != NULL); @@ -1846,11 +1852,10 @@ // if (name_key == NSV::PROP_uROOT) { - //if ( isUnloaded() ) return false; // see movieclip_destruction_test3.sc // Let ::get_root() take care of _lockroot - val->set_as_object( get_root() ); - + movie_instance* relRoot = get_root(); + val->set_as_object( relRoot ); return true; } @@ -3584,6 +3589,9 @@ url.parse_querystring(url.querystring(), vars); extern_movie->setVariables(vars); + // Set lockroot to our value of it + extern_movie->set_member( PROP_uLOCKROOT, getLockRoot() ); + save_extern_movie(extern_movie.get()); const char* name = get_name().c_str(); @@ -3618,6 +3626,7 @@ assert(get_ref_count() > 1); #endif // ndef GNASH_USE_GC + // how about lockRoot here ? root.loadLevel(level, url); // extern_movie.get()); } @@ -3899,4 +3908,48 @@ return cf; } +movie_instance* +sprite_instance::get_root() const +{ + movie_instance* relRoot = m_root; + character* rootParent = relRoot->get_parent(); + if ( rootParent ) + { + // if the relative root has a parent we descend + // to it unless SWF version of relRoot is >= 7 + // AND _lockroot is true + if ( relRoot->getSWFVersion() >= 7 ) + { + //string_table& st = _vm.getStringTable(); + //as_value lockRoot = relRoot->getMember(st.find("_lockroot")); + //if ( lockRoot.to_bool() ) + if ( relRoot->getLockRoot() ) + { + return relRoot; + } + } + + return rootParent->get_root(); + } + return relRoot; +} + +as_value +sprite_instance::lockroot_getset(const fn_call& fn) +{ + boost::intrusive_ptr<sprite_instance> ptr = ensureType<sprite_instance>(fn.this_ptr); + + as_value rv; + if ( fn.nargs == 0 ) // getter + { + rv.set_bool(ptr->getLockRoot()); + } + else // setter + { + ptr->setLockRoot(fn.arg(0).to_bool()); + } + return rv; + +} + } // namespace gnash Index: server/sprite_instance.h =================================================================== RCS file: /sources/gnash/gnash/server/sprite_instance.h,v retrieving revision 1.161 retrieving revision 1.162 diff -u -b -r1.161 -r1.162 --- server/sprite_instance.h 23 Dec 2007 22:29:57 -0000 1.161 +++ server/sprite_instance.h 26 Dec 2007 12:35:13 -0000 1.162 @@ -113,13 +113,14 @@ virtual void has_mouse_event(); /// \brief - /// Return this sprite's relative root as + /// Return this sprite's root as /// specified at contruction time + // + /// Relative or absolute is determined by + /// the _lockroot property, see getLockRoot + /// and setLockRoot. /// - virtual movie_instance* get_root() const - { - return m_root; - } + virtual movie_instance* get_root() const; /// \brief /// Return the sprite_definition (or movie_definition) @@ -839,6 +840,19 @@ /// void constructAsScriptObject(); + + /// Return true if get_root() should return the *relative* root, + /// false otherwise. + bool getLockRoot() const { return _lockroot; } + + /// Set whether get_root() should return the *relative* root, + /// false otherwise. True for relative root. + /// + void setLockRoot(bool lr) { _lockroot=lr; } + + /// Getter-setter for MovieClip._lockroot + static as_value lockroot_getset(const fn_call& fn); + private: /// Register this sprite as a listener of core broadcasters @@ -1022,6 +1036,8 @@ std::string _droptarget; + bool _lockroot; + protected: void place_character(character* ch, int depth, Index: testsuite/actionscript.all/MovieClip.as =================================================================== RCS file: /sources/gnash/gnash/testsuite/actionscript.all/MovieClip.as,v retrieving revision 1.110 retrieving revision 1.111 diff -u -b -r1.110 -r1.111 --- testsuite/actionscript.all/MovieClip.as 26 Dec 2007 10:50:19 -0000 1.110 +++ testsuite/actionscript.all/MovieClip.as 26 Dec 2007 12:35:13 -0000 1.111 @@ -20,7 +20,7 @@ // compile this test case with Ming makeswf, and then // execute it like this gnash -1 -r 0 -v out.swf -rcsid="$Id: MovieClip.as,v 1.110 2007/12/26 10:50:19 strk Exp $"; +rcsid="$Id: MovieClip.as,v 1.111 2007/12/26 12:35:13 strk Exp $"; #include "check.as" @@ -83,7 +83,7 @@ #if OUTPUT_VERSION >= 6 check(MovieClip.prototype.hasOwnProperty('loadMovie')); -xcheck(MovieClip.prototype.hasOwnProperty('_lockroot')); +check(MovieClip.prototype.hasOwnProperty('_lockroot')); check(!MovieClip.prototype.hasOwnProperty('loadMovieNum')); check(!MovieClip.prototype.hasOwnProperty('valueOf')); check(!MovieClip.prototype.hasOwnProperty('toString')); @@ -256,14 +256,14 @@ check(mc._ymouse != undefined); check(mc._yscale != undefined); check_equals(typeof(MovieClip.prototype._lockroot), 'undefined'); -xcheck_equals(typeof(mc._lockroot), 'boolean'); -xcheck_equals(mc._lockroot, false); +check_equals(typeof(mc._lockroot), 'boolean'); +check_equals(mc._lockroot, false); mc._lockroot = 56; -xcheck_equals(typeof(mc._lockroot), 'boolean'); -xcheck_equals(mc._lockroot, true); +check_equals(typeof(mc._lockroot), 'boolean'); +check_equals(mc._lockroot, true); mc._lockroot = ""; -xcheck_equals(typeof(mc._lockroot), 'boolean'); -xcheck_equals(mc._lockroot, false); +check_equals(typeof(mc._lockroot), 'boolean'); +check_equals(mc._lockroot, false); #if OUTPUT_VERSION > 5 check_equals(mc._name, ""); @@ -349,7 +349,7 @@ xcheck(!mc.hasOwnProperty("_soundbuftime")); xcheck(!mc.hasOwnProperty("_focusrect")); xcheck(!mc.hasOwnProperty("_framesloaded")); -xcheck(!mc.hasOwnProperty("_lockroot")); +check(!mc.hasOwnProperty("_lockroot")); xcheck(!mc.hasOwnProperty("_highquality")); #endif //if OUTPUT_VERSION >= 6 Index: testsuite/actionscript.all/MovieClipLoader.as =================================================================== RCS file: /sources/gnash/gnash/testsuite/actionscript.all/MovieClipLoader.as,v retrieving revision 1.10 retrieving revision 1.11 diff -u -b -r1.10 -r1.11 --- testsuite/actionscript.all/MovieClipLoader.as 25 Dec 2007 18:56:06 -0000 1.10 +++ testsuite/actionscript.all/MovieClipLoader.as 26 Dec 2007 12:35:14 -0000 1.11 @@ -21,7 +21,7 @@ // compile this test case with Ming makeswf, and then // execute it like this gnash -1 -r 0 -v out.swf -rcsid="$Id: MovieClipLoader.as,v 1.10 2007/12/25 18:56:06 strk Exp $"; +rcsid="$Id: MovieClipLoader.as,v 1.11 2007/12/26 12:35:14 strk Exp $"; #include "check.as" @@ -234,13 +234,14 @@ { with (target) { + note("_lockroot: "+_lockroot); note("---- Target's root is "+_root); - xcheck_equals(_root, _level0); + check_equals(_root, _level0); _lockroot = true; - check_equals(_root, _level0.loadtarget); + xcheck_equals(_root, _level0.loadtarget); // no idea why this fails, could be due to the assignment above doing unexpected things (assigning to pre-rebound dangling char ref?).. note("---- After setting _lockroot to true, target's root is "+_root); _lockroot = false; - xcheck_equals(_root, _level0); + check_equals(_root, _level0); note("---- After setting _lockroot to false, target's root is "+_root); } } _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit