Flash приложение содржит клип, в который грузит swf из другого домена. В обоих клипах (основном и в загружаемом) на первом кадре в руте
System.security.allowDomain("*"); Так же приложение - загрузчик открывает crossdomain.xml с сервера, на котором расположен загружаемый swf. По сути все правила доверия предусмотрены, но не работает следующее:
Загрузка производится при помощи собственного класса, основанного на movieClipLoader. Данный класс после загрузки клипа (событие onLoadComplete) программирует событие загруженного клипа onEnterFrame на инициализацию в соответствии с параметрами объекта task, который является описателем загрузки. onEnterFrame используется потому, что в момент возникновения этого события уже известны рамеры загруженного объекта и можно произвести его подгонку по размерам и установку в нужный кадр. Здесь же производится вызов пользовательской функции onLoad.
Проблема: При кроссдоменной загрузке клип загружается но не вызывает пользовательскую функцию. Так же не вызывается пользовательская функция onProgress. При этом объект task существует (проверено дебагом). Тоесть секьюрность не позволяет вызвать пользовательскую функцию.
При загрузке из того же домена, что и родительский клип все работает нормально.
Вот часть исходника загрузчика:

Код AS1/AS2:
// ==== ON LOAD PROGRESS ==========================================
private function onLoadProgress (target_mc :MovieClip, loaded_bytes :Number, total_bytes :Number)
{
if (total_bytes < 1) total_bytes = 1;
var task :Object = this.getTask({target : target_mc});
task.progress = loaded_bytes/total_bytes;
var percents = task.progress * this.progressStep;
this.progress += percents;
if (this.progress > this.progressEnd)
this.progress = this.progressEnd;
if (task.onProgress != null)
task.onProgress(Math.round(task.progress * 100), task);
}
// ==== ON LOAD TASK COMPLETE ===================================
private function onLoadComplete (target_mc :MovieClip, http_status :Number)
{
var task :Object = this.getTask({target : target_mc});
target_mc.task = task;
target_mc.onEnterFrame =
function()
{
this.task.stack.finalize(this.task);
if (this.task.onComplete != null)
this.task.onComplete(task);
this.onEnterFrame = this.task.onEnterFrame;
}
this.currTaskId ++;
if (this.currTaskId < this.tasks.length)
{
var found = false;
var task = this.tasks[this.currTaskId];
this.loadClip(task.url, task.target);
}
else
{
if (this.progress < this.progressEnd)
this.progress = this.progressEnd;
this.progressStart = this.progress;
for (var i = 0; i < this.currTaskId; i ++)
{
this.tasks.shift();
}
this.currTaskId = 0;
}
}
// ==== Finalize load task ===========================
private function finalize (task :Object)
{
if (task.frame != null)
{
task.target.gotoAndStop(task.frame);
}
if (task.width != null ||
task.height != null)
{
var w = task.width;
var h = task.height;
if (w == null) w = task.target._width;
if (h == null) h = task.target._height;
if (task.target._width > task.target._height)
{
if (h > w) w = h;
h = w * task.target._height/task.target._width;
}
else
{
if (w > h) h = w;
w = h * task.target._width/task.target._height;
}
task.target._width = w;
task.target._height = h;
}