Блог об it, программировании и интернет-маркетинге

Делюсь наблюдениями и личным опытом в области программирования и интернет-маркетинга

Моя война со Flash скриптом и Google Chrome

Posted on | July 12, 2011 | No Comments

К нам в команду, в ходе поддержки разработанного ранее медиа-портала, поступила задача выяснить почему после редактирования в админке у новости иногда пропадает (отваливается) картинка, которая при создании новости загружается через Flash uploader и при сохранении прицепляется к новости через ORM систему (цикл её жизни полностью контролируется ORM).

Появилась догадка, что двое людей редактирую одну новость, один сохраняет с картинкой, и тут сразу после этого второй сохраняет без картинки. Для того чтобы это проверить почему исчезает привязанная к новости картинка было решено написать Лог, в который будут отмечаться все действия с изображениями в рамках сущности Новости. Через какое-то время Лог был уже написан и внедрен в нужных участках кода. Оставалось только проверить на локальной версии как он работает, после чего можно запускать на боевом сервере.

В качестве тестирования я начал сохранять, удалять, заменять изображения – тут то и произошёл интереснейший поворот событий. Работая с одной и той же новостью через браузер 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-поле формы идентификатор текущей привязанной картинки. И если этот идентификатор не передать на сервер при редактировании, то картинка “отвязана” от Новости и через какое-то время удалена.

SEO Community Ваау! News2.ru SMI2 Google Bookmarks I.ua Закладки Yandex Ruspace Web-zakladka Zakladok.net delicious БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong

Comments