Opening links to web pages from AS3 is pretty well covered in various online documentation. It’s similarly straightforward in Haxe. Recently, however, I came to realize that it wasn’t normal Flash behavior that Haxe programs would only open links in the browser or standalone player if served from a server, even localhost, and not from a local ‘file:’ URL.
It turned out this was because Haxe by default compiles to a different, more restricted network security model than that to which the Adobe tools compile. Even if opened from a MouseEvent, the navigation calls are blocked, as is all network access from a local SWF. To enable this network access and allow links to be opened, you have to compile with the network-sandbox compiler flag (-Dnetwork-sandbox). The documentation for it is a little non-intuitively ambiguous, but that actually enables more access than the default. Links should now all work, from a hosted or local SWF.
As a sidenote, the code to open a link in Haxe looks like this:
import flash.Lib;
import flash.text.TextField;
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.events.MouseEvent;
import flash.events.Event;
class Sample extends Sprite
{
public function new()
{
super();
Lib.current.stage.addChild(this);
var label:TextField=new TextField();
label.width=800;
label.text="Click to open google!";
addChild(label);
Lib.current.stage.addEventListener(MouseEvent.CLICK,onClick);
}
public function onClick(inEvent:MouseEvent)
{
Lib.getURL(new URLRequest("http://www.google.com"));
}
public static function main()
{
new Sample();
}
}
Its equivalent in AS3 looks like the following:
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.net.URLRequest;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.net.navigateToURL;
import flash.net.URLRequest;
public class LinkTest extends Sprite {
public function LinkTest() {
var label:TextField = new TextField();
label.width = 200;
label.text = "Click here";
addChild(label);
label.addEventListener(MouseEvent.CLICK, onClick);
}
public function onClick(e:MouseEvent) {
navigateToURL(new URLRequest("http://google.com"));
}
}
}
Internally Haxe’s flash.Lib is actually literally just calling navigateToURL via a pretty wild looking cast on the global symbol table entry, since Haxe has no concept of package level functions like AS3 does.