Загружаем классы в текущий SecurityDomain.
Этот код позволяет универсально решить проблему загрузки классов внешних модулей и библиотек в текущий SecurityDomain приложения. Даже при отсутствии разрешений распространителя (crossdomain.xml) и создателя (Security.allowDomain()). Не требуется проверка на SecurityError или обработка SecurityErrorEvent.
Немного о проблеме — раз, два, три (проблема с взаимодействием local-remote)
/* The MIT License, Copyright (c) 2011. Dimarik */ package { import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; import flash.system.LoaderContext; import flash.system.Security; import flash.system.SecurityDomain; import substitutionTestClasses.BaseClass; /** * @author Dimarik * @version 1.2 * @langversion 3.0 * @playerversion 9.0 * */ [SWF(width="800", height="600", frameRate="21", backgroundColor="#E0EEEE")] public class ClassSubstitutionTest extends Sprite { //------------------------------------------------------------------------- // // Private class constants // //------------------------------------------------------------------------- /** * @private */ private static const IS_REMOTE:Boolean = Security.sandboxType == Security.REMOTE; //------------------------------------------------------------------------- // // Constructor // //------------------------------------------------------------------------- public function ClassSubstitutionTest() { super(); super.addEventListener(Event.ADDED_TO_STAGE, this.creationComplete); } //------------------------------------------------------------------------- // // Private methods // //------------------------------------------------------------------------- private function creationComplete(event:Event):void { super.removeEventListener(event.type, arguments.callee); const loader:Loader = new Loader(); const li:LoaderInfo = loader.contentLoaderInfo; li.addEventListener(Event.COMPLETE, this.handler_complete, false, int.MAX_VALUE); li.addEventListener(Event.COMPLETE, this.handler_publicComplete); /* Условие: этот ролик (loader) запускается с сайта или локально. У loadee песочница REMOTE (загрузка с "сайта"). */ loader.load( new URLRequest("http://example.com/loadee.swf?") ); /* Условие: этот ролик (loader) запускается только локально (если loader на сайте, то путь будет интерпретирован как относительный и этот вариант ничем не будет отличаться от загрузки строчкой выше). Загрузка с локальной файловой системы. Песочница local. Если позволяет (local-trusted, local-with-filesistem), то загрузит точно. Раскомментируйте для проверки. */ //loader.load( new URLRequest("loadee.swf")); } //------------------------------------------------------------------------- // // Event handlers // //------------------------------------------------------------------------- /** * @private * Основной обработчик */ private function handler_publicComplete(event:Event):void { const li:LoaderInfo = event.target as LoaderInfo; li.removeEventListener(event.type, arguments.callee); const test:BaseClass = li.content as BaseClass; // Not null. Bingo! test.test();// [BaseClass из текущего ApplicationDomain] } /** * @private * Вспомогательный обработчик */ private function handler_complete(event:Event):void { const li:LoaderInfo = event.target as LoaderInfo; li.removeEventListener(event.type, arguments.callee); if ( !(li.sameDomain || IS_REMOTE) // Локальный лоадер загружает удаленный ролик. || !li.childAllowsParent // У loadee нет разрешения создателя Security.allowDomain() ) { event.stopImmediatePropagation(); li.loader.loadBytes(li.bytes); } } } }
Всего комментариев 6
Комментарии
28.02.2011 23:05 | |
Я часто посылаю кого-нибудь по ссылке. Именно для этого я и сделал эту запись. Если кого-то интересует для чего и как оно работает, то поясню в комментариях. Только если мне не будет лениво. Вот вдохновившая меня тема.
|
28.02.2011 23:25 | |
Замечательная идея по поводу двух обработчиков. Я использовал флаг, но этот способ мне кажется гораздо приятней =)
|
01.03.2011 18:22 | |
проверка на isRemote довольно странная...
|
02.03.2011 00:18 | |
Николай, так получилось )
Это тип песочницы. |
|
Обновил(-а) dimarik 02.03.2011 в 00:22
|
02.03.2011 01:20 | |
ну ты же понимаешь что при LOCAL особо ничего не изменится при попытке грузить из другого домена? и почему константа не static?
|
03.03.2011 11:23 | |
Обновил лоадер. Теперь, даже если у loadee нет разрешения создателя ( Security.allowDomain() ), она будет загружена в текущий ApplicationDomain
|
Последние записи от dimarik
- Memory allocation на Vector.<IInterface> (07.05.2015)
- [Starling] Тормози меня плавно! (28.10.2014)
- [Starling идиотизмы] Об интерактивных событиях (02.10.2014)
- О типах исключений. (23.04.2014)
- Немного о Vector и ByteArray (28.03.2014)