diff --git a/developer-extension/src/panel/components/tabs/eventsTab/copyEvent.spec.ts b/developer-extension/src/panel/components/tabs/eventsTab/copyEvent.spec.ts index de7e2441b3..ba2ce4a6fe 100644 --- a/developer-extension/src/panel/components/tabs/eventsTab/copyEvent.spec.ts +++ b/developer-extension/src/panel/components/tabs/eventsTab/copyEvent.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '@datadog/browser-core' import type { TelemetryEvent } from '../../../../../../packages/core/src/domain/telemetry' import type { LogsEvent } from '../../../../../../packages/logs/src/logsEvent.types' import type { RumEvent } from '../../../../../../packages/rum-core/src/rumEvent.types' @@ -14,11 +13,6 @@ const LOG_EVENT = { } as LogsEvent describe('getIntakeUrlForEvent', () => { - beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - }) it('should return undefined when RUM is not present', () => { expect(getIntakeUrlForEvent({} as any, RUM_ERROR_EVENT)).toBeUndefined() }) diff --git a/developer-extension/src/panel/hooks/useEvents/eventFilters.spec.ts b/developer-extension/src/panel/hooks/useEvents/eventFilters.spec.ts index 50f9ac65cc..f8e6ef0ab7 100644 --- a/developer-extension/src/panel/hooks/useEvents/eventFilters.spec.ts +++ b/developer-extension/src/panel/hooks/useEvents/eventFilters.spec.ts @@ -1,7 +1,7 @@ -import { isIE, isSafari } from '@datadog/browser-core' +import { isSafari } from '@datadog/browser-core' import { parseQuery, matchWithWildcard } from './eventFilters' -if (!isIE() && !isSafari()) { +if (!isSafari()) { describe('parseQuery', () => { it('return a simple field', () => { expect(parseQuery('foo:bar')).toEqual([['foo', 'bar']]) diff --git a/packages/core/src/browser/fetchObservable.spec.ts b/packages/core/src/browser/fetchObservable.spec.ts index 694a8d0bde..8dfe097ce2 100644 --- a/packages/core/src/browser/fetchObservable.spec.ts +++ b/packages/core/src/browser/fetchObservable.spec.ts @@ -1,6 +1,5 @@ import type { MockFetch, MockFetchManager } from '../../test' import { registerCleanupTask, mockFetch } from '../../test' -import { isIE } from '../tools/utils/browserDetection' import type { Subscription } from '../tools/observable' import type { FetchResolveContext, FetchContext } from './fetchObservable' import { initFetchObservable } from './fetchObservable' @@ -17,9 +16,6 @@ describe('fetch proxy', () => { let fetch: MockFetch beforeEach(() => { - if (isIE()) { - pending('no fetch support') - } mockFetchManager = mockFetch() originalMockFetch = window.fetch diff --git a/packages/core/src/browser/xhrObservable.spec.ts b/packages/core/src/browser/xhrObservable.spec.ts index 19228458a0..d1880994b5 100644 --- a/packages/core/src/browser/xhrObservable.spec.ts +++ b/packages/core/src/browser/xhrObservable.spec.ts @@ -1,6 +1,5 @@ import type { Configuration } from '../domain/configuration' import { withXhr, mockXhr } from '../../test' -import { isIE } from '../tools/utils/browserDetection' import type { Subscription } from '../tools/observable' import type { XhrCompleteContext, XhrContext } from './xhrObservable' import { initXhrObservable } from './xhrObservable' @@ -346,9 +345,6 @@ describe('xhr observable', () => { }) it('should track request to URL object', (done) => { - if (isIE()) { - pending('IE not supported') - } withXhr({ setup(xhr) { xhr.open('GET', new URL('http://example.com/path')) diff --git a/packages/core/src/domain/console/consoleObservable.spec.ts b/packages/core/src/domain/console/consoleObservable.spec.ts index bf3d3b5042..cd73074094 100644 --- a/packages/core/src/domain/console/consoleObservable.spec.ts +++ b/packages/core/src/domain/console/consoleObservable.spec.ts @@ -1,5 +1,4 @@ /* eslint-disable no-console */ -import { isIE } from '../../tools/utils/browserDetection' import { ConsoleApiName } from '../../tools/display' import type { Subscription } from '../../tools/observable' import type { ConsoleLog } from './consoleObservable' @@ -104,11 +103,7 @@ describe('console error observable', () => { it('should extract stack from first error', () => { console.error(new TypeError('foo'), new TypeError('bar')) const stack = (notifyLog.calls.mostRecent().args[0] as ConsoleLog).stack - if (!isIE()) { - expect(stack).toMatch(/^TypeError: foo\s+at/) - } else { - expect(stack).toContain('TypeError: foo') - } + expect(stack).toContain('TypeError: foo') }) it('should retrieve fingerprint from error', () => { diff --git a/packages/core/src/domain/error/trackRuntimeError.spec.ts b/packages/core/src/domain/error/trackRuntimeError.spec.ts index e3479f20ef..fffda93e61 100644 --- a/packages/core/src/domain/error/trackRuntimeError.spec.ts +++ b/packages/core/src/domain/error/trackRuntimeError.spec.ts @@ -1,6 +1,5 @@ import { disableJasmineUncaughtExceptionTracking, collectAsyncCalls } from '../../../test' import { Observable } from '../../tools/observable' -import { isIE } from '../../tools/utils/browserDetection' import type { UnhandledErrorCallback } from './trackRuntimeError' import { instrumentOnError, instrumentUnhandledRejection, trackRuntimeError } from './trackRuntimeError' import type { RawError } from './error.types' @@ -49,9 +48,6 @@ describe('trackRuntimeError', () => { }) it('should collect unhandled rejection', (done) => { - if (isIE()) { - pending('no promise support') - } disableJasmineUncaughtExceptionTracking() setTimeout(() => { diff --git a/packages/core/src/domain/session/sessionManager.spec.ts b/packages/core/src/domain/session/sessionManager.spec.ts index 5f416bacf3..707e529b6c 100644 --- a/packages/core/src/domain/session/sessionManager.spec.ts +++ b/packages/core/src/domain/session/sessionManager.spec.ts @@ -9,7 +9,6 @@ import { import type { Clock } from '../../../test' import { getCookie, setCookie } from '../../browser/cookie' import type { RelativeTime } from '../../tools/utils/timeUtils' -import { isIE } from '../../tools/utils/browserDetection' import { DOM_EVENT } from '../../browser/addEventListener' import { ONE_HOUR, ONE_SECOND } from '../../tools/utils/timeUtils' import type { Configuration } from '../configuration' @@ -92,9 +91,6 @@ describe('startSessionManager', () => { } beforeEach(() => { - if (isIE()) { - pending('no full rum support') - } clock = mockClock() registerCleanupTask(() => { diff --git a/packages/core/src/tools/readBytesFromStream.spec.ts b/packages/core/src/tools/readBytesFromStream.spec.ts index bf0151b7cf..6f82e34008 100644 --- a/packages/core/src/tools/readBytesFromStream.spec.ts +++ b/packages/core/src/tools/readBytesFromStream.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from './utils/browserDetection' import { readBytesFromStream } from './readBytesFromStream' describe('readBytesFromStream', () => { @@ -7,9 +6,6 @@ describe('readBytesFromStream', () => { let stream: ReadableStream beforeEach(() => { - if (isIE()) { - pending('no ReadableStream support') - } beenCalled = false stream = new ReadableStream({ pull: (controller) => { diff --git a/packages/core/src/tools/serialisation/sanitize.spec.ts b/packages/core/src/tools/serialisation/sanitize.spec.ts index 22ba57ec51..07b2f9ebda 100644 --- a/packages/core/src/tools/serialisation/sanitize.spec.ts +++ b/packages/core/src/tools/serialisation/sanitize.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '../utils/browserDetection' import { display } from '../display' import { createNewEvent } from '../../../test' import { sanitize } from './sanitize' @@ -30,12 +29,7 @@ describe('sanitize', () => { function testFunction() { return true } - if (isIE()) { - // IE does not provide access to function name - expect(sanitize(testFunction)).toBe('[Function] unknown') - } else { - expect(sanitize(testFunction)).toBe('[Function] testFunction') - } + expect(sanitize(testFunction)).toBe('[Function] testFunction') }) it('should handle bigint', () => { @@ -102,19 +96,10 @@ describe('sanitize', () => { ['a', 13], ['b', 37], ]) - if (isIE()) { - // IE does not distinguish maps, weakmaps, sets... from generic objects - expect(sanitize(map)).toEqual({}) - } else { - expect(sanitize(map)).toBe('[Map]') - } + expect(sanitize(map)).toBe('[Map]') }) it('should survive when toStringTag throws', () => { - if (isIE()) { - pending('IE does not support Symbols') - } - class CannotSerialize { get [Symbol.toStringTag]() { throw Error('Cannot serialize') @@ -229,12 +214,7 @@ describe('sanitize', () => { const obj = { b: 42, toJSON: faulty } // Since toJSON throws, sanitize falls back to serialize property by property - if (isIE()) { - // IE does not provide access to function name - expect(sanitize(obj)).toEqual({ b: 42, toJSON: '[Function] unknown' }) - } else { - expect(sanitize(obj)).toEqual({ b: 42, toJSON: '[Function] faulty' }) - } + expect(sanitize(obj)).toEqual({ b: 42, toJSON: '[Function] faulty' }) }) }) diff --git a/packages/core/test/leakDetection.ts b/packages/core/test/leakDetection.ts index 523e73a5a0..8a80b4febd 100644 --- a/packages/core/test/leakDetection.ts +++ b/packages/core/test/leakDetection.ts @@ -1,5 +1,4 @@ import { display } from '../src/tools/display' -import { isIE } from '../src/tools/utils/browserDetection' import { getCurrentJasmineSpec } from './getCurrentJasmineSpec' let originalAddEventListener: typeof EventTarget.prototype.addEventListener @@ -9,9 +8,6 @@ let wrappedListeners: { } export function startLeakDetection() { - if (isIE()) { - return - } wrappedListeners = {} // eslint-disable-next-line @typescript-eslint/unbound-method @@ -35,9 +31,6 @@ export function startLeakDetection() { } export function stopLeakDetection() { - if (isIE()) { - return - } EventTarget.prototype.addEventListener = originalAddEventListener EventTarget.prototype.removeEventListener = originalRemoveEventListener wrappedListeners = {} diff --git a/packages/logs/BROWSER_SUPPORT.md b/packages/logs/BROWSER_SUPPORT.md index a35800b340..bfa8f14050 100644 --- a/packages/logs/BROWSER_SUPPORT.md +++ b/packages/logs/BROWSER_SUPPORT.md @@ -1,16 +1,16 @@ # Browser Support -| Feature | Chrome | Firefox | Safari | Edge | Chrome Android | Safari iOS | IE11 | < IE11 | Opera | -| -------------- | ------ | ------- | ------ | ---- | -------------- | ---------- | ---- | ------ | ----- | -| loading | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| init | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| global context | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| logs request | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| flush on hide | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | -| console error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| network error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| runtime error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| CSP violation | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | -| reports | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | -| custom logger | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| handler | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| Feature | Chrome | Firefox | Safari | Edge | Chrome Android | Safari iOS | IE | Opera | +| -------------- | ------ | ------- | ------ | ---- | -------------- | ---------- | --- | ----- | +| loading | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| init | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| global context | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| logs request | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| flush on hide | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| console error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| network error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| runtime error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| CSP violation | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| reports | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | +| custom logger | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| handler | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | diff --git a/packages/logs/src/boot/preStartLogs.spec.ts b/packages/logs/src/boot/preStartLogs.spec.ts index 6235069bfd..5b57623bc3 100644 --- a/packages/logs/src/boot/preStartLogs.spec.ts +++ b/packages/logs/src/boot/preStartLogs.spec.ts @@ -5,7 +5,6 @@ import { TrackingConsent, createTrackingConsentState, display, - isIE, resetFetchObservable, } from '@datadog/browser-core' import type { CommonContext } from '../rawLogsEvent.types' @@ -217,12 +216,6 @@ describe('preStartLogs', () => { }) describe('basic methods instrumentation', () => { - beforeEach(() => { - if (isIE()) { - pending('No support for IE') - } - }) - it('should instrument fetch even if tracking consent is not granted', () => { const originalFetch = window.fetch diff --git a/packages/logs/src/domain/networkError/networkErrorCollection.spec.ts b/packages/logs/src/domain/networkError/networkErrorCollection.spec.ts index 960692ace4..ad06a80855 100644 --- a/packages/logs/src/domain/networkError/networkErrorCollection.spec.ts +++ b/packages/logs/src/domain/networkError/networkErrorCollection.spec.ts @@ -1,4 +1,4 @@ -import { isIE, ErrorSource } from '@datadog/browser-core' +import { ErrorSource } from '@datadog/browser-core' import type { MockFetch, MockFetchManager } from '@datadog/browser-core/test' import { SPEC_ENDPOINTS, MockResponse, mockFetch, registerCleanupTask } from '@datadog/browser-core/test' import type { RawNetworkLogsEvent } from '../../rawLogsEvent.types' @@ -45,9 +45,6 @@ describe('network error collection', () => { } beforeEach(() => { - if (isIE()) { - pending('no fetch support') - } rawLogsEvents = [] lifeCycle = new LifeCycle() lifeCycle.subscribe(LifeCycleEventType.RAW_LOG_COLLECTED, (rawLogsEvent) => @@ -189,10 +186,6 @@ describe('computeFetchResponseText', () => { let onunhandledrejectionSpy: jasmine.Spy beforeEach(() => { - if (isIE()) { - pending('IE does not support the fetch API') - } - onunhandledrejectionSpy = jasmine.createSpy() window.onunhandledrejection = onunhandledrejectionSpy diff --git a/packages/rum-core/src/boot/preStartRum.spec.ts b/packages/rum-core/src/boot/preStartRum.spec.ts index c02cc9936f..10c4c21119 100644 --- a/packages/rum-core/src/boot/preStartRum.spec.ts +++ b/packages/rum-core/src/boot/preStartRum.spec.ts @@ -12,7 +12,6 @@ import { ExperimentalFeature, resetExperimentalFeatures, resetFetchObservable, - isIE, } from '@datadog/browser-core' import type { Clock } from '@datadog/browser-core/test' import { @@ -712,12 +711,6 @@ describe('preStartRum', () => { }) describe('basic methods instrumentation', () => { - beforeEach(() => { - if (isIE()) { - pending('No support for IE') - } - }) - it('should instrument fetch even if tracking consent is not granted', () => { const originalFetch = window.fetch diff --git a/packages/rum-core/src/boot/startRum.spec.ts b/packages/rum-core/src/boot/startRum.spec.ts index af827b3ccf..1c69edcadc 100644 --- a/packages/rum-core/src/boot/startRum.spec.ts +++ b/packages/rum-core/src/boot/startRum.spec.ts @@ -5,7 +5,6 @@ import { ONE_SECOND, findLast, noop, - isIE, relativeNow, createIdentityEncoder, createCustomerDataTracker, @@ -88,10 +87,6 @@ describe('rum session', () => { let serverRumEvents: RumEvent[] beforeEach(() => { - if (isIE()) { - pending('no full rum support') - } - setupBuilder = setup().beforeBuild( ({ location, @@ -146,9 +141,6 @@ describe('rum session keep alive', () => { let serverRumEvents: RumEvent[] beforeEach(() => { - if (isIE()) { - pending('no full rum support') - } sessionManager = createRumSessionManagerMock().setId('1234') setupBuilder = setup() .withFakeClock() diff --git a/packages/rum-core/src/browser/domMutationObservable.spec.ts b/packages/rum-core/src/browser/domMutationObservable.spec.ts index ac8b873d17..c5ed616a83 100644 --- a/packages/rum-core/src/browser/domMutationObservable.spec.ts +++ b/packages/rum-core/src/browser/domMutationObservable.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '@datadog/browser-core' import type { MockZoneJs } from '@datadog/browser-core/test' import { registerCleanupTask, mockZoneJs } from '@datadog/browser-core/test' import { createDOMMutationObservable, getMutationObserverConstructor } from './domMutationObservable' @@ -8,12 +7,6 @@ import { createDOMMutationObservable, getMutationObserverConstructor } from './d const DOM_MUTATION_OBSERVABLE_DURATION = 16 describe('domMutationObservable', () => { - beforeEach(() => { - if (isIE()) { - pending('dom mutation not available') - } - }) - function domMutationSpec(mutate: (root: HTMLElement) => void, { expectedMutations }: { expectedMutations: number }) { return (done: DoneFn) => { const root = document.createElement('div') @@ -113,10 +106,6 @@ describe('domMutationObservable', () => { const OriginalMutationObserverConstructor = window.MutationObserver beforeEach(() => { - if (isIE()) { - pending('dom mutation not available') - } - zoneJs = mockZoneJs() registerCleanupTask(() => { diff --git a/packages/rum-core/src/browser/htmlDomUtils.spec.ts b/packages/rum-core/src/browser/htmlDomUtils.spec.ts index 07b0dfdbc7..7c518de8f1 100644 --- a/packages/rum-core/src/browser/htmlDomUtils.spec.ts +++ b/packages/rum-core/src/browser/htmlDomUtils.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '@datadog/browser-core' import { appendElement, appendText } from '../../test' import { isTextNode, @@ -59,80 +58,70 @@ describe('isElementNode', () => { }) }) -if (!isIE()) { - describe('isShadowRoot', () => { - const notShadowDomNodes: Node[] = [ - document, - document.head, - document.body, - document.createElement('div'), - document.createTextNode('hello'), - document.createComment('hello'), - ] - - notShadowDomNodes.forEach((element) => { - it(`should return false for "${String(element.nodeName)}"`, () => { - expect(isNodeShadowRoot(element)).toBe(false) - }) - }) +describe('isShadowRoot', () => { + const notShadowDomNodes: Node[] = [ + document, + document.head, + document.body, + document.createElement('div'), + document.createTextNode('hello'), + document.createComment('hello'), + ] - it('should return true for shadow root but not its host', () => { - const parent = document.createElement('div') - const shadowRoot = parent.attachShadow({ mode: 'open' }) - expect(isNodeShadowRoot(parent)).toBe(false) - expect(isNodeShadowRoot(shadowRoot)).toBe(true) + notShadowDomNodes.forEach((element) => { + it(`should return false for "${String(element.nodeName)}"`, () => { + expect(isNodeShadowRoot(element)).toBe(false) }) + }) - it('should return false for a[href] despite it has a host property', () => { - const link = document.createElement('a') - link.setAttribute('href', 'http://localhost/some/path') - expect(link.host).toBeTruthy() - expect(isNodeShadowRoot(link)).toBe(false) - }) + it('should return true for shadow root but not its host', () => { + const parent = document.createElement('div') + const shadowRoot = parent.attachShadow({ mode: 'open' }) + expect(isNodeShadowRoot(parent)).toBe(false) + expect(isNodeShadowRoot(shadowRoot)).toBe(true) + }) - it('should return false for a form with an input[name="host"] despite it has a host property', () => { - const form = document.createElement('form') - const input = document.createElement('input') - input.setAttribute('name', 'host') - form.appendChild(input) - expect(isNodeShadowRoot(form)).toBe(false) - }) + it('should return false for a[href] despite it has a host property', () => { + const link = document.createElement('a') + link.setAttribute('href', 'http://localhost/some/path') + expect(link.host).toBeTruthy() + expect(isNodeShadowRoot(link)).toBe(false) }) -} - -if (!isIE()) { - describe('isShadowHost', () => { - const host = document.createElement('div') - host.attachShadow({ mode: 'open' }) - - // Edge 18 and before doesn't support shadow dom, so `Element#shadowRoot` is undefined. - const oldEdgeElement = document.createElement('div') - Object.defineProperty(oldEdgeElement, 'shadowRoot', { value: undefined }) - - const parameters: Array<[Node, boolean]> = [ - [host, true], - [host.shadowRoot!, false], - [document.body, false], - [document.createTextNode('hello'), false], - [document.createComment('hello'), false], - [oldEdgeElement, false], - ] - - parameters.forEach(([element, result]) => { - it(`should return ${String(result)} for "${String(element)}"`, () => { - expect(isNodeShadowHost(element)).toBe(result) - }) - }) + + it('should return false for a form with an input[name="host"] despite it has a host property', () => { + const form = document.createElement('form') + const input = document.createElement('input') + input.setAttribute('name', 'host') + form.appendChild(input) + expect(isNodeShadowRoot(form)).toBe(false) }) -} +}) -describe('hasChildNode', () => { - beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } +describe('isShadowHost', () => { + const host = document.createElement('div') + host.attachShadow({ mode: 'open' }) + + // Edge 18 and before doesn't support shadow dom, so `Element#shadowRoot` is undefined. + const oldEdgeElement = document.createElement('div') + Object.defineProperty(oldEdgeElement, 'shadowRoot', { value: undefined }) + + const parameters: Array<[Node, boolean]> = [ + [host, true], + [host.shadowRoot!, false], + [document.body, false], + [document.createTextNode('hello'), false], + [document.createComment('hello'), false], + [oldEdgeElement, false], + ] + + parameters.forEach(([element, result]) => { + it(`should return ${String(result)} for "${String(element)}"`, () => { + expect(isNodeShadowHost(element)).toBe(result) + }) }) +}) +describe('hasChildNode', () => { it('should return `true` if the element has a direct child node', () => { expect(hasChildNodes(appendElement('
foo
'))).toBe(true) expect(hasChildNodes(appendElement('

'))).toBe(true) @@ -153,10 +142,6 @@ describe('hasChildNode', () => { describe('forEachChildNodes', () => { it('should iterate over the direct children for a normal node', () => { - if (isIE()) { - pending('IE not supported') - } - const container = appendElement(`
toto
`) @@ -167,10 +152,6 @@ describe('forEachChildNodes', () => { }) it('should iterate over the the shadow root for a node that is a host', () => { - if (isIE()) { - pending('IE not supported') - } - const container = appendElement('
') const shadowRoot = container.attachShadow({ mode: 'open' }) @@ -181,10 +162,6 @@ describe('forEachChildNodes', () => { }) it('should iterate over the the shadow root and direct children for a node that is a host', () => { - if (isIE()) { - pending('IE not supported') - } - const container = appendElement('
') const shadowRoot = container.attachShadow({ mode: 'open' }) @@ -196,25 +173,23 @@ describe('forEachChildNodes', () => { }) }) -if (!isIE()) { - describe('getParentNode', () => { - const orphanDiv = document.createElement('div') - const parentWithShadowRoot = document.createElement('div') - const shadowRoot = parentWithShadowRoot.attachShadow({ mode: 'open' }) - - const parentWithoutShadowRoot = document.createElement('div') - const child = document.createElement('span') - parentWithoutShadowRoot.appendChild(child) - - const parameters: Array<[string, Node, Node | null]> = [ - ['return null if without parent', orphanDiv, null], - ['return the host for a shadow root', shadowRoot, parentWithShadowRoot], - ['return the parent for normal child', child, parentWithoutShadowRoot], - ] - parameters.forEach(([label, element, result]) => { - it(`should ${label}`, () => { - expect(getParentNode(element)).toBe(result) - }) +describe('getParentNode', () => { + const orphanDiv = document.createElement('div') + const parentWithShadowRoot = document.createElement('div') + const shadowRoot = parentWithShadowRoot.attachShadow({ mode: 'open' }) + + const parentWithoutShadowRoot = document.createElement('div') + const child = document.createElement('span') + parentWithoutShadowRoot.appendChild(child) + + const parameters: Array<[string, Node, Node | null]> = [ + ['return null if without parent', orphanDiv, null], + ['return the host for a shadow root', shadowRoot, parentWithShadowRoot], + ['return the parent for normal child', child, parentWithoutShadowRoot], + ] + parameters.forEach(([label, element, result]) => { + it(`should ${label}`, () => { + expect(getParentNode(element)).toBe(result) }) }) -} +}) diff --git a/packages/rum-core/src/browser/scroll.spec.ts b/packages/rum-core/src/browser/scroll.spec.ts index 3a69cd5c3d..d0272abc63 100644 --- a/packages/rum-core/src/browser/scroll.spec.ts +++ b/packages/rum-core/src/browser/scroll.spec.ts @@ -1,4 +1,4 @@ -import { addEventListener, DOM_EVENT, isIE } from '@datadog/browser-core' +import { addEventListener, DOM_EVENT } from '@datadog/browser-core' import type { RumConfiguration } from '../domain/configuration' import { getScrollX, getScrollY } from './scroll' @@ -10,17 +10,11 @@ describe('scroll', () => { } beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } configuration = {} as RumConfiguration shouldWaitForWindowScrollEvent = false }) afterEach((done) => { - if (isIE()) { - return done() - } document.body.style.removeProperty('margin-bottom') window.scrollTo(0, 0) diff --git a/packages/rum-core/src/domain/privacy.spec.ts b/packages/rum-core/src/domain/privacy.spec.ts index 2155388cf5..c7bb886571 100644 --- a/packages/rum-core/src/domain/privacy.spec.ts +++ b/packages/rum-core/src/domain/privacy.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '@datadog/browser-core' import { NodePrivacyLevel, PRIVACY_ATTR_NAME, @@ -12,12 +11,6 @@ import { } from './privacy' describe('getNodePrivacyLevel', () => { - beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - }) - it('returns the element privacy mode if it has one', () => { const node = document.createElement('div') node.setAttribute(PRIVACY_ATTR_NAME, PRIVACY_ATTR_VALUE_MASK) @@ -127,11 +120,6 @@ describe('getNodePrivacyLevel', () => { }) describe('getNodeSelfPrivacyLevel', () => { - beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - }) ;[ { msg: 'is not an element', diff --git a/packages/rum-core/src/domain/requestCollection.spec.ts b/packages/rum-core/src/domain/requestCollection.spec.ts index 27a8da52fe..ff280b13d6 100644 --- a/packages/rum-core/src/domain/requestCollection.spec.ts +++ b/packages/rum-core/src/domain/requestCollection.spec.ts @@ -1,5 +1,5 @@ import type { Payload } from '@datadog/browser-core' -import { isIE, RequestType } from '@datadog/browser-core' +import { RequestType } from '@datadog/browser-core' import type { MockFetch, MockFetchManager, MockXhrManager } from '@datadog/browser-core/test' import { registerCleanupTask, SPEC_ENDPOINTS, mockFetch, mockXhr, withXhr } from '@datadog/browser-core/test' import type { RumConfiguration } from './configuration' @@ -22,9 +22,6 @@ describe('collect fetch', () => { let stopFetchTracking: () => void beforeEach(() => { - if (isIE()) { - pending('no fetch support') - } configuration = { ...validateAndBuildRumConfiguration({ clientToken: 'xxx', applicationId: 'xxx' })!, ...SPEC_ENDPOINTS, @@ -197,9 +194,6 @@ describe('collect xhr', () => { let stopXhrTracking: () => void beforeEach(() => { - if (isIE()) { - pending('no fetch support') - } configuration = { ...validateAndBuildRumConfiguration({ clientToken: 'xxx', applicationId: 'xxx' })!, ...SPEC_ENDPOINTS, diff --git a/packages/rum-core/src/domain/resource/matchRequestTiming.spec.ts b/packages/rum-core/src/domain/resource/matchRequestTiming.spec.ts index 733f538924..135158d001 100644 --- a/packages/rum-core/src/domain/resource/matchRequestTiming.spec.ts +++ b/packages/rum-core/src/domain/resource/matchRequestTiming.spec.ts @@ -1,5 +1,5 @@ import type { Duration, RelativeTime } from '@datadog/browser-core' -import { ExperimentalFeature, isIE, relativeToClocks } from '@datadog/browser-core' +import { ExperimentalFeature, relativeToClocks } from '@datadog/browser-core' import { mockExperimentalFeatures } from '@datadog/browser-core/test' import { createPerformanceEntry } from '../../../test' import type { RumPerformanceResourceTiming } from '../../browser/performanceObservable' @@ -16,9 +16,6 @@ describe('matchRequestTiming', () => { let entries: RumPerformanceResourceTiming[] beforeEach(() => { - if (isIE()) { - pending('no full rum support') - } entries = [] spyOn(performance, 'getEntriesByName').and.returnValue(entries) }) diff --git a/packages/rum-core/src/domain/resource/resourceCollection.spec.ts b/packages/rum-core/src/domain/resource/resourceCollection.spec.ts index 2d658c0763..6edea7528c 100644 --- a/packages/rum-core/src/domain/resource/resourceCollection.spec.ts +++ b/packages/rum-core/src/domain/resource/resourceCollection.spec.ts @@ -1,5 +1,5 @@ import type { Duration, RelativeTime, ServerDuration, TimeStamp } from '@datadog/browser-core' -import { isIE, RequestType, ResourceType } from '@datadog/browser-core' +import { RequestType, ResourceType } from '@datadog/browser-core' import type { RumFetchResourceEventDomainContext, RumXhrResourceEventDomainContext } from '../../domainContext.types' import { setup, createPerformanceEntry, mockPerformanceObserver } from '../../../test' import type { TestSetupBuilder } from '../../../test' @@ -188,9 +188,6 @@ describe('resourceCollection', () => { }) it('should create resource from completed fetch request', () => { - if (isIE()) { - pending('No IE support') - } const { lifeCycle, rawRumEvents } = build() const response = new Response() lifeCycle.notify( @@ -240,9 +237,6 @@ describe('resourceCollection', () => { it(`should support ${ typeof input === 'object' ? JSON.stringify(input) : String(input) } as fetch input parameter`, () => { - if (isIE()) { - pending('No IE support') - } const { lifeCycle, rawRumEvents } = build() lifeCycle.notify( LifeCycleEventType.REQUEST_COMPLETED, @@ -395,10 +389,6 @@ describe('resourceCollection', () => { }) it('should collect handlingStack from completed fetch request', () => { - if (isIE()) { - pending('No IE support') - } - const { lifeCycle, rawRumEvents } = build() const response = new Response() lifeCycle.notify(LifeCycleEventType.REQUEST_COMPLETED, createCompletedRequest({ response })) diff --git a/packages/rum-core/src/domain/rumSessionManager.spec.ts b/packages/rum-core/src/domain/rumSessionManager.spec.ts index 73e533f44b..96cf8e3ee5 100644 --- a/packages/rum-core/src/domain/rumSessionManager.spec.ts +++ b/packages/rum-core/src/domain/rumSessionManager.spec.ts @@ -3,7 +3,6 @@ import { STORAGE_POLL_DELAY, SESSION_STORE_KEY, getCookie, - isIE, setCookie, stopSessionManager, ONE_SECOND, @@ -40,9 +39,6 @@ describe('rum session manager', () => { let clock: Clock beforeEach(() => { - if (isIE()) { - pending('no full rum support') - } clock = mockClock() expireSessionSpy = jasmine.createSpy('expireSessionSpy') renewSessionSpy = jasmine.createSpy('renewSessionSpy') diff --git a/packages/rum-core/src/domain/tracing/tracer.spec.ts b/packages/rum-core/src/domain/tracing/tracer.spec.ts index eff44929d8..0953a59db4 100644 --- a/packages/rum-core/src/domain/tracing/tracer.spec.ts +++ b/packages/rum-core/src/domain/tracing/tracer.spec.ts @@ -1,4 +1,4 @@ -import { display, isIE, objectEntries, TraceContextInjection } from '@datadog/browser-core' +import { display, objectEntries, TraceContextInjection } from '@datadog/browser-core' import type { RumSessionManagerMock } from '../../../test' import { createRumSessionManagerMock } from '../../../test' import type { RumFetchResolveContext, RumFetchStartContext, RumXhrStartContext } from '../requestCollection' @@ -288,12 +288,6 @@ describe('tracer', () => { }) describe('traceFetch', () => { - beforeEach(() => { - if (isIE()) { - pending('no fetch support') - } - }) - it('should add traceId and spanId to context, and add tracing headers', () => { const context: Partial = { ...ALLOWED_DOMAIN_CONTEXT } const tracer = startTracer(configuration, sessionManager) diff --git a/packages/rum-core/src/domain/view/viewMetrics/trackScrollMetrics.spec.ts b/packages/rum-core/src/domain/view/viewMetrics/trackScrollMetrics.spec.ts index 06755cee7b..a247efc908 100644 --- a/packages/rum-core/src/domain/view/viewMetrics/trackScrollMetrics.spec.ts +++ b/packages/rum-core/src/domain/view/viewMetrics/trackScrollMetrics.spec.ts @@ -1,5 +1,5 @@ import type { Duration, RelativeTime, Subscription, TimeStamp } from '@datadog/browser-core' -import { DOM_EVENT, Observable, isIE } from '@datadog/browser-core' +import { DOM_EVENT, Observable } from '@datadog/browser-core' import type { Clock } from '@datadog/browser-core/test' import { createNewEvent, mockClock, registerCleanupTask } from '@datadog/browser-core/test' import type { RumConfiguration } from '../../configuration' @@ -22,10 +22,6 @@ describe('createScrollValuesObserver', () => { } beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - registerCleanupTask(() => { subscription.unsubscribe() document.body.innerHTML = '' diff --git a/packages/rum/BROWSER_SUPPORT.md b/packages/rum/BROWSER_SUPPORT.md index bee0786ae7..b16d7b417c 100644 --- a/packages/rum/BROWSER_SUPPORT.md +++ b/packages/rum/BROWSER_SUPPORT.md @@ -1,25 +1,25 @@ # Browser Support -| Feature | Chrome | Firefox | Safari | Edge | Chrome Android | Safari iOS | IE11 | < IE11 | Opera | -| ----------------- | ------ | ------- | ------ | ---- | -------------- | ---------- | ----- | ------ | ----- | -| loading | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| init | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| rum request | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| flush on hide | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | -| console error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| runtime error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| CSP violation | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | -| intervention | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | -| auto action | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| custom action | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| long task | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | -| tracing | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| route change | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| loading time | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| resource timing | ✅ | ✅ | ⚠️(2) | ✅ | ✅ | ⚠️(2) | ⚠️(3) | ❌ | ✅ | -| navigation timing | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| web vitals | ✅ | ⚠️(1) | ⚠️(1) | ✅ | ✅ | ⚠️(1) | ❌ | ❌ | ✅ | -| FCP | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | +| Feature | Chrome | Firefox | Safari | Edge | Chrome Android | Safari iOS | IE | Opera | +| ----------------- | ------ | ------- | ------ | ---- | -------------- | ---------- | --- | ----- | +| loading | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| init | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| rum request | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| flush on hide | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | +| console error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| runtime error | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| CSP violation | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| intervention | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | +| auto action | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| custom action | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| long task | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | +| tracing | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| route change | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| loading time | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| resource timing | ✅ | ✅ | ⚠️(2) | ✅ | ✅ | ⚠️(2) | ❌ | ✅ | +| navigation timing | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | +| web vitals | ✅ | ⚠️(1) | ⚠️(1) | ✅ | ✅ | ⚠️(1) | ❌ | ✅ | +| FCP | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | 1. FID only 2. size information not available diff --git a/packages/rum/src/boot/recorderApi.spec.ts b/packages/rum/src/boot/recorderApi.spec.ts index 1cc63f0610..09ecba102e 100644 --- a/packages/rum/src/boot/recorderApi.spec.ts +++ b/packages/rum/src/boot/recorderApi.spec.ts @@ -1,5 +1,5 @@ import type { DeflateEncoder, DeflateWorker, DeflateWorkerAction } from '@datadog/browser-core' -import { BridgeCapability, PageExitReason, display, isIE } from '@datadog/browser-core' +import { BridgeCapability, PageExitReason, display } from '@datadog/browser-core' import type { RecorderApi, ViewContexts, LifeCycle, RumConfiguration } from '@datadog/browser-rum-core' import { LifeCycleEventType } from '@datadog/browser-rum-core' import { mockEventBridge, createNewEvent, registerCleanupTask } from '@datadog/browser-core/test' @@ -24,9 +24,6 @@ describe('makeRecorderApi', () => { let startSessionReplayRecordingManually: boolean beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } startSessionReplayRecordingManually = false mockWorker = new MockWorker() diff --git a/packages/rum/src/boot/startRecording.spec.ts b/packages/rum/src/boot/startRecording.spec.ts index 53f48487a0..9404168f3d 100644 --- a/packages/rum/src/boot/startRecording.spec.ts +++ b/packages/rum/src/boot/startRecording.spec.ts @@ -1,5 +1,5 @@ import type { TimeStamp, HttpRequest } from '@datadog/browser-core' -import { PageExitReason, DefaultPrivacyLevel, noop, isIE, DeflateEncoderStreamId } from '@datadog/browser-core' +import { PageExitReason, DefaultPrivacyLevel, noop, DeflateEncoderStreamId } from '@datadog/browser-core' import type { LifeCycle, ViewCreatedEvent, RumConfiguration } from '@datadog/browser-rum-core' import { LifeCycleEventType, startViewContexts } from '@datadog/browser-rum-core' import type { Clock } from '@datadog/browser-core/test' @@ -29,9 +29,6 @@ describe('startRecording', () => { let configuration: RumConfiguration beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } configuration = {} as RumConfiguration resetReplayStats() sessionManager = createRumSessionManagerMock() diff --git a/packages/rum/src/domain/deflate/deflateWorker.spec.ts b/packages/rum/src/domain/deflate/deflateWorker.spec.ts index 180531e638..5afe93726b 100644 --- a/packages/rum/src/domain/deflate/deflateWorker.spec.ts +++ b/packages/rum/src/domain/deflate/deflateWorker.spec.ts @@ -1,5 +1,5 @@ import type { RawTelemetryEvent } from '@datadog/browser-core' -import { display, isIE, resetTelemetry, startFakeTelemetry } from '@datadog/browser-core' +import { display, resetTelemetry, startFakeTelemetry } from '@datadog/browser-core' import type { RumConfiguration } from '@datadog/browser-rum-core' import type { Clock } from '@datadog/browser-core/test' import { mockClock, registerCleanupTask } from '@datadog/browser-core/test' @@ -75,9 +75,6 @@ describe('startDeflateWorker', () => { let displaySpy: jasmine.Spy beforeEach(() => { - if (isIE()) { - pending('IE does not support CSP blocking worker creation') - } displaySpy = spyOn(display, 'error') telemetryEvents = startFakeTelemetry() CSP_ERROR = new DOMException( diff --git a/packages/rum/src/domain/getSessionReplayLink.spec.ts b/packages/rum/src/domain/getSessionReplayLink.spec.ts index e4a8351e72..9229881bd7 100644 --- a/packages/rum/src/domain/getSessionReplayLink.spec.ts +++ b/packages/rum/src/domain/getSessionReplayLink.spec.ts @@ -1,5 +1,5 @@ -import { isIE } from '@datadog/browser-core' import type { RumConfiguration, ViewContexts } from '@datadog/browser-rum-core' +import { registerCleanupTask } from '@datadog/browser-core/test' import { createRumSessionManagerMock } from '../../../rum-core/test' import { getSessionReplayLink } from './getSessionReplayLink' import { addRecord, resetReplayStats } from './replayStats' @@ -18,11 +18,7 @@ describe('getReplayLink', () => { const link = getSessionReplayLink(DEFAULT_CONFIGURATION, sessionManager, viewContexts, true) - expect(link).toBe( - isIE() - ? 'https://dd.datad0g.com/rum/replay/sessions/session-id-1?error-type=browser-not-supported' - : 'https://dd.datad0g.com/rum/replay/sessions/session-id-1?' - ) + expect(link).toBe('https://dd.datad0g.com/rum/replay/sessions/session-id-1?') }) it('should return the replay link', () => { @@ -44,11 +40,7 @@ describe('getReplayLink', () => { true ) - expect(link).toBe( - isIE() - ? 'https://toto.datadoghq.com/rum/replay/sessions/session-id-1?error-type=browser-not-supported&seed=view-id-1&from=123456' - : 'https://toto.datadoghq.com/rum/replay/sessions/session-id-1?seed=view-id-1&from=123456' - ) + expect(link).toBe('https://toto.datadoghq.com/rum/replay/sessions/session-id-1?seed=view-id-1&from=123456') }) it('should return link when replay is forced', () => { @@ -74,11 +66,7 @@ describe('getReplayLink', () => { true ) - expect(link).toBe( - isIE() - ? 'https://toto.datadoghq.com/rum/replay/sessions/session-id-1?error-type=browser-not-supported&seed=view-id-1&from=123456' - : 'https://toto.datadoghq.com/rum/replay/sessions/session-id-1?seed=view-id-1&from=123456' - ) + expect(link).toBe('https://toto.datadoghq.com/rum/replay/sessions/session-id-1?seed=view-id-1&from=123456') }) it('return a param if replay is sampled out', () => { @@ -98,9 +86,8 @@ describe('getReplayLink', () => { viewContexts, true ) - const errorType = isIE() ? 'browser-not-supported' : 'incorrect-session-plan' expect(link).toBe( - `https://app.datadoghq.com/rum/replay/sessions/session-id-1?error-type=${errorType}&seed=view-id-1&from=123456` + 'https://app.datadoghq.com/rum/replay/sessions/session-id-1?error-type=incorrect-session-plan&seed=view-id-1&from=123456' ) }) @@ -117,8 +104,7 @@ describe('getReplayLink', () => { true ) - const errorType = isIE() ? 'browser-not-supported' : 'rum-not-tracked' - expect(link).toBe(`https://app.datadoghq.com/rum/replay/sessions/no-session-id?error-type=${errorType}`) + expect(link).toBe('https://app.datadoghq.com/rum/replay/sessions/no-session-id?error-type=rum-not-tracked') }) it('should add a param if the replay was not started', () => { @@ -139,9 +125,43 @@ describe('getReplayLink', () => { false ) - const errorType = isIE() ? 'browser-not-supported' : 'replay-not-started' expect(link).toBe( - `https://app.datadoghq.com/rum/replay/sessions/session-id-1?error-type=${errorType}&seed=view-id-1&from=123456` + 'https://app.datadoghq.com/rum/replay/sessions/session-id-1?error-type=replay-not-started&seed=view-id-1&from=123456' ) }) + + describe('browser not supported', () => { + beforeEach(() => { + // browser support function rely on Array.from being a function. + const original = Array.from + Array.from = undefined as any + + registerCleanupTask(() => { + Array.from = original + }) + }) + + it('should add a param if the browser is not supported', () => { + const sessionManager = createRumSessionManagerMock().setId('session-id-1') + const viewContexts = { + findView: () => ({ + id: 'view-id-1', + startClocks: { + timeStamp: 123456, + }, + }), + } as ViewContexts + + const link = getSessionReplayLink( + { ...DEFAULT_CONFIGURATION, site: 'datadoghq.com' }, + sessionManager, + viewContexts, + false + ) + + expect(link).toBe( + 'https://app.datadoghq.com/rum/replay/sessions/session-id-1?error-type=browser-not-supported&seed=view-id-1&from=123456' + ) + }) + }) }) diff --git a/packages/rum/src/domain/record/record.spec.ts b/packages/rum/src/domain/record/record.spec.ts index b3df25a5e6..035cf8b4be 100644 --- a/packages/rum/src/domain/record/record.spec.ts +++ b/packages/rum/src/domain/record/record.spec.ts @@ -1,4 +1,4 @@ -import { DefaultPrivacyLevel, findLast, isIE } from '@datadog/browser-core' +import { DefaultPrivacyLevel, findLast } from '@datadog/browser-core' import type { RumConfiguration, ViewCreatedEvent } from '@datadog/browser-rum-core' import { LifeCycle, LifeCycleEventType } from '@datadog/browser-rum-core' import type { Clock } from '@datadog/browser-core/test' @@ -39,10 +39,6 @@ describe('record', () => { const FAKE_VIEW_ID = '123' beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - emitSpy = jasmine.createSpy() registerCleanupTask(() => { diff --git a/packages/rum/src/domain/record/serialization/serializationUtils.spec.ts b/packages/rum/src/domain/record/serialization/serializationUtils.spec.ts index 6ee0f8ced8..22bfcdcb23 100644 --- a/packages/rum/src/domain/record/serialization/serializationUtils.spec.ts +++ b/packages/rum/src/domain/record/serialization/serializationUtils.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '@datadog/browser-core' import { NodePrivacyLevel } from '@datadog/browser-rum-core' import { getSerializedNodeId, @@ -37,12 +36,6 @@ describe('serialized Node storage in DOM Nodes', () => { }) describe('getElementInputValue', () => { - beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - }) - it('returns "undefined" for a non-input element', () => { expect(getElementInputValue(document.createElement('div'), NodePrivacyLevel.ALLOW)).toBeUndefined() }) diff --git a/packages/rum/src/domain/record/serialization/serializeAttribute.spec.ts b/packages/rum/src/domain/record/serialization/serializeAttribute.spec.ts index 992a9a35db..9e813f7ba4 100644 --- a/packages/rum/src/domain/record/serialization/serializeAttribute.spec.ts +++ b/packages/rum/src/domain/record/serialization/serializeAttribute.spec.ts @@ -1,5 +1,3 @@ -import { isIE } from '@datadog/browser-core' - import type { RumConfiguration } from '@datadog/browser-rum-core' import { STABLE_ATTRIBUTES, @@ -13,12 +11,6 @@ import { serializeAttribute } from './serializeAttribute' const DEFAULT_CONFIGURATION = {} as RumConfiguration describe('serializeAttribute', () => { - beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - }) - it('truncates "data:" URIs after long string length', () => { const node = document.createElement('p') diff --git a/packages/rum/src/domain/record/serialization/serializeAttributes.spec.ts b/packages/rum/src/domain/record/serialization/serializeAttributes.spec.ts index 1aaab9b4e1..9fea88a3e4 100644 --- a/packages/rum/src/domain/record/serialization/serializeAttributes.spec.ts +++ b/packages/rum/src/domain/record/serialization/serializeAttributes.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '@datadog/browser-core' import { registerCleanupTask } from '@datadog/browser-core/test' import { getCssRulesString } from './serializeAttributes' @@ -8,9 +7,6 @@ describe('getCssRulesString', () => { let styleNode: HTMLStyleElement beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } styleNode = document.createElement('style') document.body.appendChild(styleNode) diff --git a/packages/rum/src/domain/record/serialization/serializeNode.spec.ts b/packages/rum/src/domain/record/serialization/serializeNode.spec.ts index 7166308ba4..fb0a6bf612 100644 --- a/packages/rum/src/domain/record/serialization/serializeNode.spec.ts +++ b/packages/rum/src/domain/record/serialization/serializeNode.spec.ts @@ -1,4 +1,4 @@ -import { isIE, noop } from '@datadog/browser-core' +import { noop } from '@datadog/browser-core' import type { RumConfiguration } from '@datadog/browser-rum-core' import { isAdoptedStyleSheetsSupported, registerCleanupTask } from '@datadog/browser-core/test' import { @@ -57,12 +57,6 @@ describe('serializeNodeWithId', () => { addShadowRootSpy = jasmine.createSpy() }) - beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - }) - describe('document serialization', () => { it('serializes a document', () => { const document = new DOMParser().parseFromString('foo', 'text/html') @@ -805,10 +799,6 @@ describe('serializeDocumentNode handles', function testAllowDomTree() { const toJSONObj = (data: any) => JSON.parse(JSON.stringify(data)) as unknown beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - registerCleanupTask(() => { if (isAdoptedStyleSheetsSupported()) { document.adoptedStyleSheets = [] diff --git a/packages/rum/src/domain/record/startFullSnapshots.spec.ts b/packages/rum/src/domain/record/startFullSnapshots.spec.ts index fbd83ab367..c8eea8c778 100644 --- a/packages/rum/src/domain/record/startFullSnapshots.spec.ts +++ b/packages/rum/src/domain/record/startFullSnapshots.spec.ts @@ -1,7 +1,7 @@ import type { RumConfiguration, ViewCreatedEvent } from '@datadog/browser-rum-core' import { LifeCycle, LifeCycleEventType } from '@datadog/browser-rum-core' import type { TimeStamp } from '@datadog/browser-core' -import { isIE, noop } from '@datadog/browser-core' +import { noop } from '@datadog/browser-core' import { mockExperimentalFeatures, mockRequestIdleCallback } from '@datadog/browser-core/test' import type { BrowserRecord } from '../../types' import { ExperimentalFeature } from '../../../../core/src/tools/experimentalFeatures' @@ -17,10 +17,6 @@ describe('startFullSnapshots', () => { let fullSnapshotReadyCallback: jasmine.Spy<(records: BrowserRecord[]) => void> beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - lifeCycle = new LifeCycle() mockExperimentalFeatures([ExperimentalFeature.ASYNC_FULL_SNAPSHOT]) fullSnapshotPendingCallback = jasmine.createSpy('fullSnapshotPendingCallback') diff --git a/packages/rum/src/domain/record/trackers/trackFocus.spec.ts b/packages/rum/src/domain/record/trackers/trackFocus.spec.ts index ded044c7f5..a4575b33ec 100644 --- a/packages/rum/src/domain/record/trackers/trackFocus.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackFocus.spec.ts @@ -1,4 +1,4 @@ -import { DefaultPrivacyLevel, isIE } from '@datadog/browser-core' +import { DefaultPrivacyLevel } from '@datadog/browser-core' import { createNewEvent, registerCleanupTask } from '@datadog/browser-core/test' import type { RumConfiguration } from '@datadog/browser-rum-core' import { RecordType } from '../../../types' @@ -11,9 +11,6 @@ describe('trackFocus', () => { let configuration: RumConfiguration beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } configuration = { defaultPrivacyLevel: DefaultPrivacyLevel.ALLOW } as RumConfiguration focusCallback = jasmine.createSpy() focusTracker = trackFocus(configuration, focusCallback) diff --git a/packages/rum/src/domain/record/trackers/trackFrustration.spec.ts b/packages/rum/src/domain/record/trackers/trackFrustration.spec.ts index b59275ac56..00e29c6225 100644 --- a/packages/rum/src/domain/record/trackers/trackFrustration.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackFrustration.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '@datadog/browser-core' import type { RawRumActionEvent } from '@datadog/browser-rum-core' import { ActionType, LifeCycle, LifeCycleEventType } from '@datadog/browser-rum-core' import type { RawRumEventCollectedData } from 'packages/rum-core/src/domain/lifeCycle' @@ -20,9 +19,6 @@ describe('trackFrustration', () => { let recordIds: RecordIds beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } mouseEvent = new MouseEvent('pointerup') frustrationsCallbackSpy = jasmine.createSpy() recordIds = initRecordIds() diff --git a/packages/rum/src/domain/record/trackers/trackInput.spec.ts b/packages/rum/src/domain/record/trackers/trackInput.spec.ts index ce6be674dd..b8d53e8278 100644 --- a/packages/rum/src/domain/record/trackers/trackInput.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackInput.spec.ts @@ -1,4 +1,4 @@ -import { DefaultPrivacyLevel, isIE } from '@datadog/browser-core' +import { DefaultPrivacyLevel } from '@datadog/browser-core' import type { Clock } from '@datadog/browser-core/test' import { createNewEvent, mockClock, registerCleanupTask } from '@datadog/browser-core/test' import type { RumConfiguration } from '@datadog/browser-rum-core' @@ -20,9 +20,6 @@ describe('trackInput', () => { let configuration: RumConfiguration beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } configuration = { defaultPrivacyLevel: DefaultPrivacyLevel.ALLOW } as RumConfiguration inputCallbackSpy = jasmine.createSpy() input = appendElement('
') as HTMLInputElement diff --git a/packages/rum/src/domain/record/trackers/trackMediaInteraction.spec.ts b/packages/rum/src/domain/record/trackers/trackMediaInteraction.spec.ts index d436beb50f..d7f621af96 100644 --- a/packages/rum/src/domain/record/trackers/trackMediaInteraction.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackMediaInteraction.spec.ts @@ -1,4 +1,4 @@ -import { DefaultPrivacyLevel, isIE } from '@datadog/browser-core' +import { DefaultPrivacyLevel } from '@datadog/browser-core' import { createNewEvent, registerCleanupTask } from '@datadog/browser-core/test' import type { RumConfiguration } from '@datadog/browser-rum-core' import { appendElement } from '../../../../../rum-core/test' @@ -17,9 +17,6 @@ describe('trackMediaInteraction', () => { let configuration: RumConfiguration beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } configuration = { defaultPrivacyLevel: DefaultPrivacyLevel.ALLOW } as RumConfiguration mediaInteractionCallback = jasmine.createSpy() diff --git a/packages/rum/src/domain/record/trackers/trackMouseInteraction.spec.ts b/packages/rum/src/domain/record/trackers/trackMouseInteraction.spec.ts index 789c28b707..7f4875030c 100644 --- a/packages/rum/src/domain/record/trackers/trackMouseInteraction.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackMouseInteraction.spec.ts @@ -1,4 +1,4 @@ -import { DOM_EVENT, DefaultPrivacyLevel, isIE } from '@datadog/browser-core' +import { DOM_EVENT, DefaultPrivacyLevel } from '@datadog/browser-core' import { createNewEvent, registerCleanupTask } from '@datadog/browser-core/test' import type { RumConfiguration } from '@datadog/browser-rum-core' import { appendElement } from '../../../../../rum-core/test' @@ -20,10 +20,6 @@ describe('trackMouseInteraction', () => { let configuration: RumConfiguration beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - configuration = { defaultPrivacyLevel: DefaultPrivacyLevel.ALLOW } as RumConfiguration a = appendElement('') as HTMLAnchorElement // tabindex 0 makes the element focusable a.dispatchEvent(createNewEvent(DOM_EVENT.FOCUS)) diff --git a/packages/rum/src/domain/record/trackers/trackMove.spec.ts b/packages/rum/src/domain/record/trackers/trackMove.spec.ts index c4d86a4316..1d989c9c12 100644 --- a/packages/rum/src/domain/record/trackers/trackMove.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackMove.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '@datadog/browser-core' import { createNewEvent, registerCleanupTask } from '@datadog/browser-core/test' import type { RumConfiguration } from '@datadog/browser-rum-core' import { SerializationContextStatus, serializeDocument } from '../serialization' @@ -15,10 +14,6 @@ describe('trackMove', () => { let configuration: RumConfiguration beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - configuration = {} as RumConfiguration serializeDocument(document, DEFAULT_CONFIGURATION, { shadowRootsController: DEFAULT_SHADOW_ROOT_CONTROLLER, diff --git a/packages/rum/src/domain/record/trackers/trackMutation.spec.ts b/packages/rum/src/domain/record/trackers/trackMutation.spec.ts index a18b00c98a..732edb7c2a 100644 --- a/packages/rum/src/domain/record/trackers/trackMutation.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackMutation.spec.ts @@ -1,4 +1,4 @@ -import { DefaultPrivacyLevel, isIE } from '@datadog/browser-core' +import { DefaultPrivacyLevel } from '@datadog/browser-core' import type { RumConfiguration } from '@datadog/browser-rum-core' import { collectAsyncCalls, registerCleanupTask } from '@datadog/browser-core/test' import { @@ -64,10 +64,6 @@ describe('trackMutation', () => { } beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - sandbox = appendElement('
') registerCleanupTask(() => { diff --git a/packages/rum/src/domain/record/trackers/trackScroll.spec.ts b/packages/rum/src/domain/record/trackers/trackScroll.spec.ts index a97cca4477..f53d4c47a4 100644 --- a/packages/rum/src/domain/record/trackers/trackScroll.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackScroll.spec.ts @@ -1,4 +1,4 @@ -import { DefaultPrivacyLevel, isIE } from '@datadog/browser-core' +import { DefaultPrivacyLevel } from '@datadog/browser-core' import { createNewEvent, registerCleanupTask } from '@datadog/browser-core/test' import type { RumConfiguration } from '@datadog/browser-rum-core' import { appendElement } from '../../../../../rum-core/test' @@ -19,9 +19,6 @@ describe('trackScroll', () => { let elementsScrollPositions: ElementsScrollPositions beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } configuration = { defaultPrivacyLevel: DefaultPrivacyLevel.ALLOW } as RumConfiguration elementsScrollPositions = createElementsScrollPositions() scrollCallback = jasmine.createSpy() diff --git a/packages/rum/src/domain/record/trackers/trackStyleSheet.spec.ts b/packages/rum/src/domain/record/trackers/trackStyleSheet.spec.ts index 339b57f032..b68e8f6c96 100644 --- a/packages/rum/src/domain/record/trackers/trackStyleSheet.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackStyleSheet.spec.ts @@ -1,4 +1,3 @@ -import { isIE } from '@datadog/browser-core' import { isFirefox, registerCleanupTask } from '@datadog/browser-core/test' import { serializeDocument, SerializationContextStatus } from '../serialization' import { createElementsScrollPositions } from '../elementsScrollPositions' @@ -16,9 +15,6 @@ describe('trackStyleSheet', () => { const styleRule = '.selector-1 { color: #fff }' beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } styleSheetCallbackSpy = jasmine.createSpy() styleElement = document.createElement('style') document.head.appendChild(styleElement) @@ -188,9 +184,6 @@ describe('StyleSheetObserver > getPathToNestedCSSRule', () => { let styleSheet: CSSStyleSheet let styleElement: HTMLStyleElement beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } styleElement = document.createElement('style') document.head.appendChild(styleElement) styleSheet = styleElement.sheet! diff --git a/packages/rum/src/domain/record/trackers/trackViewportResize.spec.ts b/packages/rum/src/domain/record/trackers/trackViewportResize.spec.ts index f4c8a5132a..caa121dafd 100644 --- a/packages/rum/src/domain/record/trackers/trackViewportResize.spec.ts +++ b/packages/rum/src/domain/record/trackers/trackViewportResize.spec.ts @@ -1,4 +1,4 @@ -import { DefaultPrivacyLevel, isIE } from '@datadog/browser-core' +import { DefaultPrivacyLevel } from '@datadog/browser-core' import { createNewEvent, registerCleanupTask } from '@datadog/browser-core/test' import type { RumConfiguration } from '@datadog/browser-rum-core' import { serializeDocument, SerializationContextStatus } from '../serialization' @@ -17,9 +17,6 @@ describe('trackViewportResize', () => { let elementsScrollPositions: ElementsScrollPositions beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } configuration = { defaultPrivacyLevel: DefaultPrivacyLevel.ALLOW } as RumConfiguration elementsScrollPositions = createElementsScrollPositions() visualViewportResizeCallback = jasmine.createSpy() diff --git a/packages/rum/src/domain/segmentCollection/buildReplayPayload.spec.ts b/packages/rum/src/domain/segmentCollection/buildReplayPayload.spec.ts index f5c630a700..4a52d2dea9 100644 --- a/packages/rum/src/domain/segmentCollection/buildReplayPayload.spec.ts +++ b/packages/rum/src/domain/segmentCollection/buildReplayPayload.spec.ts @@ -1,5 +1,4 @@ import pako from 'pako' -import { isIE } from '@datadog/browser-core' import type { BrowserSegment, BrowserSegmentMetadata } from '../../types' import { readReplayPayload } from '../../../test' import { buildReplayPayload } from './buildReplayPayload' @@ -24,12 +23,6 @@ describe('buildReplayPayload', () => { compressed_segment_size: COMPRESSED_SEGMENT.byteLength, } - beforeEach(() => { - if (isIE()) { - pending('no TextEncoder support') - } - }) - it('adds the segment as a file', async () => { const payload = buildReplayPayload(COMPRESSED_SEGMENT, METADATA, SERIALIZED_SEGMENT.length) const segmentEntry = (payload.data as FormData).get('segment')! as File diff --git a/packages/rum/src/domain/segmentCollection/segment.spec.ts b/packages/rum/src/domain/segmentCollection/segment.spec.ts index 067a1c2002..54104cd132 100644 --- a/packages/rum/src/domain/segmentCollection/segment.spec.ts +++ b/packages/rum/src/domain/segmentCollection/segment.spec.ts @@ -1,5 +1,5 @@ import type { DeflateEncoder, TimeStamp } from '@datadog/browser-core' -import { noop, setDebugMode, isIE, DeflateEncoderStreamId } from '@datadog/browser-core' +import { noop, setDebugMode, DeflateEncoderStreamId } from '@datadog/browser-core' import type { RumConfiguration } from '@datadog/browser-rum-core' import { registerCleanupTask } from '@datadog/browser-core/test' import { MockWorker } from '../../../test' @@ -29,10 +29,6 @@ describe('Segment', () => { let encoder: DeflateEncoder beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } - worker = new MockWorker() encoder = createDeflateEncoder(configuration, worker, DeflateEncoderStreamId.REPLAY) setDebugMode(true) diff --git a/packages/rum/src/domain/segmentCollection/segmentCollection.spec.ts b/packages/rum/src/domain/segmentCollection/segmentCollection.spec.ts index 239ebc18bf..d5c30c63cf 100644 --- a/packages/rum/src/domain/segmentCollection/segmentCollection.spec.ts +++ b/packages/rum/src/domain/segmentCollection/segmentCollection.spec.ts @@ -1,5 +1,5 @@ import type { ClocksState, HttpRequest, TimeStamp } from '@datadog/browser-core' -import { DeflateEncoderStreamId, PageExitReason, isIE } from '@datadog/browser-core' +import { DeflateEncoderStreamId, PageExitReason } from '@datadog/browser-core' import type { ViewContexts, ViewContext, RumConfiguration } from '@datadog/browser-rum-core' import { LifeCycle, LifeCycleEventType } from '@datadog/browser-rum-core' import type { Clock } from '@datadog/browser-core/test' @@ -58,9 +58,6 @@ describe('startSegmentCollection', () => { } beforeEach(() => { - if (isIE()) { - pending('IE not supported') - } configuration = {} as RumConfiguration lifeCycle = new LifeCycle() worker = new MockWorker() diff --git a/test/browsers.conf.js b/test/browsers.conf.js index 03bd46219b..e9d6f1f6b9 100644 --- a/test/browsers.conf.js +++ b/test/browsers.conf.js @@ -36,13 +36,6 @@ const browserConfigurations = [ osVersion: '14', device: 'iPhone 11', }, - { - sessionName: 'IE', - name: 'IE', - version: '11.0', - os: 'Windows', - osVersion: '10', - }, ] module.exports = { diff --git a/test/e2e/lib/helpers/browser.ts b/test/e2e/lib/helpers/browser.ts index f81ad40186..260d098f19 100644 --- a/test/e2e/lib/helpers/browser.ts +++ b/test/e2e/lib/helpers/browser.ts @@ -2,7 +2,7 @@ import * as os from 'os' // To keep tests sane, ensure we got a fixed list of possible platforms and browser names. const validPlatformNames = ['windows', 'macos', 'linux', 'ios', 'android'] as const -const validBrowserNames = ['edge', 'safari', 'chrome', 'firefox', 'ie'] as const +const validBrowserNames = ['edge', 'safari', 'chrome', 'firefox'] as const export function getBrowserName(): (typeof validBrowserNames)[number] { const capabilities = browser.capabilities diff --git a/test/e2e/wdio.bs.conf.ts b/test/e2e/wdio.bs.conf.ts index 53ff9ca9d7..7ab959baeb 100644 --- a/test/e2e/wdio.bs.conf.ts +++ b/test/e2e/wdio.bs.conf.ts @@ -11,7 +11,6 @@ export const config: Options.Testrunner = { capabilities: browserConfigurations .filter( (configuration) => - configuration.sessionName !== 'IE' && // Safari mobile on iOS <= 14.0 does not support // the way we flush events on page change // TODO check newer version on browserstack diff --git a/test/unit/karma.bs.conf.js b/test/unit/karma.bs.conf.js index f26a918f9b..24c1bfb937 100644 --- a/test/unit/karma.bs.conf.js +++ b/test/unit/karma.bs.conf.js @@ -6,12 +6,6 @@ module.exports = function (config) { config.set({ ...karmaBaseConf, exclude: [ - // Exclude rum-react from BrowserStack because it is using dependencies that are not compatible - // with IE11 (react and react-router). Just skipping tests with Jasmine `pending` is not - // enough because those dependencies are failing at module evaluation on IE11. This exclusion - // can be removed when dropping IE11 support. - 'packages/rum-react/**', - // Exclude developer-extension from BrowserStack because it is is only compatible with Chrome // so there is no point to test it on other browsers. 'developer-extension/**',