Моя война со Flash скриптом и Google Chrome
Posted on | July 12, 2011 | No Comments
Появилась догадка, что двое людей редактирую одну новость, один сохраняет с картинкой, и тут сразу после этого второй сохраняет без картинки. Для того чтобы это проверить почему исчезает привязанная к новости картинка было решено написать Лог, в который будут отмечаться все действия с изображениями в рамках сущности Новости. Через какое-то время Лог был уже написан и внедрен в нужных участках кода. Оставалось только проверить на локальной версии как он работает, после чего можно запускать на боевом сервере.
В качестве тестирования я начал сохранять, удалять, заменять изображения – тут то и произошёл интереснейший поворот событий. Работая с одной и той же новостью через браузер Google Chrome и заметил, что иногда Flash скрипт не прогружается на странице, и после сохранения новости с непрогруженным Flash uploader’ом картинка исчезает. Стало ясно что Лог собственно и не был нужен вся проблема именно в этом. Осталось понять почему это проблема возникает и как её решить. Ни в одном другом браузере, отличном от Google Chrome такая проблема не возникала.
Наш Flash скрипт при инициализации (также как и при самой загрузке изображения) получает id картинки и засовывает её в hidden поле на странице(если картинки нет – поле остаётся пустым), которое позже вместе с остальными полями Новости сохраняется в бд.
Подозрения вызвало то, что на странице флэш внедрялся динамически JavaScript’ом через new SWFObject. Сначала возникло сумбурное предположение, что Chrome плохо работает со вложенными в object param-элементами, но использование embed не помогло решить проблему.
Пришлось лезть во Flash и проставить там трэйсы входящих данных и данных, получаемых скриптом от сервера, в консоль. Следующая серия тестов, даже с выводимыми трейсами, не сильно приблизила нас к нахождению корня зла.
А собственно мало ли кто, влекомый лучшими намерениями, мог “поправить” код контроллеров? Встала необходимость написать трейсы в серверном коде, отвечающем за сохранение и последующую привязку (при сохранении новости) изображения. Очередные тесты показали что Flash скрипт, когда загружается, отправляет и обменивается с контроллером правильно.
Где-то на этом этапе залипания в голову влетел полезный эйдос – а может прикрутить при инициализации Flash скрипта рандомный параметр? Иииии да! Оказалось что именно кэш Google Chrome портил нам всю малину и добавлял редакции сайта много геморроя. :)
Очевидно, Google иногда халявил и не брал Flash с сервера, а как я говорил выше, только он записывает в hidden-поле формы идентификатор текущей привязанной картинки. И если этот идентификатор не передать на сервер при редактировании, то картинка “отвязана” от Новости и через какое-то время удалена.
Comments
Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/dezhik.ru/wp-includes/class-wp-comment-query.php on line 399