[Swfdec] 12 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_html_parser.c libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_text_field_movie.h test/trace

Pekka Lampila medar at kemper.freedesktop.org
Mon Oct 22 05:35:40 PDT 2007


 libswfdec/swfdec_as_strings.c                |    1 
 libswfdec/swfdec_html_parser.c               |   43 +++---
 libswfdec/swfdec_text_field.c                |    2 
 libswfdec/swfdec_text_field.h                |    2 
 libswfdec/swfdec_text_field_movie.c          |  166 ++++++++++++++++-----------
 libswfdec/swfdec_text_field_movie.h          |    6 
 libswfdec/swfdec_text_field_movie_as.c       |   69 +++++++----
 test/trace/Makefile.am                       |    7 +
 test/trace/text-field-html-input-6.swf       |binary
 test/trace/text-field-html-input-6.swf.trace |  120 +++++++++++++++++++
 test/trace/text-field-html-input-7.swf       |binary
 test/trace/text-field-html-input-7.swf.trace |  118 +++++++++++++++++++
 test/trace/text-field-html-input-8.swf       |binary
 test/trace/text-field-html-input-8.swf.trace |  118 +++++++++++++++++++
 test/trace/text-field-html-input.as          |   62 ++++++++++
 15 files changed, 596 insertions(+), 118 deletions(-)

New commits:
commit ae043a89a73bdc0cfcb72dcece238e0ddc888472
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 15:34:44 2007 +0300

    In TextField don't set HTML text to variable if html property is false

diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index 78fd2b3..0bc39e1 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -1477,6 +1477,30 @@ swfdec_text_field_movie_html_text_append_paragraph (SwfdecTextFieldMovie *text,
 }
 
 const char *
+swfdec_text_field_movie_get_text (SwfdecTextFieldMovie *text)
+{
+  char *str, *p;
+
+  str = g_strdup (text->input->str);
+
+  // if input was orginally html, remove all \r
+  if (text->input_html) {
+    p = str;
+    while ((p = strchr (p, '\r')) != NULL) {
+      memmove (p, p + 1, strlen (p));
+    }
+  }
+
+  // change all \n to \r
+  p = str;
+  while ((p = strchr (p, '\n')) != NULL) {
+    *p = '\r';
+  }
+
+  return swfdec_as_context_give_string (SWFDEC_AS_OBJECT (text)->context, str);
+}
+
+const char *
 swfdec_text_field_movie_get_html_text (SwfdecTextFieldMovie *text)
 {
   const char *p, *end;
diff --git a/libswfdec/swfdec_text_field_movie.h b/libswfdec/swfdec_text_field_movie.h
index 2820c62..fc7371d 100644
--- a/libswfdec/swfdec_text_field_movie.h
+++ b/libswfdec/swfdec_text_field_movie.h
@@ -133,6 +133,7 @@ void		swfdec_text_field_movie_set_text_format	(SwfdecTextFieldMovie *	text,
 SwfdecTextFormat *swfdec_text_field_movie_get_text_format (SwfdecTextFieldMovie *	text,
 							 guint			start_index,
 							 guint			end_index);
+const char *	swfdec_text_field_movie_get_text	(SwfdecTextFieldMovie *		text);
 const char *	swfdec_text_field_movie_get_html_text	(SwfdecTextFieldMovie *		text);
 void		swfdec_text_field_movie_set_listen_variable (SwfdecTextFieldMovie *	text,
 							 const char *			value);
diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index 56240d6..48057e8 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -65,37 +65,15 @@ swfdec_text_field_movie_set_readonly (SwfdecAsContext *cx,
  * Native properties: Text
  */
 static void
-swfdec_text_field_movie_get_text (SwfdecAsContext *cx, SwfdecAsObject *object,
-    guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
+swfdec_text_field_movie_do_get_text (SwfdecAsContext *cx,
+    SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
+    SwfdecAsValue *ret)
 {
   SwfdecTextFieldMovie *text;
-  char *str, *p;
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
 
-  if (text->input == NULL) {
-    SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_EMPTY);
-    return;
-  }
-
-  str = g_strdup (text->input->str);
-
-  // if input was orginally html, remove all \r
-  if (text->input_html) {
-    p = str;
-    while ((p = strchr (p, '\r')) != NULL) {
-      memmove (p, p + 1, strlen (p));
-    }
-  }
-
-  // change all \n to \r
-  p = str;
-  while ((p = strchr (p, '\n')) != NULL) {
-    *p = '\r';
-  }
-
-  SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_context_give_string (
-      SWFDEC_AS_OBJECT (text)->context, str));
+  SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_text_field_movie_get_text (text));
 }
 
 static void
@@ -111,8 +89,13 @@ swfdec_text_field_movie_do_set_text (SwfdecAsContext *cx,
   swfdec_text_field_movie_set_text (text, value, FALSE);
 
   if (text->variable != NULL) {
-    swfdec_text_field_movie_set_listen_variable_text (text,
-	swfdec_text_field_movie_get_html_text (text));
+    if (text->text->html) {
+      swfdec_text_field_movie_set_listen_variable_text (text,
+	  swfdec_text_field_movie_get_html_text (text));
+    } else {
+      swfdec_text_field_movie_set_listen_variable_text (text,
+	  swfdec_text_field_movie_get_text (text));
+    }
   }
 }
 
@@ -152,13 +135,13 @@ swfdec_text_field_movie_get_htmlText (SwfdecAsContext *cx,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
 
-  if (!text->text->html) {
-    swfdec_text_field_movie_get_text (cx, object, argc, argv, ret);
-    return;
+  if (text->text->html) {
+    SWFDEC_AS_VALUE_SET_STRING (ret,
+	swfdec_text_field_movie_get_html_text (text));
+  } else {
+    SWFDEC_AS_VALUE_SET_STRING (ret,
+	swfdec_text_field_movie_get_text (text));
   }
-
-  SWFDEC_AS_VALUE_SET_STRING (ret,
-      swfdec_text_field_movie_get_html_text (text));
 }
 
 static void
@@ -174,8 +157,13 @@ swfdec_text_field_movie_set_htmlText (SwfdecAsContext *cx,
   swfdec_text_field_movie_set_text (text, value, text->text->html);
 
   if (text->variable != NULL) {
-    swfdec_text_field_movie_set_listen_variable_text (text,
-	swfdec_text_field_movie_get_html_text (text));
+    if (text->text->html) {
+      swfdec_text_field_movie_set_listen_variable_text (text,
+	  swfdec_text_field_movie_get_html_text (text));
+    } else {
+      swfdec_text_field_movie_set_listen_variable_text (text,
+	  swfdec_text_field_movie_get_text (text));
+    }
   }
 }
 
@@ -1223,7 +1211,8 @@ swfdec_text_field_movie_init_properties (SwfdecAsContext *cx)
 
   // text
   swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_text,
-      swfdec_text_field_movie_get_text, swfdec_text_field_movie_do_set_text);
+      swfdec_text_field_movie_do_get_text,
+      swfdec_text_field_movie_do_set_text);
   swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_html,
       swfdec_text_field_movie_get_html, swfdec_text_field_movie_set_html);
   swfdec_text_field_movie_add_variable (proto, SWFDEC_AS_STR_htmlText,
commit 65d226fa857aad1e78f18098417ab18465969846
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 15:24:15 2007 +0300

    Add SWFDEC_FIXME about IMG tag support

diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c
index 1c4dfad..a6a0aa0 100644
--- a/libswfdec/swfdec_html_parser.c
+++ b/libswfdec/swfdec_html_parser.c
@@ -329,6 +329,9 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p)
 	swfdec_as_object_set_variable (object, SWFDEC_AS_STR_italic, &val);
       } else if (tag->name_length == 1 && !g_strncasecmp (tag->name, "u", 1)) {
 	swfdec_as_object_set_variable (object, SWFDEC_AS_STR_underline, &val);
+      } else if (tag->name_length == 3 && !g_strncasecmp (tag->name, "img", 3))
+      {
+	SWFDEC_FIXME ("IMG tag support for TextField's HTML input missing");
       }
     }
 
commit 90a9604f2af766e86c373a3ccc5d1ab88538af73
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 15:20:48 2007 +0300

    Add a test for TextField's HTML input
    
    Pretty limited for now

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index b3a7b76..6b39368 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -1859,6 +1859,13 @@ EXTRA_DIST = \
 	targetpath-6.swf.trace \
 	targetpath-7.swf \
 	targetpath-7.swf.trace \
+	text-field-html-input.as \
+	text-field-html-input-6.swf \
+	text-field-html-input-6.swf.trace \
+	text-field-html-input-7.swf \
+	text-field-html-input-7.swf.trace \
+	text-field-html-input-8.swf \
+	text-field-html-input-8.swf.trace \
 	text-field-length.as \
 	text-field-length-5.swf \
 	text-field-length-5.swf.trace \
diff --git a/test/trace/text-field-html-input-6.swf b/test/trace/text-field-html-input-6.swf
new file mode 100644
index 0000000..6e68068
Binary files /dev/null and b/test/trace/text-field-html-input-6.swf differ
diff --git a/test/trace/text-field-html-input-6.swf.trace b/test/trace/text-field-html-input-6.swf.trace
new file mode 100644
index 0000000..e976072
--- /dev/null
+++ b/test/trace/text-field-html-input-6.swf.trace
@@ -0,0 +1,120 @@
+0: multiline: false condenseWhite: false
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+0: multiline: true condenseWhite: false
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+0: multiline: false condenseWhite: true
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+0: multiline: true condenseWhite: true
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: false condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: true condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: false condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: true condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: false condenseWhite: false
+a
b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/
: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: true condenseWhite: false
+a
b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/
: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: false condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: true condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: false condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: true condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: false condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: true condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: false condenseWhite: false
+ab
c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">ab</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/
: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: true condenseWhite: false
+ab
c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">ab</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/
: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: false condenseWhite: true
+ab
c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">ab</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/
: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: true condenseWhite: true
+ab
c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">ab</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/
: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
diff --git a/test/trace/text-field-html-input-7.swf b/test/trace/text-field-html-input-7.swf
new file mode 100644
index 0000000..bf7b7b4
Binary files /dev/null and b/test/trace/text-field-html-input-7.swf differ
diff --git a/test/trace/text-field-html-input-7.swf.trace b/test/trace/text-field-html-input-7.swf.trace
new file mode 100644
index 0000000..5150aee
--- /dev/null
+++ b/test/trace/text-field-html-input-7.swf.trace
@@ -0,0 +1,118 @@
+0: multiline: false condenseWhite: false
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+0: multiline: true condenseWhite: false
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+0: multiline: false condenseWhite: true
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+0: multiline: true condenseWhite: true
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: false condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: true condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: false condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: true condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: false condenseWhite: false
+a
b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/
: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: true condenseWhite: false
+a
b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/
: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: false condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: true condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: false condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: true condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: false condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: true condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: false condenseWhite: false
+abc
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">abc</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: true condenseWhite: false
+ab
c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">ab</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/
: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: false condenseWhite: true
+abc
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">abc</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: true condenseWhite: true
+ab
c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">ab</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/
: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
diff --git a/test/trace/text-field-html-input-8.swf b/test/trace/text-field-html-input-8.swf
new file mode 100644
index 0000000..c580f99
Binary files /dev/null and b/test/trace/text-field-html-input-8.swf differ
diff --git a/test/trace/text-field-html-input-8.swf.trace b/test/trace/text-field-html-input-8.swf.trace
new file mode 100644
index 0000000..6079e11
--- /dev/null
+++ b/test/trace/text-field-html-input-8.swf.trace
@@ -0,0 +1,118 @@
+0: multiline: false condenseWhite: false
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+0: multiline: true condenseWhite: false
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+0: multiline: false condenseWhite: true
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+0: multiline: true condenseWhite: true
+a
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: false condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: true condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: false condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1: multiline: true condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: false condenseWhite: false
+a
b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/
: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: true condenseWhite: false
+a
b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/
: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: false condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2: multiline: true condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: false condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: true condenseWhite: false
+ab
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"></FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: false condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3: multiline: true condenseWhite: true
+a b
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a b</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: false condenseWhite: false
+abc
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">abc</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: true condenseWhite: false
+ab
c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">ab</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/
: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: false condenseWhite: true
+abc
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">abc</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+4: multiline: true condenseWhite: true
+ab
c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">ab</FONT></P><P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/b: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/
: align=right blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
diff --git a/test/trace/text-field-html-input.as b/test/trace/text-field-html-input.as
new file mode 100644
index 0000000..da34d4a
--- /dev/null
+++ b/test/trace/text-field-html-input.as
@@ -0,0 +1,62 @@
+// makeswf -v 7 -r 1 -o test-7.swf test.as
+
+var properties = [
+  "align",
+  "blockIndent",
+  "bold",
+  "bullet",
+  "color",
+  "display",
+  "font",
+  "indent",
+  "italic",
+  "kerning",
+  "leading",
+  "leftMargin",
+  "letterSpacing",
+  "rightMargin",
+  "size",
+  "tabStops",
+  "target",
+  "underline",
+  "url"
+];
+
+function format_to_string (fmt) {
+  str = "";
+  for (var i = 0; i < properties.length; i++) {
+    str += " " + properties[i] + "=" + fmt[properties[i]];
+  }
+  return str;
+}
+
+this.createTextField ("t", 1, 0, 0, 200, 200);
+
+var texts = [
+  "a",
+  "a\rb",
+  "a\r\nb",
+  "a\r\rb",
+  "a<p align='right'>b</p>c"
+];
+
+t.html = true;
+
+for (var i = 0; i < texts.length; i++) {
+  for (var j = 0; j <= 3; j++) {
+    t.multiline = j & 1;
+    t.condenseWhite = j & 2;
+    t.htmlText = texts[i];
+
+    trace (i + ": multiline: " + t.multiline + " condenseWhite: " + t.condenseWhite);
+
+    trace (t.text);
+    trace (t.htmlText);
+
+    for (var k = 0; k < t.length; k++) {
+      trace (k + "/" + t.text.charAt (k) + ":" + format_to_string (t.getTextFormat (k)));
+    }
+  }
+}
+
+loadMovie ("FSCommand:quit", "");
commit 171389a442f643884ffc98de2368b32f995205bb
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 15:14:15 2007 +0300

    Add \n not \r after </p> etc. in TextField's HTML parser

diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c
index 0052cd7..1c4dfad 100644
--- a/libswfdec/swfdec_html_parser.c
+++ b/libswfdec/swfdec_html_parser.c
@@ -70,7 +70,7 @@ swfdec_text_field_movie_html_parse_close_tag (ParserData *data, ParserTag *tag)
 	break;
       }
     }
-    data->text = g_string_append_c (data->text, '\r');
+    data->text = g_string_append_c (data->text, '\n');
   }
 
   tag->end_index = data->text->len;
@@ -287,7 +287,7 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p)
   {
     if (data->cx->version < 7 &&
 	(name_length == 2 && !g_strncasecmp (name, "br", 2))) {
-      data->text = g_string_append_c (data->text, '\r');
+      data->text = g_string_append_c (data->text, '\n');
       tag = NULL;
     } else {
       SwfdecAsObject *object;
@@ -303,7 +303,7 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p)
 	  ParserTag *f = iter->data;
 	  if ((f->name_length == 1 && !g_strncasecmp (f->name, "p", 1)) ||
 	      (f->name_length == 2 && !g_strncasecmp (f->name, "li", 2))) {
-	    data->text = g_string_append_c (data->text, '\r');
+	    data->text = g_string_append_c (data->text, '\n');
 	    break;
 	  }
 	}
commit 97b7664b5d462cc629b631d713d8c6485e99247e
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 15:00:25 2007 +0300

    TextField: Return only text in htmlText if html is false (broke this earlier)

diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index 9ca8560..56240d6 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -152,6 +152,11 @@ swfdec_text_field_movie_get_htmlText (SwfdecAsContext *cx,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
 
+  if (!text->text->html) {
+    swfdec_text_field_movie_get_text (cx, object, argc, argv, ret);
+    return;
+  }
+
   SWFDEC_AS_VALUE_SET_STRING (ret,
       swfdec_text_field_movie_get_html_text (text));
 }
commit 93c18b3fb52aefda9c6daa226be061b6571e7119
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 14:44:08 2007 +0300

    Change TextField to use GString internally

diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c
index 798ca5e..0052cd7 100644
--- a/libswfdec/swfdec_html_parser.c
+++ b/libswfdec/swfdec_html_parser.c
@@ -396,10 +396,12 @@ swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie *text, const char *str)
   g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
   g_return_if_fail (str != NULL);
 
+  text->input = g_string_assign (text->input, "");
+
   data.cx = SWFDEC_AS_OBJECT (text)->context;
   data.multiline = (data.cx->version < 7 || text->text->multiline);
   data.condense_white = text->condense_white;
-  data.text = g_string_new ("");
+  data.text = text->input;
   data.tags_open = NULL;
   data.tags_closed = NULL;
 
@@ -422,10 +424,6 @@ swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie *text, const char *str)
 	(ParserTag *)data.tags_open->data);
   }
 
-  // set parsed text
-  text->text_display =
-    swfdec_as_context_give_string (data.cx, g_string_free (data.text, FALSE));
-
   // add parsed styles
   while (data.tags_closed != NULL) {
     ParserTag *tag = (ParserTag *)data.tags_closed->data;
diff --git a/libswfdec/swfdec_text_field.c b/libswfdec/swfdec_text_field.c
index 7b5c688..a11e2f1 100644
--- a/libswfdec/swfdec_text_field.c
+++ b/libswfdec/swfdec_text_field.c
@@ -113,7 +113,7 @@ tag_func_define_edit_text (SwfdecSwfDecoder * s, guint tag)
   text->word_wrap = swfdec_bits_getbit (b);
   text->multiline = swfdec_bits_getbit (b);
   text->password = swfdec_bits_getbit (b);
-  text->input = !swfdec_bits_getbit (b);
+  text->editable = !swfdec_bits_getbit (b);
   has_color = swfdec_bits_getbit (b);
   has_max_length = swfdec_bits_getbit (b);
   has_font = swfdec_bits_getbit (b);
diff --git a/libswfdec/swfdec_text_field.h b/libswfdec/swfdec_text_field.h
index cdbe1ec..0ecf9bf 100644
--- a/libswfdec/swfdec_text_field.h
+++ b/libswfdec/swfdec_text_field.h
@@ -52,7 +52,7 @@ struct _SwfdecTextField
 
   gboolean		html;
 
-  gboolean		input;
+  gboolean		editable;
   gboolean		password;
   int			max_chars;
   gboolean		selectable;
diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index d3e4a2a..78fd2b3 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -115,9 +115,9 @@ swfdec_text_field_movie_generate_paragraph (SwfdecTextFieldMovie *text,
   g_assert (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
   g_assert (paragraph != NULL);
   g_assert (start_index <= end_index);
-  g_assert (end_index <= strlen (text->text_display));
+  g_assert (end_index <= text->input->len);
 
-  paragraph->text = text->text_display + start_index;
+  paragraph->text = text->input->str + start_index;
   paragraph->text_length = end_index - start_index;
 
   paragraph->blocks = NULL;
@@ -299,7 +299,7 @@ swfdec_text_field_movie_get_paragraphs (SwfdecTextFieldMovie *text, int *num)
   g_assert (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
 
   count = 0;
-  p = text->text_display;
+  p = text->input->str;
   while (p != NULL && *p != '\0') {
     count++;
     p = strpbrk (p, "\r\n");
@@ -311,7 +311,7 @@ swfdec_text_field_movie_get_paragraphs (SwfdecTextFieldMovie *text, int *num)
     *num = count;
 
   i = 0;
-  p = text->text_display;
+  p = text->input->str;
   while (*p != '\0') {
     g_assert (i < count);
     end = strpbrk (p, "\r\n");
@@ -319,7 +319,7 @@ swfdec_text_field_movie_get_paragraphs (SwfdecTextFieldMovie *text, int *num)
       end = strchr (p, '\0');
 
     swfdec_text_field_movie_generate_paragraph (text, &paragraphs[i],
-	p - text->text_display, end - text->text_display);
+	p - text->input->str, end - text->input->str);
 
     p = end;
     if (*p != '\0') p++;
@@ -876,7 +876,6 @@ swfdec_text_field_movie_mark (SwfdecAsObject *object)
 
   text = SWFDEC_TEXT_FIELD_MOVIE (object);
 
-  swfdec_as_string_mark (text->text_display);
   if (text->variable != NULL)
     swfdec_as_string_mark (text->variable);
   swfdec_as_object_mark (SWFDEC_AS_OBJECT (text->format_new));
@@ -998,6 +997,7 @@ swfdec_text_field_movie_init (SwfdecTextFieldMovie *text)
   text->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
   text->cr = cairo_create (text->surface);
 
+  text->input = g_string_new ("");
   text->scroll = 1;
   text->mouse_wheel_enabled = TRUE;
 }
@@ -1013,7 +1013,7 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text,
   g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
   g_return_if_fail (SWFDEC_IS_TEXT_FORMAT (format));
   g_return_if_fail (start_index < end_index);
-  g_return_if_fail (end_index <= strlen (text->text_display));
+  g_return_if_fail (end_index <= text->input->len);
 
   g_assert (text->formats != NULL);
   g_assert (text->formats->data != NULL);
@@ -1031,7 +1031,7 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text,
       findex_end_index =
 	((SwfdecFormatIndex *)iter->next->data)->index;
     } else {
-      findex_end_index = strlen (text->text_display);
+      findex_end_index = text->input->len;
     }
 
     if (findex_end_index <= start_index)
@@ -1093,7 +1093,7 @@ swfdec_text_field_movie_get_text_format (SwfdecTextFieldMovie *text,
 
   g_assert (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
   g_assert (start_index < end_index);
-  g_assert (end_index <= strlen (text->text_display));
+  g_assert (end_index <= text->input->len);
 
   g_assert (text->formats != NULL);
   g_assert (text->formats->data != NULL);
@@ -1361,7 +1361,7 @@ swfdec_text_field_movie_html_text_append_paragraph (SwfdecTextFieldMovie *text,
     index_ = ((SwfdecFormatIndex *)(iter->data))->index;
     format = ((SwfdecFormatIndex *)(iter->data))->format;
 
-    escaped = swfdec_xml_escape_len (text->text_display + index_prev,
+    escaped = swfdec_xml_escape_len (text->input->str + index_prev,
 	index_ - index_prev);
     string = g_string_append (string, escaped);
     g_free (escaped);
@@ -1449,7 +1449,7 @@ swfdec_text_field_movie_html_text_append_paragraph (SwfdecTextFieldMovie *text,
       string = g_string_append (string, "<U>");
   }
 
-  escaped = swfdec_xml_escape_len (text->text_display + index_,
+  escaped = swfdec_xml_escape_len (text->input->str + index_,
       end_index - index_);
   string = g_string_append (string, escaped);
   g_free (escaped);
@@ -1485,22 +1485,19 @@ swfdec_text_field_movie_get_html_text (SwfdecTextFieldMovie *text)
   g_return_val_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text),
       SWFDEC_AS_STR_EMPTY);
 
-  if (text->text_display == NULL)
+  if (text->input == NULL)
     return SWFDEC_AS_STR_EMPTY;
 
-  if (text->text->html == FALSE)
-    return text->text_display;
-
   string = g_string_new ("");
 
-  p = text->text_display;
+  p = text->input->str;
   while (*p != '\0') {
     end = strpbrk (p, "\r\n");
     if (end == NULL)
       end = strchr (p, '\0');
 
     string = swfdec_text_field_movie_html_text_append_paragraph (text, string,
-	p - text->text_display, end - text->text_display);
+	p - text->input->str, end - text->input->str);
 
     p = end;
     if (*p != '\0') p++;
@@ -1515,23 +1512,15 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     guint start_index, guint end_index, const char *str)
 {
   SwfdecFormatIndex *findex;
-  char *text_new;
   GSList *iter, *prev;
   gboolean first;
 
   g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
-  g_return_if_fail (end_index <= strlen (text->text_display));
+  g_return_if_fail (end_index <= text->input->len);
   g_return_if_fail (start_index <= end_index);
   g_return_if_fail (str != NULL);
 
-  text_new = g_malloc (strlen (text->text_display) -
-      (end_index - start_index) + strlen (str) + 1);
-
-  memcpy (text_new, text->text_display, start_index);
-  memcpy (text_new + start_index, str, strlen (str));
-  memcpy (text_new + start_index + strlen (str),
-      text->text_display + end_index,
-      strlen (text->text_display + end_index) + 1);
+  text->input = g_string_insert (text->input, start_index, str);
 
   first = TRUE;
   prev = NULL;
@@ -1540,7 +1529,7 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     findex = iter->data;
 
     if (findex->index >= start_index) {
-      if (end_index == strlen (text->text_display) || (iter->next != NULL &&
+      if (end_index == text->input->len || (iter->next != NULL &&
 	  ((SwfdecFormatIndex *)iter->next->data)->index <= end_index))
       {
 	g_free (iter->data);
@@ -1558,7 +1547,7 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     }
     prev = iter;
   }
-  if (end_index == strlen (text->text_display)) {
+  if (end_index == text->input->len) {
     if (SWFDEC_AS_OBJECT (text)->context->version < 8) {
       SWFDEC_FIXME ("replaceText to the end of the TextField might use wrong text format on version 7");
     }
@@ -1569,9 +1558,6 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     text->formats = g_slist_append (text->formats, findex);
   }
 
-  text->text_display =
-    swfdec_as_context_give_string (SWFDEC_AS_OBJECT (text)->context, text_new);
-
   swfdec_movie_invalidate (SWFDEC_MOVIE (text));
   swfdec_text_field_movie_auto_size (text);
   swfdec_text_field_movie_update_scroll (text, TRUE);
@@ -1609,7 +1595,7 @@ swfdec_text_field_movie_set_text (SwfdecTextFieldMovie *text, const char *str,
   if (html) {
     swfdec_text_field_movie_html_parse (text, str);
   } else {
-    text->text_display = str;
+    text->input = g_string_assign (text->input, str);
   }
 
   swfdec_movie_invalidate (SWFDEC_MOVIE (text));
diff --git a/libswfdec/swfdec_text_field_movie.h b/libswfdec/swfdec_text_field_movie.h
index 9d6749e..2820c62 100644
--- a/libswfdec/swfdec_text_field_movie.h
+++ b/libswfdec/swfdec_text_field_movie.h
@@ -80,7 +80,7 @@ struct _SwfdecTextFieldMovie {
 
   SwfdecTextField *	text;		/* the text_field object we render */
 
-  const char *		text_display;
+  GString *		input;
   gboolean		input_html;	/* whether orginal input was given as HTML */
 
   const char *		variable;
diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index aec3bf1..9ca8560 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -73,12 +73,12 @@ swfdec_text_field_movie_get_text (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
 
-  if (text->text_display == NULL) {
+  if (text->input == NULL) {
     SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_EMPTY);
     return;
   }
 
-  str = g_strdup (text->text_display);
+  str = g_strdup (text->input->str);
 
   // if input was orginally html, remove all \r
   if (text->input_html) {
@@ -182,7 +182,7 @@ swfdec_text_field_movie_get_length (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
 
-  SWFDEC_AS_VALUE_SET_INT (ret, g_utf8_strlen (text->text_display, -1));
+  SWFDEC_AS_VALUE_SET_INT (ret, g_utf8_strlen (text->input->str, -1));
 }
 
 /*
@@ -349,7 +349,7 @@ swfdec_text_field_movie_do_get_type (SwfdecAsContext *cx,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
 
-  if (text->text->input) {
+  if (text->text->editable) {
     SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_input);
   } else {
     SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_dynamic);
@@ -370,9 +370,9 @@ swfdec_text_field_movie_do_set_type (SwfdecAsContext *cx,
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "s", &value);
 
   if (!g_strcasecmp (value, SWFDEC_AS_STR_input)) {
-    text->text->input = TRUE;
+    text->text->editable = TRUE;
   } else if (!g_strcasecmp (value, SWFDEC_AS_STR_dynamic)) {
-    text->text->input = FALSE;
+    text->text->editable = FALSE;
   }
 
   // FIXME: invalidate
@@ -949,16 +949,15 @@ swfdec_text_field_movie_setTextFormat (SwfdecAsContext *cx,
   i = 0;
   if (argc >= 2) {
     start_index = swfdec_as_value_to_integer (cx, &argv[i++]);
-    start_index = CLAMP (start_index, 0, (int)strlen (text->text_display));
+    start_index = CLAMP (start_index, 0, (int)text->input->len);
   } else {
     start_index = 0;
   }
   if (argc >= 3) {
     end_index = swfdec_as_value_to_integer (cx, &argv[i++]);
-    end_index = CLAMP (end_index, start_index,
-	(int)strlen (text->text_display));
+    end_index = CLAMP (end_index, start_index, (int)text->input->len);
   } else {
-    end_index = (int)strlen (text->text_display);
+    end_index = text->input->len;
   }
   if (start_index == end_index)
     return;
@@ -987,15 +986,15 @@ swfdec_text_field_movie_getTextFormat (SwfdecAsContext *cx,
 
   if (argc == 0) {
     start_index = 0;
-    end_index = strlen (text->text_display);
+    end_index = text->input->len;
   } else {
     start_index = swfdec_as_value_to_integer (cx, &argv[0]);
-    start_index = MIN (start_index, strlen (text->text_display));
+    start_index = MIN (start_index, text->input->len);
     if (argc == 1) {
       end_index = start_index + 1;
     } else {
       end_index = swfdec_as_value_to_integer (cx, &argv[1]);
-      end_index = CLAMP (end_index, start_index, strlen (text->text_display));
+      end_index = CLAMP (end_index, start_index, text->input->len);
     }
   }
 
@@ -1019,11 +1018,11 @@ swfdec_text_field_movie_replaceText (SwfdecAsContext *cx,
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "iis", &start_index,
       &end_index, &str);
 
-  start_index = MIN (start_index, (int)strlen (text->text_display));
+  start_index = MIN (start_index, (int)text->input->len);
   if (start_index < 0)
     return;
 
-  end_index = MIN (end_index, (int)strlen (text->text_display));
+  end_index = MIN (end_index, (int)text->input->len);
   if (end_index < start_index)
     return;
 
@@ -1111,7 +1110,7 @@ swfdec_text_field_movie_createTextField (SwfdecAsContext *cx,
 
   edittext = g_object_new (SWFDEC_TYPE_TEXT_FIELD, NULL);
   edittext->html = FALSE;
-  edittext->input = FALSE;
+  edittext->editable = FALSE;
   edittext->password = FALSE;
   edittext->selectable = TRUE;
   edittext->font = NULL; // FIXME
commit 4a93d286003fdf5b8a3db1f4d2eed3412b2bb6b3
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 14:30:58 2007 +0300

    If TextField's input was originally HTML, remove all \n from text property

diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index 13a3dc8..d3e4a2a 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -1605,6 +1605,7 @@ swfdec_text_field_movie_set_text (SwfdecTextFieldMovie *text, const char *str,
   block->format = swfdec_text_format_copy (text->format_new);
   text->formats = g_slist_prepend (text->formats, block);
 
+  text->input_html = html;
   if (html) {
     swfdec_text_field_movie_html_parse (text, str);
   } else {
diff --git a/libswfdec/swfdec_text_field_movie.h b/libswfdec/swfdec_text_field_movie.h
index f5b0910..9d6749e 100644
--- a/libswfdec/swfdec_text_field_movie.h
+++ b/libswfdec/swfdec_text_field_movie.h
@@ -81,6 +81,7 @@ struct _SwfdecTextFieldMovie {
   SwfdecTextField *	text;		/* the text_field object we render */
 
   const char *		text_display;
+  gboolean		input_html;	/* whether orginal input was given as HTML */
 
   const char *		variable;
 
diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index 9f67634..aec3bf1 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -69,6 +69,7 @@ swfdec_text_field_movie_get_text (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
   SwfdecTextFieldMovie *text;
+  char *str, *p;
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
 
@@ -77,20 +78,24 @@ swfdec_text_field_movie_get_text (SwfdecAsContext *cx, SwfdecAsObject *object,
     return;
   }
 
-  // change all \n to \r
-  if (strchr (text->text_display, '\n') != NULL) {
-    char *str, *p;
+  str = g_strdup (text->text_display);
 
-    str = g_strdup (text->text_display);
+  // if input was orginally html, remove all \r
+  if (text->input_html) {
     p = str;
-    while ((p = strchr (p, '\n')) != NULL) {
-      *p = '\r';
+    while ((p = strchr (p, '\r')) != NULL) {
+      memmove (p, p + 1, strlen (p));
     }
-    SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_context_give_string (
-	SWFDEC_AS_OBJECT (text)->context, str));
-  } else {
-    SWFDEC_AS_VALUE_SET_STRING (ret, text->text_display);
   }
+
+  // change all \n to \r
+  p = str;
+  while ((p = strchr (p, '\n')) != NULL) {
+    *p = '\r';
+  }
+
+  SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_context_give_string (
+      SWFDEC_AS_OBJECT (text)->context, str));
 }
 
 static void
commit a53f4965828535510f11f9480e9b3eb0d13c0573
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 14:25:37 2007 +0300

    Fix adding text when parsing HTML, that I just broke

diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c
index 2b49068..798ca5e 100644
--- a/libswfdec/swfdec_html_parser.c
+++ b/libswfdec/swfdec_html_parser.c
@@ -363,26 +363,25 @@ swfdec_text_field_movie_html_parse_text (ParserData *data, const char *p)
 
   // get the text
   // if condense_white: all whitespace blocks are converted to a single space
-  if (data->condense_white) {
-    while (*p != '\0' && *p != '<') {
+  while (*p != '\0' && *p != '<') {
+    if (data->condense_white) {
       end = p + strcspn (p, "< \n\r\t");
+    } else {
+      end = strchr (p, '<');
+      if (end == NULL)
+	end = strchr (p, '\0');
+    }
 
-      unescaped = swfdec_xml_unescape_len (data->cx, p, end - p);
-      data->text = g_string_append (data->text, unescaped);
-      g_free (unescaped);
+    unescaped = swfdec_xml_unescape_len (data->cx, p, end - p);
+    data->text = g_string_append (data->text, unescaped);
+    g_free (unescaped);
 
-      if (g_ascii_isspace (*end)) {
-	data->text = g_string_append_c (data->text, ' ');
-	p = end + strspn (end, " \n\r\t");
-      } else {
-	p = end;
-      }
+    if (data->condense_white && g_ascii_isspace (*end)) {
+      data->text = g_string_append_c (data->text, ' ');
+      p = end + strspn (end, " \n\r\t");
+    } else {
+      p = end;
     }
-  } else {
-    end = strchr (p, '<');
-    if (end == NULL)
-      end = strchr (p, '\0');
-    p = end;
   }
 
   return p;
commit 473419146bc841e87bf918f220f630c746235501
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 14:12:02 2007 +0300

    TextField: Only replace \n with \r in text property not internally

diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c
index 968d6ce..2b49068 100644
--- a/libswfdec/swfdec_html_parser.c
+++ b/libswfdec/swfdec_html_parser.c
@@ -40,6 +40,7 @@ typedef struct {
 typedef struct {
   SwfdecAsContext	*cx;
   gboolean		multiline;
+  gboolean		condense_white;
   GString *		text;
   GSList *		tags_open;
   GSList *		tags_closed;
@@ -351,8 +352,7 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p)
 }
 
 static const char *
-swfdec_text_field_movie_html_parse_text (ParserData *data, const char *p,
-    gboolean condense_white)
+swfdec_text_field_movie_html_parse_text (ParserData *data, const char *p)
 {
   const char *end;
   char *unescaped;
@@ -363,29 +363,26 @@ swfdec_text_field_movie_html_parse_text (ParserData *data, const char *p,
 
   // get the text
   // if condense_white: all whitespace blocks are converted to a single space
-  // if not: all \n are converted to \r
-  while (*p != '\0' && *p != '<') {
-    if (condense_white) {
+  if (data->condense_white) {
+    while (*p != '\0' && *p != '<') {
       end = p + strcspn (p, "< \n\r\t");
-    } else {
-      end = p + strcspn (p, "<\n");
-    }
 
-    unescaped = swfdec_xml_unescape_len (data->cx, p, end - p);
-    data->text = g_string_append (data->text, unescaped);
-    g_free (unescaped);
+      unescaped = swfdec_xml_unescape_len (data->cx, p, end - p);
+      data->text = g_string_append (data->text, unescaped);
+      g_free (unescaped);
 
-    if (g_ascii_isspace (*end)) {
-      if (condense_white) {
+      if (g_ascii_isspace (*end)) {
 	data->text = g_string_append_c (data->text, ' ');
 	p = end + strspn (end, " \n\r\t");
       } else {
-	data->text = g_string_append_c (data->text, '\r');
-	p = end + 1;
+	p = end;
       }
-    } else {
-      p = end;
     }
+  } else {
+    end = strchr (p, '<');
+    if (end == NULL)
+      end = strchr (p, '\0');
+    p = end;
   }
 
   return p;
@@ -402,6 +399,7 @@ swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie *text, const char *str)
 
   data.cx = SWFDEC_AS_OBJECT (text)->context;
   data.multiline = (data.cx->version < 7 || text->text->multiline);
+  data.condense_white = text->condense_white;
   data.text = g_string_new ("");
   data.tags_open = NULL;
   data.tags_closed = NULL;
@@ -415,8 +413,7 @@ swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie *text, const char *str)
 	p = swfdec_text_field_movie_html_parse_tag (&data, p);
       }
     } else {
-      p = swfdec_text_field_movie_html_parse_text (&data, p,
-	  text->condense_white);
+      p = swfdec_text_field_movie_html_parse_text (&data, p);
     }
   }
 
diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index fb8cec4..13a3dc8 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -302,7 +302,7 @@ swfdec_text_field_movie_get_paragraphs (SwfdecTextFieldMovie *text, int *num)
   p = text->text_display;
   while (p != NULL && *p != '\0') {
     count++;
-    p = strchr (p, '\r');
+    p = strpbrk (p, "\r\n");
     if (p != NULL) p++;
   }
 
@@ -314,7 +314,7 @@ swfdec_text_field_movie_get_paragraphs (SwfdecTextFieldMovie *text, int *num)
   p = text->text_display;
   while (*p != '\0') {
     g_assert (i < count);
-    end = strchr (p, '\r');
+    end = strpbrk (p, "\r\n");
     if (end == NULL)
       end = strchr (p, '\0');
 
@@ -322,7 +322,7 @@ swfdec_text_field_movie_get_paragraphs (SwfdecTextFieldMovie *text, int *num)
 	p - text->text_display, end - text->text_display);
 
     p = end;
-    if (*p == '\r') p++;
+    if (*p != '\0') p++;
 
     i++;
   }
@@ -1495,18 +1495,15 @@ swfdec_text_field_movie_get_html_text (SwfdecTextFieldMovie *text)
 
   p = text->text_display;
   while (*p != '\0') {
-    end = strchr (p, '\r');
+    end = strpbrk (p, "\r\n");
     if (end == NULL)
       end = strchr (p, '\0');
 
     string = swfdec_text_field_movie_html_text_append_paragraph (text, string,
 	p - text->text_display, end - text->text_display);
 
-    if (*end == '\r') {
-      p = end + 1;
-    } else {
-      p = end;
-    }
+    p = end;
+    if (*p != '\0') p++;
   }
 
   return swfdec_as_context_give_string (SWFDEC_AS_OBJECT (text)->context,
@@ -1611,20 +1608,7 @@ swfdec_text_field_movie_set_text (SwfdecTextFieldMovie *text, const char *str,
   if (html) {
     swfdec_text_field_movie_html_parse (text, str);
   } else {
-    // change all \n to \r
-    if (strchr (str, '\n') != NULL) {
-      char *string, *p;
-
-      string = g_strdup (str);
-      p = string;
-      while ((p = strchr (p, '\n')) != NULL) {
-	*p = '\r';
-      }
-      text->text_display = swfdec_as_context_give_string (
-	  SWFDEC_AS_OBJECT (text)->context, string);
-    } else {
-      text->text_display = str;
-    }
+    text->text_display = str;
   }
 
   swfdec_movie_invalidate (SWFDEC_MOVIE (text));
diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index 75770bb..9f67634 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -72,8 +72,25 @@ swfdec_text_field_movie_get_text (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
 
-  SWFDEC_AS_VALUE_SET_STRING (ret, (text->text_display != NULL ?
-	text->text_display : SWFDEC_AS_STR_EMPTY));
+  if (text->text_display == NULL) {
+    SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_EMPTY);
+    return;
+  }
+
+  // change all \n to \r
+  if (strchr (text->text_display, '\n') != NULL) {
+    char *str, *p;
+
+    str = g_strdup (text->text_display);
+    p = str;
+    while ((p = strchr (p, '\n')) != NULL) {
+      *p = '\r';
+    }
+    SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_context_give_string (
+	SWFDEC_AS_OBJECT (text)->context, str));
+  } else {
+    SWFDEC_AS_VALUE_SET_STRING (ret, text->text_display);
+  }
 }
 
 static void
commit 19bf55d1c8e6500e34a87e65abf54f5a12951746
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 14:01:21 2007 +0300

    Remove unused text_input variable from SwfdecTextFieldMovie

diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index 021b8ad..fb8cec4 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -876,8 +876,6 @@ swfdec_text_field_movie_mark (SwfdecAsObject *object)
 
   text = SWFDEC_TEXT_FIELD_MOVIE (object);
 
-  if (text->text_input != NULL)
-    swfdec_as_string_mark (text->text_input);
   swfdec_as_string_mark (text->text_display);
   if (text->variable != NULL)
     swfdec_as_string_mark (text->variable);
@@ -1592,8 +1590,6 @@ swfdec_text_field_movie_set_text (SwfdecTextFieldMovie *text, const char *str,
   g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
   g_return_if_fail (str != NULL);
 
-  text->text_input = str;
-
   // remove old formatting info
   iter = text->formats;
   while (iter) {
diff --git a/libswfdec/swfdec_text_field_movie.h b/libswfdec/swfdec_text_field_movie.h
index 70ddb4f..f5b0910 100644
--- a/libswfdec/swfdec_text_field_movie.h
+++ b/libswfdec/swfdec_text_field_movie.h
@@ -80,7 +80,6 @@ struct _SwfdecTextFieldMovie {
 
   SwfdecTextField *	text;		/* the text_field object we render */
 
-  const char *		text_input;
   const char *		text_display;
 
   const char *		variable;
commit 6841fe177bd6d0ea99c78ae3b6f34763a64b6c67
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 11:42:43 2007 +0300

    Implement TextField's onScroller property

diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c
index 313383a..8a940d5 100644
--- a/libswfdec/swfdec_as_strings.c
+++ b/libswfdec/swfdec_as_strings.c
@@ -421,5 +421,6 @@ const char swfdec_as_strings[] =
   SWFDEC_AS_CONSTANT_STRING ("Monospace")
   SWFDEC_AS_CONSTANT_STRING ("textHeight")
   SWFDEC_AS_CONSTANT_STRING ("textWidth")
+  SWFDEC_AS_CONSTANT_STRING ("onScroller")
   /* add more here */
 ;
diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index 93ac9aa..021b8ad 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -729,16 +729,36 @@ swfdec_text_field_movie_update_scroll (SwfdecTextFieldMovie *text,
   swfdec_text_field_movie_free_layouts (layouts);
   layouts = NULL;
 
-  text->scroll_max = all - visible + 1;
-  text->hscroll_max = SWFDEC_TWIPS_TO_DOUBLE (width_max - width);
+  if (text->scroll_max != all - visible + 1) {
+    text->scroll_max = all - visible + 1;
+    text->scroll_changed = TRUE;
+  }
+  if (text->hscroll_max != SWFDEC_TWIPS_TO_DOUBLE (width_max - width)) {
+    text->hscroll_max = SWFDEC_TWIPS_TO_DOUBLE (width_max - width);
+    text->scroll_changed = TRUE;
+  }
 
   if (check_limits) {
-    text->scroll = CLAMP(text->scroll, 1, text->scroll_max);
-    text->scroll_bottom = text->scroll + (visible > 0 ? visible - 1 : 0);
-    text->hscroll = CLAMP(text->hscroll, 0, text->hscroll_max);
+    if (text->scroll != CLAMP(text->scroll, 1, text->scroll_max)) {
+      text->scroll = CLAMP(text->scroll, 1, text->scroll_max);
+      text->scroll_changed = TRUE;
+    }
+    if (text->scroll_bottom != text->scroll + (visible > 0 ? visible - 1 : 0))
+    {
+      text->scroll_bottom = text->scroll + (visible > 0 ? visible - 1 : 0);
+      text->scroll_changed = TRUE;
+    }
+    if (text->hscroll != CLAMP(text->hscroll, 0, text->hscroll_max)) {
+      text->hscroll = CLAMP(text->hscroll, 0, text->hscroll_max);
+      text->scroll_changed = TRUE;
+    }
   } else {
-    text->scroll_bottom = MAX (CLAMP(text->scroll, 1, text->scroll_max) +
-      (visible > 0 ? visible - 1 : 0), text->scroll);
+    if (text->scroll_bottom != MAX (CLAMP(text->scroll, 1, text->scroll_max) +
+      (visible > 0 ? visible - 1 : 0), text->scroll)) {
+      text->scroll_bottom = MAX (CLAMP(text->scroll, 1, text->scroll_max) +
+	(visible > 0 ? visible - 1 : 0), text->scroll);
+      text->scroll_changed = TRUE;
+    }
   }
 }
 
@@ -940,6 +960,23 @@ swfdec_text_field_movie_finish_movie (SwfdecMovie *movie)
 }
 
 static void
+swfdec_text_field_movie_iterate (SwfdecMovie *movie)
+{
+  SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (movie);
+
+  if (text->scroll_changed) {
+    SwfdecAsValue argv[2];
+
+    SWFDEC_AS_VALUE_SET_STRING (&argv[0], SWFDEC_AS_STR_onScroller);
+    SWFDEC_AS_VALUE_SET_OBJECT (&argv[1], SWFDEC_AS_OBJECT (movie));
+    swfdec_as_object_call (SWFDEC_AS_OBJECT (movie),
+	SWFDEC_AS_STR_broadcastMessage, 2, argv, NULL);
+
+    text->scroll_changed = FALSE;
+  }
+}
+
+static void
 swfdec_text_field_movie_class_init (SwfdecTextFieldMovieClass * g_class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (g_class);
@@ -952,6 +989,7 @@ swfdec_text_field_movie_class_init (SwfdecTextFieldMovieClass * g_class)
 
   movie_class->init_movie = swfdec_text_field_movie_init_movie;
   movie_class->finish_movie = swfdec_text_field_movie_finish_movie;
+  movie_class->iterate_start = swfdec_text_field_movie_iterate;
   movie_class->update_extents = swfdec_text_field_movie_update_extents;
   movie_class->render = swfdec_text_field_movie_render;
 }
diff --git a/libswfdec/swfdec_text_field_movie.h b/libswfdec/swfdec_text_field_movie.h
index 058d915..70ddb4f 100644
--- a/libswfdec/swfdec_text_field_movie.h
+++ b/libswfdec/swfdec_text_field_movie.h
@@ -92,6 +92,7 @@ struct _SwfdecTextFieldMovie {
   gboolean		embed_fonts;
   SwfdecStyleSheet *	style_sheet;
 
+  gboolean		scroll_changed; /* if any of the scroll attributes have changed and we haven't fired the event yet */
   int			scroll;
   int			scroll_max;
   int			scroll_bottom;
diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index 4235111..75770bb 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -587,6 +587,7 @@ swfdec_text_field_movie_do_set_hscroll (SwfdecAsContext *cx,
   value = CLAMP (value, 0, text->hscroll_max);
   if (value != text->hscroll) {
     text->hscroll = value;
+    text->scroll_changed = TRUE;
     swfdec_movie_invalidate (SWFDEC_MOVIE (text));
   }
 }
@@ -672,6 +673,7 @@ swfdec_text_field_movie_do_set_scroll (SwfdecAsContext *cx,
   if (value != text->scroll) {
     text->scroll_bottom += value - text->scroll;
     text->scroll = value;
+    text->scroll_changed = TRUE;
     swfdec_movie_invalidate (SWFDEC_MOVIE (text));
   }
 }
commit 876a5a755308af20d35b7e8528c9a42a6c8d4398
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Oct 22 10:55:47 2007 +0300

    Make TextField instances do addListener on themselves

diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index 1d3e791..93ac9aa 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -890,6 +890,11 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie)
 	SWFDEC_AS_VALUE_GET_OBJECT (&val));
   }
 
+  // listen self
+  SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (movie));
+  swfdec_as_object_call (SWFDEC_AS_OBJECT (movie), SWFDEC_AS_STR_addListener,
+      1, &val, NULL);
+
   // format
   text->format_new =
     SWFDEC_TEXT_FORMAT (swfdec_text_format_new_no_properties (cx));
diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index 4b85cc9..4235111 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -1319,5 +1319,7 @@ swfdec_text_field_movie_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   swfdec_text_field_movie_init_properties (cx);
 
+  // FIXME: do object.addListener (object);
+
   SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
 }


More information about the Swfdec mailing list