Add API support for the rich_text field on several resources.

Review Request #4801 — Created Oct. 18, 2013 and submitted — Latest diff uploaded

Information

Review Board
master

Reviewers

Add API support for the rich_text field on several resources.

rich_text was previously the default for any new objects, and clients
were expected to send text in valid Markdown. This posed a problem for
Review Bot, RBTools, and probably a lot of scripts used in production,
which would suddenly have to know about Markdown.

This change gives clients more control. Now, by default, rich text is an
opt-in thing. It's disabled on new objects by default, but callers can
pass rich_text=true in API calls to indicate that the text fields for
that object should be rich text.

For resources with multiple affected fields, setting rich_text to true
will set the provided text as-is, and escape any text fields not set
during that API call, ensuring their contents won't accidentally be
interpreted as Markdown.

Likewise, if setting rich_text=false, any unspecified text fields will
have any escaping removed, leaving just the text content (meaning that
**This** is a \*test\* will turn into **This** is a *test*).

The web UI always sets rich_text=true in calls. It also ensures that the
text coming in is Markdown, even if it's not stored as Markdown on the
server. That is, if rbt post provides a description for a review
request, then server-side, rich_text will be false, but the web UI will
then escape it when displaying. This ensures that the user will see
Markdown-formatted text and can act appropriately when they go to save
(which will formally set rich_text=true on the server).

Unit tests for the API and UI have been added.

Python and JavaScript unit tests pass.

Tested the following scenarios:

Review requests

  • Posted a change for review, with a description that would be otherwise interpreted as Markdown.
    Saw that it escaped properly for display, but was internally stored with the original content
    and rich_text=false.
  • Edited the Description and Testing Done fields individually when a review request had
    rich_text=false. The other fields properly escaped, but the new content went through.
    The server had rich_text=true after the save.
  • Did the same test with a change description.

Reviews

  • Tested creating a review and saw that it was in Markdown by default.
  • Took an old review with rich_text=false and edited it. The original text was properly escaped.
    Saving it set rich_text=true.

Comments

  • Created a comment for a new review, and saw that it was Markdown by default. Repeated with a new
    comment on an existing review. Published these and saw my Markdown was rendered.
  • Took an old comment with rich_text=false and edited it. The original text was properly escaped.
    Saving it set rich_text=true.

Replies

  • Made a new reply to a comment and added Markdown. It properly rendered, before and after a reload.
    Saw in the database that rich_text=true.
  • Edited an older, unpublished reply with rich_text=false. The text was escaped in the input box.
    Saved and it saw that rich_text=true, and saw it render properly.
  • Repeated the tests with a reply to a review's body text.