Skip to content

Commit

Permalink
Add option to disable performanceNavigationTiming plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
greg-el committed Nov 11, 2024
1 parent 967733d commit 229e66d
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 8 deletions.
1 change: 1 addition & 0 deletions trackers/javascript-tracker/src/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,6 @@ export interface JavaScriptTrackerConfiguration extends TrackerConfiguration {
geolocation: boolean;
clientHints: boolean | { includeHighEntropy: boolean };
webVitals: boolean | { loadWebVitalsScript?: boolean; webVitalsSource?: string };
performanceNavigationTiming: boolean;
};
}
11 changes: 3 additions & 8 deletions trackers/javascript-tracker/src/features.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,8 @@ import * as WebVitals from '@snowplow/browser-plugin-web-vitals';
* @param configuration - The tracker configuration object
*/
export function Plugins(configuration: JavaScriptTrackerConfiguration) {
const {
performanceTiming,
gaCookies,
geolocation,
clientHints,
webVitals
} = configuration?.contexts ?? {};
const { performanceTiming, gaCookies, geolocation, clientHints, webVitals, performanceNavigationTiming } =
configuration?.contexts ?? {};
const activatedPlugins: Array<[BrowserPlugin, {} | Record<string, Function>]> = [];

if (plugins.performanceTiming && performanceTiming) {
Expand Down Expand Up @@ -148,7 +143,7 @@ export function Plugins(configuration: JavaScriptTrackerConfiguration) {
activatedPlugins.push([EventSpecificationsPlugin(), apiMethods]);
}

if (plugins.performanceNavigationTiming) {
if (plugins.performanceNavigationTiming && performanceNavigationTiming) {
const { PerformanceNavigationTimingPlugin, ...apiMethods } = PerformanceNavigationTiming;
activatedPlugins.push([PerformanceNavigationTimingPlugin(), apiMethods]);
}
Expand Down
61 changes: 61 additions & 0 deletions trackers/javascript-tracker/test/unit/plugin_features.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { SelfDescribingJson } from '@snowplow/tracker-core';
import { Plugins } from '../../src/features';

describe('Performance Navigation Timing', () => {
let windowSpy: any;

const otherContexts = {
webPage: false,
session: false,
performanceTiming: false,
gaCookies: false,
geolocation: false,
clientHints: false,
webVitals: false,
};

const hasPerformanceNavigationTimingContext = (plugins: ReturnType<typeof Plugins>): boolean => {
const pluginContexts = plugins.map((plugin) => plugin[0]?.contexts?.());
const hasPerformanceContext = pluginContexts.some((contexts?: SelfDescribingJson[]) =>
contexts?.some(
(context: { schema?: string }) => context.schema === 'iglu:org.w3/PerformanceNavigationTiming/jsonschema/1-0-0'
)
);
return hasPerformanceContext;
};

beforeEach(() => {
windowSpy = jest.spyOn(global, 'window', 'get');

// The PerformanceNavigationTiming context will only be added if the plugin can:
// - Access the `performance` object on the window
// - See that a value is returned from `getEntriesByType`
windowSpy.mockImplementation(() => ({
performance: {
getEntriesByType: () => [{}],
},
}));
});

it('Is enabled if contexts.performanceNavigationTiming is true', () => {
const plugins = Plugins({
contexts: {
performanceNavigationTiming: true,
...otherContexts,
},
});

expect(hasPerformanceNavigationTimingContext(plugins)).toBe(true);
});

it('Is disabled if contexts.performanceNavigationTiming is false', () => {
const plugins = Plugins({
contexts: {
performanceNavigationTiming: false,
...otherContexts,
},
});

expect(hasPerformanceNavigationTimingContext(plugins)).toBe(false);
});
});

0 comments on commit 229e66d

Please sign in to comment.