Skip to content

[SPARK-31534][WEBUI] Text for tooltip should be escaped. #28317

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from

Conversation

sarutak
Copy link
Member

@sarutak sarutak commented Apr 23, 2020

What changes were proposed in this pull request?

This PR escapes text for tooltip for DAG Viz and Timeline View.

Why are the changes needed?

This is a bug.
Normally, DAG Viz and Timeline View show tooltip like as follows.

dag-viz-tooltip

timeline-tooltip

They contain a callsite properly.
However, if a callsite contains characters which should be escaped for HTML without escaping , the corresponding tooltips wouldn't show the callsite and its following text properly.
dag-viz-tooltip-before-fixed
timeline-tooltip-before-fixed

The reason of this issue is that the source texts of the tooltip texts are not escaped.

Does this PR introduce any user-facing change?

No.

How was this patch tested?

I tested manually.
First, I ran a job sc.parallelize(1 to 10).collect in Spark Shell then, visited AllJobsPage and JobPage and confirmed tooltip texts.
dag-viz-tooltip-fixed
timeline-tooltip-fixed

I also added a testcase.

@dongjoon-hyun
Copy link
Member

Thank you, @sarutak . I'll take a look.

@@ -88,7 +88,8 @@ private[ui] class AllJobsPage(parent: JobsTab, store: AppStatusStore) extends We
// The timeline library treats contents as HTML, so we have to escape them. We need to add
// extra layers of escaping in order to embed this in a Javascript string literal.
val escapedDesc = Utility.escape(jobDescription)
val jsEscapedDesc = StringEscapeUtils.escapeEcmaScript(escapedDesc)
val jsEscapedDescForTooltip = StringEscapeUtils.escapeEcmaScript(Utility.escape(escapedDesc))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ur, this is triple escaping since we are using escapedDesc?
Technically, this is equivalent StringEscapeUtils.escapeEcmaScript(Utility.escape(Utility.escape(jobDescription))).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we'd like to get a tooltip text <console>, the value of the corresponding attribute data-title should be &lt;console&gt;.
With single Utility.escape, the value of attribute will be <console> so additional Utility.escape is needed.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got it. Thanks~

.replace(/&gt;/g, ">")
.replace(/&quot;/g, "\"");
var g = graphlibDot.read(escaped_dot);
var g = graphlibDot.read(dot);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, did we handle all callers of renderDot in this PR?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I've noticed StagePage needs those escaping.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the current implementation, a source text is used for tooltip text as HTML and used for node label as plain text for DAG Viz.
I changed the usage of the source text for node label to interpret it as HTML.
So, I believe these escaping I remove from renderDot are not needed.

@SparkQA
Copy link

SparkQA commented Apr 23, 2020

Test build #121692 has finished for PR 28317 at commit e01d458.

  • This patch passes all tests.
  • This patch merges cleanly.
  • This patch adds no public classes.

@SparkQA
Copy link

SparkQA commented Apr 24, 2020

Test build #121698 has finished for PR 28317 at commit d3690bd.

  • This patch fails from timeout after a configured wait of 400m.
  • This patch merges cleanly.
  • This patch adds no public classes.

@sarutak
Copy link
Member Author

sarutak commented Apr 24, 2020

retest this please.

@SparkQA
Copy link

SparkQA commented Apr 24, 2020

Test build #121709 has finished for PR 28317 at commit d3690bd.

  • This patch fails Spark unit tests.
  • This patch merges cleanly.
  • This patch adds no public classes.

@sarutak
Copy link
Member Author

sarutak commented Apr 24, 2020

retest this please.

@HyukjinKwon HyukjinKwon removed the CORE label Apr 24, 2020
@SparkQA
Copy link

SparkQA commented Apr 24, 2020

Test build #121740 has finished for PR 28317 at commit d3690bd.

  • This patch fails Spark unit tests.
  • This patch merges cleanly.
  • This patch adds no public classes.

@SparkQA
Copy link

SparkQA commented Apr 24, 2020

Test build #121755 has finished for PR 28317 at commit 3b8b071.

  • This patch fails Spark unit tests.
  • This patch merges cleanly.
  • This patch adds no public classes.

@dongjoon-hyun
Copy link
Member

Retest this please.

@@ -772,6 +773,33 @@ class UISeleniumSuite extends SparkFunSuite with WebBrowser with Matchers with B
}
}

test("SPARK-31534: text for tooltip should be escaped") {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for adding this.

@SparkQA
Copy link

SparkQA commented Apr 24, 2020

Test build #121767 has finished for PR 28317 at commit 3b8b071.

  • This patch fails Spark unit tests.
  • This patch merges cleanly.
  • This patch adds no public classes.

@sarutak
Copy link
Member Author

sarutak commented Apr 24, 2020

retest this please.

@SparkQA
Copy link

SparkQA commented Apr 24, 2020

Test build #121781 has finished for PR 28317 at commit 3b8b071.

  • This patch fails Spark unit tests.
  • This patch merges cleanly.
  • This patch adds no public classes.

@sarutak
Copy link
Member Author

sarutak commented Apr 25, 2020

retest this please.

@dongjoon-hyun
Copy link
Member

Wow. The current Jenkins environment is really flaky.

@SparkQA
Copy link

SparkQA commented Apr 25, 2020

Test build #121788 has finished for PR 28317 at commit 3b8b071.

  • This patch fails Spark unit tests.
  • This patch merges cleanly.
  • This patch adds no public classes.

@dongjoon-hyun
Copy link
Member

We reverted 9faad07 from the master. Let's trigger once more tomorrow.

@sarutak
Copy link
Member Author

sarutak commented Apr 25, 2020

retest this please.

@SparkQA
Copy link

SparkQA commented Apr 25, 2020

Test build #121803 has finished for PR 28317 at commit 3b8b071.

  • This patch passes all tests.
  • This patch merges cleanly.
  • This patch adds no public classes.

@dongjoon-hyun
Copy link
Member

dongjoon-hyun commented Apr 25, 2020

@sarutak . I've been digging the following error message, but didn't find a clue. Do you have any idea about this ERROR message in your new test case? It's not a failure, but I just want to understand the reason why this complains.

$ build/sbt "core/testOnly *.UISeleniumSuite -- -z SPARK-31534"
[info] UISeleniumSuite:
Error: TOOLTIP: Option "sanitizeFn" provided type "window" but expected type "(null|function)". (http://localhost:54471/static/bootstrap.bundle.min.js#6)
[info] - SPARK-31534: text for tooltip should be escaped (7 seconds, 627 milliseconds)

@sarutak
Copy link
Member Author

sarutak commented Apr 26, 2020

@dongjoon-hyun I inspected the error message by replacing bootstrap.bundle.min.js with bootstrap.bundle.js and inserting logging code before the error message shown like as follows.

if (!new RegExp(expectedTypes).test(valueType)) {
  console.warn("Property Name: " + property + ", value of the property: " + config[property] + ", type of the property: " + toType(config[property]));
  throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
}

Then, I found the reason was the type of null is regarded as window by HtmlUnit (it's a surprising behavior...).

WARN WebConsole: Property Name: sanitizeFn, value of the property: null, type of the property: window

@dongjoon-hyun
Copy link
Member

Oh, thank you for the instruction, @sarutak . It's helpful.

@dongjoon-hyun
Copy link
Member

So, it sounds like we are good to go.

@dongjoon-hyun
Copy link
Member

Feel free to proceed to merge, @sarutak ! Thanks.

@sarutak
Copy link
Member Author

sarutak commented Apr 26, 2020

Thanks all !
I've noticed that if we merge this into branch-3.0, we'll get DAG with white colored font.
white-colored-font

So, I'll merge this into only master for now.

@dongjoon-hyun
Copy link
Member

I merged #28352 now. Could you reconsider about backporting?

sarutak added a commit to sarutak/spark that referenced this pull request Apr 27, 2020
### What changes were proposed in this pull request?

This PR escapes text for tooltip for DAG Viz and Timeline View.

### Why are the changes needed?

This is a bug.
Normally, DAG Viz and Timeline View show tooltip like as follows.

<img width="278" alt="dag-viz-tooltip" src="https://user-images.githubusercontent.com/4736016/80127481-5a6c6880-85cf-11ea-8daf-cfd59aa3ba09.png">
<img width="477" alt="timeline-tooltip" src="https://user-images.githubusercontent.com/4736016/80127500-60624980-85cf-11ea-9b0f-cce301019e3a.png">

They contain a callsite properly.
However, if a callsite contains characters which should be escaped for HTML without escaping , the corresponding tooltips wouldn't show the callsite and its following text properly.
<img width="179" alt="dag-viz-tooltip-before-fixed" src="https://user-images.githubusercontent.com/4736016/80128480-b1267200-85d0-11ea-8035-ad68ae5fbcab.png">
<img width="261" alt="timeline-tooltip-before-fixed" src="https://user-images.githubusercontent.com/4736016/80128492-b5eb2600-85d0-11ea-9556-c48490110244.png">

The reason of this issue is that the source texts of the tooltip texts are not escaped.

### Does this PR introduce any user-facing change?

No.

### How was this patch tested?

I tested manually.
First, I ran a job `sc.parallelize(1 to 10).collect` in Spark Shell then, visited AllJobsPage and JobPage and confirmed tooltip texts.
<img width="196" alt="dag-viz-tooltip-fixed" src="https://user-images.githubusercontent.com/4736016/80128813-2db95080-85d1-11ea-82f8-90a1f4547f30.png">
<img width="363" alt="timeline-tooltip-fixed" src="https://user-images.githubusercontent.com/4736016/80128824-31e56e00-85d1-11ea-9818-492b72b1c56e.png">

I also added a testcase.

Closes apache#28317 from sarutak/fix-tooltip.

Authored-by: Kousuke Saruta <sarutak@oss.nttdata.com>
Signed-off-by: Kousuke Saruta <sarutak@oss.nttdata.com>
@gengliangwang
Copy link
Member

Late LGTM, nice catch!

dongjoon-hyun pushed a commit that referenced this pull request Apr 28, 2020
### What changes were proposed in this pull request?
This PR backports #28317 which escapes text for tooltip for DAG Viz and Timeline View.

### Why are the changes needed?

This is a bug.
Normally, DAG Viz and Timeline View show tooltip like as follows.

<img width="278" alt="dag-viz-tooltip" src="https://user-images.githubusercontent.com/4736016/80127481-5a6c6880-85cf-11ea-8daf-cfd59aa3ba09.png">
<img width="477" alt="timeline-tooltip" src="https://user-images.githubusercontent.com/4736016/80127500-60624980-85cf-11ea-9b0f-cce301019e3a.png">

They contain a callsite properly.
However, if a callsite contains characters which should be escaped for HTML without escaping , the corresponding tooltips wouldn't show the callsite and its following text properly.
<img width="179" alt="dag-viz-tooltip-before-fixed" src="https://user-images.githubusercontent.com/4736016/80128480-b1267200-85d0-11ea-8035-ad68ae5fbcab.png">
<img width="261" alt="timeline-tooltip-before-fixed" src="https://user-images.githubusercontent.com/4736016/80128492-b5eb2600-85d0-11ea-9556-c48490110244.png">

The reason of this issue is that the source texts of the tooltip texts are not escaped.

### Does this PR introduce any user-facing change?

No.

### How was this patch tested?

I tested manually.
First, I ran a job `sc.parallelize(1 to 10).collect` in Spark Shell then, visited AllJobsPage and JobPage and confirmed tooltip texts.
<img width="277" alt="timeline-tooltip-fixed-3 0" src="https://user-images.githubusercontent.com/4736016/80332616-41411180-8886-11ea-8d93-28e1c5265115.png">
<img width="191" alt="dag-tooltip-fixed-3 0" src="https://user-images.githubusercontent.com/4736016/80332625-44d49880-8886-11ea-8f2e-de8df1369e62.png">
And I confirmed that the appearance of the label of DAG-viz in StagePage is not changed.
<img width="313" alt="stage-page-dag" src="https://user-images.githubusercontent.com/4736016/80332725-9b41d700-8886-11ea-9adb-40d50ad29f86.png">

I also added a testcase.
With this testcase, an error message related to JavaScript is shown.

`TypeError: Cannot call method "indexOf" of undefined (http://192.168.1.209:59376/static/spark-dag-viz.js#378)`

This is thrown from `interpretLineBreak` in `spark-dag-viz.js`.
HtmlUnit seems not to support `innerHTML` for text content (I tried replacing it with `textContent` and the error message is not shown).
But DOMs which is needed by the testcase added is already rendered before `interpretLineBreak` is called. So the testcase successfully passes.

Closes #28359 from sarutak/fix-tooltip-branch-3.0.

Authored-by: Kousuke Saruta <sarutak@oss.nttdata.com>
Signed-off-by: Dongjoon Hyun <dongjoon@apache.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants