diff --git a/Packages/Infrastructure/Sources/Public/Protocols/Page.swift b/Packages/Infrastructure/Sources/Public/Protocols/Page.swift index 952ea4c..a2f4d6a 100644 --- a/Packages/Infrastructure/Sources/Public/Protocols/Page.swift +++ b/Packages/Infrastructure/Sources/Public/Protocols/Page.swift @@ -86,6 +86,7 @@ public extension Page { /// The structured data is an inert data block — browsers never execute it, so a site's `Content-Security-Policy` does not apply to it — /// that search engines read for the organization's name, logo, and profiles. The analytics tracker, by contrast, is an executable script the /// policy must allow, and it is `defer`red so it never delays the page render; each behavior flag renders its `data-` attribute only when enabled. + /// When recorder mode is on, the session recorder script follows the tracker script, deferred as well and carrying only the website id. @HTMLBuilder var head: some HTML { meta( @@ -147,6 +148,17 @@ public extension Page { value: $0.value ) }) + + if let recorderScriptURL = analytics.recorderScriptURL { + script( + .defer, + .src(recorderScriptURL), + .custom( + name: "data-website-id", + value: analytics.websiteID + ) + ) {} + } } metadata diff --git a/Packages/Infrastructure/Tests/Cases/Public/Protocols/PageTests.swift b/Packages/Infrastructure/Tests/Cases/Public/Protocols/PageTests.swift index 8e6f1fc..04c4a17 100644 --- a/Packages/Infrastructure/Tests/Cases/Public/Protocols/PageTests.swift +++ b/Packages/Infrastructure/Tests/Cases/Public/Protocols/PageTests.swift @@ -151,6 +151,34 @@ struct PageTests { #expect(preconnect.lowerBound < script.lowerBound) } + @Test + func `omits the session recorder script by default`() { + let html = StubPage(analytics: .init( + scriptURL: "https://analytics.example.com/script", + websiteID: "0000-website-id", + domains: "example.com" + )).render() + + #expect(!html.contains("recorder.js")) + } + + @Test + func `renders the session recorder script when recorder mode is on`() throws { + let html = StubPage(analytics: .init( + scriptURL: "https://analytics.example.com/script", + websiteID: "0000-website-id", + domains: "example.com", + recorder: true + )).render() + + #expect(html.contains(#""#)) + + let tracker = try #require(html.range(of: #"