actionscript 3 это Ошибка? LoaderInfo getLoaderInfoByDefinition безопасности безопасности в AIR




adobe flash actionscript 3.0 скачать (3)

Вы можете записывать ошибки с AIR (а также создавать запросы функций) по адресу: www.adobe.com/go/wish

Я подозреваю, что ошибка безопасности может быть красной селедкой. Не похоже, что здесь должен быть один.

Этот вопрос специфичен для приложений Adobe AIR ActionScript / Flash. Я потратил довольно много времени на изучение этого и продолжал находить обсуждения о модели безопасности Flash Player при работе в браузере, где проблемы с загрузкой SWF могут быть смягчены различными способами (загрузка из того же домена с использованием файла crossdomain.xml и т. д.) или для приложений AIR HTML, где обсуждалась модель безопасности JavaScript с ее изолированными изолированными файлами на основе кадра и мостом для песочницы. Я считаю, что моя проблема другая.

Сначала некоторый код. Чтобы продемонстрировать, я создал очень простое приложение Flex (LoaderInfoTest.mxml):

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
    xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    creationComplete="onCreationComplete(event)">
    <mx:Script>
        <![CDATA[
            import flash.display.LoaderInfo;
            import flash.system.ApplicationDomain;
            import flash.utils.getQualifiedClassName;

            import mx.events.FlexEvent;

            public function onCreationComplete(event:FlexEvent):void
            {
                // the following line of code throws an exception
                var info:LoaderInfo = LoaderInfo.getLoaderInfoByDefinition(this);
            }
        ]]>
    </mx:Script>
</mx:WindowedApplication>

... и файл дескриптора application.xml (LoaderInfoTest-app.xml):

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application xmlns="http://ns.adobe.com/air/application/1.5.2">
    <id>LoaderInfoTest</id>
    <filename>LoaderInfoTest</filename>
    <name>LoaderInfoTest</name>
    <version>v1</version>
    <initialWindow>
        <content>LoaderInfoTest.swf</content>
    </initialWindow>
</application>

Я создаю это с помощью Flash Builder 4 Beta, но я предполагаю, что проблема остается неизменной при использовании инструментов командной строки SDK. При выполнении этого либо из Flash Builder, либо из командной строки через:

> adl LoaderInfoTest-app.xml . 

Я получаю всплывающее окно с этим исключением:

Нарушение безопасности изолированной программной среды: приложение-вызывающий: /LoaderInfoTest.swf не может получить доступ к LoaderInfo.applicationDomain, принадлежащему приложению: /LoaderInfoTest.swf. на flash.display :: LoaderInfo $ / getLoaderInfoByDefinition () ...

Я не понимаю, почему SWF не может получить доступ к свойству LoaderInfo.applicationDomain (предположительно защищенному или внутреннему свойству), принадлежащему самому себе. В документации для LoaderInfo.getLoaderInfoByDefinition указано, что можно вызвать SecurityError, если «[t] он не работает в локальной надежной изолированной программной среде». Если у меня действительно есть грубое непонимание модели безопасности AIR, локальный SWF работает с полным доверием ( программная песочница ). Итак, почему это не работает? Это ошибка в среде выполнения AIR? ,

Я должен отметить, что в другом сценарии при запуске этого кода в качестве приложения Flash (не AIR) в Flash-плеере он работает.

Лучший ответ - это какая-то конфигурация или настройка, которые я могу изменить, чтобы сделать эту работу (возможно, в дескрипторе приложения?) ... или указав, где я делаю ошибку. Второй лучший ответ был бы определенным источником объяснения того, почему это никогда не сработает.

1st Edit - Прежде чем кто-нибудь onCreationComplete это: я знаю, что внутри метода this.loaderInfo дает мне доступ к текущему экземпляру LoaderInfo . Мой пример здесь - самый простой, который я мог бы придумать, чтобы продемонстрировать «проблему». Контекст, в котором я хочу использовать LoaderInfo.getLoaderInfoByDefinition(this) , не является экземпляром DisplayObject .

2nd Edit - Я рассматриваю возможность даже принять ссылку на то, где я могу опубликовать сообщение об ошибке в редакторе ошибок Adobe AIR в качестве ответа. Общедоступный отслеживатель ошибок Flex не учитывается, поскольку это не проблема Flex.

3-е Редактирование. Очевидно, что существуют различия между «локальной надежной песочницей» и «песочницей приложений AIR», но (некоторые из) эти различия кажутся нечувствительными, и теперь я считаю их ошибкой, по крайней мере, в контексте этот вопрос и особенно потому, что он работает в Flash Player.


Документация верна, что getLoaderInfoByDefinition доступен только для содержимого в localTrusted sandbox . Хотя содержимое приложения AIR имеет множество привилегий, оно не находится в localTrusted и поэтому не может использовать API.

Разумеется, разумный запрос - добавить доступ к содержимому приложения.

В качестве обходного пути вы можете использовать этот API (и API-интерфейсы Sampler) в AIR, загрузив другой SWF в localTrusted sandbox . Для этого вам нужно добавить файл в один из доверенных списков и загрузить файл с file:// URL (не app:/ ). Затем существует ряд способов localTrusted и localTrusted содержимого приложения.


Эта проблема также появляется в обычном flash-приложении. В принципе, у меня есть вспомогательный класс UrlInfo.

Конструктор выглядит так:

import flash.display.LoaderInfo;
public class UrlInfo
{
private var _loaderInfo:LoaderInfo;

    public function UrlInfo():void
    {
        _loaderInfo = LoaderInfo.getLoaderInfoByDefinition(this);
    }
}

В файле fla у меня есть следующее:

import my.namespace.UrlInfo;
var ui:UrlInfo = new UrlInfo();

Я получаю ту же ошибку:

SecurityError: Error #2119: Security sandbox violation: caller file **SAMEFILE.swf** cannot access LoaderInfo.applicationDomain owned by **SAMEFILE.swf**.
    at flash.display::LoaderInfo$/getLoaderInfoByDefinition()
    at com.honda.ttd.content.as3.util::UrlInfo()
    at urlinfo_fla::MainTimeline/frame1()

Запуск .html, который вызывает swf, не вызывает этого. Запуск .swf вызывает это.

Я знаю, что могу исправить это, перейдя к настройкам флэш-памяти и добавив местоположение swf во вкладку «Настройки безопасности Flash» .

Например, если SAMEFILE.swf находится на моем Рабочем столе, я могу добавить C: / в список доверенных местоположений.

Я СОГЛАСЕН, ЧТО ЭТО ОДОБРЕН, потому что файл обращается к самому себе, но он нарушает некоторую безопасность. Я хотел бы знать, есть ли какое-либо исправление для этого или если это действительно ожидаемое поведение.