Flex FocusManager - нажатие клавиши Tab вызывает переполнение стека в многоверсионном приложении.

У меня есть главное приложение (созданное с использованием SDK 4.6), которое загружает дополнительное приложение (созданное с использованием SDK 4.1). Большая часть содержимого в этом состоянии приложения содержится во вложенном приложении, при этом некоторые элементы пользовательского интерфейса в верхнем приложении образуют фрейм (или «HUD») вокруг содержимого вложенного приложения.

В точке, где нет поля ввода текста для получения фокуса, нажатие табуляции вызовет ужасный сбой Flash Player с ошибкой № 1023: произошло переполнение стека.

Вот пример трассировки стека:

Error: Error #1023: Stack overflow occurred.
at mx.managers.systemClasses::MarshallingSupport/get swfBridgeGroup()
at mx.managers.systemClasses::MarshallingSupport/getSWFBridgeOfDisplayObject()
at mx.managers.systemClasses::MarshallingSupport/isDisplayObjectInABridgedApplication()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/keyDownHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers::FocusManager/http://www.adobe.com/2006/flex/mx/internal::keyDownHandler()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/moveFocus()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/focusRequestMoveHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/moveFocusToParent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/focusRequestMoveHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/setFocusToComponentHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers::FocusManager/setFocusToComponent()
at mx.managers::FocusManager/setFocusToNextObject()
at mx.managers::FocusManager/http://www.adobe.com/2006/flex/mx/internal::keyFocusChangeHandler()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/moveFocus()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/focusRequestMoveHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/moveFocusToParent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/focusRequestMoveHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/setFocusToComponentHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers::FocusManager/setFocusToComponent()
at mx.managers::FocusManager/setFocusToNextObject()
at mx.managers::FocusManager/http://www.adobe.com/2006/flex/mx/internal::keyFocusChangeHandler()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/moveFocus()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/focusRequestMoveHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/moveFocusToParent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/focusRequestMoveHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/setFocusToComponentHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers::FocusManager/setFocusToComponent()
at mx.managers::FocusManager/setFocusToNextObject()
at mx.managers::FocusManager/http://www.adobe.com/2006/flex/mx/internal::keyFocusChangeHandler()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/moveFocus()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/focusRequestMoveHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/moveFocusToParent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/focusRequestMoveHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/setFocusToComponentHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.managers::FocusManager/setFocusToComponent()
at mx.managers::FocusManager/setFocusToNextObject()
at mx.managers::FocusManager/http://www.adobe.com/2006/flex/mx/internal::keyFocusChangeHandler()
at mx.managers.marshalClasses::FocusManagerMarshalMixin/moveFocus()

Согласно руководству Adobe по «разработке приложений sandbox» "FocusManager должен работать даже с изолированными, многоверсионными приложениями.

Кто-нибудь когда-нибудь видел это? Есть идеи, что мне может не хватать?

Примечательно:

  • Подприложение загружается в SWFLoader, который настроен на использование отдельного ApplicationDomain.
  • Мне вообще не нужно поддерживать табуляцию в приложении верхнего уровня, но табуляция должна работать, когда во вспомогательном приложении есть редактируемые текстовые поля. И это работает нормально, когда есть текстовые поля для табуляции.

Любые предложения приветствуются. Спасибо!


person sandonk    schedule 18.12.2012    source источник
comment
Судя по вашему описанию и трассировке стека, похоже, что он пытается (очень сложно) найти место для установки фокуса при нажатии табуляции. Трудно сказать, почему это происходит, если вы не выполните код в отладчике. Можно кое-что обойти, но все зависит от того, что вы видите в отладчике. На ум приходят следующие моменты: поиграйте со свойствами, связанными с фокусом клавиатуры (tabEnabled, tabChildren и т. Д.), FocusEvent и KeyboardEvent.   -  person Sunil D.    schedule 18.12.2012


Ответы (1)


Во-первых, кажется, что ваша трассировка стека не содержит 1000 строк по умолчанию, установленных в scriptRecursionLimit = "1000" приложения. Я не знаю, есть ли у вас какие-то ограничения для кода или песочница может ограничить это по умолчанию более жестким образом. Как я вижу, некоторые строки не повторяются, поэтому это может означать, что поведение по умолчанию правильное, но его нельзя закончить из-за некоторых ограничений.

Во-вторых, вы можете использовать обходной путь, если не можете найти хороший способ исправить это:

try{
    dispatchTabPressEventThatCausesProblems();
}catch(e:Error){
    stage.focus = null;
}
person user1875642    schedule 18.12.2012