Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > dimarik

Рейтинг: 4.00. Голосов: 3.

Загружаем классы в текущий SecurityDomain.

Запись от dimarik размещена 28.02.2011 в 22:56
Обновил(-а) dimarik 25.10.2011 в 22:22

Этот код позволяет универсально решить проблему загрузки классов внешних модулей и библиотек в текущий SecurityDomain приложения. Даже при отсутствии разрешений распространителя (crossdomain.xml) и создателя (Security.allowDomain()). Не требуется проверка на SecurityError или обработка SecurityErrorEvent.

Немного о проблеме — раз, два, три (проблема с взаимодействием local-remote)



Код AS3:
/*
 
  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 dimarik вне форума
dimarik
 
Аватар для dimarik
Я часто посылаю кого-нибудь по ссылке. Именно для этого я и сделал эту запись. Если кого-то интересует для чего и как оно работает, то поясню в комментариях. Только если мне не будет лениво. Вот вдохновившая меня тема.
Старый 28.02.2011 23:25 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Замечательная идея по поводу двух обработчиков. Я использовал флаг, но этот способ мне кажется гораздо приятней =)
Старый 01.03.2011 18:22 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
проверка на isRemote довольно странная...
Старый 02.03.2011 00:18 dimarik вне форума
dimarik
 
Аватар для dimarik
Николай, так получилось )
Это тип песочницы.
Обновил(-а) dimarik 02.03.2011 в 00:22
Старый 02.03.2011 01:20 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
ну ты же понимаешь что при LOCAL особо ничего не изменится при попытке грузить из другого домена? и почему константа не static?
Старый 03.03.2011 11:23 dimarik вне форума
dimarik
 
Аватар для dimarik
Обновил лоадер. Теперь, даже если у loadee нет разрешения создателя ( Security.allowDomain() ), она будет загружена в текущий ApplicationDomain
 

 


Часовой пояс GMT +4, время: 00:35.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.