@@ -125,6 +125,36 @@ function createMainResource(resource = {}): PerformanceResourceTiming {
125
125
return mainResource ;
126
126
}
127
127
128
+ function createFakePerformanceObs ( url : string ) {
129
+ class FakePerfObs implements PerformanceObserver {
130
+ constructor ( private readonly cb : PerformanceObserverCallback ) { }
131
+ observe ( ) {
132
+ const absoluteUrl = url . startsWith ( 'http' ) ? url : location . origin + url ;
133
+ const resources : PerformanceObserverEntryList = {
134
+ getEntries ( ) : PerformanceEntryList {
135
+ return [
136
+ createResource ( { name : absoluteUrl } ) as any ,
137
+ createMainResource ( { name : absoluteUrl } ) as any ,
138
+ ] ;
139
+ } ,
140
+ getEntriesByName ( ) : PerformanceEntryList {
141
+ return [ ] ;
142
+ } ,
143
+ getEntriesByType ( ) : PerformanceEntryList {
144
+ return [ ] ;
145
+ } ,
146
+ } ;
147
+ this . cb ( resources , this ) ;
148
+ }
149
+ disconnect ( ) { }
150
+ takeRecords ( ) : PerformanceEntryList {
151
+ return [ ] ;
152
+ }
153
+ }
154
+
155
+ return FakePerfObs ;
156
+ }
157
+
128
158
describe ( 'xhr' , ( ) => {
129
159
const asyncTests = [ { async : true } , { async : false } ] ;
130
160
asyncTests . forEach ( test => {
@@ -200,6 +230,11 @@ describe('xhr', () => {
200
230
'getEntriesByType'
201
231
) ;
202
232
spyEntries . withArgs ( 'resource' ) . returns ( resources ) ;
233
+
234
+ sinon
235
+ . stub ( window , 'PerformanceObserver' )
236
+ . value ( createFakePerformanceObs ( fileUrl ) ) ;
237
+
203
238
xmlHttpRequestInstrumentation = new XMLHttpRequestInstrumentation (
204
239
config
205
240
) ;
@@ -221,7 +256,7 @@ describe('xhr', () => {
221
256
222
257
rootSpan = webTracerWithZone . startSpan ( 'root' ) ;
223
258
api . context . with ( api . trace . setSpan ( api . context . active ( ) , rootSpan ) , ( ) => {
224
- getData (
259
+ void getData (
225
260
new XMLHttpRequest ( ) ,
226
261
fileUrl ,
227
262
( ) => {
@@ -635,20 +670,11 @@ describe('xhr', () => {
635
670
636
671
beforeEach ( done => {
637
672
requests = [ ] ;
638
- const resources : PerformanceResourceTiming [ ] = [ ] ;
639
- resources . push (
640
- createResource ( {
641
- name : firstUrl ,
642
- } ) ,
643
- createResource ( {
644
- name : secondUrl ,
645
- } )
646
- ) ;
647
673
const reusableReq = new XMLHttpRequest ( ) ;
648
674
api . context . with (
649
675
api . trace . setSpan ( api . context . active ( ) , rootSpan ) ,
650
676
( ) => {
651
- getData (
677
+ void getData (
652
678
reusableReq ,
653
679
firstUrl ,
654
680
( ) => {
@@ -665,7 +691,7 @@ describe('xhr', () => {
665
691
api . context . with (
666
692
api . trace . setSpan ( api . context . active ( ) , rootSpan ) ,
667
693
( ) => {
668
- getData (
694
+ void getData (
669
695
reusableReq ,
670
696
secondUrl ,
671
697
( ) => {
@@ -728,6 +754,35 @@ describe('xhr', () => {
728
754
assert . ok ( attributes [ 'xhr-custom-attribute' ] === 'bar' ) ;
729
755
} ) ;
730
756
} ) ;
757
+
758
+ describe ( 'when using relative url' , ( ) => {
759
+ beforeEach ( done => {
760
+ clearData ( ) ;
761
+ const propagateTraceHeaderCorsUrls = [ window . location . origin ] ;
762
+ prepareData ( done , '/get' , { propagateTraceHeaderCorsUrls } ) ;
763
+ } ) ;
764
+
765
+ it ( 'should create correct span with events' , ( ) => {
766
+ // no prefetch span because mock observer uses location.origin as url when relative
767
+ // and prefetch span finding compares url origins
768
+ const span : tracing . ReadableSpan = exportSpy . args [ 0 ] [ 0 ] [ 0 ] ;
769
+ const events = span . events ;
770
+
771
+ assert . strictEqual (
772
+ exportSpy . args . length ,
773
+ 1 ,
774
+ `Wrong number of spans: ${ exportSpy . args . length } `
775
+ ) ;
776
+
777
+ assert . strictEqual ( events . length , 12 , `number of events is wrong: ${ events . length } ` ) ;
778
+ assert . strictEqual (
779
+ events [ 8 ] . name ,
780
+ PTN . REQUEST_START ,
781
+ `event ${ PTN . REQUEST_START } is not defined`
782
+ ) ;
783
+ } ) ;
784
+ } ) ;
785
+
731
786
} ) ;
732
787
733
788
describe ( 'when request is NOT successful' , ( ) => {
0 commit comments