@@ -15,29 +15,6 @@ webrtcperf.startFakeScreenshare = (
15
15
if ( document . querySelector ( '#webrtcperf-fake-screenshare' ) ) {
16
16
return
17
17
}
18
-
19
- const animateElement = async ( el , direction ) => {
20
- const slideIn = [
21
- { transform : 'translateX(100%)' , opacity : 0 } ,
22
- { transform : 'translateX(0%)' , opacity : 1 } ,
23
- ]
24
- const slideOut = [
25
- { transform : 'translateX(0%)' , opacity : 1 } ,
26
- { transform : 'translateX(-100%)' , opacity : 0 } ,
27
- ]
28
- return new Promise ( resolve => {
29
- el . animate ( direction === 'in' ? slideIn : slideOut , {
30
- duration : animationDuration ,
31
- iterations : 1 ,
32
- fill : 'forwards' ,
33
- } ) . addEventListener ( 'finish' , ( ) => resolve ( ) )
34
- } )
35
- }
36
- const applyAnimation = async ( el1 , el2 , delay ) => {
37
- await Promise . all ( [ animateElement ( el1 , 'out' ) , animateElement ( el2 , 'in' ) ] )
38
- await webrtcperf . sleep ( delay )
39
- }
40
-
41
18
webrtcperf . log (
42
19
`FakeScreenshare start: embed=${ embed } slides=${ slides } animationDuration=${ animationDuration } delay=${ delay } width=${ width } height=${ height } ` ,
43
20
)
@@ -53,6 +30,7 @@ webrtcperf.startFakeScreenshare = (
53
30
webrtcperf . GET_DISPLAY_MEDIA_CROP = '#webrtcperf-fake-screenshare'
54
31
}
55
32
33
+ // Pointer animation.
56
34
if ( pointerAnimation ) {
57
35
const el = document . createElement ( 'div' )
58
36
el . setAttribute (
@@ -74,6 +52,34 @@ webrtcperf.startFakeScreenshare = (
74
52
)
75
53
}
76
54
55
+ // Draw overlay with timestamp.
56
+ let drawTimestamp = null
57
+ if ( webrtcperf . enabledForSession ( webrtcperf . params . timestampWatermarkVideo ) ) {
58
+ const canvas = document . createElement ( 'canvas' )
59
+ const fontSize = Math . round ( height / 18 )
60
+ const textHeight = Math . round ( height / 15 )
61
+ canvas . width = width
62
+ canvas . height = textHeight
63
+ canvas . setAttribute (
64
+ 'style' ,
65
+ `all: unset; position: absolute; top: 0; left: 0; z-index: 1; width: 100%; height: ${ textHeight } px;` ,
66
+ )
67
+ wrapper . appendChild ( canvas )
68
+ const ctx = canvas . getContext ( '2d' )
69
+ ctx . font = `${ fontSize } px Noto Mono`
70
+ ctx . textAlign = 'center'
71
+ const participantNameIndex = parseInt ( webrtcperf . getParticipantName ( ) . split ( '-' ) [ 1 ] ) || 0
72
+ drawTimestamp = ( ) => {
73
+ ctx . fillStyle = 'black'
74
+ ctx . fillRect ( 0 , 0 , width , textHeight )
75
+ ctx . fillStyle = 'white'
76
+ const text = `${ participantNameIndex } -${ Date . now ( ) } `
77
+ ctx . fillText ( text , width / 2 , fontSize )
78
+ }
79
+ }
80
+
81
+ // Slides animation.
82
+ let advanceSlide = null
77
83
if ( embed ) {
78
84
const el = document . createElement ( 'iframe' )
79
85
el . setAttribute ( 'src' , embed )
@@ -82,7 +88,33 @@ webrtcperf.startFakeScreenshare = (
82
88
el . setAttribute ( 'style' , 'padding: 0; margin: 0; border: none;' )
83
89
el . setAttribute ( 'frameborder' , '0' )
84
90
wrapper . appendChild ( el )
91
+
92
+ advanceSlide = async ( ) => {
93
+ try {
94
+ await window . keypressText ( 'iframe' , ' ' ) //0x24
95
+ } catch ( e ) {
96
+ console . error ( e )
97
+ }
98
+ }
85
99
} else {
100
+ const animateElement = async ( el , direction ) => {
101
+ const slideIn = [
102
+ { transform : 'translateX(100%)' , opacity : 0 } ,
103
+ { transform : 'translateX(0%)' , opacity : 1 } ,
104
+ ]
105
+ const slideOut = [
106
+ { transform : 'translateX(0%)' , opacity : 1 } ,
107
+ { transform : 'translateX(-100%)' , opacity : 0 } ,
108
+ ]
109
+ return new Promise ( resolve => {
110
+ el . animate ( direction === 'in' ? slideIn : slideOut , {
111
+ duration : animationDuration ,
112
+ iterations : 1 ,
113
+ fill : 'forwards' ,
114
+ } ) . addEventListener ( 'finish' , ( ) => resolve ( ) )
115
+ } )
116
+ }
117
+
86
118
const slidesElements = [ ]
87
119
for ( let i = 0 ; i < slides ; i ++ ) {
88
120
const img = document . createElement ( 'img' )
@@ -99,15 +131,20 @@ webrtcperf.startFakeScreenshare = (
99
131
slidesElements . push ( img )
100
132
}
101
133
let cur = 0
102
- const loopIteration = async ( ) => {
103
- if ( ! document . querySelector ( '#webrtcperf-fake-screenshare' ) ) return
134
+ advanceSlide = async ( ) => {
104
135
const next = cur === slidesElements . length - 1 ? 0 : cur + 1
105
- await applyAnimation ( slidesElements [ cur ] , slidesElements [ next ] , delay )
136
+ await Promise . all ( [ animateElement ( slidesElements [ cur ] , 'out' ) , animateElement ( slidesElements [ next ] , 'in' ) ] )
106
137
cur = next
107
- setTimeout ( ( ) => loopIteration ( ) )
108
138
}
109
- loopIteration ( )
110
139
}
140
+
141
+ const loopIteration = async ( ) => {
142
+ if ( ! document . querySelector ( '#webrtcperf-fake-screenshare' ) ) return
143
+ if ( drawTimestamp ) drawTimestamp ( )
144
+ if ( advanceSlide ) await advanceSlide ( )
145
+ setTimeout ( ( ) => loopIteration ( ) , delay )
146
+ }
147
+ loopIteration ( )
111
148
}
112
149
113
150
webrtcperf . stopFakeScreenshare = ( ) => {
0 commit comments