MediaStreamTrack-clone.https.html (15530B)
1 <!DOCTYPE html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="/resources/testdriver.js"></script> 5 <script src="/resources/testdriver-vendor.js"></script> 6 <script src="/mediacapture-image/resources/imagecapture-helpers.js"></script> 7 <script> 8 9 // This test verifies that we can set some nondefault constraints, then clone a 10 // MediaStreamTrack and check that the cloned constraints are the same as the 11 // original, with a mock Mojo service implementation. 12 image_capture_test(async (t, imageCaptureTest) => { 13 await test_driver.set_permission({name: 'camera', panTiltZoom: true}, 14 'granted'); 15 16 const constraints = { advanced : [{ whiteBalanceMode : 'single-shot', 17 exposureMode : 'manual', 18 focusMode : 'single-shot', 19 20 pointsOfInterest : [{x : 0.1, y : 0.2}, 21 {x : 0.3, y : 0.4}], 22 23 exposureCompensation : 133.77, 24 exposureTime : 10000, 25 colorTemperature : 6000, 26 iso : 120.0, 27 28 brightness : 3, 29 contrast : 4, 30 saturation : 5, 31 sharpness : 6, 32 focusDistance : 7, 33 34 pan : 8, 35 tilt : 9, 36 zoom : 3.141592, 37 38 torch : true 39 }]}; 40 for (const [key, value] of Object.entries(constraints.advanced[0])) { 41 constraints[key] = {exact: value}; 42 } 43 44 let stream = await navigator.mediaDevices.getUserMedia({video: true}); 45 let originalVideoTrack = stream.getVideoTracks()[0]; 46 47 await originalVideoTrack.applyConstraints(constraints); 48 49 let appliedConstraints = originalVideoTrack.getConstraints(); 50 51 let clonedVideoTrack = originalVideoTrack.clone(); 52 let appliedClonedConstraints = clonedVideoTrack.getConstraints(); 53 assert_true('advanced' in appliedClonedConstraints); 54 assert_equals(appliedClonedConstraints.advanced.length, 1); 55 const appliedClonedAdvancedConstraints = appliedClonedConstraints.advanced[0]; 56 57 // Check that |appliedClonedConstraints| and |appliedConstraints| are equal. 58 const appliedAdvancedConstraints = appliedConstraints.advanced[0]; 59 assert_equals(appliedAdvancedConstraints.length, appliedClonedAdvancedConstraints.length); 60 Object.keys(appliedClonedAdvancedConstraints).forEach(key => { 61 assert_not_equals(appliedClonedConstraints[key], undefined, 'key ' + key); 62 assert_not_equals(appliedConstraints[key], undefined, 'key ' + key); 63 assert_not_equals(appliedConstraints[key].exact, undefined, 'key ' + key); 64 assert_not_equals(appliedAdvancedConstraints[key], undefined, 'key ' + key); 65 if (key != 'pointsOfInterest') { 66 assert_equals(appliedConstraints[key].exact, appliedClonedConstraints[key].exact, key); 67 assert_equals(appliedAdvancedConstraints[key], appliedClonedAdvancedConstraints[key], key); 68 } else { 69 assert_point2d_array_approx_equals(appliedConstraints[key].exact, 70 appliedClonedConstraints[key].exact, 0.01); 71 assert_point2d_array_approx_equals(appliedAdvancedConstraints[key], 72 appliedClonedAdvancedConstraints[key], 0.01); 73 } 74 }); 75 76 assert_equals(appliedAdvancedConstraints.whiteBalanceMode, 77 appliedClonedAdvancedConstraints.whiteBalanceMode, 78 'whiteBalanceMode'); 79 assert_equals(appliedAdvancedConstraints.exposureMode, 80 appliedClonedAdvancedConstraints.exposureMode, 81 'exposureMode'); 82 assert_equals(appliedAdvancedConstraints.focusMode, 83 appliedClonedAdvancedConstraints.focusMode, 84 'focusMode'); 85 86 assert_point2d_array_approx_equals( 87 appliedAdvancedConstraints.pointsOfInterest, 88 appliedClonedAdvancedConstraints.pointsOfInterest, 89 0.01); 90 91 assert_equals(appliedAdvancedConstraints.exposureCompensation, 92 appliedClonedAdvancedConstraints.exposureCompensation, 93 'exposureCompensation'); 94 assert_equals(appliedAdvancedConstraints.exposureTime, 95 appliedClonedAdvancedConstraints.exposureTime, 96 'exposureTime'); 97 assert_equals(appliedAdvancedConstraints.colorTemperature, 98 appliedClonedAdvancedConstraints.colorTemperature, 99 'colorTemperature'); 100 assert_equals(appliedAdvancedConstraints.iso, 101 appliedClonedAdvancedConstraints.iso, 102 'iso'); 103 assert_equals(appliedAdvancedConstraints.brightness, 104 appliedClonedAdvancedConstraints.brightness, 105 'brightness'); 106 assert_equals(appliedAdvancedConstraints.contrast, 107 appliedClonedAdvancedConstraints.contrast, 108 'constrast'); 109 assert_equals(appliedAdvancedConstraints.saturation, 110 appliedClonedAdvancedConstraints.saturation, 111 'saturation'); 112 assert_equals(appliedAdvancedConstraints.sharpness, 113 appliedClonedAdvancedConstraints.sharpness, 114 'sharpness'); 115 assert_equals(appliedAdvancedConstraints.focusDistance, 116 appliedClonedAdvancedConstraints.focusDistance, 117 'focusDistance'); 118 119 assert_equals(appliedAdvancedConstraints.pan, 120 appliedClonedAdvancedConstraints.pan, 121 'pan'); 122 assert_equals(appliedAdvancedConstraints.tilt, 123 appliedClonedAdvancedConstraints.tilt, 124 'tilt'); 125 assert_equals(appliedAdvancedConstraints.zoom, 126 appliedClonedAdvancedConstraints.zoom, 127 'zoom'); 128 129 assert_equals(appliedAdvancedConstraints.torch, 130 appliedClonedAdvancedConstraints.torch, 131 'torch'); 132 }, 'checks MediaStreamTrack.clone() gets same applied constraints'); 133 134 // This test verifies that MediaStreamTrack ImageCapture settings are copied 135 // when cloning a MediaStreamTrack. 136 image_capture_test(async (t, imageCaptureTest) => { 137 await test_driver.set_permission({name: 'camera', panTiltZoom: true}, 138 'granted'); 139 140 let stream = await navigator.mediaDevices.getUserMedia({video: true}); 141 let originalVideoTrack = stream.getVideoTracks()[0]; 142 let clonedVideoTrack = originalVideoTrack.clone(); 143 144 let settings = originalVideoTrack.getSettings(); 145 let clonedSettings = clonedVideoTrack.getSettings(); 146 147 assert_equals(settings.whiteBalanceMode, 148 clonedSettings.whiteBalanceMode, 149 'whiteBalanceMode'); 150 assert_equals(settings.exposureMode, 151 clonedSettings.exposureMode, 152 'exposureMode;'); 153 assert_equals(settings.focusMode, 154 clonedSettings.focusMode, 155 'focusMode'); 156 157 assert_point2d_array_approx_equals( 158 settings.pointsOfInterest, 159 clonedSettings.pointsOfInterest, 160 0.01); 161 162 assert_equals(settings.exposureCompensation, 163 clonedSettings.exposureCompensation, 164 'exposureCompensation'); 165 assert_equals(settings.exposureTime, 166 clonedSettings.exposureTime, 167 'exposureTime'); 168 assert_equals(settings.colorTemperature, 169 clonedSettings.colorTemperature, 170 'colorTemperature'); 171 assert_equals(settings.iso, 172 clonedSettings.iso, 173 'iso'); 174 175 assert_equals(settings.brightness, 176 clonedSettings.brightness, 177 'brightness'); 178 assert_equals(settings.contrast, 179 clonedSettings.contrast, 180 'contrast'); 181 assert_equals(settings.saturation, 182 clonedSettings.saturation, 183 'saturation'); 184 assert_equals(settings.sharpness, 185 clonedSettings.sharpness, 186 'sharpness'); 187 188 assert_equals(settings.focusDistance, 189 clonedSettings.focusDistance, 190 'focusDistance'); 191 192 assert_equals(settings.pan, 193 clonedSettings.pan, 194 'pan'); 195 assert_equals(settings.tilt, 196 clonedSettings.tilt, 197 'tilt'); 198 assert_equals(settings.zoom, 199 clonedSettings.zoom, 200 'zoom'); 201 202 assert_equals(settings.torch, 203 clonedSettings.torch, 204 'torch'); 205 }, 'checks MediaStreamTrack.clone() gets same settings'); 206 207 // This test verifies that MediaStreamTrack ImageCapture capabilities are copied 208 // when cloning a MediaStreamTrack. 209 image_capture_test(async (t, imageCaptureTest) => { 210 await test_driver.set_permission({name: 'camera', panTiltZoom: true}, 211 'granted'); 212 213 let stream = await navigator.mediaDevices.getUserMedia({video: true}); 214 let originalVideoTrack = stream.getVideoTracks()[0]; 215 let clonedVideoTrack = originalVideoTrack.clone(); 216 217 let capabilities = originalVideoTrack.getCapabilities(); 218 let clonedCapabilities = clonedVideoTrack.getCapabilities(); 219 220 assert_equals(capabilities.whiteBalanceMode.length, 221 clonedCapabilities.whiteBalanceMode.length, 222 'whiteBalanceMode length'); 223 for (i = 0; i < capabilities.whiteBalanceMode.length; ++i) { 224 assert_equals(capabilities.whiteBalanceMode[i], 225 clonedCapabilities.whiteBalanceMode[i], 226 'whiteBalanceMode'); 227 } 228 229 assert_equals(capabilities.exposureMode.length, 230 clonedCapabilities.exposureMode.length, 231 'exposureMode length'); 232 for (i = 0; i < capabilities.exposureMode.length; ++i) { 233 assert_equals(capabilities.exposureMode[i], 234 clonedCapabilities.exposureMode[i], 235 'exposureMode'); 236 } 237 238 assert_equals(capabilities.focusMode.length, 239 clonedCapabilities.focusMode.length, 240 'focusMode length'); 241 for (i = 0; i < capabilities.focusMode.length; ++i) { 242 assert_equals(capabilities.focusMode[i], 243 clonedCapabilities.focusMode[i], 244 'focusMode'); 245 } 246 247 assert_equals(capabilities.exposureCompensation.max, 248 clonedCapabilities.exposureCompensation.max, 249 'exposureCompensation max'); 250 assert_equals(capabilities.exposureCompensation.min, 251 clonedCapabilities.exposureCompensation.min, 252 'exposureCompensation min'); 253 assert_equals(capabilities.exposureCompensation.step, 254 clonedCapabilities.exposureCompensation.step, 255 'exposureCompensation step'); 256 257 assert_equals(capabilities.exposureTime.max, 258 clonedCapabilities.exposureTime.max, 259 'exposureTime max'); 260 assert_equals(capabilities.exposureTime.min, 261 clonedCapabilities.exposureTime.min, 262 'exposureTime min'); 263 assert_equals(capabilities.exposureTime.step, 264 clonedCapabilities.exposureTime.step, 265 'exposureTime step'); 266 267 assert_equals(capabilities.colorTemperature.max, 268 clonedCapabilities.colorTemperature.max, 269 'colorTemperature max'); 270 assert_equals(capabilities.colorTemperature.min, 271 clonedCapabilities.colorTemperature.min, 272 'colorTemperature min'); 273 assert_equals(capabilities.colorTemperature.step, 274 clonedCapabilities.colorTemperature.step, 275 'colorTemperature step'); 276 277 assert_equals(capabilities.iso.max, 278 clonedCapabilities.iso.max, 279 'iso max'); 280 assert_equals(capabilities.iso.min, 281 clonedCapabilities.iso.min, 282 'iso min'); 283 assert_equals(capabilities.iso.step, 284 clonedCapabilities.iso.step, 285 'iso step'); 286 287 assert_equals(capabilities.brightness.max, 288 clonedCapabilities.brightness.max, 289 'brightness max'); 290 assert_equals(capabilities.brightness.min, 291 clonedCapabilities.brightness.min, 292 'brightness min'); 293 assert_equals(capabilities.brightness.step, 294 clonedCapabilities.brightness.step, 295 'brightness step'); 296 297 assert_equals(capabilities.contrast.max, 298 clonedCapabilities.contrast.max, 299 'contrast max'); 300 assert_equals(capabilities.contrast.min, 301 clonedCapabilities.contrast.min, 302 'contrast min'); 303 assert_equals(capabilities.contrast.step, 304 clonedCapabilities.contrast.step, 305 'contrast step'); 306 307 assert_equals(capabilities.saturation.max, 308 clonedCapabilities.saturation.max, 309 'saturation max'); 310 assert_equals(capabilities.saturation.min, 311 clonedCapabilities.saturation.min, 312 'saturation min'); 313 assert_equals(capabilities.saturation.step, 314 clonedCapabilities.saturation.step, 315 'saturation step'); 316 317 assert_equals(capabilities.sharpness.max, 318 clonedCapabilities.sharpness.max, 319 'sharpness max'); 320 assert_equals(capabilities.sharpness.min, 321 clonedCapabilities.sharpness.min, 322 'sharpness min'); 323 assert_equals(capabilities.sharpness.step, 324 clonedCapabilities.sharpness.step, 325 'sharpness step'); 326 327 assert_equals(capabilities.focusDistance.max, 328 clonedCapabilities.focusDistance.max, 329 'focusDistance max'); 330 assert_equals(capabilities.focusDistance.min, 331 clonedCapabilities.focusDistance.min, 332 'focusDistance min'); 333 assert_equals(capabilities.focusDistance.step, 334 clonedCapabilities.focusDistance.step, 335 'focusDistance step'); 336 337 assert_equals(capabilities.pan.max, 338 clonedCapabilities.pan.max, 339 'pan max'); 340 assert_equals(capabilities.pan.min, 341 clonedCapabilities.pan.min, 342 'pan min'); 343 assert_equals(capabilities.pan.step, 344 clonedCapabilities.pan.step, 345 'pan step'); 346 347 assert_equals(capabilities.tilt.max, 348 clonedCapabilities.tilt.max, 349 'tilt max'); 350 assert_equals(capabilities.tilt.min, 351 clonedCapabilities.tilt.min, 352 'tilt min'); 353 assert_equals(capabilities.tilt.step, 354 clonedCapabilities.tilt.step, 355 'tilt step'); 356 357 assert_equals(capabilities.zoom.max, 358 clonedCapabilities.zoom.max, 359 'zoom max'); 360 assert_equals(capabilities.zoom.min, 361 clonedCapabilities.zoom.min, 362 'zoom min'); 363 assert_equals(capabilities.zoom.step, 364 clonedCapabilities.zoom.step, 365 'zoom step'); 366 367 assert_equals(capabilities.torch, 368 clonedCapabilities.torch, 369 'torch'); 370 }, 'checks MediaStreamTrack.clone() gets same capabilities'); 371 </script>