diff --git a/core/src/display_object/edit_text.rs b/core/src/display_object/edit_text.rs index deb9a068f2748..5b6157105e466 100644 --- a/core/src/display_object/edit_text.rs +++ b/core/src/display_object/edit_text.rs @@ -2000,7 +2000,13 @@ impl<'gc> EditText<'gc> { }; if let Avm2Value::Object(target) = self.object2() { - let character_string = AvmString::new_utf8(context.gc(), character.to_string()); + let character_string = AvmString::new_utf8( + context.gc(), + match character { + Self::INPUT_NEWLINE => "\n".into(), + chr => chr.to_string(), + }, + ); let mut activation = Avm2Activation::from_nothing(context); let text_evt = Avm2EventObject::text_event( diff --git a/tests/tests/swfs/avm2/edittext_newline_character/Test.as b/tests/tests/swfs/avm2/edittext_newline_character/Test.as new file mode 100644 index 0000000000000..4422f7d57f1da --- /dev/null +++ b/tests/tests/swfs/avm2/edittext_newline_character/Test.as @@ -0,0 +1,40 @@ +package { + import flash.display.Sprite; + import flash.events.Event; + import flash.events.KeyboardEvent; + import flash.events.TextEvent; + import flash.text.TextField; + import flash.text.TextFieldType; + + public class Test extends Sprite { + public function Test() { + var textField: TextField = new TextField(); + textField.type = TextFieldType.INPUT; + textField.border = true; + textField.multiline = true; + textField.height = 200; + textField.addEventListener(Event.CHANGE, onChange); + textField.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); + textField.addEventListener(TextEvent.TEXT_INPUT, onTextInput); + addChild(textField); + } + + public function onChange(evt: Event): void { + trace("onChange"); + + var text: String = evt.target.text; + for (var i: int = 0; i < text.length; i++) { + trace(" U+" + text.charCodeAt(i).toString(16)); + } + } + + public function onKeyDown(evt: KeyboardEvent): void { + // TODO: We must not be firing this event yet. + // trace("onKeyDown: U+" + evt.charCode.toString(16)); + } + + public function onTextInput(evt: TextEvent): void { + trace("onTextInput: U+" + evt.text.charCodeAt(0).toString(16)); + } + } +} diff --git a/tests/tests/swfs/avm2/edittext_newline_character/input.json b/tests/tests/swfs/avm2/edittext_newline_character/input.json new file mode 100644 index 0000000000000..21926b2ae76a8 --- /dev/null +++ b/tests/tests/swfs/avm2/edittext_newline_character/input.json @@ -0,0 +1,7 @@ +[ + { "type": "MouseDown", "pos": [10, 10], "btn": "Left" }, + { "type": "TextInput", "codepoint": "a" }, + { "type": "TextControl", "code": "Enter" }, + { "type": "TextInput", "codepoint": "b" }, + { "type": "TextControl", "code": "Enter" } +] \ No newline at end of file diff --git a/tests/tests/swfs/avm2/edittext_newline_character/output.txt b/tests/tests/swfs/avm2/edittext_newline_character/output.txt new file mode 100644 index 0000000000000..b754f2d2ea591 --- /dev/null +++ b/tests/tests/swfs/avm2/edittext_newline_character/output.txt @@ -0,0 +1,18 @@ +onTextInput: U+61 +onChange + U+61 +onTextInput: U+a +onChange + U+61 + U+d +onTextInput: U+62 +onChange + U+61 + U+d + U+62 +onTextInput: U+a +onChange + U+61 + U+d + U+62 + U+d diff --git a/tests/tests/swfs/avm2/edittext_newline_character/test.swf b/tests/tests/swfs/avm2/edittext_newline_character/test.swf new file mode 100644 index 0000000000000..98ff5ada982b7 Binary files /dev/null and b/tests/tests/swfs/avm2/edittext_newline_character/test.swf differ diff --git a/tests/tests/swfs/avm2/edittext_newline_character/test.toml b/tests/tests/swfs/avm2/edittext_newline_character/test.toml new file mode 100644 index 0000000000000..cf6123969a1d6 --- /dev/null +++ b/tests/tests/swfs/avm2/edittext_newline_character/test.toml @@ -0,0 +1 @@ +num_ticks = 1