Форум 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

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

Mur4ik 23.05.2009 22:36

Обход в том, что при таком методе можно не беспокоится есть ли crossdomain.xml или нет его, в любом случае контент загрузится (вернее отобразится).
Хотя судя по документации такого эффекта быть не должно, или я что то недопонимаю?

etc 23.05.2009 22:49

Вообще-то должно отобразится. Секьюрити запрещает обращение к контенту и только. В данном случае простое перемещение лоадера не является обходом политики.

Mur4ik 23.05.2009 22:57

Ну это радует )
Т.е это самое правильное решение в данном случае?

Хотя в доках вроде как сказано, что если нет файла политики, то и загрузить его не удастся, ексепшн то вываливается, значит так делать низя, сделали б адобовцы тогда возможность загрузки любого контента без файла политики, а уже при доступе к нему проверку на безопасность.

etc 24.05.2009 10:48

Цитата:

Сообщение от Mur4ik (Сообщение 822447)
сделали б адобовцы тогда возможность загрузки любого контента без файла политики, а уже при доступе к нему проверку на безопасность.

А разве это не так? Это касается того, что грузится Loader-ом.

Mur4ik 24.05.2009 21:32

Я про то, что если на сервере источнике не будет файла кроссдоменной политики, то отобразить загруженный loader-ом контент без ухищрений не получится.

etc 24.05.2009 21:56

Каких ухищрений? addChild Loader-а — ухищрение? А я думал, что это вполне себе разумное действие.

Mur4ik 24.05.2009 22:07

Такс... что то я уже запутался. Зачем я тогда изобретаю велосипед?

Без crossdomain.xml addChild loadera выкидывает обшибку безопасности (нарушение изолированной среды... бла-бла-бла). Или нет?

etc 24.05.2009 22:10

Не знаю, последний раз я загружал картинку с удаленного хоста сто лет назад.
Но не должен выдавать ошибку, особенно судя по чудному приведенному коду, где сначала есть попытка обратиться к контенту (что и вываливает ошибку), а затем уже addChild лоадера без всяких try … catch, что свидетельствует о том, что можно не выпендриваться и сразу делать addChild лоадера, не трогая контент.

Mur4ik 24.05.2009 22:23

Не... Вы немного не поняли сути. Там не просто addChild изначального loadera :)
А ексепшн все же выдается, если напрямую добавлять лоадер в список отображения, об этом свидетельствует код из первого поста. Собственно поэтому и поднялся этот вопрос здесь (иначе бы не спрашивал).
Естественно при тестах из Flash IDE или FD никаких ошибок не будет, проблемы начинаются после размещения swf в сети.

etc 24.05.2009 22:29

В первом посте добавляется контент лоадера, а не сам лоадер.

Mur4ik 24.05.2009 22:48

Точно :)
Век живи - век учись, при добавлении самого лоадера никаких проблем с безопасностью при отображении. Что то я переработался :), ищу сложностей там где их нет вообще.
Спасибо, будем знать.


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

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