flash.system

# ApplicationDomain - AS3

Package | flash.system
Class | public final class ApplicationDomain
Inheritance | ApplicationDomain Object

Language Version: | ActionScript 3.0

Runtime Versions: | AIR 1.0, Flash Player 9, Flash Lite 4

The ApplicationDomain class is a container for discrete groups of class definitions. Application domains are used to partition classes that are in the same security domain. They allow multiple definitions of the same class to exist and allow children to reuse parent definitions.

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 the ActionScript 3.0 Developer's Guide.

The `ApplicationDomain()` constructor function allows you to create an ApplicationDomain object.

View the examples

More examples

Working with application domains

Learn more

About application domains

Related API Elements

flash.display.Loader.load()
flash.display.Loader.loadBytes()
flash.display.LoaderInfo
flash.net.URLRequest
flash.system.LoaderContext

Public Properties
Hide Inherited Public Properties
Show Inherited Public Properties

| 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

Public Methods
Hide Inherited Public Methods
Show Inherited Public Methods

| Method | Defined By
--- | --- | ---
|  | ApplicationDomain(parentDomain:ApplicationDomain = null) Creates a new application domain. | ApplicationDomain
|  | getDefinition(name:String):Object Gets a public definition from the specified application domain. | ApplicationDomain
|  | getQualifiedDefinitionNames():Vector.<String> Gets all fully-qualified names of public definitions from the specified application domain. | ApplicationDomain
|  | hasDefinition(name:String):Boolean Checks to see if a public definition exists within the specified application domain. | ApplicationDomain
|  | hasOwnProperty(name:String):Boolean Indicates whether an object has a specified property defined. | Object
|  | isPrototypeOf(theClass:Object):Boolean Indicates whether an instance of the Object class is in the prototype chain of the object specified as the parameter. | Object
|  | propertyIsEnumerable(name:String):Boolean Indicates whether the specified property exists and is enumerable. | Object
|  | setPropertyIsEnumerable(name:String, isEnum:Boolean = true):void Sets the availability of a dynamic property for loop operations. | Object
|  | toLocaleString():String Returns the string representation of this object, formatted according to locale-specific conventions. | Object
|  | toString():String Returns the string representation of the specified object. | Object
|  | valueOf():Object Returns the primitive value of the specified object. | Object

Property Detail

### currentDomain

property

`currentDomain:ApplicationDomain` [read-only]

Language Version: | ActionScript 3.0

Runtime Versions: | AIR 1.0, Flash Player 9, Flash Lite 4

Gets the current application domain in which your code is executing.

Implementation
`public static function get currentDomain():ApplicationDomain`

More examples

Working with application domains

### domainMemory

property

`domainMemory:ByteArray`

Language Version: | ActionScript 3.0

Runtime Versions: | Flash Player 10, AIR 1.5, Flash Lite 4

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, Flash Lite 4

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: | AIR 1.0, Flash Player 9, Flash Lite 4

Gets the parent domain of this application domain.

Implementation
`public function get parentDomain():ApplicationDomain`

More examples

Working with application domains
Constructor Detail

### ApplicationDomain

()
Constructor

`public function ApplicationDomain(parentDomain:ApplicationDomain = null)`

Language Version: | ActionScript 3.0

Runtime Versions: | AIR 1.0, Flash Player 9, Flash Lite 4

Creates a new application domain.

Parameters

| `parentDomain:ApplicationDomain` (default = `null`)`` — If no parent domain is passed in, this application domain takes the system domain as its parent.

Method Detail

### getDefinition

()
method

`public function getDefinition(name:String):Object`

Language Version: | ActionScript 3.0

Runtime Versions: | AIR 1.0, Flash Player 9, Flash Lite 4

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.

Returns

| `Object` — The object associated with the definition.

Throws

| `ReferenceError` — No public definition exists with the specified name.

### getQualifiedDefinitionNames

()
method

`public function getQualifiedDefinitionNames():Vector.<String>`

Language Version: | ActionScript 3.0

Runtime Versions: | Flash Player 11.3, AIR 3.3

Gets all fully-qualified names of public definitions from the specified application domain. The definition can be that of a class, a namespace, or a function. The names returned from this method can be passed to the `getDefinition()` method to get the object of the actual definition.

The returned Vector is of type String, where each String is in the form: `package.path::definitionName`

If `definitionName` is in the top-level package, then `package.path::` is omitted.

For example, for the following class definition:

         package my.Example
         {
           public class SampleClass extends Sprite
           { }
         }

This method returns "my.Example::SampleClass".

Returns

| `Vector.<String>` — An unsorted Vector of Strings which are the names of the definitions. If there is no definition, an empty Vector.<String> is returned.

Throws

| `SecurityError` — The definition belongs to a domain to which the calling code does not have access.

### hasDefinition

()
method

`public function hasDefinition(name:String):Boolean`

Language Version: | ActionScript 3.0

Runtime Versions: | AIR 1.0, Flash Player 9, Flash Lite 4

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.

Returns

| `Boolean` — A value of `true` if the specified definition exists; otherwise, `false`.

Examples How to use this example
ApplicationDomainExample.as
The following example demonstrates runtime class loading as well as how to call public methods of a class that reside in another SWF.

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:

Copy

     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:

Copy

    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));
        }
    }

ApplicationDomainExample.2.as
If multiple SWF files contain compiled classes with the same name but provide different implementation, you can partition the classes of externally loaded SWF files separate from the classes of each other following this example. Previously, the child SWF was instructed to use `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:

Copy

     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:

Copy

     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:

Copy

    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));
        }
    }

© 2015 Adobe Systems Incorporated. All rights reserved.
Mon Apr 10 2017, 12:28 PM -07:00