Skip to content

Commit f21bfde

Browse files
committed
Fix tracking a page view with a custom title sets the title for future page views as well (close #1332)
1 parent 5311e26 commit f21bfde

File tree

3 files changed

+115
-3
lines changed

3 files changed

+115
-3
lines changed

libraries/browser-tracker-core/src/tracker/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ export function Tracker(
210210
lastDocumentTitle = document.title,
211211
// Custom title
212212
lastConfigTitle: string | null | undefined,
213+
// Indicates that the lastConfigTitle was set from a trackPageView call
214+
// Custom title configured this way has a shorter lifespan than when set using setDocumentTitle.
215+
// It only lasts until the next trackPageView call.
216+
lastConfigTitleFromTrackPageView: boolean = false,
213217
// Controls whether activity tracking page ping event timers are reset on page view events
214218
resetActivityTrackingOnPageView = trackerConfiguration.resetActivityTrackingOnPageView ?? true,
215219
// Disallow hash tags in URL. TODO: Should this be set to true by default?
@@ -987,7 +991,12 @@ export function Tracker(
987991

988992
// So we know what document.title was at the time of trackPageView
989993
lastDocumentTitle = document.title;
990-
lastConfigTitle = title ?? lastConfigTitle;
994+
if (title) {
995+
lastConfigTitle = title;
996+
lastConfigTitleFromTrackPageView = true;
997+
} else if (lastConfigTitleFromTrackPageView) {
998+
lastConfigTitle = null;
999+
}
9911000

9921001
// Fixup page title
9931002
const pageTitle = fixupTitle(lastConfigTitle || lastDocumentTitle);
@@ -1227,6 +1236,7 @@ export function Tracker(
12271236
// So we know what document.title was at the time of trackPageView
12281237
lastDocumentTitle = document.title;
12291238
lastConfigTitle = title;
1239+
lastConfigTitleFromTrackPageView = false;
12301240
},
12311241

12321242
discardHashTag: function (enableFilter: boolean) {
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*
2+
* Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions are met:
7+
*
8+
* 1. Redistributions of source code must retain the above copyright notice, this
9+
* list of conditions and the following disclaimer.
10+
*
11+
* 2. Redistributions in binary form must reproduce the above copyright notice,
12+
* this list of conditions and the following disclaimer in the documentation
13+
* and/or other materials provided with the distribution.
14+
*
15+
* 3. Neither the name of the copyright holder nor the names of its
16+
* contributors may be used to endorse or promote products derived from
17+
* this software without specific prior written permission.
18+
*
19+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+
*/
30+
31+
import { createTracker } from '../helpers';
32+
33+
describe('Tracker API: page views', () => {
34+
beforeEach(() => {
35+
jest.spyOn(document, 'title', 'get').mockReturnValue('Page title 1');
36+
});
37+
38+
it('Uses custom page title for only a single page view', () => {
39+
let titles: string[] = [];
40+
const tracker = createTracker({
41+
plugins: [
42+
{
43+
afterTrack: (payload) => {
44+
titles.push(payload.page as string);
45+
},
46+
},
47+
],
48+
});
49+
50+
tracker?.trackPageView({
51+
title: 'Title override',
52+
});
53+
tracker?.trackPageView();
54+
55+
expect(titles).toEqual(['Title override', 'Page title 1']);
56+
});
57+
58+
it('Uses custom page title set using setDocumentTitle until overriden again', () => {
59+
let titles: string[] = [];
60+
const tracker = createTracker({
61+
plugins: [
62+
{
63+
afterTrack: (payload) => {
64+
titles.push(payload.page as string);
65+
},
66+
},
67+
],
68+
});
69+
70+
tracker?.setDocumentTitle('Title override');
71+
tracker?.trackPageView();
72+
tracker?.trackPageView();
73+
74+
jest.spyOn(document, 'title', 'get').mockReturnValue('Page title 2');
75+
tracker?.trackPageView();
76+
77+
tracker?.setDocumentTitle('Title override 2');
78+
tracker?.trackPageView();
79+
80+
expect(titles).toEqual(['Title override', 'Title override', 'Title override', 'Title override 2']);
81+
});
82+
83+
it('Explicit title in trackPageView overrides setDocumentTitle', () => {
84+
let titles: string[] = [];
85+
const tracker = createTracker({
86+
plugins: [
87+
{
88+
afterTrack: (payload) => {
89+
titles.push(payload.page as string);
90+
},
91+
},
92+
],
93+
});
94+
95+
tracker?.setDocumentTitle('Title override');
96+
tracker?.trackPageView({
97+
title: 'Explicit title',
98+
});
99+
tracker?.trackPageView();
100+
101+
expect(titles).toEqual(['Explicit title', 'Page title 1']);
102+
});
103+
});

trackers/javascript-tracker/test/integration/integration.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,7 @@ describe('Snowplow Micro integration', () => {
8989
platform: 'mob',
9090
app_id: `sp-${method}-${testIdentifier}`,
9191
user_id: 'Malcolm',
92-
// The title is not correctly set due to #1332
93-
// page_title: 'Integration test page',
92+
page_title: 'Integration test page',
9493
},
9594
})
9695
).toBe(true);

0 commit comments

Comments
 (0)