Skip to content

Instantly share code, notes, and snippets.

@azizpunjani
Last active February 2, 2026 21:58
Show Gist options
  • Select an option

  • Save azizpunjani/60ae1502217fe6030b0eaa3b09254b94 to your computer and use it in GitHub Desktop.

Select an option

Save azizpunjani/60ae1502217fe6030b0eaa3b09254b94 to your computer and use it in GitHub Desktop.
SmartPages Referrer Header Implementation Summary

SmartPages Referrer Header Implementation Summary

Problem

Customer wants referrer headers sent when links are clicked in SmartPages/Digital Rooms. Currently, rel="noreferrer" prevents this in some blocks.


Block Analysis

Blocks That ADD noreferrer (Need Changes)

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.

Blocks That DO NOT Add noreferrer (No Changes Needed)

New Page Designer (v2)

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

Legacy Page Designer (v1)

Block Type Link Behavior File
Banner (v1) Opens new tab (target="_blank"), sends referrer DynamicBandView.jssetupUserActivity()
Navigation (v1) Opens new tab (target="_blank"), sends referrer DynamicBandView.jssetupUserActivity()
Image (v1) Opens new tab (target="_blank"), sends referrer DynamicBandView.jssetupUserActivity()

Key Finding: Legacy v1 dynamic bands (Banner, Navigation, Image) only add target="_blank" for external links but do NOT add rel="noreferrer". They already send referrer headers!


Key Files Requiring Changes

1. parseHTMLLinks() - Primary Fix

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

2. Lexical Editor Files

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"

3. Programmatic window.open() Calls

File Line Context
pagedesigner/hooks/useAnchorHash.ts 64 Anchor link preview
digitalroombuilder/.../CalendarConnectButton.tsx 34 Calendar integration

Recommended Solution

Core Fix: Modify parseHTMLLinks()

File: pagedesigner/components/blocks/Html/htmlBandHelpers.js

Change the function to:

  1. Stop adding rel="noreferrer" to external links
  2. Strip/replace existing noreferrer with noopener (handles Lexical-saved content)
  3. Keep noopener for security

Why this is the only viable approach:

  • Fixes ALL existing Summernote content immediately (no migration)
  • Fixes ALL existing Lexical content that has noreferrer baked in (no migration)
  • Single point of change for rendering
  • No database migration required

Optional: Update Lexical Files

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.


Scope Summary

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

Files with noreferrer (for reference)

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"

Technical Details

How Links Are Processed

Summernote (Legacy Text Editor)

  1. User creates link → saved without rel attribute
  2. At render time → parseHTMLLinks() adds rel="noreferrer"
  3. Fix: Modify parseHTMLLinks() - immediate effect on all content

Lexical (New Text Editor)

  1. User creates link → linkUtils.ts sets rel="noopener noreferrer"
  2. Saved to DB with rel attribute baked in
  3. At render time → parseHTMLLinks() may process again
  4. Fix: Update Lexical files + use render-time fix to handle existing content

Legacy v1 Dynamic Bands (Banner, Navigation, Image)

  1. Links rendered via DynamicBandView.jssetupUserActivity() method
  2. External links: adds target="_blank" only (lines 119-122)
  3. NO rel="noreferrer" added → Already sends referrers!
  4. 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"!
}

Security Consideration

Keep rel="noopener" to prevent:

  • Opened page accessing window.opener
  • Potential redirect/phishing attacks

Change from:

  • rel="noreferrer" or rel="noopener noreferrer"

To:

  • rel="noopener" (security preserved, referrer now sent)

Summary by Page Designer Version

Legacy v1 (Pitch Styles on SPv1)

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

New v2 (SmartPages, Digital Rooms)

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment