zulip/frontend_tests
Ryan Rehman 3b5ba6b2c1 message list: Change locally echoed message ids synchronously.
There is a bug and race issue that occurs when a message is selected
while we are in the process of reifying a locally echoed message,
raising the "Selected message id not in MessageList" error.
The code flow to get the exception is as follows:

* A user sends a message to the current narrow we are in.
* Before the new message event is received, we sent a message to
  the same message list which renders it with a locally echoed id.
* One of the ways of getting the exception is to already have the
  locally sent message selected, before receiving an acknowledgment
  from the server.
* Thus the Message List Data's `selected_id` now points to the new
  message id. The exception is raised on entering the `was_selected`
  if block inside `message_list_view` which tries to re-select the
  message.

Updating the `_rerender_message` code for this special case won't fix
the entire bug because, as mentioned above there are other ways of
getting the exception:

Ideally, after all our synchronous work (`echo.process_from_server`)
has completed we would expect the re-order and re-render work of the
`change_message_id` would occur first, due to the timer of the
setTimeout being set to 0.

However as evident from the race condition existing, this isn't always
the case. `change_message_id` function is responsible for 3 things:
updation, re-ordering and re-rendering.
The first one which is responsible for updating the message list's
local cache, occurs synchronously while for the latter two, they both
occur asynchronously.

Before the setTimeout which is responsible for the latter two actions,
is encountered the user might select the message by clicking or more
commonly by scrolling, which causes this message selection event to be
ahead of the setTimeout in the callback queue.
During this time frame, our race condition takes place.

And even though the message id is updated it's Message List is not
in the correct sort order, which leads to `closest_id` !== `id` in
`MessageList_select_id` being true and raising the exception.

Now, we only asynchronously call the re_render function, to guarantee
the data is always correct and UI updates should be done at the end.

Extended by tabbott to comment the setTimeout call.

Fixes #15346.
2020-07-06 15:36:33 -07:00
..
casper_lib js: Use hasOwnProperty correctly or not at all. 2020-05-26 23:33:40 -07:00
casper_tests settings org: Use `image_upload_widget.hbs` for realm icon. 2020-06-17 17:47:49 -07:00
node_tests message list: Change locally echoed message ids synchronously. 2020-07-06 15:36:33 -07:00
puppeteer_lib eslint: Enable comma-dangle for functions. 2020-07-03 16:55:51 -07:00
puppeteer_tests eslint: Enable arrow-parens. 2020-07-03 16:53:39 -07:00
zjsunit eslint: Enable comma-dangle for functions. 2020-07-03 16:55:51 -07:00
.eslintrc.json lint: Check eslint indentation for casper tests. 2018-05-06 19:35:18 -07:00
run-casper python: Sort imports with isort. 2020-06-11 16:45:32 -07:00