Commit c866f1f5 authored by Paul Slaughter's avatar Paul Slaughter

Merge branch 'jswain_whats_target_blank' into 'master'

Whats new content links open in a new tab

See merge request gitlab-org/gitlab!61954
parents 22e722ec af59ed02
...@@ -30,6 +30,7 @@ export default { ...@@ -30,6 +30,7 @@ export default {
return dateInWords(date); return dateInWords(date);
}, },
}, },
safeHtmlConfig: { ADD_ATTR: ['target'] },
}; };
</script> </script>
...@@ -71,7 +72,10 @@ export default { ...@@ -71,7 +72,10 @@ export default {
<gl-icon name="license" />{{ packageName }} <gl-icon name="license" />{{ packageName }}
</gl-badge> </gl-badge>
</div> </div>
<div v-safe-html="feature.body" class="gl-pt-3 gl-line-height-20"></div> <div
v-safe-html:[$options.safeHtmlConfig]="feature.body"
class="gl-pt-3 gl-line-height-20"
></div>
<gl-button <gl-button
:href="feature.url" :href="feature.url"
target="_blank" target="_blank"
......
...@@ -33,7 +33,7 @@ class ReleaseHighlight ...@@ -33,7 +33,7 @@ class ReleaseHighlight
next unless include_item?(item) next unless include_item?(item)
begin begin
item.tap {|i| i['body'] = Kramdown::Document.new(i['body']).to_html } item.tap {|i| i['body'] = Banzai.render(i['body'], { project: nil }) }
rescue StandardError => e rescue StandardError => e
Gitlab::ErrorTracking.track_exception(e, file_path: file_path) Gitlab::ErrorTracking.track_exception(e, file_path: file_path)
......
--- ---
- title: bright and sunshinin' day - title: bright and sunshinin' day
body: | body: |
## bright and sunshinin' day bright and sunshinin' [day](https://en.wikipedia.org/wiki/Day)
self-managed: true self-managed: true
gitlab-com: false gitlab-com: false
packages: ["Premium", "Ultimate"] packages: ["Premium", "Ultimate"]
......
...@@ -8,7 +8,7 @@ describe("What's new single feature", () => { ...@@ -8,7 +8,7 @@ describe("What's new single feature", () => {
const exampleFeature = { const exampleFeature = {
title: 'Compliance pipeline configurations', title: 'Compliance pipeline configurations',
body: body:
'<p>We are thrilled to announce that it is now possible to define enforceable pipelines that will run for any project assigned a corresponding compliance framework.</p>', '<p data-testid="body-content">We are thrilled to announce that it is now possible to define enforceable pipelines that will run for any project assigned a corresponding <a href="https://en.wikipedia.org/wiki/Compliance_(psychology)" target="_blank" rel="noopener noreferrer" onload="alert(xss)">compliance</a> framework.</p>',
stage: 'Manage', stage: 'Manage',
'self-managed': true, 'self-managed': true,
'gitlab-com': true, 'gitlab-com': true,
...@@ -20,6 +20,7 @@ describe("What's new single feature", () => { ...@@ -20,6 +20,7 @@ describe("What's new single feature", () => {
}; };
const findReleaseDate = () => wrapper.find('[data-testid="release-date"]'); const findReleaseDate = () => wrapper.find('[data-testid="release-date"]');
const findBodyAnchor = () => wrapper.find('[data-testid="body-content"] a');
const createWrapper = ({ feature } = {}) => { const createWrapper = ({ feature } = {}) => {
wrapper = shallowMount(Feature, { wrapper = shallowMount(Feature, {
...@@ -43,4 +44,13 @@ describe("What's new single feature", () => { ...@@ -43,4 +44,13 @@ describe("What's new single feature", () => {
expect(findReleaseDate().exists()).toBe(false); expect(findReleaseDate().exists()).toBe(false);
}); });
}); });
it('safe-html config allows target attribute on elements', () => {
createWrapper({ feature: exampleFeature });
expect(findBodyAnchor().attributes()).toEqual({
href: expect.any(String),
rel: 'noopener noreferrer',
target: '_blank',
});
});
}); });
...@@ -67,12 +67,12 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache do ...@@ -67,12 +67,12 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache do
expect(subject[:next_page]).to eq(2) expect(subject[:next_page]).to eq(2)
end end
it 'parses the body as markdown and returns html' do it 'parses the body as markdown and returns html, and links are target="_blank"' do
expect(subject[:items].first['body']).to match("<h2 id=\"bright-and-sunshinin-day\">bright and sunshinin’ day</h2>") expect(subject[:items].first['body']).to match('<p data-sourcepos="1:1-1:62" dir="auto">bright and sunshinin\' <a href="https://en.wikipedia.org/wiki/Day" rel="nofollow noreferrer noopener" target="_blank">day</a></p>')
end end
it 'logs an error if theres an error parsing markdown for an item, and skips it' do it 'logs an error if theres an error parsing markdown for an item, and skips it' do
allow(Kramdown::Document).to receive(:new).and_raise allow(Banzai).to receive(:render).and_raise
expect(Gitlab::ErrorTracking).to receive(:track_exception) expect(Gitlab::ErrorTracking).to receive(:track_exception)
expect(subject[:items]).to be_empty expect(subject[:items]).to be_empty
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment