Мне потребовалось через RTMP рассылать данные в формате JSON по флешкам.
После прихода во флеш данные отправляются сразу в ExternalInterface.call:
ExternalInterface.call("juggernaut.receiveData", event.info.description);
В какой-то момент у меня начали валиться ошибки «в нигде» и «из
ниоткуда», которые
были видны только в Firebug-е. До receiveData дело не дошло.
Текст ошибки:
missing ) after argument list
Минимальный тест таков:
var s:String = "\"\\\"B\\\"\""; — это дважды экранированная строка "B"
(кавычки входят в часть строки).
trace(s);
ExternalInterface.call("receiveData", s);
Дело оказалось вот в чём:
user_name Вася “Пупкин” превращалось в JSON
{"user" : {"id" : 15, "user_name" : "Вася \"Пупкин\""}}
Эта строка без изменений проходит по AMQP, RTMP и попадет в
event.info.description.
Сначала я решил, что проблема может быть где-то на выходе из флеша и
предположил, что дело в
яваскриптовой функции __flash__toXML
function __flash__escapeXML(s) {
return s.replace(/&/g, "&").replace(/</g,
"<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g,
"'");
}
Потом, обрезав всё до минимума и получив тот самый минимальный тест увидел:
try { __flash__toXML(r("\"\\"B\\"\"")) ; } catch (e) { "<undefined/>"; }
Т.е. __flash__toXML вызывается для обработки возвращаемых значений, а
вот входной JSON туда попадал прям как есть, без необходимого
экранирования.
Чтение http://code.google.com/p/doctype/wiki/ArticleFixingFlashExternalInterface
мне не помогло, так что решил проблему так:
var re:RegExp = /\\/g;
ExternalInterface.call("receiveData",
event.info.description.replace(re, "\\\\"));
Вроде работает.
UPD: Доп информация: http://www.develotec.com/flash8api.txt
xpost: http://habrahabr.ru/blogs/webdev/65708/