morfizm (morfizm) wrote,
morfizm
morfizm

Category:

Chrome bug

Нашёлся баг в Хроме.

Судя по логу, происходит следующее:

1. Загружается страничка "?game_id=125343&v=7" (1). На этой страничке стоит таймер (javascript), чтобы через 5 секунд загрузить "?game_id=125343&v=8". В случае, если для v=8 рендеринг engine решит, что страница не изменилась, он сделает редирект обратно, и браузер вытащит v=7 из кэша. Это я сделал такой солюшн, чтобы избежать перерисовки каждые 5 секунд, даже если ничего не изменилось. (Я знаю про Ajax, просто редиректы + кэш куда проще имплементировать, для прототипа такие варианты побеждают :)).

2. Примерно через 5 секунд я кликаю "начать новую игру" (2). Это ссылка "?game_id=125343&action=start_new". Страничка видит action=start_new и делает (3) редирект на "?game_id=747700&v=8". Это новая игра (747700).

3. Хром тут же грузит страничку с новой игрой (4). Но!

4. Через секунду срабатывает таймер у страницы, про которую хром должен был уже давно забыть, и по таймеру Хром загружает "?game_id=125343&v=8" (5). Аааа!!! Юзера откидывает на страницу с предыдущей игрой, как будто "начать новую игру" он не нажимал.

(1)
client-host-name.com - - [05/Mar/2011 20:01:05] Command: GET Path: /renju?game_id=125343&v=7
client-host-name.com - - [05/Mar/2011 20:01:05] "GET /renju?game_id=125343&v=7 HTTP/1.1" 200 -

(2)
client-host-name.com - - [05/Mar/2011 20:01:10] Command: GET Path: /favicon.ico
client-host-name.com - - [05/Mar/2011 20:01:10] "GET /favicon.ico HTTP/1.1" 404 -
client-host-name.com - - [05/Mar/2011 20:01:10] Command: GET Path: /renju?game_id=125343&action=start_new
(3)
Redirect to location: /renju?game_id=747700&v=8
client-host-name.com - - [05/Mar/2011 20:01:10] "GET /renju?game_id=125343&action=start_new HTTP/1.1" 301 -

(4)
client-host-name.com - - [05/Mar/2011 20:01:10] Command: GET Path: /renju?game_id=747700&v=8
client-host-name.com - - [05/Mar/2011 20:01:10] "GET /renju?game_id=747700&v=8 HTTP/1.1" 200 -
Not caching

(5)
client-host-name.com - - [05/Mar/2011 20:01:11] Command: GET Path: /renju?game_id=125343&v=8
client-host-name.com - - [05/Mar/2011 20:01:11] "GET /renju?game_id=125343&v=8 HTTP/1.1" 200 -
Caching


В качестве решения, я так понимаю, нужно запоминать в сессии пользователя, куда он недавно перешёл, и на всех страницах, куда есть редирект по таймеру, передавать параметром страницу, с которой он перешёл (или ещё версию), проверять, а не перешёл ли он уже с этой страницы куда-нибудь, и в этом случае повторять новый редирект. Или попросить Хром, чтобы починили баг. World is evil.

Ещё один солюшн - кажется, более правильный, это клики сделать такими, чтобы они вначале отключали таймер, а потом уже делали переход. Или переход вытащить в отдельную javascript-переменную, и сделать, чтобы клик просто модифицировал её на нужный url и ускорял триггер таймера.

P.S. А ещё - FYI web developer'ам - Хром по умолчанию кэширует редиректы. Т.е. если вы отвечаете на запрос 301, то надо явно передавать хедеры, чтобы отключить кэширование, если вы не хотите, чтобы в следующий раз Хром просто проигнорировал ваш редирект и выполнил запомненный переход. Это важно знать для сценария, если по редиректам вы делаете action processing.
Tags: software development
Subscribe

  • Дети и инвестирование

    (Хоть и личная тема, пощу в public, чтобы легче было собрать полезный фидбек) Сегодня за прогулкой соединились воедино сразу несколько посылок в…

  • 27" мониторы - 2

    Я тут про мониторы писал. 1. Для юзера allochkag подтверждаю, что "надо брать Делл S2721D за $200 и брать вот этот monitor arm за…

  • Как агрегировать точечную информацию?

    Из всех неприятных вопросов больше всего в жизни я ненавижу вопросы про самочувствие, вроде "насколько сильно у тебя болела рука в этом месяце?".…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments