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
  • 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