1. 16 May, 2017 2 commits
    • Sean Hammond's avatar
      Fix refreshing access tokens when laptop suspends · 361d3381
      Sean Hammond authored
      This commit fixes an issue that refresh token requests were being sent
      too late if a laptop was suspended, even if the laptop was resumed again
      in time to do the refresh.
      
      For example if a laptop was suspended for 10 mins, then the refresh
      request would be sent 10 mins later than it should have been and the
      access token and refresh token would have already expired before the
      refresh request was attempted.
      
      The bug was due to a misunderstanding about how `window.setTimeout()`
      works:
      
      If you, say, use `setTimeout` to call a function in 10 minutes time,
      then wait 5 minutes, then put the laptop to sleep for an hour, then
      wake it up, **it will wait another 5 minutes and then call the
      function**.
      
      That is, the time that the laptop spent asleep does not count towards
      the timeout, it pauses the timer and then continues the timer again when
      the laptop wakes. This will also happen if the browser or OS suspends
      the tab or app.
      
      I've verified this behaviour in Chrome and Firefox on Linux, and it also
      agrees with [this StackOverflow
      answer](http://stackoverflow.com/questions/6346849/what-happens-to-settimeout-when-the-computer-goes-to-sleep/6347336#6347336)
      and [the HTML5 spec on
      `setTimeout`](https://www.w3.org/TR/2010/WD-html5-20101019/timers.html#timers):
      "wait until the Document associated with the method context has been
      fully active for a further timeout milliseconds (not necessarily
      consecutively)."
      
      This means that if you want to definitely call a function at a given
      time (say 55 mins in the future) you can't just use `setTimeout` to set
      a single timer for 55 mins like our code was doing - if the laptop is
      suspended during those 55 mins then the timer won't go off until 55 mins
      + however long the laptop was suspended for.
      
      To fix this change the code to repeatedly poll, every few seconds,
      whether the current time is later than the access token expiry time
      minus 5 minutes. If it is, then try to refresh the access token.
      
      I'm using repeated calls to `window.setTimeout()` to implement this,
      rather than one call to `window.setInterval()`, because with
      `setTimeout()` it's easier to do a couple of things that the previous
      implementation was already doing:
      
      1. Not make any more refresh token requests while one is still in flight
      2. Stop making further refresh token requests when one fails
      361d3381
    • Robert Knight's avatar
      1.16.0 · 7d041803
      Robert Knight authored
      7d041803
  2. 15 May, 2017 3 commits
  3. 12 May, 2017 4 commits
  4. 09 May, 2017 4 commits
  5. 04 May, 2017 2 commits
  6. 27 Apr, 2017 2 commits
    • Sean Hammond's avatar
      f2f5775f
    • Sean Hammond's avatar
      Improve error when flagging when logged out · cd22ae61
      Sean Hammond authored
      Improve the error message that's shown to the user when trying to flag
      an annotation while logged out.
      
      Instead of showing a "404 Not Found. Either the resource you requested
      doesn't exist, or you are not currently authorized to see it." error
      from the server, show a friendlier "You must be logged in to report an
      annotation" message.
      
      This is done client-side by checking whether the user is logged in when
      they click the flag button, and if not showing an error instead of
      sending the flag request to the API. This is because the API doesn't
      respond with a unique "You must be logged in to flag" error that the
      client could depend on, it just returns a 404, which could be for a
      number of reasons (e.g. the annotation no longer exists).
      cd22ae61
  7. 26 Apr, 2017 1 commit
    • Sean Hammond's avatar
      Clarify in tooltip what flag button does · e64fa192
      Sean Hammond authored
      The flag button on an annotation has a tooltip that says simply "Flag"
      (or "Annotation has been flagged" if it's already flagged) but there's
      no indication to the user what flagging is or does (even when they click
      the button, all that happens is the flag turns red).
      
      "Flagging" can certainly be misinterpreted. I think some apps use it as
      a way to keep track of "special" or "favorite" items (usually called
      "starring" in most modern apps), or have a variety of different "flags"
      that you can apply to an email or whatever it is (important, work,
      personal, etc, this is usually called "tagging" or "labelling" in most
      modern apps).
      
      This commit changes the tooltips to clarify that what the button does is
      report the annotation to the moderators. I've used the verb "report"
      rather than "flag" as I think "Report this annotation to the moderators"
      sounds better than "Flag this annotation to the moderators".  Either way
      I think "to the moderators" is important to clarify that this button
      sends a message to the moderators and isn't, for example, just flagging
      for personal use like starring / tagging / labeling.
      e64fa192
  8. 24 Apr, 2017 11 commits
  9. 21 Apr, 2017 2 commits
  10. 20 Apr, 2017 6 commits
  11. 19 Apr, 2017 3 commits