LoaderContext и ApplicationDomain изменяются с Adobe AIR?

Вы не можете заменить url текстом без какого-либо протокола, подобного этому, потому что php - серверный язык сценариев, он может влиять только на браузер.

8
задан euge1979 5 March 2009 в 04:18
поделиться

1 ответ

Получил его.

Проблема была вызвана другим поведением в SecurityDomain система в рамках приложения AIR. Когда файл SWF загружается в рамках приложения AIR, он всегда зависит к другой песочнице. Таким образом AIR создает новое SecurityDomain для этого SWF.

С тех пор a SecurityDomain группа одного или нескольких ApplicationDomains, это поведение вызвало создание нового ApplicationDomain (в новом SecurityDomain), игнорируя указанный (которые принадлежат 'основному' SecurityDomain).

Существует использование обходного решения URLLoader. При загрузке из байт-кода (использование Loader.loadBytes), SWF загружается в том же SecurityDomain. Поэтому необходимо поместить allowLoadBytesCodeExecution к истинному, так как это может быть небезопасно. Так загружая SWF косвенно, сначала хотя URLLoader, и затем с Loader.loadBytes, решите эту проблему.

Вот отрывок:

package {
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    import flash.utils.ByteArray;

    public class Invoker extends Sprite
    {
        public function Invoker()
        {
            var uldr : URLLoader = new URLLoader();
            uldr.dataFormat = URLLoaderDataFormat.BINARY;
            uldr.addEventListener(Event.COMPLETE, onBytesComplete);

            uldr.load(new URLRequest("otherSwf.swf"));
        }

        private function onBytesComplete(e : Event) : void
        {
            var bytes : ByteArray = (e.target as URLLoader).data;

            var ldr : Loader = new Loader();
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onChildComplete);

            var ldrC : LoaderContext = new LoaderContext();

            // This property was for AIR 1.0.
            //ldrC.allowLoadBytesCodeExecution = true;

            // Since AIR 2.0, it's allowCodeImport.
            ldrC.allowCodeImport = true;

            ldr.loadBytes(bytes, ldrC);
        }

        private function onChildComplete(e : Event) : void
        {
            var c1ad : ApplicationDomain = (e.target as LoaderInfo).applicationDomain;
            var inad : ApplicationDomain = ApplicationDomain.currentDomain;

            trace("Child One parentDomain : " + c1ad.parentDomain);
            trace("Invoker parentDomain   : " + inad.parentDomain);

            trace("Child One has Invoker  : " + c1ad.hasDefinition("Invoker"));
            trace("Invoker has Invoker    : " + inad.hasDefinition("Invoker"));
        }
    }
}

Надеюсь, это поможет.

14
ответ дан 5 December 2019 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: