[Swfdec-commits] 5 commits - swfdec/swfdec_movie.c swfdec/swfdec_player.c swfdec/swfdec_player_internal.h swfdec/swfdec_resource.c swfdec/swfdec_sprite_movie_as.c test/trace

Benjamin Otte company at kemper.freedesktop.org
Wed Jul 16 07:19:54 PDT 2008


 swfdec/swfdec_movie.c                  |   21 +-------
 swfdec/swfdec_player.c                 |    5 +-
 swfdec/swfdec_player_internal.h        |    3 -
 swfdec/swfdec_resource.c               |   80 ++++++++++++++++++++-------------
 swfdec/swfdec_sprite_movie_as.c        |    2 
 test/trace/Makefile.am                 |    9 +++
 test/trace/loadClip-levels-5.swf       |binary
 test/trace/loadClip-levels-5.swf.trace |   14 +++++
 test/trace/loadClip-levels-6.swf       |binary
 test/trace/loadClip-levels-6.swf.trace |   36 ++++++++++++++
 test/trace/loadClip-levels-7.swf       |binary
 test/trace/loadClip-levels-7.swf.trace |   56 +++++++++++++++++++++++
 test/trace/loadClip-levels-8.swf       |binary
 test/trace/loadClip-levels-8.swf.trace |   56 +++++++++++++++++++++++
 test/trace/loadClip-levels.as          |   46 ++++++++++++++++++
 15 files changed, 275 insertions(+), 53 deletions(-)

New commits:
commit 636e3fb4db52c2ea21c46cef89e06563409b1bc6
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Jul 16 16:17:12 2008 +0200

    add a test for MovieClipLoader.loadClip() that fixes

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 3118d36..7bfb69b 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -1744,6 +1744,15 @@ EXTRA_DIST = \
 	load-4.swf.trace \
 	load-5.swf \
 	load-5.swf.trace \
+	loadClip-levels-5.swf \
+	loadClip-levels-5.swf.trace \
+	loadClip-levels-6.swf \
+	loadClip-levels-6.swf.trace \
+	loadClip-levels-7.swf \
+	loadClip-levels-7.swf.trace \
+	loadClip-levels-8.swf \
+	loadClip-levels-8.swf.trace \
+	loadClip-levels.as \
 	loadmovie-case.as \
 	loadmovie-case-5.swf \
 	loadmovie-case-5.swf.trace \
diff --git a/test/trace/loadClip-levels-5.swf b/test/trace/loadClip-levels-5.swf
new file mode 100644
index 0000000..9b95b5e
Binary files /dev/null and b/test/trace/loadClip-levels-5.swf differ
diff --git a/test/trace/loadClip-levels-5.swf.trace b/test/trace/loadClip-levels-5.swf.trace
new file mode 100644
index 0000000..26eb533
--- /dev/null
+++ b/test/trace/loadClip-levels-5.swf.trace
@@ -0,0 +1,14 @@
+testing target arguments for MovieClipLoader
+toString
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+hi, quitting from _level9
diff --git a/test/trace/loadClip-levels-6.swf b/test/trace/loadClip-levels-6.swf
new file mode 100644
index 0000000..5e4a88d
Binary files /dev/null and b/test/trace/loadClip-levels-6.swf differ
diff --git a/test/trace/loadClip-levels-6.swf.trace b/test/trace/loadClip-levels-6.swf.trace
new file mode 100644
index 0000000..5dcdad5
--- /dev/null
+++ b/test/trace/loadClip-levels-6.swf.trace
@@ -0,0 +1,36 @@
+testing target arguments for MovieClipLoader
+toString
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+hi, quitting from _level9
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+_level9
+undefined
+undefined
diff --git a/test/trace/loadClip-levels-7.swf b/test/trace/loadClip-levels-7.swf
new file mode 100644
index 0000000..9f1f126
Binary files /dev/null and b/test/trace/loadClip-levels-7.swf differ
diff --git a/test/trace/loadClip-levels-7.swf.trace b/test/trace/loadClip-levels-7.swf.trace
new file mode 100644
index 0000000..6f0fbac
--- /dev/null
+++ b/test/trace/loadClip-levels-7.swf.trace
@@ -0,0 +1,56 @@
+testing target arguments for MovieClipLoader
+toString
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+onLoadStart: _level2
+onLoadProgress 1303/1303: _level2
+onLoadProgress 1303/1303: _level2
+onLoadComplete: _level2
+onLoadStart: _level6
+onLoadProgress 1303/1303: _level6
+onLoadProgress 1303/1303: _level6
+onLoadComplete: _level6
+onLoadStart: _level11
+onLoadProgress 1303/1303: _level11
+onLoadProgress 1303/1303: _level11
+onLoadComplete: _level11
+hi, quitting from _level9
+hi, quitting from _level11
+hi, quitting from _level8
+hi, quitting from _level6
+hi, quitting from _level3
+hi, quitting from _level2
+undefined
+_level2
+_level3
+undefined
+undefined
+_level6
+undefined
+_level8
+_level9
+undefined
+_level11
+onLoadInit: _level11
+onLoadInit: _level6
+onLoadInit: _level2
diff --git a/test/trace/loadClip-levels-8.swf b/test/trace/loadClip-levels-8.swf
new file mode 100644
index 0000000..5cb4cad
Binary files /dev/null and b/test/trace/loadClip-levels-8.swf differ
diff --git a/test/trace/loadClip-levels-8.swf.trace b/test/trace/loadClip-levels-8.swf.trace
new file mode 100644
index 0000000..6f0fbac
--- /dev/null
+++ b/test/trace/loadClip-levels-8.swf.trace
@@ -0,0 +1,56 @@
+testing target arguments for MovieClipLoader
+toString
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+undefined
+onLoadStart: _level2
+onLoadProgress 1303/1303: _level2
+onLoadProgress 1303/1303: _level2
+onLoadComplete: _level2
+onLoadStart: _level6
+onLoadProgress 1303/1303: _level6
+onLoadProgress 1303/1303: _level6
+onLoadComplete: _level6
+onLoadStart: _level11
+onLoadProgress 1303/1303: _level11
+onLoadProgress 1303/1303: _level11
+onLoadComplete: _level11
+hi, quitting from _level9
+hi, quitting from _level11
+hi, quitting from _level8
+hi, quitting from _level6
+hi, quitting from _level3
+hi, quitting from _level2
+undefined
+_level2
+_level3
+undefined
+undefined
+_level6
+undefined
+_level8
+_level9
+undefined
+_level11
+onLoadInit: _level11
+onLoadInit: _level6
+onLoadInit: _level2
diff --git a/test/trace/loadClip-levels.as b/test/trace/loadClip-levels.as
new file mode 100644
index 0000000..016a003
--- /dev/null
+++ b/test/trace/loadClip-levels.as
@@ -0,0 +1,46 @@
+// makeswf -v 7 -r 1 -o loadClip-levels.swf loadClip-levels.as
+
+if (this != _level0) {
+  trace ("hi, quitting from " + this);
+  getURL ("FSCommand:quit", "");
+  return;
+}
+
+trace ("testing target arguments for MovieClipLoader");
+l = new MovieClipLoader ();
+l.onLoadError = function (m, e, s) { trace ("onLoadError " + e + "/" + s + ": " + m); };
+l.onLoadStart = function (m) { trace ("onLoadStart: " + m); };
+l.onLoadProgress = function (m, l, t) { trace ("onLoadProgress " + l + "/" + t + ": " + m); };
+l.onLoadComplete = function (m) { trace ("onLoadComplete: " + m); };
+l.onLoadInit = function (m) { trace ("onLoadInit: " + m); };
+
+l.loadClip ("movie190.swf", true);
+l.loadClip ("movie190.swf", 2);
+l.loadClip ("movie190.swf", "_level3");
+l.loadClip ("movie190.swf", _level4);
+l.loadClip ("movie190.swf", "5");
+l.loadClip ("movie190.swf", 6.54321);
+l.loadClip ("movie190.swf", { valueOf: function () { trace ("valueOf"); return 7; }, toString: function () { trace ("toString"); return "7"; } });
+createEmptyMovieClip ("_level8", 8);
+l.loadClip ("movie190.swf", "_level8");
+l.loadClip ("movie190.swf", -10);
+l.loadClip ("movie190.swf", 0xFFFFFFFF + 12);
+
+x = { valueOf: function () { trace ("valueOf"); return 9; }, toString: function () { trace ("toString"); return "_level9"; } };
+loadMovie ("movie190.swf", x);
+
+onEnterFrame = function () {
+  trace (_level1);
+  trace (_level2);
+  trace (_level3);
+  trace (_level4);
+  trace (_level5);
+  trace (_level6);
+  trace (_level7);
+  trace (_level8);
+  trace (_level9);
+  trace (_level10);
+  trace (_level11);
+};
+onEnterFrame ();
+
commit 2a6e87131a03802b23d54ae3a245690ff6396fa6
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Jul 16 16:16:49 2008 +0200

    make swfdec_player_get_level() take the version as an argument
    
    and fix the failing testcase

diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 3871e43..d12da72 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -950,7 +950,7 @@ swfdec_movie_get_by_name (SwfdecMovie *movie, const char *name, gboolean unnamed
   guint version = SWFDEC_AS_OBJECT (movie)->context->version;
   SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
 
-  i = swfdec_player_get_level (player, name);
+  i = swfdec_player_get_level (player, name, version);
   if (i >= 0)
     return SWFDEC_MOVIE (swfdec_player_get_movie_at_level (player, i));
 
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 3e9c63d..316a1bd 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -2475,6 +2475,7 @@ swfdec_player_set_background_color (SwfdecPlayer *player, SwfdecColor bgcolor)
  * swfdec_player_get_level:
  * @player: a #SwfdecPlayer
  * @name: a name that is supposed to refer to a level
+ * @version: version to use for case sensitivity checks
  *
  * Checks if the given @name refers to a level, and if so, returns the level.
  * An example for such a name is "_level5". These strings are used to refer to
@@ -2483,7 +2484,7 @@ swfdec_player_set_background_color (SwfdecPlayer *player, SwfdecColor bgcolor)
  * Returns: the level referred to by @name or -1 if none
  **/
 int
-swfdec_player_get_level (SwfdecPlayer *player, const char *name)
+swfdec_player_get_level (SwfdecPlayer *player, const char *name, guint version)
 {
   char *end;
   gulong l;
@@ -2492,7 +2493,7 @@ swfdec_player_get_level (SwfdecPlayer *player, const char *name)
   g_return_val_if_fail (name != NULL, -1);
 
   /* check name starts with "_level" */
-  if (swfdec_strncmp (SWFDEC_AS_CONTEXT (player)->version, name, "_level", 6) != 0)
+  if (swfdec_strncmp (version, name, "_level", 6) != 0)
     return -1;
   name += 6;
   /* extract depth from rest string (or fail if it's not a depth) */
diff --git a/swfdec/swfdec_player_internal.h b/swfdec/swfdec_player_internal.h
index 2a0867a..5cd3948 100644
--- a/swfdec/swfdec_player_internal.h
+++ b/swfdec/swfdec_player_internal.h
@@ -247,7 +247,8 @@ void		swfdec_player_stop_sounds	(SwfdecPlayer *		player,
 						 gpointer		data);
 void		swfdec_player_stop_all_sounds	(SwfdecPlayer *		player);
 gboolean	swfdec_player_get_level		(SwfdecPlayer *		player,
-						 const char *		name);
+						 const char *		name,
+						 guint			version);
 SwfdecSpriteMovie *
 		swfdec_player_get_movie_at_level(SwfdecPlayer *		player,
 						 int			level);
diff --git a/swfdec/swfdec_resource.c b/swfdec/swfdec_resource.c
index cfbbbfd..393c500 100644
--- a/swfdec/swfdec_resource.c
+++ b/swfdec/swfdec_resource.c
@@ -538,7 +538,7 @@ swfdec_resource_create_movie (SwfdecResource *resource, SwfdecResourceLoad *load
     else
       movie = NULL;
   } else {
-    int level = swfdec_player_get_level (player, load->target_string);
+    int level = swfdec_player_get_level (player, load->target_string, 7);
     if (level >= 0) {
       movie = swfdec_player_get_movie_at_level (player, level);
       if (movie)
@@ -642,7 +642,7 @@ swfdec_resource_load_request (gpointer loadp, gpointer playerp)
   }
 
   /* LAUNCH command (aka getURL) */
-  if (load->target_string && swfdec_player_get_level (player, load->target_string) < 0) {
+  if (load->target_string && swfdec_player_get_level (player, load->target_string, 7) < 0) {
     swfdec_player_launch (player, load->url, load->target_string, load->buffer);
     swfdec_player_unroot (player, load);
     return;
@@ -715,8 +715,11 @@ swfdec_resource_load_movie (SwfdecPlayer *player, const SwfdecAsValue *target,
   } else {
     s = swfdec_as_value_to_string (SWFDEC_AS_CONTEXT (player), target);
   }
-  if (swfdec_player_get_level (player, s) >= 0) {
-    swfdec_resource_load_internal (player, NULL, s, url, buffer, NULL);
+  if (swfdec_player_get_level (player, s, SWFDEC_AS_CONTEXT (player)->version) >= 0) {
+    /* lowercase the string, so we can do case insensitive level lookups later on */
+    char *tmp = g_ascii_strdown (s, -1);
+    swfdec_resource_load_internal (player, NULL, tmp, url, buffer, NULL);
+    g_free (tmp);
     return TRUE;
   }
   movie = swfdec_player_get_movie_from_string (player, s);
commit 47394a0e8392d5b580c81dc75b2d912ebb44f710
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Jul 16 16:08:51 2008 +0200

    rework code to allow passing numbers as levels in MovieClipLoader.loadClip()
    
    This breaks a testcase

diff --git a/swfdec/swfdec_resource.c b/swfdec/swfdec_resource.c
index 8e4780f..cfbbbfd 100644
--- a/swfdec/swfdec_resource.c
+++ b/swfdec/swfdec_resource.c
@@ -119,28 +119,19 @@ swfdec_resource_emit_signal (SwfdecResource *resource, const char *name, gboolea
   if (resource->clip_loader == NULL)
     return;
   cx = SWFDEC_AS_OBJECT (resource->clip_loader)->context;
-  /* This feels wrong. Why do we resolve here by real name? */
-  if (resource->target) {
-    SwfdecMovie *parent = swfdec_movie_resolve (resource->target->parent);
-    if (parent)
-      movie = swfdec_movie_get_by_name (parent, resource->target->name, FALSE);
-    else
-      movie = NULL;
-  } else {
-    movie = NULL;
-  }
-  if (movie == NULL && resource->movie != NULL) {
-    SWFDEC_DEBUG ("no movie, not emitting signal");
-    return;
-  }
-  if (name == SWFDEC_AS_STR_onLoadInit &&
-      movie != SWFDEC_MOVIE (resource->movie)) {
-    SWFDEC_INFO ("not emitting onLoadInit - the movie is different");
-    return;
-  }
 
   SWFDEC_AS_VALUE_SET_STRING (&vals[0], name);
-  if (movie) {
+  if (resource->movie) {
+    movie = swfdec_movie_resolve (SWFDEC_MOVIE (resource->movie));
+    if (movie == NULL) {
+      SWFDEC_DEBUG ("no movie, not emitting signal");
+      return;
+    }
+    if (name == SWFDEC_AS_STR_onLoadInit &&
+	movie != SWFDEC_MOVIE (resource->movie)) {
+      SWFDEC_INFO ("not emitting onLoadInit - the movie is different");
+      return;
+    }
     SWFDEC_AS_VALUE_SET_OBJECT (&vals[1], SWFDEC_AS_OBJECT (movie));
   } else {
     SWFDEC_AS_VALUE_SET_UNDEFINED (&vals[1]);
@@ -548,10 +539,14 @@ swfdec_resource_create_movie (SwfdecResource *resource, SwfdecResourceLoad *load
       movie = NULL;
   } else {
     int level = swfdec_player_get_level (player, load->target_string);
-    if (level >= 0)
+    if (level >= 0) {
+      movie = swfdec_player_get_movie_at_level (player, level);
+      if (movie)
+	swfdec_movie_remove (SWFDEC_MOVIE (movie));
       movie = swfdec_player_create_movie_at_level (player, resource, level);
-    else
+    } else {
       movie = NULL;
+    }
   }
   if (movie == NULL) {
     SWFDEC_WARNING ("target does not reference a movie, not loading %s", load->url);
@@ -580,13 +575,15 @@ swfdec_resource_do_load (SwfdecPlayer *player, gboolean allowed, gpointer loadp)
     resource->clip_loader = load->loader;
     resource->clip_loader_sandbox = load->sandbox;
   }
-  resource->target = SWFDEC_MOVIE (load->target_movie);
   resource->sandbox = load->sandbox;
   if (!allowed) {
     SWFDEC_WARNING ("SECURITY: no access to %s from %s",
 	load->url, swfdec_url_get_url (load->sandbox->url));
     /* FIXME: is replacing correct? */
-    swfdec_resource_emit_error (resource, SWFDEC_AS_STR_IllegalRequest);
+    if (load->target_movie) {
+      resource->movie = SWFDEC_SPRITE_MOVIE (swfdec_movie_resolve (SWFDEC_MOVIE (load->target_movie)));
+      swfdec_resource_emit_error (resource, SWFDEC_AS_STR_IllegalRequest);
+    }
     swfdec_player_unroot (player, load);
     return;
   }
@@ -699,17 +696,35 @@ swfdec_resource_load_movie (SwfdecPlayer *player, const SwfdecAsValue *target,
     }
   }
 
-  s = swfdec_as_value_to_string (SWFDEC_AS_CONTEXT (player), target);
+  if (loader) {
+    if (SWFDEC_AS_VALUE_IS_NUMBER (target)) {
+      int i = swfdec_as_double_to_integer (SWFDEC_AS_VALUE_GET_NUMBER (target));
+      if (i < 0)
+	return FALSE;
+      s = swfdec_as_context_give_string (SWFDEC_AS_OBJECT (loader)->context,
+	  g_strdup_printf ("_level%d", i));
+      swfdec_resource_load_internal (player, NULL, s, url, buffer, loader);
+      return TRUE;
+    } else if (SWFDEC_AS_VALUE_IS_STRING (target) ||
+	(SWFDEC_AS_VALUE_IS_OBJECT (target) && SWFDEC_IS_MOVIE (SWFDEC_AS_VALUE_GET_OBJECT (target)))) {
+      s = swfdec_as_value_to_string (SWFDEC_AS_CONTEXT (player), target);
+    } else {
+      SWFDEC_WARNING ("target does not reference a movie, not loading %s", url);
+      return FALSE;
+    }
+  } else {
+    s = swfdec_as_value_to_string (SWFDEC_AS_CONTEXT (player), target);
+  }
+  if (swfdec_player_get_level (player, s) >= 0) {
+    swfdec_resource_load_internal (player, NULL, s, url, buffer, NULL);
+    return TRUE;
+  }
   movie = swfdec_player_get_movie_from_string (player, s);
   if (SWFDEC_IS_SPRITE_MOVIE (movie)) {
     swfdec_resource_load_internal (player, SWFDEC_SPRITE_MOVIE (movie),
 	NULL, url, buffer, loader);
     return TRUE;
   }
-  if (swfdec_player_get_level (player, s) >= 0) {
-    swfdec_resource_load_internal (player, NULL, s, url, buffer, NULL);
-    return TRUE;
-  }
   SWFDEC_WARNING ("%s does not reference a movie, not loading %s", s, url);
   return FALSE;
 }
commit cf01d80cb2e936736a1a57158482aeb2649d6774
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Jul 16 16:02:49 2008 +0200

    improve querying _levelN properties
    
    - use swfdec_player() functions for querying stuff
    - If the level is empty, don't return a child movie

diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index e957cd6..3871e43 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -947,27 +947,12 @@ swfdec_movie_get_by_name (SwfdecMovie *movie, const char *name, gboolean unnamed
 {
   GList *walk;
   int i;
-  gulong l;
   guint version = SWFDEC_AS_OBJECT (movie)->context->version;
-  char *end;
   SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
 
-  if ((version >= 7 && g_str_has_prefix (name, "_level")) ||
-      (version < 7 && strncasecmp (name, "_level", 6) == 0)) {
-    errno = 0;
-    l = strtoul (name + 6, &end, 10);
-    if (errno != 0 || *end != 0 || l > G_MAXINT)
-      return NULL;
-    i = l - 16384;
-    for (walk = player->priv->roots; walk; walk = walk->next) {
-      SwfdecMovie *cur = walk->data;
-      if (cur->depth < i)
-	continue;
-      if (cur->depth == i)
-	return cur;
-      break;
-    }
-  }
+  i = swfdec_player_get_level (player, name);
+  if (i >= 0)
+    return SWFDEC_MOVIE (swfdec_player_get_movie_at_level (player, i));
 
   for (walk = movie->list; walk; walk = walk->next) {
     SwfdecMovie *cur = walk->data;
commit 35f005a0cf68b458790f2da1f5d31c643ea99385
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Jul 16 15:46:39 2008 +0200

    unset the right sandbox

diff --git a/swfdec/swfdec_sprite_movie_as.c b/swfdec/swfdec_sprite_movie_as.c
index 35f5d05..756051d 100644
--- a/swfdec/swfdec_sprite_movie_as.c
+++ b/swfdec/swfdec_sprite_movie_as.c
@@ -658,7 +658,7 @@ swfdec_sprite_movie_createEmptyMovieClip (SwfdecAsContext *cx, SwfdecAsObject *o
   movie = swfdec_movie_new (SWFDEC_PLAYER (cx), depth, parent, parent->resource, NULL, name);
 
   if (SWFDEC_IS_SPRITE_MOVIE (movie)) {
-    SwfdecSandbox *sandbox = movie->resource->sandbox;
+    SwfdecSandbox *sandbox = SWFDEC_SANDBOX (cx->global);
     SwfdecActor *actor = SWFDEC_ACTOR (movie);
     swfdec_sandbox_unuse (sandbox);
     swfdec_movie_initialize (movie);


More information about the Swfdec-commits mailing list