Bug 1976779 - rsclientcerts: make each backend responsible for rate-limiting calls to find_objects r=jschanck
Before this patch, `rsclientcerts::manager` would rate-limit calls to
`find_objects` to once every 3 seconds because the underlying operation can be
time-consuming (in particular, on macOS and Windows, if there are many
certificates/keys available). On Android, keys aren't available until the user
selects one, which means that if a call to `find_objects` happened before the
selection prompt was shown (which is what happens) and the user chose one in
less than 3 seconds, the backend wouldn't search again, thus making it seem like
no keys were available, which would cause Firefox to not send a client
certificate. This patch makes each backend implementation responsible for this
rate-limiting, because only they know if it's appropriate to do so (in particular,
on Android, `find_objects` doesn't have the same performance concern as
on macOS and Windows because rather than searching for certificates and
keys, it asks `ClientAuthCertificateManager` for the cached list of certificates
and keys that have already been approved for use by the user).
Differential Revision: https://phabricator.services.mozilla.com/D257065
<!--Copyright (c) 2019 The Khronos Group Inc.Use of this source code is governed by an MIT-style license that can befound in the LICENSE.txt file.--><!DOCTYPE html><html><head><metacharset="utf-8"><title>WebGL buffer copying restrictions test.</title><linkrel="stylesheet"href="../../resources/js-test-style.css"/><scriptsrc="../../js/js-test-pre.js"></script><scriptsrc="../../js/webgl-test-utils.js"></script></head><body><divid="description"></div><divid="console"></div><script>"use strict";description("Test buffer copying restrictions governed by the WebGL 2 spec. The test makes sure that copyBufferSubData acts as expected.");varwtu=WebGLTestUtils;vargl=wtu.create3DContext(undefined,undefined,2);varvalidTargets=[gl.ARRAY_BUFFER,gl.COPY_READ_BUFFER,gl.COPY_WRITE_BUFFER,gl.ELEMENT_ARRAY_BUFFER,gl.PIXEL_PACK_BUFFER,gl.PIXEL_UNPACK_BUFFER,gl.TRANSFORM_FEEDBACK_BUFFER,gl.UNIFORM_BUFFER];wtu.glErrorShouldBe(gl,gl.NO_ERROR,"Should be no errors from setup.");vartestCopyBuffer=function(srcTarget,dstTarget){varsrcTargetStr=wtu.glEnumToString(gl,srcTarget),dstTargetStr=wtu.glEnumToString(gl,dstTarget);varsrcBuffer=gl.createBuffer(),dstBuffer=gl.createBuffer();vartestCopyStr="copying from a gl."+wtu.glEnumToString(gl,srcTarget)+" buffer to a gl."+wtu.glEnumToString(gl,dstTarget)+" buffer"gl.bindBuffer(srcTarget,srcBuffer);gl.bufferData(srcTarget,newFloat32Array(32),gl.STATIC_DRAW);gl.bindBuffer(dstTarget,dstBuffer);gl.bufferData(dstTarget,newFloat32Array(32),gl.STATIC_DRAW);gl.copyBufferSubData(srcTarget,dstTarget,8,0,4);if(srcTarget==dstTarget)wtu.glErrorShouldBe(gl,gl.NO_ERROR,testCopyStr+" should work.");elseif(srcTarget==gl.ELEMENT_ARRAY_BUFFER||dstTarget==gl.ELEMENT_ARRAY_BUFFER)wtu.glErrorShouldBe(gl,gl.INVALID_OPERATION,testCopyStr+" should fail.");elsewtu.glErrorShouldBe(gl,gl.NO_ERROR,testCopyStr+" should work.");// Special case: COPY_READ_BUFFER and COPY_WRITE_BUFFER are compatible with ELEMENT_ARRAY_BUFFER// only if the buffer had been initially bound to an ELEMENT_ARRAY_BUFFERif(srcTarget==gl.ELEMENT_ARRAY_BUFFER&&(dstTarget==gl.COPY_READ_BUFFER||dstTarget==gl.COPY_WRITE_BUFFER)){dstBuffer=gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,dstBuffer);}elseif(dstTarget==gl.ELEMENT_ARRAY_BUFFER&&(srcTarget==gl.COPY_READ_BUFFER||srcTarget==gl.COPY_WRITE_BUFFER)){srcBuffer=gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,srcBuffer);}else{return;}gl.bindBuffer(srcTarget,srcBuffer);gl.bufferData(srcTarget,newFloat32Array(32),gl.STATIC_DRAW);gl.bindBuffer(dstTarget,dstBuffer);gl.bufferData(dstTarget,newFloat32Array(32),gl.STATIC_DRAW);gl.copyBufferSubData(srcTarget,dstTarget,8,0,4);wtu.glErrorShouldBe(gl,gl.NO_ERROR,testCopyStr+" should work if all buffers were initially bound to ELEMENT_ARRAY_BUFFER.");};for(vari=0;i<validTargets.length;i++){debug("");debug("Copying data from a "+wtu.glEnumToString(gl,validTargets[i])+" buffer to another target");for(varj=0;j<validTargets.length;j++)testCopyBuffer(validTargets[i],validTargets[j]);}debug("");debug("Test copying a buffer of other data (gl.ARRAY_BUFFER) bound to gl.COPY_READ_BUFFER to a "+"buffer bound to gl.ELEMENT_ARRAY_BUFFER");varsrcBuffer=gl.createBuffer(),dstBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,srcBuffer);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,dstBuffer);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,newFloat32Array(32),gl.STATIC_DRAW);gl.bufferData(gl.ARRAY_BUFFER,newFloat32Array(32),gl.STATIC_DRAW);gl.bindBuffer(gl.COPY_READ_BUFFER,srcBuffer);gl.copyBufferSubData(gl.COPY_READ_BUFFER,gl.ELEMENT_ARRAY_BUFFER,0,0,4);wtu.glErrorShouldBe(gl,gl.INVALID_OPERATION,"Copying gl.ARRAY_BUFFER bound to "+"gl.COPY_READ_BUFFER to a buffer bound to gl.ELEMENT_ARRAY_BUFFER should fail.");finishTest();varsuccessfullyParsed=true;</script></body></html>