core: Implement avm2 event: links in texts

This commit is contained in:
Nathan Adams 2023-08-18 00:03:12 +02:00
parent 814a900b03
commit f0d356589a
8 changed files with 195 additions and 0 deletions

View File

@ -145,6 +145,35 @@ impl<'gc> EventObject<'gc> {
.unwrap() // we don't expect to break here
}
pub fn text_event<S>(
activation: &mut Activation<'_, 'gc>,
event_type: S,
text: AvmString<'gc>,
bubbles: bool,
cancelable: bool,
) -> Object<'gc>
where
S: Into<AvmString<'gc>>,
{
let event_type: AvmString<'gc> = event_type.into();
let text_event_cls = activation.avm2().classes().textevent;
text_event_cls
.construct(
activation,
&[
event_type.into(),
// bubbles
bubbles.into(),
// cancelable
cancelable.into(),
// text
text.into(),
],
)
.unwrap() // we don't expect to break here
}
pub fn net_status_event<S>(
activation: &mut Activation<'_, 'gc>,
event_type: S,

View File

@ -1637,6 +1637,14 @@ impl<'gc> EditText<'gc> {
if let Err(e) = self.execute_avm1_asfunction(context, address) {
error!("Couldn't execute URL \"{url:?}\": {e:?}");
}
} else if let Some(address) = url.strip_prefix(WStr::from_units(b"event:")) {
if let Avm2Value::Object(object) = self.object2() {
let mut activation = Avm2Activation::from_nothing(context.reborrow());
let text = AvmString::new(activation.context.gc_context, address);
let event = Avm2EventObject::text_event(&mut activation, "link", text, true, false);
Avm2::dispatch_event(&mut activation.context, event, object);
}
} else {
context
.navigator

View File

@ -0,0 +1,47 @@
package {
import flash.display.MovieClip;
import flash.text.TextField;
import flash.events.TextEvent;
public class Test extends MovieClip {
public var text: TextField;
public function Test() {
text.htmlText = "" +
"<p>Click <a href='event:alert1'>here</a> to call alert 1</p>" +
"<p>Or click <a href='event:Second Test'>here</a> to call alert 2</p>" +
"<p><a href='event:'>this one is empty</a></p>" +
"<p>But <a href='event:a,b,c,d'>this one</a> has lots of args!</p>" +
"";
text.addEventListener(TextEvent.LINK, this.onLink);
}
function onLink(event: TextEvent) {
trace("/// onLink called!");
trace("// event.text");
trace(event.text);
trace("");
trace("// event.bubbles");
trace(event.bubbles);
trace("");
trace("// event.cancelable");
trace(event.cancelable);
trace("");
trace("// event.currentTarget");
trace(event.currentTarget);
trace("");
trace("// event.target");
trace(event.target);
trace("");
trace("");
}
}
}

View File

@ -0,0 +1,42 @@
[
{
"type": "MouseDown",
"pos": [134, 69],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [134, 69],
"btn": "Left"
},
{
"type": "MouseDown",
"pos": [166, 95],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [166, 95],
"btn": "Left"
},
{
"type": "MouseDown",
"pos": [143, 128],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [143, 128],
"btn": "Left"
},
{
"type": "MouseDown",
"pos": [142, 160],
"btn": "Left"
},
{
"type": "MouseUp",
"pos": [142, 160],
"btn": "Left"
}
]

View File

@ -0,0 +1,68 @@
/// onLink called!
// event.text
alert1
// event.bubbles
true
// event.cancelable
false
// event.currentTarget
[object TextField]
// event.target
[object TextField]
/// onLink called!
// event.text
Second Test
// event.bubbles
true
// event.cancelable
false
// event.currentTarget
[object TextField]
// event.target
[object TextField]
/// onLink called!
// event.text
// event.bubbles
true
// event.cancelable
false
// event.currentTarget
[object TextField]
// event.target
[object TextField]
/// onLink called!
// event.text
a,b,c,d
// event.bubbles
true
// event.cancelable
false
// event.currentTarget
[object TextField]
// event.target
[object TextField]

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
num_ticks = 1