Package | flash.system |
Class | public final class ApplicationDomain |
Inheritance | ApplicationDomain Object |
Language Version: | ActionScript 3.0 |
Runtime Versions: | Flash Player 9, AIR 1.0 |
Application domains are used when an external SWF file is loaded through the Loader class.
All ActionScript 3.0 definitions in the loaded SWF file are stored in the application
domain, which is specified by the applicationDomain
property of the LoaderContext
object that you pass as a context
parameter of the Loader object's load()
or
loadBytes()
method. The LoaderInfo object also contains an
applicationDomain
property, which is read-only.
All code in a SWF file is defined to exist in an application domain. The current application domain is where your main application runs. The system domain contains all application domains, including the current domain, which means that it contains all Flash Player classes.
Every application domain, except the system domain, has an associated parent domain. The parent domain of your main application's application domain is the system domain. Loaded classes are defined only when their parent doesn't already define them. You cannot override a loaded class definition with a newer definition.
For usage examples of application domains, see Programming ActionScript 3.0.
The ApplicationDomain()
constructor function allows you to create an ApplicationDomain object.
See also
flash.display.Loader.loadBytes()
flash.display.LoaderInfo
flash.net.URLRequest
flash.system.LoaderContext
About application domains
Property | Defined By | ||
---|---|---|---|
constructor : Object
A reference to the class object or constructor function for a given object instance. | Object | ||
currentDomain : ApplicationDomain [static] [read-only]
Gets the current application domain in which your code is executing. | ApplicationDomain | ||
domainMemory : ByteArray
Gets and sets the object on which domain-global memory operations
will operate within this ApplicationDomain. | ApplicationDomain | ||
MIN_DOMAIN_MEMORY_LENGTH : uint [static] [read-only]
Gets the minimum memory object length required to be used as
ApplicationDomain.domainMemory. | ApplicationDomain | ||
parentDomain : ApplicationDomain [read-only]
Gets the parent domain of this application domain. | ApplicationDomain | ||
prototype : Object [static]
A reference to the prototype object of a class or function object. | Object |
Method | Defined By | ||
---|---|---|---|
ApplicationDomain(parentDomain:ApplicationDomain = null)
Creates a new application domain. | ApplicationDomain | ||
Gets a public definition from the specified application domain. | ApplicationDomain | ||
Checks to see if a public definition exists within the specified application domain. | ApplicationDomain | ||
Indicates whether an object has a specified property defined. | Object | ||
Indicates whether an instance of the Object class is in the prototype chain of the object specified
as the parameter. | Object | ||
Indicates whether the specified property exists and is enumerable. | Object | ||
Sets the availability of a dynamic property for loop operations. | Object | ||
Returns the string representation of this object, formatted according to locale-specific conventions. | Object | ||
Returns the string representation of the specified object. | Object | ||
Returns the primitive value of the specified object. | Object |
currentDomain | property |
currentDomain:ApplicationDomain
[read-only] Language Version: | ActionScript 3.0 |
Runtime Versions: | Flash Player 9, AIR 1.0 |
Gets the current application domain in which your code is executing.
Implementation
public static function get currentDomain():ApplicationDomain
domainMemory | property |
domainMemory:ByteArray
Language Version: | ActionScript 3.0 |
Runtime Versions: | Flash Player 10, AIR 1.5 |
Gets and sets the object on which domain-global memory operations will operate within this ApplicationDomain.
Implementation
public function get domainMemory():ByteArray
public function set domainMemory(value:ByteArray):void
MIN_DOMAIN_MEMORY_LENGTH | property |
MIN_DOMAIN_MEMORY_LENGTH:uint
[read-only] Language Version: | ActionScript 3.0 |
Runtime Versions: | Flash Player 10, AIR 1.5 |
Gets the minimum memory object length required to be used as ApplicationDomain.domainMemory.
Implementation
public static function get MIN_DOMAIN_MEMORY_LENGTH():uint
parentDomain | property |
parentDomain:ApplicationDomain
[read-only] Language Version: | ActionScript 3.0 |
Runtime Versions: | Flash Player 9, AIR 1.0 |
Gets the parent domain of this application domain.
Implementation
public function get parentDomain():ApplicationDomain
ApplicationDomain | () | Constructor |
public function ApplicationDomain(parentDomain:ApplicationDomain = null)
Language Version: | ActionScript 3.0 |
Runtime Versions: | Flash Player 9, AIR 1.0 |
Creates a new application domain.
ParametersparentDomain:ApplicationDomain (default = null ) — If no parent domain is passed in, this application domain takes the system domain as its parent.
|
getDefinition | () | method |
public function getDefinition(name:String):Object
Language Version: | ActionScript 3.0 |
Runtime Versions: | Flash Player 9, AIR 1.0 |
Gets a public definition from the specified application domain. The definition can be that of a class, a namespace, or a function.
Parameters
name:String — The name of the definition.
|
Object — The object associated with the definition.
|
Throws
ReferenceError — No public definition exists with the
specified name.
|
hasDefinition | () | method |
public function hasDefinition(name:String):Boolean
Language Version: | ActionScript 3.0 |
Runtime Versions: | Flash Player 9, AIR 1.0 |
Checks to see if a public definition exists within the specified application domain. The definition can be that of a class, a namespace, or a function.
Parameters
name:String — The name of the definition.
|
Boolean — A value of true if the specified definition exists; otherwise, false .
|
Notes:
- Since the ClassLoader class loads a SWF file, local security needs to be at the file system level.
- To run this example, you must have a swf file called RuntimeClasses.swf existing in the same folder as the ApplicationDomainExample.swf file.
Begin by creating the RuntimeClasses.swf file from the following code:
package { import flash.display.Sprite; public class RuntimeClasses extends Sprite { public function RuntimeClasses() {} public function greet():String { return("Hello World"); } } }
Then implement the following code:
package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.errors.IllegalOperationError; import flash.events.Event; import flash.text.TextField; public class ApplicationDomainExample extends Sprite { private var loader:ClassLoader; private var tf:TextField = new TextField(); public function ApplicationDomainExample() { addChild(tf); loader = new ClassLoader(); loader.addEventListener(ClassLoader.LOAD_ERROR,loadErrorHandler); loader.addEventListener(ClassLoader.CLASS_LOADED,classLoadedHandler); loader.load("RuntimeClasses.swf"); } private function loadErrorHandler(e:Event):void { tf.text = "Load failed"; throw new IllegalOperationError("Cannot load the specified file."); } private function classLoadedHandler(e:Event):void { var runtimeClassRef:Class = loader.getClass("RuntimeClasses"); var greeter:Object = new runtimeClassRef(); tf.text = greeter.greet(); } } } import flash.display.Loader; import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; import flash.net.URLRequest; import flash.system.ApplicationDomain; import flash.system.LoaderContext; class ClassLoader extends EventDispatcher { public static var CLASS_LOADED:String = "classLoaded"; public static var LOAD_ERROR:String = "loadError"; private var loader:Loader; private var swfLib:String; private var request:URLRequest; private var loadedClass:Class; public function ClassLoader() { loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler); loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler); } public function load(lib:String):void { swfLib = lib; request = new URLRequest(swfLib); var context:LoaderContext = new LoaderContext(); context.applicationDomain=ApplicationDomain.currentDomain; loader.load(request,context); } public function getClass(className:String):Class { try { return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class; } catch (e:Error) { throw new IllegalOperationError(className + " definition not found in " + swfLib); } return null; } private function completeHandler(e:Event):void { dispatchEvent(new Event(ClassLoader.CLASS_LOADED)); } private function ioErrorHandler(e:Event):void { dispatchEvent(new Event(ClassLoader.LOAD_ERROR)); } private function securityErrorHandler(e:Event):void { dispatchEvent(new Event(ClassLoader.LOAD_ERROR)); } }
ApplicationDomain.currentDomain
. In this case, a new ApplicationDomain
is created,
so that then the properties and methods of the Greeter
class of whichever SWF loads second will not replace the properties and methods of the first Greeter
class.
You can test this by modifying the context.applicationDomain
property in the load
method of ClassLoader
.
Notes:
- Since the ClassLoader class loads a SWF file, local security needs to be at the file system level.
- To run this example, you must have two SWF files called Greeter.swf existing in an "en" and "es" folder respectively.
Create a Greeter.as file in the "en" directory with the following code:
package { import flash.display.Sprite; public class Greeter extends Sprite { public function Greeter() { } public function greet():String { return("Good Morning"); } } }
Then create a very similar Greeter.as file in the "es" directory:
package { import flash.display.Sprite; public class Greeter extends Sprite { public function Greeter() { } public function greet():String { return("Buenos Dias"); } } }
Compile SWF files for both and then implement the following code:
package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.errors.IllegalOperationError; import flash.events.Event; import flash.text.TextField; import flash.text.TextFieldAutoSize; public class ApplicationDomainExample2 extends Sprite { private var spanishGreeterLoader:ClassLoader; private var englishGreeterLoader:ClassLoader; private var tf:TextField = new TextField(); private var greetersLoaded:uint = 0; public function ApplicationDomainExample2() { tf.autoSize = TextFieldAutoSize.LEFT; addChild(tf); spanishGreeterLoader = new ClassLoader(); spanishGreeterLoader.addEventListener(ClassLoader.LOAD_ERROR,loadErrorHandler); spanishGreeterLoader.addEventListener(ClassLoader.CLASS_LOADED,classLoadedHandler); spanishGreeterLoader.load("es/Greeter.swf"); englishGreeterLoader = new ClassLoader(); englishGreeterLoader.addEventListener(ClassLoader.LOAD_ERROR,loadErrorHandler); englishGreeterLoader.addEventListener(ClassLoader.CLASS_LOADED,classLoadedHandler); englishGreeterLoader.load("en/Greeter.swf"); } private function loadErrorHandler(e:Event):void { tf.text = "Load failed"; throw new IllegalOperationError("Cannot load the specified file."); } private function classLoadedHandler(e:Event):void { greetersLoaded++; if(greetersLoaded == 2) { greet(); } } private function greet():void { var spanishGreeter:Class = spanishGreeterLoader.getClass("Greeter"); var englishGreeter:Class = englishGreeterLoader.getClass("Greeter"); var greeter1 = new spanishGreeter(); var greeter2 = new englishGreeter(); tf.text = greeter1.greet() + "\n" + greeter2.greet(); } } } import flash.display.Loader; import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; import flash.net.URLRequest; import flash.system.ApplicationDomain; import flash.system.LoaderContext; class ClassLoader extends EventDispatcher { public static var CLASS_LOADED:String = "classLoaded"; public static var LOAD_ERROR:String = "loadError"; private var loader:Loader; private var swfLib:String; private var request:URLRequest; private var loadedClass:Class; public function ClassLoader() { loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler); loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler); } public function load(lib:String):void { swfLib = lib; request = new URLRequest(swfLib); var context:LoaderContext = new LoaderContext(); // context.applicationDomain = ApplicationDomain.currentDomain; context.applicationDomain = new ApplicationDomain(); loader.load(request,context); } public function getClass(className:String):Class { try { return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class; } catch (e:Error) { throw new IllegalOperationError(className + " definition not found in " + swfLib); } return null; } private function completeHandler(e:Event):void { dispatchEvent(new Event(ClassLoader.CLASS_LOADED)); } private function ioErrorHandler(e:Event):void { dispatchEvent(new Event(ClassLoader.LOAD_ERROR)); } private function securityErrorHandler(e:Event):void { dispatchEvent(new Event(ClassLoader.LOAD_ERROR)); } }
Fri Mar 19 2010, 02:45 AM -07:00