Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Политика безопасности Flash-плеера и не только (http://www.flasher.ru/forum/showthread.php?t=158080)

forhaxed 15.06.2011 01:24

Политика безопасности Flash-плеера и не только
 
Привет.
Помогите решить проблему, бьюсь уже часа три, не меньше.

Что хочу сделать?

Хочу сделать некий wrapper.
Т.е. флешка грузит еще одну флешку внутрь себя, далее идет работа с подгруженной флешкой (addChild, интерактив).

Использую следующий код в wrapper'е:

Код AS3:

public function Main():void 
{
if (stage) init();
else this.addEventListener(Event.ADDED_TO_STAGE, init);
}
 
public function init(event:Event = null):void
{
this.removeEventListener(Event.ADDED_TO_STAGE, init);
 
stage.dispatchEvent(new Event(Event.DEACTIVATE));
stage.dispatchEvent(new Event(Event.ACTIVATE));
 
 
loadExeption();
}
 
public function loadExeption():void
{
 
Security.allowDomain("*");
Security.allowInsecureDomain("*");
 
loaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
 
if (Security.sandboxType != 'localTrusted')
{
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
loaderContext.securityDomain = SecurityDomain.currentDomain;
}
 
m_loader = new Loader();
m_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
 
m_loader.load(new URLRequest("xxx.ru/my.swf"), loaderContext);
}
 
public function onCompleteHandler(e:Event):void
{
addChild(m_loader);
}

Вроде все правильно, ошибок при компиляции нет, realtime ошибок тоже.

А что не так?

А не так то, что это все не работает. После запуска такого кода флеш начинает жестоко личить в память, и складывается ощущение, что он загружает сам себя.


Адрес wrapper'a (Preloader'a): xxx.ru/preloader.swf (условно).
Адрес подгружаемой swf-шки: xxx.ru/my.swf (условно).

Лежат на одном домине, с ними рядом лежит:
crossdomain.xml, листинг:

Код:

<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-http-request-headers-from domain="xxx.ru" headers="*"/>
<allow-access-from domain="xxx.ru" to-ports="80"/>
</cross-domain-policy>

Использую swfobject.js, в index.html (index.php) кусок кода, ответственный за флешку:
Код:

...
var params = {
menu: "false",
scale: "noScale",
allowFullscreen: "true",
allowScriptAccess: "always",
allowNetworking: "always",
bgcolor: "#000000"
};
...
swfobject.embedSWF("preloader.swf", "altContent", "600", "580", "10.0.0", "expressInstall.swf", flashvars, params, attributes);

У второй флешки есть событие added_to_stage, костыль с активацией/деактивацией.

Самое интересное, что локально это все работает нормально.
Т.е. заливаю на хостинг my.swf, локально компилирую preloader.swf — работает на ура. Как стоит мне залить preloader.swf на хостинг, то возникает такая ситуация. Сталкивался кто?

Reon 15.06.2011 03:07

Привет, первое, я бы не стал лодер в аддЧайлд совать (addChild(m_loader);) а его контент. Проверь права доступа к файлу на хостинге.

fish_r 15.06.2011 03:21

И ещё... Уже пару раз на форуме было: если документ-класс в обоих флешках имеет одно имя (и пакет), например Main(), то это может быть причиной глюков.

forhaxed 15.06.2011 10:23

Спасибо дорогие друзья, особенно fish_r.

Действительно, сменил название главного класса в флешке с Main на Wrapper - все заработало.

gloomyBrain 15.06.2011 10:30

Цитата:

если документ-класс в обоих флешках имеет одно имя (и пакет), например Main(), то это может быть причиной глюков
Причиной глюков обычно бывает то, что курит разработчик.
А надо было разобраться почему так происходит и просто поменять applicationDomain, в который идет загрузка

fish_r 15.06.2011 19:08

Цитата:

Сообщение от gloomyBrain (Сообщение 1003825)
Причиной глюков обычно бывает то, что курит разработчик.
А надо было разобраться почему так происходит и просто поменять applicationDomain, в который идет загрузка

не понимаю - решаете проблему (создания однояйцевых близнецов) созданием другой (потерей доступа к типам загруженных классов)?

gloomyBrain 15.06.2011 20:59

Причиной проблемы является то, что в ApplicationDomain уже есть класс с таким именем.
Возможны 2 решения:
а) переименовать класс
б) загрузить в домен, в котором класса с таким именем нет

Решение б) является универсальным, т.к. один модуль по определению не будет пересекаться с другим, при любых названиях классов. Более того, при таком подходе модуль можно выгрузить.
Решение а) является прямолинейным и не позволяет Вам делать одинаковые названия классов в разных модулях

Цитата:

потерей доступа к типам загруженных классов
Можно подробнее - что куда потеряется? И какие, кстати, типы у классов Вы знаете?

fish_r 15.06.2011 21:53

Встреча двух классов с одинаковым именем в одном домене - есть уже признак кривизны. Исправлять надо то, что криво, и автор, в данном случае, имеет такую возможность, а вы предлагаете "лечить" ситуацию "костылями", по факту.

То что называется проверкой типов на этапе исполнения, напр. я уже не смогу обратиться к методу загруженного класса
Код AS3:

  Wrapper(e.target.content).init();

Мне придётся обходить "строгую проверку" приведя к object или перем. к *, и то, и другое, пусть даже формально, плохо сказывается на быстродействии...

А ты о каких типах подумал?

gloomyBrain 15.06.2011 22:15

Цитата:

вы предлагаете "лечить" ситуацию "костылями"
Если костыль - это частное решение, которое работает только в некоторых случаях, то Ваше решение - костыль.

Цитата:

Встреча двух классов с одинаковым именем в одном домене - есть уже признак кривизны
Правильно. Ваш способ переносит ответственность за это на загружаемый модуль (то есть подстраивает имя класса под то место, в которое будет загружаться). Мой способ переносит ответственность на загружающий модуль.
Однако, т.к. домен (а значит и наличие в нем класса с каким-то именем) определяется именно загружающим модулем, то свой способ я считаю верным, а Ваш - нет.

Цитата:

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

fish_r 15.06.2011 22:53

Вложений: 1
@gloomy можешь говорить мне "ты" не опасаясь панибратства :)


Цитата:

Сообщение от gloomyBrain (Сообщение 1003989)
Если костыль - это частное решение, которое работает только в некоторых случаях, то Ваше решение - костыль.

Несколько экзотическое определение "костыля".
Я имел ввиду вообще то вот это.

Цитата:

Сообщение от gloomyBrain (Сообщение 1003989)
Правильно. Ваш способ переносит ответственность за это на загружаемый модуль (то есть подстраивает имя класса под то место, в которое будет загружаться). Мой способ переносит ответственность на загружающий модуль.
Однако, т.к. домен (а значит и наличие в нем класса с каким-то именем) определяется именно загружающим модулем, то свой способ я считаю верным, а Ваш - нет.

В общем звучит разумно, однако, если не учитывать частность, что речь идет о Main(), от которого у меня, лично уже, скоро, аллергическая сыпь появится.

Цитата:

Сообщение от gloomyBrain (Сообщение 1003989)
То, что Вы умеете делать и можете делать - это разные вещи. Судя по всему, идея с написанием интерфейса Вас еще не посещала.

Да-к, ещё и интерфейс навоять? :)
И, кстати, не пойму: как мне поможет интерфейс в отсутствии доступа к типам?

Вот это - костыль:


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

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