Customer wants referrer headers sent when links are clicked in SmartPages/Digital Rooms. Currently, rel="noreferrer" prevents this in some blocks.
| Block Type | Also Known As | How noreferrer is Added |
Saved in DB? |
|---|---|---|---|
| Text Block (v2) | Text | parseHTMLLinks() at render time |
No |
| Rich Text Block (v2) | HTML Block | parseHTMLLinks() at render time |
No |
| Text Block (Lexical) | Text with Lexical editor | linkUtils.ts + CustomLinkNode.tsx at edit time |
Yes |
| Text/Rich Text (v1 legacy) | HtmlBand | parseHTMLLinks() at render time |
No |
Note: "Rich Text" block in the UI = "HTML Block" in code (
Html.tsx,HtmlBand.js). It uses Summernote in "designer" mode with images, backgrounds, and colors. The simpler "Text" block uses Summernote in "textonly" mode.
| Block Type | Link Behavior | File |
|---|---|---|
| Banner (CTA) | Opens same tab, sends referrer | CallToAction.tsx |
| Navigation | Opens same tab, sends referrer | SimpleNavigation.tsx, SplitNavigation.tsx, ImageNavigation.tsx |
| Block Type | Link Behavior | File |
|---|---|---|
| Banner (v1) | Opens new tab (target="_blank"), sends referrer |
DynamicBandView.js → setupUserActivity() |
| Navigation (v1) | Opens new tab (target="_blank"), sends referrer |
DynamicBandView.js → setupUserActivity() |
| Image (v1) | Opens new tab (target="_blank"), sends referrer |
DynamicBandView.js → setupUserActivity() |
Key Finding: Legacy v1 dynamic bands (Banner, Navigation, Image) only add
target="_blank"for external links but do NOT addrel="noreferrer". They already send referrer headers!
File: pagedesigner/components/blocks/Html/htmlBandHelpers.js
// Line 44 - Currently adds noreferrer to external links
link.setAttribute(rel, noreferrer);- Handles all Summernote/legacy content
- Handles Text and HTML blocks (both new and legacy Page Designer)
- No database migration needed - change affects render time
| File | Line | Current Value |
|---|---|---|
pagedesigner/.../utils/linkUtils.ts |
27 | rel: 'noopener noreferrer' |
texteditor/lexical/nodes/CustomLinkNode.tsx |
132 | rel = 'noreferrer' (default) |
texteditor/lexical/nodes/PipedTextNode.tsx |
185 | link.rel = 'noopener noreferrer' |
texteditor/lexical/nodes/PipedTextComponent.tsx |
62 | rel="noopener noreferrer" |
| File | Line | Context |
|---|---|---|
pagedesigner/hooks/useAnchorHash.ts |
64 | Anchor link preview |
digitalroombuilder/.../CalendarConnectButton.tsx |
34 | Calendar integration |
File: pagedesigner/components/blocks/Html/htmlBandHelpers.js
Change the function to:
- Stop adding
rel="noreferrer"to external links - Strip/replace existing
noreferrerwithnoopener(handles Lexical-saved content) - Keep
noopenerfor security
Why this is the only viable approach:
- Fixes ALL existing Summernote content immediately (no migration)
- Fixes ALL existing Lexical content that has
noreferrerbaked in (no migration) - Single point of change for rendering
- No database migration required
For code cleanliness, also update Lexical to stop adding noreferrer at edit time. This prevents the data from being saved with noreferrer in the first place, but is not sufficient on its own since existing content would still have it.
| Category | Files | Effort |
|---|---|---|
| Core fix | 1 (htmlBandHelpers.js) |
Low |
| Lexical editor | 4 files | Low-Medium |
| window.open calls | 2 files | Low |
| Legacy v1 tools | 2 files (optional, already have noreferrer) |
Low |
| Testing | Text, HTML, Lexical, anchor links | Medium |
Total Files: ~7-9 files
Database Migration: Not required if using render-time fix
| File | Line | Notes |
|---|---|---|
pagedesigner/legacy/tools/EntityLinkToolView.js |
12 | Has rel="noreferrer" |
pagedesigner/legacy/tools/ChooseContentToolsView.js |
120 | Has rel="noreferrer" |
pagedesigner/legacy/components/AnchorLinkSelect/AnchorLinkDemo.js |
36-37 | Has rel="noreferrer" |
- User creates link → saved without
relattribute - At render time →
parseHTMLLinks()addsrel="noreferrer" - Fix: Modify
parseHTMLLinks()- immediate effect on all content
- User creates link →
linkUtils.tssetsrel="noopener noreferrer" - Saved to DB with
relattribute baked in - At render time →
parseHTMLLinks()may process again - Fix: Update Lexical files + use render-time fix to handle existing content
- Links rendered via
DynamicBandView.js→setupUserActivity()method - External links: adds
target="_blank"only (lines 119-122) - NO
rel="noreferrer"added → Already sends referrers! - No changes needed for these block types
// DynamicBandView.js lines 119-122
} else if (HsUrl.isExternal(this.href)) {
const $link = $(this);
$link.attr('target', '_blank'); // Only adds target
$link.addClass('hs-user-activity'); // No rel="noreferrer"!
}Keep rel="noopener" to prevent:
- Opened page accessing
window.opener - Potential redirect/phishing attacks
Change from:
rel="noreferrer"orrel="noopener noreferrer"
To:
rel="noopener"(security preserved, referrer now sent)
| Block | Adds noreferrer? |
Action Needed |
|---|---|---|
| Text (Summernote) | Yes (via parseHTMLLinks) |
Fix parseHTMLLinks |
| Rich Text / HTML (Summernote) | Yes (via parseHTMLLinks) |
Fix parseHTMLLinks |
| Banner | No | None |
| Navigation | No | None |
| Image | No | None |
| Block | Adds noreferrer? |
Action Needed |
|---|---|---|
| Text (Summernote) | Yes (via parseHTMLLinks) |
Fix parseHTMLLinks |
| Text (Lexical) | Yes (edit + render time) | Fix Lexical + parseHTMLLinks |
| Rich Text / HTML (Summernote) | Yes (via parseHTMLLinks) |
Fix parseHTMLLinks |
| Banner | No | None |
| Navigation | No | None |