Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.02.2013, 17:50
Vreden вне форума Посмотреть профиль Отправить личное сообщение для Vreden Найти все сообщения от Vreden
  № 1  
Ответить с цитированием
Vreden
 
Аватар для Vreden

Регистрация: Feb 2009
Сообщений: 141
По умолчанию Нарушение изолированной среды

Код:
Error #2044: Необработанный SecurityErrorEvent:. text=Error #2048: Нарушение изолированной среды: http://cs405122.userapi.com/u7907811/4da01a287.zip не может загрузить данные из http://vk.com/images/camera_b.gif.
При загрузке информации о пользователях используя api вконтакте, получаю url аватаров пользователей.
Если аватар есть, то все они из зоны userapi.com и загружаются нормально без SecurityErrorEvent, но если у пользователя нет аватара, то api возвращает http://vk.com/images/camera_b.gif. Т.е. это изображение из чужого для swf домена и возникает ошибка SecurityErrorEvent

Использую Loader с LoaderContext по всем правилам, на продуктиве ошибка воспроизводится постоянно.

Код AS3:
var context:LoaderContext;
 
if (Security.sandboxType != Security.LOCAL_TRUSTED)
	context = new LoaderContext(true, ApplicationDomain.currentDomain, SecurityDomain.currentDomain);
 
loader.load(new URLRequest(__currentImageUrlLoad), context);
В чем может быть проблема?


Последний раз редактировалось iNils; 22.02.2013 в 18:08.
Старый 22.02.2013, 18:05
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
В чем может быть проблема?
То, в чем проблема подробно описано в тексте ошибки.
А избегается так:
Код AS3:
try {
     loader.load(new URLRequest(__currentImageUrlLoad), context);
} catch (e:Error) {}
и к загрузчику нужно добавить слушатель события SecurityErrorEvent

Старый 22.02.2013, 20:15
Vreden вне форума Посмотреть профиль Отправить личное сообщение для Vreden Найти все сообщения от Vreden
  № 3  
Ответить с цитированием
Vreden
 
Аватар для Vreden

Регистрация: Feb 2009
Сообщений: 141
Мне нужна помощь не в обработке этой ошибки, а в ее устранении

Старый 22.02.2013, 21:29
AlexLucas вне форума Посмотреть профиль Отправить личное сообщение для AlexLucas Найти все сообщения от AlexLucas
  № 4  
Ответить с цитированием
AlexLucas
[+1 05.11.12]
 
Аватар для AlexLucas

Регистрация: Feb 2011
Сообщений: 431
Ну, как вариант, в catch'e вставляйте свой дефолтный аватар.

Старый 22.02.2013, 22:32
Vreden вне форума Посмотреть профиль Отправить личное сообщение для Vreden Найти все сообщения от Vreden
  № 5  
Ответить с цитированием
Vreden
 
Аватар для Vreden

Регистрация: Feb 2009
Сообщений: 141
Как вариант, но самый последний.
Мне необходимо устранить нарушение изолированной среды, а не реализовать ее следствие.

Старый 23.02.2013, 00:46
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 6  
Ответить с цитированием
yasha005
[+1 16.03.13]
[+1 22.03.13]

Регистрация: Dec 2012
Сообщений: 100
Цитата:
Сообщение от Vreden Посмотреть сообщение
Как вариант, но самый последний.
Мне необходимо устранить нарушение изолированной среды, а не реализовать ее следствие.
Как вариант в обход файла политик и в обход изолированной среды можно провернуть вот такой чит, реализованный в методе EventFunctionComplete:

Код AS3:
package lib_loader
{
	import flash.net.URLRequest;
	import flash.display.Loader;
	import flash.net.URLRequestMethod;
	import flash.events.IOErrorEvent;
	import flash.events.SecurityErrorEvent;
	import flash.errors.IOError;
	import flash.events.ProgressEvent;
	import flash.events.Event;
	import flash.events.ErrorEvent;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	import flash.utils.ByteArray;
 
	public class LibContentLoaderNoPolicyBytes implements ILibLoader
	{
		// Адрес, откуда необходимо загрузить компонент
		private var urlFrom:String;
		// Передаваемые параметры методом POST
		private var dataFrom:Object;
 
		// Метод, выполняемый при наступлении события успешной загрузки
		private var eventFunctionComplit:Function;
		// Метод, выполняемый во время загрузки
		private var eventFunctionProgress:Function;
		// Метод, выполняемый при ошибке загрузки
		private var eventFunctionError:Function;
		// Метод, выполняемый при отмене загрузки
		private var eventFunctionUndo:Function;
 
		// Флаг выполнения загрузки
		private var eventListener:Boolean = false;
		// Объект передаваемых параметров загрузки
		private var requestLoader:URLRequest;
		// Объект загрузки
		private var objectLoader:Loader;
		// Флаг отмены загрузки
		private var flagUnload:Boolean = false;
 
 
 
		/*////////////////////////////////////////////////////////////
 
			Загрузка двоичных данных, таких как изображения
 
		////////////////////////////////////////////////////////////*/
 
		public function LibContentLoaderNoPolicyBytes()
		{
			// constructor code
		}
 
		// Установить параметры объекта
		public function set SetParam(paramObject:Object):void
		{
			if(paramObject is Object)
			{
				// Адрес, откуда необходимо загрузить компонент
				if(paramObject.urlLoc is String)
				{
					this.urlFrom = paramObject.urlLoc;
				}
 
				// Передаваемые параметры методом POST
				if(paramObject.dataLoc is Object)
				{
					this.dataFrom = paramObject.dataLoc;
				}
 
				// Метод, выполняемый при наступлении события успешной загрузки
				if(paramObject.functionComplitLoc is Function)
				{
					this.eventFunctionComplit = paramObject.functionComplitLoc;
				}
 
				// Метод, выполняемый во время загрузки
				if(paramObject.functionProgressLoc is Function)
				{
					this.eventFunctionProgress = paramObject.functionProgressLoc;
				}
 
				// Метод, выполняемый при ошибке загрузки
				if(paramObject.functionErrorLoc is Function)
				{
					this.eventFunctionError = paramObject.functionErrorLoc;
				}
 
				// Метод, выполняемый при отмене загрузки
				if(paramObject.functionUndoLoc is Function)
				{
					this.eventFunctionUndo = paramObject.functionUndoLoc;
				}
 
				// Начать/остановить загрузку true/false
				if(paramObject.startLoc is Boolean)
				{
					if(this.eventListener && !paramObject.startLoc)
					{
						this.flagUnload = true;
						this.objectLoader.unload();
					}
					this.EventListener = paramObject.startLoc;
				}
 
 
			} // Конец объекта
		} // Конец метода установки параметров
 
		// Подключение или отключение слушателей событий
		private function set EventListener(flagEvent:Boolean):void
		{
			if(this.eventListener != flagEvent)
			{
				if(this.eventListener = flagEvent)
				{
					// Подключение слушателей событий
					this.AddEventListener();
				}
				else
				{
					// Отключение слушателей событий
					this.RemoveEventListener();
				}
			}
		}
 
		private function Builder():void
		{
			this.requestLoader = new URLRequest();
			this.objectLoader = new Loader();
		}
 
		private function Destroy():void
		{
			this.EventListener = false;
			this.objectLoader = null;
			this.requestLoader = null;
			this.urlFrom = null;
			this.dataFrom = null;
		}
 
 
		private function AddEventListener():void
		{
			this.Builder();
			if(this.dataFrom is Object)
			{
				this.requestLoader.method = URLRequestMethod.POST;
				this.requestLoader.data = this.dataFrom;
			}
 
			if((this.urlFrom is String) && this.urlFrom.length)
			{
				this.requestLoader.url = this.urlFrom;
				try
				{
					this.objectLoader.load(this.requestLoader);
				}
				catch (e:ArgumentError)
				{
					this.FunctionError(e.message);
 
				}
				catch (e:SecurityError)
				{
					this.FunctionError(e.message);
 
				}
				catch (e:IOError)
				{
					this.FunctionError(e.message);
 
				}
				catch (e:Error)
				{
					this.FunctionError(e.message);
 
				}
				finally
				{
				}
 
				this.objectLoader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR , this.EventFunctionError);
				this.objectLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR , this.EventFunctionError);
				this.objectLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS , this.EventFunctionProgress);
				this.objectLoader.contentLoaderInfo.addEventListener(Event.INIT , this.EventFunctionInit);
				//this.objectLoader.contentLoaderInfo.addEventListener(Event.COMPLETE , this.EventFunctionComplete);
 
 
 
			}
			else 
			{
				var e:Error = new Error('url is null');
				this.FunctionError(e.message);
			}
		}
 
		private function RemoveEventListener():void
		{
			this.objectLoader.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR , this.EventFunctionError);
			this.objectLoader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR , this.EventFunctionError);
			this.objectLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS , this.EventFunctionProgress);
			this.objectLoader.contentLoaderInfo.removeEventListener(Event.INIT , this.EventFunctionInit);
			if(this.flagUnload)
			this.objectLoader.contentLoaderInfo.addEventListener(Event.UNLOAD , this.EventFunctionUndo);
 
 
		}
 
		////////////////////////////////////////////////////////////
 
		private function EventFunctionUndo(e:Event):void
		{
			this.flagUnload = false;
			this.objectLoader.contentLoaderInfo.removeEventListener(Event.UNLOAD , this.EventFunctionUndo);			
			if (this.eventFunctionUndo is Function) this.eventFunctionUndo();
			this.Destroy();
		}
 
		///////////////////////////////////////////////////////////
 
		private function EventFunctionComplete(e:Event):void
		{
 
			this.objectLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE , this.EventFunctionComplete);
			var objectLoaderLocal:Loader = new Loader();
			objectLoaderLocal.loadBytes(this.objectLoader.contentLoaderInfo.bytes, new LoaderContext(false, ApplicationDomain.currentDomain));
			objectLoaderLocal.addEventListener(Event.COMPLETE , LocalComplit);				
 
			function LocalComplit(e:Event):void
			{
				objectLoaderLocal.removeEventListener(Event.COMPLETE , LocalComplit);
				//var bytesW:ByteArray = new ByteArray();
				//bytesW.writeBytes(objectLoaderLocal.);
				//this.eventFunctionComplit(bytesW.readUTFBytes(bytesW.length));
 
				//this.eventFunctionComplit(e.target.data);
				this.Destroy();
			}
 
		}
 
		// Инициализация прошла успешно
		private function EventFunctionInit(e:Event):void
		{
			if(this.eventFunctionComplit is Function)
			{
				try
				{
					//this.eventFunctionComplit(e.target.content as ByteArray);
					//var objectLoaderLocal:Loader = new Loader();
					//objectLoaderLocal.loadBytes(this.objectLoader.bytes, new LoaderContext(false, ApplicationDomain.currentDomain));
					//this.eventFunctionComplit(e.target.content as ByteArray);
					this.objectLoader.contentLoaderInfo.addEventListener(Event.COMPLETE , this.EventFunctionComplete);				
					//this.eventFunctionComplit(this.objectLoader);
				}
				catch (t:ArgumentError)
				{
					this.FunctionError(t.message);
				}
				catch (t:SecurityError)
				{
					this.FunctionError(t.message);
				}
				catch (t:IOError)
				{
					this.FunctionError(t.message);
				}
				catch (t:Error)
				{
					this.FunctionError(t.message);
				}
				finally
				{
					trace(this.objectLoader.contentLoaderInfo.bytes);
				}
 
 
			}
			else
			{
				var err:Error = new Error('function eventFunctionComplit not found');
				this.FunctionError(err.message);
			}
		}
 
		private function EventFunctionProgress(e:ProgressEvent):void
		{
			if(this.eventFunctionProgress is Function)
			{
				const thisLoaded:Number = Math.round((e.bytesLoaded/e.bytesTotal) * 10)*10;
				this.eventFunctionProgress(thisLoaded);				
			}
		}
 
		private function EventFunctionError(e:ErrorEvent):void
		{
			this.FunctionError(e.text);
		}
 
		private function FunctionError(err:String):void
		{
			if(this.eventFunctionError is Function) this.eventFunctionError(err);
			this.Destroy();
		}
 
 
 
 
	} // Конец класса
} // Конец пакета
А передачу параметров в вышеуказанный класс можно реализовать вот таким интерфейсом:
Код AS3:
package lib_loader
{
 
	public interface ILibLoader
	{
 
		// Interface methods:
		// Установить параметры объекта
		function set SetParam(paramObject:Object):void;
	}
 
}

Старый 23.02.2013, 01:43
Vreden вне форума Посмотреть профиль Отправить личное сообщение для Vreden Найти все сообщения от Vreden
  № 7  
Ответить с цитированием
Vreden
 
Аватар для Vreden

Регистрация: Feb 2009
Сообщений: 141
Не понимаю, как логика работы вообще доходит до EventFunctionComplete, если при возникновении SecurityErrorEvent.SECURITY_ERROR все заканчивается на EventFunctionError.

Объясните, пожалуйста, как этот хак работает. Работает?

Старый 23.02.2013, 01:51
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 8  
Ответить с цитированием
yasha005
[+1 16.03.13]
[+1 22.03.13]

Регистрация: Dec 2012
Сообщений: 100
Цитата:
Сообщение от Vreden Посмотреть сообщение
Не понимаю, как логика работы вообще доходит до EventFunctionComplete, если при возникновении SecurityErrorEvent.SECURITY_ERROR все заканчивается на EventFunctionError.

Объясните, пожалуйста, как этот хак работает. Работает?
Всё очень просто: если вы в момент загрузки контента не обращаетесь к нему, т.е. когда оно находится на этапе инициализации, то никаких ошибок не выдаст. После того как контент загрузился в первый лоадер, он загружается во второй лоадер. Причём вторым лоадером из первого мы этот контент считываем как поток двоичных данных, а не как контент, к которому можно обратиться как к типу DisplayObject. А уже после того как мы загрузили двоичные данные во второй лоадер, именно к нему можем обращаться как к контенту типа DisplayObject

Старый 23.02.2013, 02:04
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 9  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Ха они так и не починили это. Вам дешевле будет эту ссылку ловить и не грузить. А подставлять картинку свою (ну или эту же, но свою)
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 23.02.2013, 02:10
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 10  
Ответить с цитированием
yasha005
[+1 16.03.13]
[+1 22.03.13]

Регистрация: Dec 2012
Сообщений: 100
Цитата:
Сообщение от GBee Посмотреть сообщение
Ха они так и не починили это. Вам дешевле будет эту ссылку ловить и не грузить. А подставлять картинку свою (ну или эту же, но свою)
Согласен, гораздо проще написать серверный скрипт, который будет забирать картинку с другого сервера, а сий запрос будет инициировать флэшка. Тогда и не понадобятся никакие обходные пути изолированной среды

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:55.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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