[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