Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблемы с отображением AVM1 в AVM2 (http://www.flasher.ru/forum/showthread.php?t=125332)

Mur4ik 21.05.2009 18:00

Проблемы с отображением AVM1 в AVM2
 
Есть 2 домена, на одном (допустим домен А) swf c AS3, на другом (допустим домен Б) swf c AS2.
На домене Б лежит crossdomain.xml

Загружаю из Б в А swf, примерно так:

Код AS3:

var url:String = "http://домен Б/some.swf";
var urlReq:URLRequest = new URLRequest(url);
var ldrCntx:LoaderContext = new LoaderContext();
        ldrCntx.checkPolicyFile = false;
        ldrCntx.securityDomain = SecurityDomain.currentDomain;
var ldr:Loader = new Loader();
        ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
        ldr.load(urlReq, ldrCntx);
 
function onLoaded(e:Event):void
{
        addChild(e.target.content);
}

При тестах локально выдает ошибку безопастности, а при работе на домене A никаких ошибок, но в swf из домена Б отображается только анимация, скрипты не работают.

При тестах локально с таким кодом:
Код AS3:

var url:String = "http://домен Б/some.swf"; 
var urlReq:URLRequest = new URLRequest(url);
var ldr:Loader = new Loader();
        ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
        ldr.load(urlReq);
 
function onLoaded(e:Event):void
{
        addChild(e.target.content);
}

swf из домена Б работает без проблем с анимацией и со скриптами, но при работе в сети вываливается ошибка безопасности.

Что я делаю не так, и как заставить корректно работать swf из домена Б в swf c домена А?

P.S. Флешки не общаются друг с другом, просто скрипты в загружаемой флешке не работают по отношению к ней же.

silin 21.05.2009 20:12

прописать System.security.allowDomain("*"); в подгружаемой флешке не поможет?
и грузить в дефолтовый securityDomain

Mur4ik 21.05.2009 20:55

System.security.allowDomain("*"); прописывал, не помогает.

А по подробнее про "грузить в дефолтовый securityDomain" можно?
Т.е вместо ldrCntx.securityDomain = SecurityDomain.currentDomain;
заменить на ldrCntx.securityDomain = null;
так?

silin 21.05.2009 22:27

да я сам не слишком ориентируюсь, сори
как я понял, по умолчанию флешка с другого домена грузится в контексте своего security domain, а с ldrCntx.securityDomain = SecurityDomain.currentDomain; в контексте загружающего, как если бы она было загружена с того же домена..
вот и подумалось, что с allowDomain("*") могло бы сложиться и с дефолтовой загрузкой, походу устранив косяк.., но это только предположение

Mur4ik 21.05.2009 23:41

Спасибо. за совет, но косяк устранился через "дырку", но все же хотелось бы понять как это делается документированными методами.

Кто нить в курсе?

dimarik 22.05.2009 00:29

Что за дырка, поясните.

Mur4ik 22.05.2009 02:11

Я не знаю дырки это или нет, одно из решений загрузки контента в обход политик безопасности демонстрировал __etc недавно, нечто подобное и у меня есть, но это, так сказать, временные заплатки, которые может и прикроют скоро. Хотелось бы решать проблемы "легальными" и надежными методами.
Решения через серверные скрипты-прокси не в счет.

etc 22.05.2009 08:51

loadBytes что ли?

Mur4ik 22.05.2009 20:59

нет не bytes и loadBytes, чуток по другому

Код AS3:

private function onLoadData(event:Event):void
                {
                        var xml:XML = new XML(event.target.data);
                        var loader:Loader = new Loader();
                        var context:LoaderContext = new LoaderContext();
 
                        loader.load( new URLRequest(xml.@url.toString()), context );
                        loader.contentLoaderInfo.addEventListener(Event.INIT, onButtonLoaded);
 
                        bannerLink = xml.@link.toString();
                }
 
 
 
                private function onButtonLoaded(event:Event):void
                {
                        var ldrInfo:LoaderInfo = event.target as LoaderInfo;
                        var unrealContent:DisplayObject;
 
                        try
                        {
                                // это в случае если нет проблем с security
                                unrealContent = ldrInfo.loader.content;
                        }
                        catch(err:SecurityError)
                        {
                                // Fuck Flash Sequrity
                                var loaderContainer:Sprite = new Sprite();
 
                                loaderContainer.addChild(ldrInfo.loader);
                                unrealContent = loaderContainer as DisplayObject;
                        }
 
                        mcUsualBannerContainer.addChild(unrealContent);
                        mcUsualBannerContainer.mouseChildren = false;
                        mcUsualBannerContainer.mouseEnabled = false;
 
                        btLink.addEventListener(MouseEvent.CLICK, onClick);
                }


etc 23.05.2009 12:06

Я не понял в чем тут «обход».


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

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